Hallo,
ich habe mal wieder Probleme mit einem Sketch, der nicht das macht was ich möchte...
Folgende Situation: Ich habe ein paar LTO Akkus (Enzellzellen) mit welchen ich ein paar Versuche bezüglich der Kapazität usw machen möchte.
Da es keine fertige Schaltung gibt die so flexibel ist wie ich es gerne möchte, wollte ich das mit einem Arduino und dem passenden Sketch machen.
Der Sketch soll eigentlich nichts anderes machen, als bei jeder Zelle die Spannung messen und, so fern die jeweilige Spannung erreicht ist ein Relais schalten.
Die Verwendete Hartware sind ein Nano (Clone) und eine 8er Relaiskarte. Die Stromversorgung des Arduino erfolgt über eine Festspannungsregelung, die Referenzspannung ist also OK.
Im Versuchsaufbau wird jede Zelle für sich (aus einer eigenen Stromquelle) geladen, es soll deshalb auch jede Zelle für sich geschaltet werden. Um die Tiefentladung einer Zelle zu vermeiden, soll beim erreichen der Minimalspannung die komplette Last von der Batterie genommen werden.
Hier der Sketch mit dem ich das erreichen möchte:
/*
Experimentelle Laderegelung für "12V" LTO Akkus.
Die Regelung misst jede Zelle einzeln und schaltet den Ladestrom bei Erreichen der Ladeschlussspannung ab.
Es wird jede Zelle separat geladen, weshalb auch die Zellenspannung separat gemessen und der Ladestrom
für jede Zelle separat geschalten wird.
*/
const byte voltin1 = A1; // input Pin für Spannung Zelle 1
const byte voltin2 = A2; // input Pin für Spannung Zelle 2
const byte voltin3 = A3; // input Pin für Spannung Zelle 3
const byte voltin4 = A4; // input Pin für Spannung Zelle 4
const byte voltin5 = A5; // input Pin für Spannung Zelle 5
const byte voltin6 = A6; // input Pin für Spannung Zelle 6
//const byte voltinall = A7; // input Pin für Spannung ganze Batterie
const int lssp = 512; // digitalwert für Ladeschlussspannung
const int lwasp = 480; // digitalwert für wiederaufnahme des Ladevorgangs
const int cutoffsp = 390; // digitalwert für Unterspannungs Abschaltung
int voltzelle1 = 400; // Startwerte setzen
int voltzelle2 = 400;
int voltzelle3 = 400;
int voltzelle4 = 400;
int voltzelle5 = 400;
int voltzelle6 = 400;
void setup() {
digitalWrite(2, HIGH);
pinMode(2, OUTPUT);
digitalWrite(3, HIGH);
pinMode(3, OUTPUT);
digitalWrite(4, HIGH);
pinMode(4, OUTPUT);
digitalWrite(5, HIGH);
pinMode(5, OUTPUT);
digitalWrite(6, HIGH);
pinMode(6, OUTPUT);
digitalWrite(7, HIGH);
pinMode(7, OUTPUT);
digitalWrite(10, HIGH);
pinMode(10, OUTPUT);
}
void loop() {
voltzelle1 = analogRead(voltin1); //Spannungs an A 1 auslesen
if (voltzelle1 >= lssp) digitalWrite(2, HIGH); //Schaltet bei Ladeschlussspannung den Ladestrom ab
if (voltzelle1 <= lwasp) digitalWrite(2, LOW); //Schaltet bei Wiederaufnahmespannung den Ladestrom an.
if (voltzelle1 >= cutoffsp) digitalWrite(10, HIGH); //Nimmt bei Unterspannung einer Zelle die Last von der Batterie.
voltzelle2 = analogRead(voltin2); //Spannungs an A 2 auslesen
if (voltzelle2 >= lssp) digitalWrite(3, HIGH); //Schaltet bei Ladeschlussspannung den Ladestrom ab
if (voltzelle2 <= lwasp) digitalWrite(3, LOW); //Schaltet bei Wiederaufnahmespannung den Ladestrom an.
if (voltzelle2 >= cutoffsp) digitalWrite(10, HIGH); //Nimmt bei Unterspannung einer Zelle die Last von der Batterie.
voltzelle3 = analogRead(voltin3); //Spannungs an A 3 auslesen
if (voltzelle3 >= lssp) digitalWrite(4, HIGH); //Schaltet bei Ladeschlussspannung den Ladestrom ab
if (voltzelle3 <= lwasp) digitalWrite(4, LOW); //Schaltet bei Wiederaufnahmespannung den Ladestrom an.
if (voltzelle3 >= cutoffsp) digitalWrite(10, HIGH); //Nimmt bei Unterspannung einer Zelle die Last von der Batterie.
voltzelle4 = analogRead(voltin4); //Spannungs an A 4 auslesen
if (voltzelle4 >= lssp) digitalWrite(5, HIGH); //Schaltet bei Ladeschlussspannung den Ladestrom ab
if (voltzelle4 <= lwasp) digitalWrite(5, LOW); //Schaltet bei Wiederaufnahmespannung den Ladestrom an.
if (voltzelle4 >= cutoffsp) digitalWrite(10, HIGH); //Nimmt bei Unterspannung einer Zelle die Last von der Batterie.
voltzelle5 = analogRead(voltin5); //Spannungs an A 5 auslesen
if (voltzelle5 >= lssp) digitalWrite(6, HIGH); //Schaltet bei Ladeschlussspannung den Ladestrom ab
if (voltzelle5 <= lwasp) digitalWrite(6, LOW); //Schaltet bei Wiederaufnahmespannung den Ladestrom an.
if (voltzelle5 >= cutoffsp) digitalWrite(10, HIGH); //Nimmt bei Unterspannung einer Zelle die Last von der Batterie.
voltzelle6 = analogRead(voltin6); //Spannungs an A 6 auslesen
if (voltzelle6 >= lssp) digitalWrite(7, HIGH); //Schaltet bei Ladeschlussspannung den Ladestrom ab
if (voltzelle6 <= lwasp) digitalWrite(7, LOW); //Schaltet bei Wiederaufnahmespannung den Ladestrom an.
if (voltzelle6 >= cutoffsp) digitalWrite(10, HIGH); //Nimmt bei Unterspannung einer Zelle die Last von der Batterie.
}
Das Messen an sich scheint zu funktionieren, denn die Relaiskarte reagiert auf entsprechende Spannungsänderungen.
Allerdings wirden die Relais nicht einzeln geschaltet, sondern immer "on block".
D.h. wenn ich die Spannung an einem Eingang ändere ziehen die Ralais 1-6 gemeinsm an (oder fallen gemeinsam ab). Relais 8 (welches am A10 hängt) reagiert dagegen überhaupt nicht.
Ich bin recht überzeugt davon, dass meine "if Abfrage" und die daraus resultierenden Befehle nicht richtig sind... aber was falsch ist kann ich nicht erkennen...