Download als ZIP Archiv (33 kB) |
Das Programm ist relativ einfach: Der Timer1 weckt den Microcontroller jede 200ms aus dem Idle Mode, der zum Stromsparen verwendet wird (auch wenn die Reduktion der Stromaufnahme nicht wirklich nötig gewesen wäre). In der Hauptschleife (also nicht im Interrupthandler) wird die Spannung gemessen. Im Interrupthandler des Timers wird die Spannung dann über mehrere Messungen gemittelt und ausgewertet. Die LEDs werden entsprechend der aktuellen Spannung gesetzt. Das Relais wird ein- bzw. ausgeschaltet, wenn die Spannung für eine gewisse Zeit oberhalb der Einschaltschwelle bzw. unterhalb der Ausschaltschwelle ist.
Bei der Softwareerstellung war vor allem die Verwendung von ADC (Analog-Digital-Konverter) und Timer-Interrupt (zum Wecken des Mikrocontrollers) etwas schwierig. Beide lösen Interrupts aus. Man muss sicherstellen, dass der ADC ausgeschaltet wird, wenn die CPU in den Schlafmodus versetzt werden soll. Ansonsten weckt sie sofort wieder auf, so dass kein Stromsparen möglich ist.
Direkt
nach dem Einschalten des Geräts wird das Relais bereits
eingeschaltet, wenn (nach der eingestellten Verzögerung) die
Spannung oberhalb der Ausschaltschwelle
ist. Ist jedoch im Betrieb die Spannung einmal unter die
Ausschaltschwelle gesunken, schaltet das Relais erst wieder ein,
wenn die Spannung über die Einschaltschwelle
steigt. Dieses Verhalten ist bewußt so gewählt, damit nach
Einschalten des Geräts bei ausgeschaltetem Motor der Verbraucher
initial eingeschaltet wird.
Zur Bestimmung der Schaltschwellen habe ich zunächst die Batteriespannung zweier Fahrzeuge mit einem Multimeter gemessen:
Wenn die Strom-Überwachung aktiviert ist, leuchtet die LED, sobald der Stromverbrauch über dem eingestellten Wert liegt. Falls der Strom für die eingestellte Zeit unter der eingestellten Stromstärke liegt, wird ein Alarm im Minutentakt ausgelöst.
Vor allem zu Testzwecken können des weiteren zwei Info-Schwellen eingestellt werden, so dass akustisch angezeigt wird, wenn der Verbraucher (die Kühlbox) ab jetzt einen anderen Stromverbrauch hat. Die eingesetzte Kühlbox läuft grundsätzlich nur in drei Stufen und verbraucht ~0 A, ~1,7 A und ~4,1 A, so dass ich mit dieser Funktion interessehalber mal das Verhalten der Box mitbekommen kann.
Die Strom-Überwachung bietet zudem die Möglichkeit, die tatsächliche Batteriespannung anhand der am Gerät anliegenden Spannung hochzurechnen. In meinem Fall hatte ich einen Spannungsabfall von immerhin 0,7V zwischen Batterie und Elektronik. Deshalb schaltete die Elektronik natürlich die Kühlbox recht schnell ab, obwohl die Batterie auf keinen Fall schon leer war. Durch die Berücksichtigung des Widerstands des Kabels bis zur Elektronik kann die tatsächliche Batteriespannung hochgerechnet werden und so ein vorzeitiges Abschalten unterbunden werden. Um diese Funktion nutzen zu können, muss die Stromüberwachung bestückt und im EEPROM eingeschaltet werden.
Eine weitere Möglichkeit, die ich allerdings bisher nicht implementiert habe, wäre das Messen der Batteriespannung nach kurzzeitigem Ausschalten des Verbrauchers (also ohne Last). Dies würde bedeuten, dass der Verbraucher aber zyklisch (z.B. alle 15 Minuten) ausgeschaltet werden muss.
Mit folgenden Parametern können im EEPROM gesetzt werden, um
Schaltschwellen und Schaltverzögerung anzupassen.
Zudem werden zwei Testmodi unterstützt, um die (halbfertige)
Hardware auf Funktionstüchtigkeit zu prüfen.
Zum Schreiben des Testmodus ist im Downloadpaket eine passende Batchdatei und ein hex File für das EEPROM enthalten.
Der Brownout-Detector, der den Mikrocontroller im Falle von Unterspannung ausschaltet, sollte aktiviert werden, damit bei Unterspannung nicht unkontrolliert ins EEPROM geschrieben werden kann. Dies geht durch Setzen des entsprechenden Fuse-Bits "brownout detection enabled" auf 0.
EEPROM Position (Byte) | Bedeutung |
---|---|
0 |
Betriebsmodus ungleich 1 und 2, z.B. FF (EEPROM unbeschrieben) = LED Test (LEDs 1-8 werden in einer Schleife nacheinander eingeschaltet) 1 = Spannungstest (LEDs zeigen im Sekundentakt aktualisiert die Spannung entsprechend der Schaltschwellen ein. Dient zum Prüfen der Spannungsmessung.) 2 = Normalbetrieb |
1 |
Anzahl
Spannungsmessungen für Durchschnittsberechnung Die Spannung wird (alle 200ms) mehrfach gemessen und ein Durchschnitt gebildet, bevor sie ausgewertet wird. Auch die Spannungsanzeige wird in diesem Intervall aktualisiert. (Default = 5 = 1s) |
2 + 3 |
Ausschaltschwelle
in 1/100 V Unterhalb dieser Spannung wird das Relais ausgeschaltet. (Default = 1200) |
4 + 5 | Einschaltschwelle in 1/100 V Oberhalb dieser Spannung wird das Relais eingeschaltet. (Default = 1320) |
6 + 7 | Ausschalt-Delay Das Relais wird erst ausgeschaltet, wenn die Ausschaltschwelle für x Sekunden unterschritten wird. (Default = 20) |
8 + 9 |
Einschalt-Delay Das Relais wird erst eingeschaltet, wenn die Einschaltschwelle für x Sekunden überschritten wird. (Default = 20) |
10 - 25 |
Spannungsschwellen
in 1/100 V für die LED-Anzeige Byte 10 + 11 ist die niedrigste Spannungsschwelle (Default = 1170, 1200, 1230, 1260, 1290, 1310, 1340, 1370) |
26 | LED-Anzeige umdrehen Je nach Einbau der LEDs kann man deren Bedeutung umdrehen. 0 = aus 1 = ein |
27 | Strom-Überwachung |
28 + 29 | Alarm-Schwelle Ist der Strom unterhalb dieses Wertes in mA, wird der akustische Alarm ausgelöst. (Default = 1000) |
30 + 31 | Alarm Timeout |
32 + 33 | Strom Max (UNBENUTZT!) Dieser Wert gibt den zu erwartenden maximalen Strom in mA an. (Damit sollte ein Pulsverhältnis der Stromstärken-LED justiert werden, so dass bei maximaler Stromstärke ein Dauerleuchten erreicht wird.) (Default = 5000) |
34 + 35 | Strom Info-Schwelle 1 (Default = 900, aus = 0) |
36 + 37 | Strom Info-Schwelle 2 (Default = 2900, aus = 0) |
38 + 39 | Widerstand des Kabels zwischen Batterieklemmen und Elektronik in mOhm |