Arduino / AVR: Überlauf nicht nachvollziehbar ?

Gast #5693304
Lesenswert?

Ich habe ein Gerät gebaut, welches beim Laden eines Akkus die mAh zählt, 
Funktion ist gegeben. Der µC ist ein AT328 als A*-Nano.
1
unsigned long mAsek = 0;
2
unsigned long mAh = 0;
3
float Strom = 10.5;
4

5
mAsek = mAsek + (Strom * 5);  // Messung in mA alle 5 Sekunden
6
mAh = mAsek / 3600;

Im Test erfolgt bei etwa 125.000 mAh ein Überlauf. Das stört nicht, da 
ich diese niemals zu erreichen gedenke. Aber:

unsigned long mAsek müsste bis 2^32 = 4.294.967.296 reichen.
Teile ich die durch 3600, komme ich auf 1.193.046 mAh - wo ist mein 
Denkfehler?

Gucke ich auf den Timer millis() und teile 4.294.967.296 durch 3600 und 
durch 24, ergeben sich die bekannten 49,7 Tage - von daher sollte 2^32 
doch passen.
Gast #5693520
Lesenswert?

H.Joachim S. schrieb:
> Wie sieht die Ausgaberoutine aus?
1
float Ah = 11.22;
2

3
if (mAh >= 10000) {   // weil im Display nur 4/5-Stellen verfügbar
4
  Ah = mAh / 1000.00; // ich will zwei Nachkommastellen
5
  lcd.print(Ah, 2);
6
  lcd.print(" Ah");
7
}

Wenn Du den Verdacht in diese Richtung lenken willst, könnte ich ja mal 
ein serial.print der mAs bauen und gucken, was da kommt. Dafür muss ich 
eine Sonderversion mit getürktem Strom bauen, drei Tage unter Reallast 
dauern zu lange.

----------

Joachim B. schrieb:
>> float Strom = 10.5;
> ich verzichte gerne auf float, ist dein Strom A oder mA
> mit int Variablen kannst du doch alles abdecken von µA bia kA

Den Strom liefert die INA219.h in mA als Float, natürlich mit 
Nachkommastellen.

=========

Wie gesagt: Ich beklage keine Fehlfunktion, mich ärgert, das ich das 
Verhalten nicht nachgerechnet bekomme!
#5693568
Lesenswert?

Gleitkommazahlen sind genau um die Null herum, und ungenau für Zahlen 
weit davon weg.

Ein "float" (double gibt es beim avr-gcc nicht, bzw. wird wie float 
behandelt) hat etwa 7 signifikante Stellen, bei (125.000 * 5) könnte das 
schon auffallen...

Rechne die Stromwerte in mA um und speichere sie in einem long. Das 
könnte helfen.
#5693744
Lesenswert?

Manfred schrieb:
> float Ah = 11.22;
> if (mAh >= 10000) {   // weil im Display nur 4/5-Stellen verfügbar
>   Ah = mAh / 1000.00; // ich will zwei Nachkommastellen
>   lcd.print(Ah, 2);
>   lcd.print(" Ah");
> }

Ich kenne Arduino nicht, daher ist das vielleicht eine blöde Frage:
Kann lcd.print() standardmäßig float verarbeiten? Bei der avr-libc muss 
dazu eine spezielle Library (libprintf_flt.a) gelinkt werden.

Gruß,
Bernd

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren