erstellt  08.11.2011
Leistungsmesser
Wer hat nicht schon einmal das Gefühl gehabt das seine NC oder Blei-Akkus zu schnell leer sind obwohl sie doch laut Typenschild eine Menge an Leistung bringen sollen.
Spätestens dann stellt man sich die Frage, ist der Akku defekt oder vielleicht schon zu alt ?
Aber wie soll man überprüfen ob ein Akku seine angegebene Leistung noch hat und vor allem ob er sie auch zu Verfügung stellt ?
Also bastel ich mir ein Messgerät mit dem ich die Energie die ich in einen leeren Akku reinstecke bzw. die Energie  die ich aus einen vollen Akku raus ziehe auch messen kann.
Das Grundprinzip sieht also folgendermaßen aus:
Erst lade ich den vorhandenen AKKU voll auf, dann Entlade ich ihn über eine genau definierte Last und messe den Entladestrom (I),
anhand des Ladestrom und des vorhanden Lastwiderstand berechne ich die entnommene Leistung(W).
Wenn ich nun diese Leistung in Bezug zur Entladezeit setze habe ich die Energie bzw. (Wh ) die im Akku sitzt.

Das Grundprinzip
Um die Energiemenge eines Akkus zu bestimmen muss ich wissen wie lange ein bestimmter Strom bei einer bestimmten Spannung  in meinen Akku fließt
wenn ich ihn auflade oder eben entlade.
Also ist zu einem die Zeit und zum anderen der Strom und die Spannung ein Kriterium über welche ich die Energiemenge bestimmen kann.
Wenn beispielsweise eine Autobatterie (12V) mit einem Strom von 1 Ampere und einer Spannung von 14 Volt geladen wird, dann lade ich mit einer Leistung von 168 Watt.
Wenn ich nun diese Leistung über 1 Sekunde beibehalte dann beinhaltet meine Batterie eine Energie von 168 Ws.

Da je nach Akku und Ladegerät der Strom und auch die Spannung aber nicht während der gesamten Messung gleich bleibt, müssen  eine Vielzahl von Messungen durchgeführt
werden und  daraus der Mittelwert ermittelt werden.
Den Strom kann ich indirekt mit einen sogenannten Shunt messen, so nennt man Widerstände die meist über einen sehr geringen Widerstandswert verfügen und im
Verbraucherkreis  liegen und nur zu Messzwecke benutzt werden.
Shunt kommt aus dem Englischen und bedeutet soviel wie Neben oder Parallelwiderstand .
Es gibt auch noch andere Möglichkeiten den Strom zu messen , allerdings ist es mit einem Shunt am preisgünstigsten.
Die Strommessung über einen Shunt hat aber den Nachteil das zu einem der Verbraucher-Stromkreis durch eben diesen zusätzlich beeinflusst wird
und zum anderen durch diesen Shunt der gesamte Strom fließt, und dadurch unnötig Leistung verbraucht wird, die in Form von Wärme abgegeben werden muss.
Sprich der Shunt wird unter Umständen heiß.

Als nächstes muss ich also auch die Spannung der Batterie messen ( im Plan ADC1) da aber bei der Spannungsmessung auch die Spannung die am Shunt abfällt
mitgemessen wird und so mein Messergebnis verfälscht wird später im Programm die am Shunt gemessene Spannung von der gesamt Spannung abgezogen,
so das ich nur noch die reine Spannung der Batterie in meine Leistungsmessung einfließt.







Der Atmega 32 besitzt mehrere Analogeingänge an den man Spannungen messen kann, eigentlich werden  die Spannungen  nicht gemessen sondern
mit einer Referenzspannung verglichen,dazu wird die im Lade/Entlade-Stromkreis am Shunt abfallende Spannung dem Atmega an einen
seiner Analogeingänge (ADC0)zugeführt.
Diese am Shunt abfallende Spannung darf bis zu max. 5 Volt sein und wird je nach Konfiguration mit einer genauigkeit von 10 Bit abgetastet.
Vorausgesetzt wir benutzen eine Referenzspannung von 5 Volt sind wir somit in der Lage bei 10 Bit das sind 1023 Spannungsbereiche  (5Volt/ 1023=4,88 mV)
die Eingangsspannung in 4,88mV Schritte wahrzunehmen.
Über die gemessene Spannung und den Wert des vorhandenen Widerstand kann ich  mit dem Atmega den Strom errechnen der im Lade-Entladekreis fließt.

Nun benötigen wir noch die an der Batterie anliegende Spannung , die mit dem Analogeingang ADC1 gemessen wird.
Mit diesen Werten , also Strom und Spannung kann ich nun die Leistung berechnen die beim Ladevorgang in meinen Akku fließt.
Um aber eine Aussagekraft über die im Akku enthaltene Energie  zu erhalten benötigen wir noch die Zeit in der der Lade-Entlade vorgang statfindet.

Dafür benötige ich noch eine Zeitvorgabe , mit Timer 1 wird also ein Sekundentakt erzeugt, um damit im Programm jede Sekunde die Leistung zu addieren.
Wie ermittel ich also den Widerstand (Shunt) ?
Fall 1
Um den Widerstand zu ermitteln , durch den mein Ladestrom fließen soll überlege ich mir erst einmal wie groß der maximale Strom sein soll den ich zu
messen beabsichtige.
Wenn ich einmal von  maximal 3 Ampere Ladestrom ausgehe um auch noch die Leistung beim laden einer Auto Batterie im überschaulichen Zeitrahmen
zu Messen und der Atmega maximal 5 Volt messen kann , ergibt sich ein Widerstand von R=U/I (5/3)= 1,6 Ohm.
Dafür brauchen wir aber nicht nur einen Widerstand mit einer Leistung von P=U*I(5*3)  =15 Watt sondern wir verbraten auch diese 15 Watt völlig sinnlos,
also muss ein anderes Konzept her, ich versuche es mit einer kleineren Referenzspannung die der Atmega intern  zu Verfügung stellt,
und nur per Anweisung aktiviert werden muss.

Fall 2
Die interne Referenzspannung beträgt 2,56 Volt, wie also sieht die Rechnung damit aus?
R=U/I(2,56/3) = 0,85 Ohm Wir brauchen also einen Shunt von 0,85 Ohm und einer Leistung von P=U*I(2,56*3) das sind immer noch 7,68 Watt.
Somit ist es mir immer noch zu viel um diese 7,68 Watt als Wärme so verpuffen zu lassen

Fall 3
Um die Verlustleistung des Shunt zu verringern muss also mit  eine kleinere Referenzspannung gearbeitete werden.
Nachdem ich mit zwei Dioden eine Referenzspannung von 1,66 Volt erzeugt habe und eine Shunt von 0,22 Ohm eingesetzt habe ergibt sich dann folgende Rechnung:
P=U*I (1,66*3) ist gleich 4,98Watt
Da mein eingesetzter 0,22 Ohm Widerstand eine Verlustleistung von 5 Watt hat, kann ich damit bis zu 3 Ampere messen.

Wie genau misst denn nun mein Leistungsmesser
zu Fall 1
Referenz 5 Volt /1023 Schritte = 4,8 mV
I = U/R  = 4,8 mV /0,22 Ohm = 21mA Schritte
Verlustleistung
P=U*I
5 Volt * 3 Ampere = 15 Watt
zu Fall 2
Referenz 2,56 Volt /1023 Schritte = 2,5 mV
I=U/R = 2,5 mV / 0,22 Ohm = 11 mA Schritte
Verlustleistung
P= U*I
2,56 Volt * 3 Ampere = 7,68 Watt
zu Fall 3 Referenz 1,66 Volt / 1023 Schritte = 1,6 mV
I=U/R = 1,6mV /0,22Ohm = 7,2 mA Schritte
Verlustleistung
P=U*I
1,66 Volt * 3 Ampere = 4,98 Watt





Funktion
Zunächst wird als erstes  aus dem aktuellen Digitalwert ( ADC0)  der  im Shunt fließende Strom wie folgt errechnet:
1023 Bit entsprechen 1,66 Volt Referenzspannung - dann entspricht 1 Bit einer Spannung von 1,6mV-1,6 mV an einem Widerstand von 0,22 Ohm ergeben 7,37mA
Damit hab ich pro Bit einen Strom von 7,37mA
Weil der Mikrokontroller aber nicht mit Kommazahlen rechnen kann ,er müsste ja rechnen Aktuelle Digitalwert mal 7,37 so nehme ich den Stromwert 7,37 erst einmal mal 100 sind also 737.
und teile dann später das Ergebnis wieder durch Hundert.
Beispiel:
Digitalwert ist 50
Dann rechne ich 50*737=36850
Dann das Ergebnis 36850/100= 368,5 mA damit habe ich das Ergebnis in mA um das Ergebnis aber in Ampere angezeigt zu bekommen muss ich noch einmal durch 1000 teilen (1000mA=1A).#
Also sieht die ganze Rechnung so aus:
Strom =ADC0 * 773
Strom =Strom/100000

Als nächstes wird die am Akkus liegende Spannung erfasst
Spannung:
U=R*I
U=0,22*Strom

Die Leistung berechnet sich wie folgt:
P=U*I
P=Soannung * Strom

Da sich der Strom und damit die Spannung und auch die Leistung über den gesammten lade-Entladezeitraum nicht statisch verhält also sich je meist stetig ändert,
müssen wir einen Durschnittswert errechnen indem zu jeder Sekunde der messwert neu erfasst wird und jeweils mit dem alten wert ein Mittelwert gebildet wird.

Mit Timer 1 wird ein Sekundentakt genereiert, Nach jeder Sekunde wird in die Unterroutine "Routine_sekundentakt" gesprungen dort wird der Messwert zu
jeder Sekunde mit dem alten Messwert addiert und das Ergebnis durch 2 geteilt somit haben wir als Messwert2 immwe dwn Durschnittswert.

Das Programm

Zeile
Programm
Beschreibung
1
$regfile "m32def.dat" Definiert den Atmega als Atmega 32
2
$crystal = 1000000 Taktfrequenz auf 1 Mega setzen (Standard)
3
Config Lcd = 16 * 2 definiert das LCD Display in Art und Größe 16 Zeichen , 2 Zeilen
4
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.6 , Rs = Portc.5 , E = Portc.4 Bestimmt die Display Anschlüsse am Atmega
5
Dim I As Word Variable deklarieren für den Wert aus Analogeingang ADC0
6
Dim Ampere As Single
7
Dim U As Word Wert für Spannung aus Analogeingang ADC1 holen
8
Dim Volt As Single
9
Dim Spannung_widerstand As Single
10
Dim Sekunde As Word
11
Dim Watt As Single
12
Dim Energie As Single
13
Dim Watt_h As Single
14
Dim Strom As Single
15
Dim Ampere_h As Single
16
Const Stromfaktor = 578 Konstanten
17
Const Spannungsfaktor = 15
18
On Adc Adc_interrupt Routine für Analogmessung, nicht benutzt
19
Sreg.7 = 1 Globale Interrupt Freigeben
20
Ddrb = &B00000111 B0,B1,B2 als Ausgang für Led's
21
Ddra = &B00000000 Alle Analogpins als Eingänge definieren
22
Admux = &B00000000 Bit 7+6 =00 für externe Referenzspannung an Pin AREF (hier 1,66 Volt) ' 01 Anschluß AVCC dient als Referenz ' 10 ohne Funktion ' 11 interne Referenz 2,56 Volt, Ablock kondensator an Aref ' Bit 5 = 0 für 10 Bit Auflösung ( 1= 8 Bit ) ' Bit 3 nur benötigt bei Vergeichfunktion der Analogeingänge hier nicht " ' Bit 2 -1 -0 für die Wahl des Eingangs der abgefragt werden soll ' 000= ADC0 ' 001= ADC1 ' 010= ADC2 usw.
23
Adcsr = &B11001111 Bit 7 = 1 schaltet A/D Wandler ein (Standard=0) ' Bit 6 = 1 startet die Konvertierung ' Bit 5 = 1 Freilaufmodus für permanente Konvertierung ' Bit 3 = 1 Interrupt benutzen ' Bit 2-1-0 legt die Sample Rate fest 010 Takt / 4 ' 111 Takt / 128 ' Sampler Rate sollte zwischen 50 Khz und 200 Khz liegen.
24
On Timer1 Routine_sekundentakt Unterroutine für Timer 1 festlegen
25
Tccr1a = &B00000000 Konfiguration für Timer1
26
Tccr1b = &B00000011 Takt durch 64 teilen
27
Timsk = &B00000100 Interrupt für Timerüberlauf einschalten
28
Timer1 = 49911 Timer Vorgabewert um auf 1 Sekunde zu kommen
29
Do
30
Portb.2 = 0
31
If Sekunde <> Sekunde Then Erst wenn sic die Sekunde geändert hatlass das Programm weiter laufen
32
Toggle Portb.0
33
I = Getadc(0) Strom erfassen
34
Ampere = I * Stromfaktor
35
Ampere = Ampere / 100000
36
Locate 1 , 1
37
If Ampere < 10 Then
38
Lcd "";
39
End If
40
Lcd Fusing(ampere , "#.##") ; "A"
41
Spannung_widerstand = Ampere * 22 Spannung die am Widerstand abfällt'Spannung_widerstand = Ampere * 0 , 22 ' also Ampere=22/100
42
Spannung_widerstand = Spannung_widerstand / 100
43
U = Getadc(1) ' Spannung erfassen------------------------
44
Volt = U * Spannungsfaktor
45
Volt = Volt / 1000
46
Volt = Volt - Spannung_widerstand
47
Locate 2 , 1
48
Lcd Fusing(volt , "#.##") ; "V"
49
Watt = Volt * Ampere ' Leistung berechnen in Watt
50
Energie = Watt / 3600 Energie berechnenenergie in einer sekunde
51
Watt_h = Watt_h + Energie wattstunde
52
Locate 2 , 9
53
Lcd Fusing(watt_h , "#.####") ; "wh"
54
Strom = Ampere / 3600 Ampere Sunden berechnen
55
Ampere_h = Ampere_h + Strom
56
Locate 1 , 9
57
Lcd Fusing(ampere_h , "#.####") ; "Ah"
58
If U > 1000 Then Gosub Ueberlast Überlastanzeige
59
If I > 1000 Then Gosub Ueberlast
60
Waitms 100
61
End If
62
Loop
63
End
64
Adc_interrupt: Zur Zeit nicht benutzt
65
Return
66
Routine_sekundentakt: Timer1 Interrupt Routine
67
Timer1 = 49911
68
Toggle Portb.2
69
Incr Sekunde
70
Return
71
Ueberlast: Überlastmeldung
72
Portb.0 = 1
73
Waitms 8
74
Portb.1 = 1
75
Waitms 8
76
Portb.2 = 1
77
Waitms 8
78
Portb.0 = 0
79
Waitms 8
80
Portb.1 = 0
81
Waitms 8
82
Portb.2 = 0
83
Return

Fragen, Anrgegungen , Kritik bitte hier




Copyright by Ms2009
letzte Aktualisierung 12.02.2019