Forum: Mikrocontroller und Digitale Elektronik Anzeige mit INA219 schwankt um den Nullpunkt


von Peter (Gast)


Lesenswert?

Hallo
Zur Messung der Stromaufnahme mit einem INA219 verwende ich das 
Programm:
1
// Strommessung
2
    i2c_start(adr_ina219);      // Angabe Adresse
3
    i2c_write(01);          // Strom
4
    i2c_stop();
5
6
    i2c_start(adr_ina219 +1);    // Auslesen Adresse + 1
7
    msb_strom = i2c_readAck();    //...speichere oberes Bit
8
    lsb_strom = i2c_readNak();    //...speichere unteres Bit
9
    i2c_stop();
10
11
    strom_wrd = (msb_strom << 8 | lsb_strom);  // Zusammensetzung von o. & u. Byte
12
    strom_anz = strom_wrd / 4;
13
14
    itoa(strom_anz, Buffer, 10 );
15
    lcd_printlc(2,9,"     ");  
16
    lcd_printlc(2,9,Buffer);

Da ich für strom_anz ein uint16_t verwende dürfte eigentlich kein 
negativer Wert angezeigt werden. Die Anzeige schwankt aber zwischen -1 
und -4 teilweise sogar bis 16000. Kommt das durch itoa? Wie ändern
Das auslesen der Register und Berechnung habe ich so gemacht. Gibt es 
eine bessere Methode dazu?
( C, AVR GCC, Atmega)

LG Pt

von Tom (Gast)


Lesenswert?


von Karl M. (Gast)


Lesenswert?

Hallo,

wie stellst Du sicher, dass bei dieser Rechnung das erwartete heraus 
kommt?
1
strom_wrd = (msb_strom << 8 | lsb_strom);
keiner von uns kann das selbst beantworte, da wir die Datentypen nicht 
kennen!

von Peter (Gast)


Lesenswert?

Datentypen_
1
uint8_t msb_strom;              // Oberes Strom-Byte
2
uint8_t lsb_strom;              // Unteres Strom-Byte
3
uint16_t strom_wrd;             // Ganzes Strom-Wort
4
uint16_t strom_anz;             // Ganzes Strom-Anzeige

von Peter (Gast)


Lesenswert?

Tom schrieb:
> Jepp. Probier es mal damit:
> 
https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__avr__stdlib_1gad50d835af7e358518fd100179732e948.html

Habe es mir angeschaut, leider versteh ich es nicht.
Kennt jemand eine andere Möglichkeit?

von Karl M. (Gast)


Lesenswert?

Hallo Peter ,

Du weißt schon, dass hier immer 0 heraus kommt?
1
(msb_strom << 8)

von Karl M. (Gast)


Lesenswert?

Hallo Peter,

itoa(...) konvertiert eine integer Zahl mit Vorzeichen, die hat ein 
Vorzeichen, zu ihrer ASCII Darstellung.
"Convert an integer to a string."

utoa(...) konvertiert eine integer Zahl ohne Vorzeichen...
"Convert an unsigned integer to a string."

Alles klar?

von Peter (Gast)


Lesenswert?

Sorry, muss mal fragen um es zu verstehen.

Karl M. schrieb:
> Du weißt schon, dass hier immer 0 heraus kommt?(msb_strom << 8)

Das Stromregister des INA219 besrhet aus einem 16 Bit Wort. Das lade ich 
durch 2 x 8 Bit und füge es zu einem 16 Bit wieder zusammen. Durch das 
Bit verschieben wird aus den 2 x 8 einmal 16 gebildet. Sorry wieso null?

von Peter (Gast)


Lesenswert?

Du warst schneller mit der Antwort als ich mit der Frage. Danke, werde 
es gleich testen.

von Karl M. (Gast)


Lesenswert?

Peter schrieb:
> Sorry, muss mal fragen um es zu verstehen.
>
> Karl M. schrieb:
>> Du weißt schon, dass hier immer 0 heraus kommt?(msb_strom << 8)
>
> Das Stromregister des INA219 besrhet aus einem 16 Bit Wort. Das lade ich
> durch 2 x 8 Bit und füge es zu einem 16 Bit wieder zusammen. Durch das
> Bit verschieben wird aus den 2 x 8 einmal 16 gebildet. Sorry wieso null?

Nun man kann 8 bit um 8 Stellen nach links in eine (interne) 8 bit 
Variable verschieben, dann ist das Ergebnis immer 0.

Du kennst Dich mit "C" aus?

von Peter (Gast)


Lesenswert?

Soweit ja, habe auch das C buch neben mir zu liegen, Leider gibt es auf 
diese Probleme keine Antwort. itoa und utoa stehn gar nicht drin. Werde 
da mal Tante Google bemühen. Habe gearde utao eingesetzt, bringt aber 
keine Veränderung. Der INA219 ist im Leeerlauf dabei erscheint 0 bzw. 
16383. Schliesse ich einen Verbraucher z.B. Led an,wird der Strom 
korrekt dargestellt

von Karl M. (Gast)


Lesenswert?

Hallo Peter,

utoa(...) und itoa(...) sind Standard C Funktionen, der Link mit den 
Beschreibungen zu diesen steht ja oben.

Um dies nutzen zu können muss man <stdlib.h> einbinden.

Wie? mit #inlcude <stdlib.h>!
Dann kann man auch alle weitern aus dieser Bibliothek nutzen:
https://www.microchip.com/webdoc/AVRLibcReferenceManual/ch20s10s01.html

Ich schrieb ja schon, dass die Berechnung NUR ein 8 Bit Ergebnis 
liefert.
Das liegt am fehlenden Cast auf unsigned 16 Bit, das auf die Variable 
|msb_strom| anzuwenden ist.
1
strom_wrd = (msb_strom << 8 | lsb_strom);
Das solltest Du nun selbst lösen können.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Karl M. schrieb:
> Du kennst Dich mit "C" aus?

Vielleicht solltest du auch mal wieder dein C Buch lesen, speziell das 
Kapitel "integral promotion"

Peters Problem liegt woanders... vermutlich an einer falschen/fehlenden 
Initialisierung des INA. Nebenbei bemerkt liefert der INA negative 
Werte, uint16_t ist also schon mal falsch.

von Peter (Gast)


Lesenswert?

Karl M. schrieb:
> Um dies nutzen zu können muss man <stdlib.h> einbinden.

Hatte ich bereits eingebunden.

von Peter (Gast)


Lesenswert?

Michael R. schrieb:
> Vielleicht solltest du auch mal wieder dein C Buch lesen, speziell das
> Kapitel "integral promotion"

Das Teil scheint im Netz auf richtig Aktion zu stossen. Viele dafür und 
viele dagegen. Muss gestehen, es ist auch für mich zu hoch.

Michael R. schrieb:
> Peters Problem liegt woanders... vermutlich an einer falschen/fehlenden
> Initialisierung des INA. Nebenbei bemerkt liefert der INA negative
> Werte, uint16_t ist also schon mal falsch.

Lazût Angabe im Datenblatt ist der INA beim einschalten in einer 
Grundstellung. Dabei können die Daten ohne init ausgelesen werden. Wenn 
er die Werte negative Werte bringt, warum schwankt er den Nullpunkt. 
Lege ich einen Verbraucher an, geht die Anzeige sofort ins positive und 
zeigt korrekt an. Hatte eigentlci angenommen, wenn kein Strom fliesst 
dann ist die Anzeige 0.
Hat noch jemand eine Idee dazu?

LG Peter

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Peter schrieb:
>> Vielleicht solltest du auch mal wieder dein C Buch lesen, speziell das
>> Kapitel "integral promotion"
>
> Das Teil scheint im Netz auf richtig Aktion zu stossen. Viele dafür und
> viele dagegen. Muss gestehen, es ist auch für mich zu hoch.

Der Rat mit "Buch lesen" war auch auf Karl bezogen. Dein Code ist 
prinzipiell richtig.

"dafür und dagagen sein" macht wenig Sinn, wenn es darum geht wie sich 
ein C-Compiler standardkonform zu verhalten hat ;-)


Peter schrieb:
> Hatte eigentlci angenommen, wenn kein Strom fliesst
> dann ist die Anzeige 0.

Bissel rauschen darf er. Stark schwanken kann daher kommen, dass die 
Eingänge "in der Luft" hängen. Schaltplan?

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Sorry einen Schaltplan habe ich nicht. Ist eigentlich das Modul von 
Sparkfunk auf einer kleinen Platine mit so ca. 2x2 cm und mein Aufbau 
dazu um an den Bus zu kommen (Kabel mit Stecker). An den offenen Eingang 
habe ich gar nicht gedacht. Könnte möglich sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.