PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Entnommene Strommenge aus Akku in mAh anzeigen



tooltime
26.09.2005, 13:10
Hallo,

ich würde gerne die entnommene Strommenge aus einem Akku berechnen und anzeigen.
Ich messe bereits die Spannung am Akku, und über einen Shunt den Strom.
Wie bekomme ich nun einen Wert für die Elektriziätsmenge? :-k Mir ist klar dass Q = I x t ist, nur ist mein Strom dummerweise nicht konstant.
Später würde ich das gleiche Messverfahren gerne auch im häuslichen Stromnetz verwenden um z.B. die Stromkosten von einzelnen Geräten (Boiler, Waschmaschine usw.) zu ermitteln.


Vielen Dank an alle

SprinterSB
26.09.2005, 13:28
Die im Zeitintervall [T0, T1] entnommene Ladungsmenge ist


Q = \int_{T0}^{T1} I(t) dt


Das könnte man analog über einen Integrator berechnen, aber das ist wohl nich angesagt. Es bleibt dir also nur die Diskretisierung:
Zerstückeln des Zeitintervalls in N Teilstückchen t_i der Länge

delta_t = (T1-T0)/N

Q = \sum{i=1}^N Q(t_i)

und
Q(t_i) = delta_t * I(t_i) (zum Beispiel)
Q(t_i) = delta_t * (I(t_i) + I(t_{i-1})) / 2 (zum Beispiel)

0tes_Gesetz
26.09.2005, 13:29
Hm..

So auf die schnelle würde ich auf integrieren tippen.. also kleinste Sümmchen von I x dt addieren.
Dein dt kannst Du ja als Timerinterrupt geben lassen und dann nimmst Du je nach gewünschter Genauigkeit entweder den gerade aktuellen Stromwert (I) oder einen gemittelten (etwas Code für Mittelwertbildung in Intervall nötig). Diese differentiellen Ergebnisse addierst Du dann auf deinen Gesamt-Energieverbrauchswert drauf..

So in etwa meine Vorstellung davon.
Gruß
Nico

fzehner
26.09.2005, 14:23
Wie die vorhergehenden Antworten schon andeuten, ist es die Berechnung eines Integrals mit dt gegen null.

Betrachtet man das Ganze aber von einer anderen Position, stellt sich Dir doch nur die Frage, wie oft muß I gemessen werden, damit es ein sinnvolles Ergebnis gibt? Dabei spielen die Genauigkeit des Shunts, des A/D-Wandlers und das zu messende Gerät eine Rolle. Schon bei 10 Messungen pro Sekunde wirst Du sehen, dass die Messwerte bereinigt von den Messfehlern bei normalen Haushaltsgeräten nahezu konstant sind, wenn Du nur einen ebenso kleinen Zeitraum von betrachtest.

Gruss
Frank

26.09.2005, 14:55
Bei (fast) DC mit langsamen Stromänderungen ist das alles richtig. Für Wechselstrom und Haushaltsgeräten mit einem signifikanten Induktivitäts- oder Kapazitätsanteil im Verbraucher ist das nicht mehr so einfach. Stichwort Wirkleistung und Blindleistung. Mal abgesehen davon, dass 230V nicht jedemanns Sache sind.
Also, mAh aus dem Akku messen und den Verbauch von 230V-Geräten messen sind praktisch gesehen zwei Paar Stiefel.

ciao .. bernd

bertl100
26.09.2005, 19:30
Also ich würde die Messwerte ungefähr im Abstand von 30 - 50 ms (der µC soll ja auch andere Funktionen audführen) machen und ein Array damit füllen.
Danach den Mittelwert bilden und mit der abgelaufenen Zeit berechnen.


MFg

Vader

bertl100
26.09.2005, 19:32
Vielleicht sogar kürzere Abstände , so 10 - 20 ms

tooltime
26.09.2005, 21:52
Danke schon mal für alle Tipps.

bertl100, könntest du mir das mit den Arrays mal kurz erklären. Klingt sehr interessant. Hab leider nur noch keine Erfahrung damit.
Um eine gute Genauigkeit zu erreichen, denke ich auch, dass mindestens alle 20 ms gemessen werden sollte.

Ich versuche die nächsten Tage einen Codeschnipsel zu basteln.

Gruß
tooltime

recycle
26.09.2005, 23:53
Also ich würde die Messwerte ungefähr im Abstand von 30 - 50 ms (der µC soll ja auch andere Funktionen audführen) machen und ein Array damit füllen.
Danach den Mittelwert bilden und mit der abgelaufenen Zeit berechnen.

Mit Arrays würde ich bei dem knapp bemessenen Speicher eines Controllers sparsam umgehen und Divisionen (z.B. zur Mittelwertbildung) würde ich auch nur vornehmen, wenn es unbedingt sein muss.

Ich glaube, wenn du die Messwerte jeweils mit deinem Zeitintervall multiplizierst und das Ergebnis bei jeder Messung aufaddierst kommst du ungefähr auf dasselbe Ergebnis, sparst deinem Controller aber den Array und die Mittelwertbildung.

SprinterSB
27.09.2005, 09:28
Arrays
brauchst du nicht...wozu auch???

Du hast einen Wert Q, der für die entnommene Ladung steht. Die Einheit ist zB mAh.
In einer Variablen Sum_I wird die Summer der Ströme gemerkt. Zu Anfang der Messung wird Sum_I=0 gesetzt.

Am einfachsten ist es , Q = Sum_I *dt zu setzen, wobei dt die Dauer zwischen 2 Messungen ist und immer gleich bleibt.
Denkbar wäre ein dt = 31.25ms = 1/32 Sekunde. Die Multiplikation mit dt ist dann eine Division durch 32, was durch einen 5-fachen Rechts-Shift zu erledigen ist -- große und langwierige Divisionsroutinen braucht's nicht, ebensowenig Arrays. Ist [I] = mA , dann ist die Einheit von Q: [Q] = mAs.

fzehner
27.09.2005, 09:42
Im ersten Versuch solltest Du nur die reinen Werte des AD-Wandlers in einem Array speichern und am Ende auf dem PC in einem Diagramm ausgeben, damit Du abschätzen kannst wieviele Messungen Du wirklich benötigst.
Bei konstanten Zeitintervallen reicht es, die Werte einfach zu addieren. Ansonsten wie recycle schon vorschlägt, mit dem Zeitintervall (Timerticks) multiplizieren und aufaddieren.
Den korrekten Wert kannst Du dann 1- oder 2-mal pro Sekunde ausgeben, bzw wenn Du die Werte in ein Array schreibst, kann dann der PC den richtigen Wert berechnen.

27.09.2005, 11:34
kann man nicht einfach die Auf-oder Entladezeiten von Kondensatoren auswerten. Also eine I/f - Wandlung vornehmen.

robotronix

bhm
27.09.2005, 13:35
Wie kann das genau aussehen?

tooltime
29.09.2005, 14:37
Schön dass meine Frage doch auf etwas Interesse gestoßen ist.

Mein Hauptproblem liegt nicht in der Mathematik oder Elektrotechnik, sondern in der Umsetzung in Bascom.

SprinterSB:
Wenn ich es richtig verstanden habe, würdest du alle 31,25ms (im Timer denke ich) eine Messung starten und die Werte 32-mal addieren. Die Summe dann durch 32 teilen. Dann alles mit 3600 multiplizieren und ich erhalte Ah. Im nächsten Schritt jede Sekunde Ah auf Summe_Ah aufaddieren. Dann wieder von vorne.
Nur was meinst du mit: „Die Multiplikation mit dt ist dann eine Division durch 32, was durch einen 5-fachen Rechts-Shift zu erledigen ist“
Was ist ein 5-facher Rechts-Shift?

fzehner:
Es wäre schön, wenn ich die Daten auch auf meinem PC auswerten könnte. Leider fehlen mir leider die nötigen Programmierkenntnisse um ein Programm zu schreiben, dass mir z.B. eine Leistungskurve in Abhängigkeit von der Zeit darstellt. Solltest du da ein paar Tipps haben, wäre ich dir sehr dankbar. Als nächster Schritt wäre dass ein nützliches Feature.


Gruß
tooltime

SprinterSB
29.09.2005, 17:24
Wenn ich es richtig verstanden habe, würdest du alle 31,25ms (im Timer denke ich) eine Messung starten und die Werte 32-mal addieren. Die Summe dann durch 32 teilen. Dann alles mit 3600 multiplizieren und ich erhalte Ah. Im nächsten Schritt jede Sekunde Ah auf Summe_Ah aufaddieren. Dann wieder von vorne.
Jepp. Nur, daß ich duch 3600 teilen würde, um von As auf Ah zu kommen ;-)


Nur was meinst du mit: „Die Multiplikation mit dt ist dann eine Division durch 32, was durch einen 5-fachen Rechts-Shift zu erledigen ist“
Was ist ein 5-facher Rechts-Shift?
Divisionen sind teuer, sowohl was Rechenzeit angeht als auch Speicherbedarf. Teilen durch 2 ist einfach zu realisieren, indem man die zu teilende Zahl um 1 nach rechts schiebt (shiftet) -- voarusgesetzt, die Zahl ist in der richtigen Darstellung dafür. Das entspricht dem Teilen im Zehnersystem durch 10, indem man einfach das Komma eine Stelle nach links schiebt. Durch 7 teilen ist dagagen komplizierten.
Wenn du 5 mal durch 2 teilst hast du eine Division durch 32 -- obgleich 5 mal 2 gleich 10 ist *staun*.

bhm
30.09.2005, 09:06
...
Wenn du 5 mal durch 2 teilst hast du eine Division durch 32 -- obgleich 5 mal 2 gleich 10 ist *staun*.
2^5 # 2*5 !
Sprache ist halt etwas ungenau, oder zumindest mehrdeutig.

ciao .. bernd

07.10.2005, 07:24
Divisionen sind teuer, sowohl was Rechenzeit angeht als auch Speicherbedarf. Teilen durch 2 ist einfach zu realisieren, indem man die zu teilende Zahl um 1 nach rechts schiebt (shiftet) -- voarusgesetzt, die Zahl ist in der richtigen Darstellung dafür. Das entspricht dem Teilen im Zehnersystem durch 10, indem man einfach das Komma eine Stelle nach links schiebt. Durch 7 teilen ist dagagen komplizierten.
Wenn du 5 mal durch 2 teilst hast du eine Division durch 32 -- obgleich 5 mal 2 gleich 10 ist *staun*.

Alles klar :-k

Könntest du evtl. ein kleines Bascom-Beispiel beifügen?
Dieser Rechenschritt würde mich wirklich interessieren. Vielleicht verstehe ich es ja, wenn ich es vor mir sehe.

Danke

tooltime
07.10.2005, 07:27
Ach ja, ich war das eben.