Ein Wattstunden-Meter
Nicht käuflich sondern unbestechlich
Ich bin bei Geschäften über mehr als 100 Euro immer mißtrauisch.
Der jung-dynamische Verkäufer meines Elektrofahrrades meinte, der mitgelieferte Akku hat eine Leistung
von 10 A und eine Kapazität von 24 V. Ich nehme ihm das nicht übel. Nicht jeder hat in der Schule im Fach Physik
aufgepaßt und es wird wohl immer Leute geben, die die Zinsrechnung bereits als höhere Mathematik betrachten.
Meine Frage, wieviele Wattstunden denn im Akku gespeichert werden können blieb erwartungsgemäß unbeantwortet.
Zur Erinnerung:
I ist der elektrische Strom. Er wird in Ampere gemessen und mit A bezeichnet.
U ist die elektrische Spannung. Sie wird in Volt gemessen, abgekürzt V.
P ist die elektrische Leistung W in Watt. Sie errechnet sich aus U * I .
E ist die elektrische Arbeit. Sie wird berechnet aus P * Zeiteinheit. Ihre Maßeinheit ist daher z.B. die
Wattsekunde Ws oder die Wattstunde Wh.
Und dann ist da noch die Kapazität eines Akkus in Ah. Diese wird meist vom Hersteller als
Nennspannung * Nenn-Entladestrom auf dem Typenschild des Akku vermerkt. Weicht man vom Nenn-Entladestrom ab, ändert
sich auch die Kapazität eines Akku. Verwirrend, nicht wahr?
Doch zurück zu meinem Fahrrad-Akku:
Er ist angegeben mit einer Nennspannung von 24 V und einem Nenn-Entladestrom von 10 A. Das entspricht einer
elektrischen Nenn-Leistung von 240 W. Interessant wäre es zu wissen, wie lange der Akku diese 240 W oder eine andere
entnommene elektrische Leistung liefern kann, denn das ist entscheidend für die Reichweite eines Elektrofahrrades.
Es mußte also ein Meßgerät her.
Nun gehen Sie einmal in einen Laden und verlangen ein Wattstunden-Meter für Gleichspannung. Wenn Sie auf einen
relativ qualifizierten Verkäufer treffen werden Sie ein Energiekosten-Meßgerät für 230 V angeboten bekommen.
Das kann ich aber für meinen Akku nicht gebrauchen.
Man nehme also einen Mikrocontroller, ein LC-Display und etwas Programm und baue sich sein DC-Wh-Meter selbst.
Ein gerade vorhandener ATmega32 von ATMEL war gut geeignet, denn er besitzt bereits 8 Stück Analogeingänge
mit jeweils 10 Bit Auflösung. Davon werden im Wh-Meter nur 2 Kanäle für die Strom- und Spannungsmessung genutzt.
Aus dem 16 MHz-Quarz für die Takterzeugung des Mikrocontrollers wird gleich noch der Sekundenimpuls für die Erfassung
der Wattsekunden gewonnen, das vereinfacht den Aufbau sehr. Es wird eine Meßgenauigkeit von etwa +/- 3 % angestrebt.
Im Display werden als Abfallprodukt auch die Akkuspannung, der dem Akku entnommene Strom und die daraus
errechnete aktuelle elektrische Leistung angezeigt. Leider besitzt das verwendete ältere Display keine
Hintergrundbeleuchtung, was sich als echter Nachteil beim Ablesen des Wh-Meters erwies.
Wird IC1 durch einen Schaltregler mit dem MC34063 ersetzt, verringert sich die vom Wh-Meter
selbst verbrauchte Leistung. Dann kann der Spannungsmeßbereich auch bis 50 V vergrößert werden. Die Reihenschaltung
von R8 und R9 sollte dann einen Gesamtwiderstand von 19,2 kOhm besitzen.
Bei 24 V Akkuspannung kann zur weiteren Verringerung der elektrischen Verluste für IC1 auch ein Schaltregler von RECOM
R785.0-0.5
verwendet werden. Für einen 36 V-Akku ist dieser leider nicht mehr geeignet.
Die Programmierung erfolgte in BASCOM-AVR. Mit der kostenlosen Demo kann man
bis zu 4 kByte Programmcode erzeugen.
Die Software besteht nur aus wenigen Zeilen und belegt 9 % des Flash-Programmspeichers im Mikrocontroller. Es ist also
noch jede Menge Platz für irgendwelche Erweiterungen. Nach 24 h Meßzeit wird das Programm beendet, ebenso bei
Überschreiten der Zählgrenze von
9999 Wh, was ja immerhin 10 kWh sind. Natürlich könnte man die Anzeige auch für Kilowattstunden programmieren, das ist
für meinen Zweck (Laden und Entladen eines Akku für ein Elektrofahrrad) jedoch nicht sinnvoll, denn hier bewegt man
sich im Bereich weit unter einer Kilowattstunde.
Die Software nimmt in einer Sekunde lediglich ein einziges Sample der Spannung und des Stromes. Dieses wird als
repräsentativ für die gesamte Sekunde angenommen, was jedoch nicht stimmen muß. Der Mikrocontroller langweilt sich die
meiste Zeit damit, in der DO-LOOP-Schleife NICHTS zu tun. Hier könnte man ihn damit beschäftigen, innerhalb einer
Sekunde mehrere Samples zu nehmen und den Mittelwert je Sekunde auszurechnen. Das würde die Meßgenauigkeit bei
unstabilen Meßgrößen erhöhen.
Hier folgt nun der vollständige Programmcode für das Wh-Meter in BASCOM-AVR:
'******************************************************************************
'* M32 Wh-Meter1.bas *
'* frei nach mikrocontroller.net (for_ro) bearbeitet von DL3JIN *
'* 12.12.2008 *
'* misst Strom und Spannung, errechnet Leistung und zählt Wattstunden *
'* startet bei Zuschalten der Betriebsspannung *
'******************************************************************************
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
$prog &HFF , &HFF , &HD9 , &H00 'lock and fuse bytes für M32
'externer Quarz, JTAG disabled,
'Port C frei für Anwender
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , _
Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2
Config Portd.7 = Output 'LED an PortD.7 (device running)
Config Timer1 = Timer , Prescale = 256
Config Adc = Single , Prescaler = 128 , Reference = Internal
'Die Timervorgabe für 1s errechnet sich zu:
'(Zählumfang Timer) - (Quarzfrequenz / Prescaler) = Timervorgabe
'(65536 ) - (16000000 / 256 ) = 3036
Const Timervorgabe = 3036
Const Vref = 2.48 'interne Vref = ADW max. Vin !
Const Vende = 30 'Endwert Spannungsmessbereich
Const Iende = 30 'Endwert Strommessbereich
Dim Iststunde As Byte
Dim Istminute As Byte
Dim Istsekunde As Byte
Dim Letzte_sekunde As Byte 'Merker zum Vergleich ob neue Sekunde
Dim Uwert As Word '0...1023
Dim Iwert As Word 'dito
Dim Volt As Single 'angezeigte Spannung
Dim Amp As Single 'angezeigter Strom
Dim Vfaktor As Single 'umrechnen auf Messbereichsendwert
Dim Ifaktor As Single 'dito
Dim Pwr As Single 'angezeigte Leistung
Dim E As Single 'Arbeit in 1s (zum Addieren)
Dim Wh As Single 'angezeigte Wattstunden
Vfaktor = Vende / 1023 'da der ADW nur 0...1023 ausgibt
Ifaktor = Iende / 1023 'dito
Iststunde = 0 'bei "0" starten
Istminute = 0
Istsekunde = 0
On Timer1 Timer_irq
Enable Timer1
Enable Interrupts
Cursor Off
Cls 'Begrüßungsfenster
Locate 1 , 3
Lcd "M32 Wh-Meter"
Locate 2 , 6
Lcd "DL3JIN"
Wait 2
Cls
Start Adc
Do
If Istsekunde <> Letzte_sekunde Then 'neue Sekunde da? Wenn ja, dann:
Uwert = Getadc(0) 'Wert "U" im Kanal0 holen
Volt = Uwert * Vfaktor 'Wert "U" umrechnen in Volt
Locate 1 , 1 'gilt für alle Spannungen
If Volt < 10 then 'fülle links mit einem Leerzeichen auf
lcd " ";
end if
lcd fusing(volt , "#.#") ; " V " 'runde und formatiere vor Ausgabe
iwert = getadc(1) 'Wert "I" im Kanal1 holen
amp = iwert * ifaktor 'Wert "I" umrechnen in Ampere
locate 2 , 1
if amp < 10 then
lcd " ";
end if
lcd fusing(amp , "#.#") ; " A "
pwr = volt * amp 'Leistung "P"
locate 1 , 9
if pwr < 100 then 'fülle links mit einem Leerzeichen auf
lcd " ";
end if
if pwr < 10 then 'fülle mit einem weiteren Leerzeichen
lcd " ";
end if
lcd fusing(pwr , "#.#") ; " W "
e = pwr / 3600 'Arbeit "E in einer Sekunde"
wh = wh + e 'die Wattstunden seit letztem Reset
locate 2 , 8
if wh < 1000 then 'fülle links mit einem Leerzeichen auf
lcd " ";
end if
if wh < 100 then
lcd " ";
end if
if wh < 10 then
lcd " ";
end if
lcd fusing(wh , "#.#") ; " Wh"
if wh > 9999 Then 'bei > 9999 Wh erfolgt Hinweis im LCD
Cls 'und Programmende
Locate 1 , 1
Lcd " Error"
Locate 2 , 1
Lcd " Wh Overflow"
End
End If
If Istsekunde = 60 Then 'Istsekundenzähler zurücksetzen
Istsekunde = 0
Incr Istminute 'Minutenzähler +1
End If
If Istminute = 60 Then 'Istminutenzähler zurücksetzen
Istminute = 0
Incr Iststunde 'Stundenzähler +1
End If
If Iststunde = 24 Then 'Hinweis auf LCD
Cls
Locate 1 , 1
Lcd " Error"
Locate 2 , 1
Lcd " 24h Overflow"
End ' Programmende
End If
Toggle Portd.7 'Kontroll-LED
Letzte_sekunde = Istsekunde 'aktualisieren
End If
Loop
Timer_irq:
Timer1 = Timervorgabe 'Timer wieder voreinstellen
Incr Istsekunde 'Sekundenzähler +1
Return
'******************************************************************************
Und nun noch das obige Programm als compiliertes HEX-File
M32-whmeter.hex zum Download.