mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Zur Messung der Stromaufnahme mit einem INA219 verwende ich das 
Programm:
// Strommessung
    i2c_start(adr_ina219);      // Angabe Adresse
    i2c_write(01);          // Strom
    i2c_stop();

    i2c_start(adr_ina219 +1);    // Auslesen Adresse + 1
    msb_strom = i2c_readAck();    //...speichere oberes Bit
    lsb_strom = i2c_readNak();    //...speichere unteres Bit
    i2c_stop();

    strom_wrd = (msb_strom << 8 | lsb_strom);  // Zusammensetzung von o. & u. Byte
    strom_anz = strom_wrd / 4;

    itoa(strom_anz, Buffer, 10 );
    lcd_printlc(2,9,"     ");  
    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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datentypen_
uint8_t msb_strom;              // Oberes Strom-Byte
uint8_t lsb_strom;              // Unteres Strom-Byte
uint16_t strom_wrd;             // Ganzes Strom-Wort
uint16_t strom_anz;             // Ganzes Strom-Anzeige

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter ,

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

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

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

Autor: Karl M. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
strom_wrd = (msb_strom << 8 | lsb_strom);
Das solltest Du nun selbst lösen können.

Autor: Michael R. (fisa)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

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

Hatte ich bereits eingebunden.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael R. (fisa)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.