Ein Wattstunden-Meter


Wh-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.

Wattstunden-Meter Schaltplan 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.