/* Arduino Workshop U13 Laderegler10, HHC 5.1.18 Entlädt bis 11,4 V, lädt dann bis 14,4 V, hält dort Haltezeit ms, hält dann auf 13,8V. Bildet Mittel aus LadPWM und ändert von dort aus. Das haut hin, wenig Regelschwingungen beim Halten */ float U0; // Spg. Punkt 0, 1, 2 float U1; float U2; float UBat; // Batteriespannung float Ualt; // Alter Spannungswert float dUdt=0; // Stromänderung (V/s) float Pot; // Strompoti float IWert; // Aktueller Akkustrom float Ladesoll = 0.5; // Ladestrom Urwert float ILad = 0; // Ladstrom akt. Sollwert float Entladesoll = 0.5; // Entladestrom Urwert float IEnt = 0; // Entladestr akt. Sollwert float A; // Scratch float D; // Regelabweichung float Mittel; float Ladg = 0.0; // Gesammelte Ladung in mAs float Ufak1=0.024; // Faktor bei UBat float Ufak2=0.024; // Faktor bei U2 int LadPWM; int EntPWM; int Null; int Step=50; // Zeitschritt in ms int N=6; // Zellenzahl char Phase='K'; int Intervall=2000; // Druckintervall in ms long Zeit; long Haltezeit=60000; // Haltezeit bei 14,4 V in ms long Halt144; float USoll; float U114=11.4; // Entladeschluss 11,4V float U144=14.4; // Füllspannung 14,4V float U138=13.8; // Haltespannung 13,8V boolean Eein; // Pin 8 Entladg. void setup() { pinMode (3, OUTPUT); // Ladestrom PWM pinMode (5, OUTPUT); // Entladestrom PWM pinMode (8, INPUT_PULLUP); // Entladung E/A pinMode (9, OUTPUT); // LED1 Unterste LED pinMode (10, OUTPUT); // LED2 pinMode (11, OUTPUT); // LED3 pinMode (12, OUTPUT); // LED4 Oberste LED // LED leuchtet bei LOW digitalWrite(12,LOW); // Version 10 digitalWrite(11,HIGH); digitalWrite(10,LOW); digitalWrite(9,HIGH); analogWrite (3,0); LadPWM=0; // Ladestrom aus! analogWrite (5,0); EntPWM=0; // Entladestrom aus! Serial.begin(9600); // 9600 Baud Serial.println(); // Clear Screen Serial.println("Laderegler9"); Serial.print(N); Serial.println(" Zellen"); Serial.print("Autozero: "); delay(3000); // Ausschwingzeit Null = analogRead(0); // Autozero Serial.println(Null); Zeit=millis()+1000; Serial.println("Kontakttest"); Phase='K'; digitalWrite(9,HIGH); // LEDs aus digitalWrite(10,HIGH); digitalWrite(11,HIGH); digitalWrite(12,HIGH); } // Ende setup void loop() { // Spannungen messen U0 = analogRead(0); U0=(U0-Null)/102.0; // Spannung am 1 Ohm Shunt IWert=U0; // Batteriestrom in A U1 = analogRead(1)*Ufak1; // Spannung +Pol Batterie UBat=U1-U0; // Spg. an Batterie in V U2 = analogRead(2)*Ufak2; // Versorgungsspannung in V Pot = analogRead(5); // StromPoti lesen Pot=Pot*Pot/1000000.0; Eein = digitalRead(8); // Schalter Entladung if (Phase=='K') // Kontakttest { if (UBat>U114 && UBat230) EntPWM=230; if (EntPWM<0) EntPWM=0; analogWrite(5,EntPWM); if (UBat 14,4 V"); } } // Ende Entladung // LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL if (Phase=='L') // Laden bis 14,4 V { digitalWrite(10,LOW); // LED2 ein ILad=Pot; if (IWert255) LadPWM=255; if (LadPWM<5) LadPWM=5; analogWrite(3,LadPWM); if (UBat>U144) { USoll=U144; Phase='H'; Halt144=millis()+Haltezeit; Serial.print("Halten auf 14,4 V fuer "); Serial.print(Haltezeit/1000); Serial.println(" Sekunden"); Mittel=40; // Anhaltswert LadPWM=Mittel; } } // Ende Laden bis 14,4 V // HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH if (Phase=='H') // Halten bei 14,4 V { digitalWrite(11,LOW); // LED3 ein if (UBat255) LadPWM=255; if (LadPWM<5) LadPWM=5; analogWrite(3,LadPWM); if (millis()>Halt144) { USoll=U138; Phase='F'; Serial.println("Fertig. Halten auf 13,8 V"); } } // Ende Halten bei 14,4 V // FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF if (Phase=='F') // Fertig: Halten bei 13,8V { digitalWrite(12,LOW); // LED4 ein if (UBat255) LadPWM=255; if (LadPWM<5) LadPWM=5; analogWrite(3,LadPWM); } // Ende Halten bei 13,8V A=LadPWM; // Gleitendes Mittel aus den Mittel=(9.0*Mittel+A)/10.0; // letzten 10 Werten if (millis() > Zeit) // Drucken alle .. Sekunden { Zeit=Zeit+Intervall; dUdt=(UBat-Ualt)*Intervall/1000; Ualt=UBat; Ladg=Ladg+IWert*Intervall/1000; // mAs /* // Auskommentiert Serial.print("U0 "); Serial.print(U0); Serial.print(" U1 "); Serial.print(U1); Serial.print(" U2 "); Serial.print(U2); */ Serial.print(Phase); Serial.print(" UBat="); Serial.print(UBat); Serial.print(" V / IBat="); Serial.print(IWert); Serial.print(" A / EW"); Serial.print(EntPWM); Serial.print(" LW"); Serial.print(LadPWM); Serial.print("/ Pot "); Serial.print(Pot); Serial.print("/ Mit "); Serial.println(Mittel); /* // Auskommentiert Serial.print(" dUdt "); Serial.print(dUdt); Serial.print(" / Ladg "); Serial.print(Ladg); Serial.println(" As "); */ if (U2<16) { Serial.print("Oberspannung = "); Serial.print(U2); Serial.println(" V <16V"); } if (UBatU144+1) Serial.println("UBat>14,4V"); } // Ende drucken delay(Step); } // Ende loop