Forum: Mikrocontroller und Digitale Elektronik Strommessung mit INA219


von Henry (Gast)


Lesenswert?

Hallo
Habe mir den Stromsensor INA 219 gekauft. Das Datenblatt habe ich 
gefunden und bin beim studieren. Anschluss und Adresse ist auch klar.
Wenn ich im Netz nach Beispielen oder Anwendung dazu suche bekomme ich 
fast ausschliesslich die Sachen Sparkfun oder was mit Arduino.
Da ich nur mit C programmiere finde ich so gut keine Beispiele.
Hat jemand von euch was dazu oder wo finde ich was dazu?

LG Henry

von Sam W. (sam_w)


Lesenswert?

Du könntest beim I2C Protokoll für AVR/PIC in C anfangen. Das dann so 
einzusetzen, dass du den INA219 auslesen kannst sollte machbar sein :-)

von Wolfgang (Gast)


Lesenswert?

Henry schrieb:
> Da ich nur mit C programmiere finde ich so gut keine Beispiele.

Beispiele für I²C-Handling in C gibt es genug; wie der INA219 gesteuert 
werden muss und was als Wandlungsergebnis raus kommt, steht im 
Datenblatt. Was hast du gegen den Arduino Code und was hindert dich 
daran, die paar Zeilen in C nachzustricken.

von Henry (Gast)


Lesenswert?

Hallo Wolfgang
Habe damals mit einem simplen Atm 128 mit C angefangen. Zufällig bin ich 
nicht zum Arduino gekommen. Eigentlich bin ich heute fast froh darüber. 
Habe mehrmals versucht mich mit dem Arduino anzufreunden. Leider hat das 
Teil einige von meinen Programmen so nicht verstanden. Die Libs scheinen 
nicht so gut zu sein. Das grössere Problem liegt bei mir in der Zeit. 
Arbeite mit TFT Displays (Farbe) mit dem Bus. Das Display hat eine 
Reaktionszeit von ca. 6 Mikrosekunden. Da kommt der Arduino nicht so 
richtig mit. Kann mit dem alten C scheinbar viel machen zu können.
Leider sind einge Sachen bei mir unklar. Wenn ich das Datenblatt richtig 
verstanden habe, kommt das Ergbnis als 16 Bit mit MSB und LSB. In 
einigen Sachen von Arduino und vom Hersteller steht was Einstellung oder 
sogar Kalibrierung. Das andere Problem ist der Code selber. Wenn ich 
Beispiel im Netz finde kann es so um die 500 Zeilen Code haben. Wozu so 
viel?
Bei anderen Sachen mache es in 30 Zeilen mit Umrechnung.

LG Henry

PS: ich verwende kein delay (meistens)

von Alex G. (dragongamer)


Lesenswert?

@Henry
Was hat dein Aufsatz denn jetzt mit dem Thema zutun?

Arduino ist auch nur C und dabei open source. D.h. wenn man C kann, 
sollte es möglich sein, dessen library zum Ansprechen des INA219 
umzubauen bzw. sie als Hilfe nehmen um zu verstehen, wie die 
Kommunikation funktioniert.

von STK500-Besitzer (Gast)


Lesenswert?

Henry schrieb:
> Die Libs scheinen nicht so gut zu sein.

Die "Mach-was-das-so-wie-ich-will"-Funktion ist genauso kompliziert wie 
der automatische Blinker bei Audi, BMW etc.

Henry schrieb:
> Das Display hat eine Reaktionszeit von ca. 6 Mikrosekunden.
Was hat das mit dem INA-Problem zutun?

Henry schrieb:
> Wenn ich das Datenblatt richtig
> verstanden habe, kommt das Ergbnis als 16 Bit mit MSB und LSB

Jepp. Das erste der beiden Bytes ist das MSB.

Henry schrieb:
> Wenn ich Beispiel im Netz finde kann es so um die 500 Zeilen Code haben.
> Wozu so viel?
Mit Display-Ausgabe oder anderem Spielkram.
Vielleicht hat auch einfach ein Anfänger sein Werk veröffentlicht, weil 
er der Meinung ist, dass das der Welt gefehlt hat.
> Bei anderen Sachen mache es in 30 Zeilen mit Umrechnung.

von Henry (Gast)


Lesenswert?

Das mit der Reaktionszeit hat mit Arduino zu tun. Da scheinbar vorrangig 
delay benutzt wird ist die Zeit einfach zu langsam um auf das Display zu 
reagieren. In anderen Beiträgen wird hier auf das "Grottenschlechte" IDE 
von Arduino verwiesen.
Wozu auf das schlechte gehen wemm es etwas besserens gibt. AVR oder 
Studio sei mal dahin gestellt ob es soviel besser ist. Sicher hat jede 
Sparche oder Programm seine Vor- oder Nachteile.

LG Henry

von Wolfgang (Gast)


Lesenswert?

Henry schrieb:
> Da kommt der Arduino nicht so richtig mit.

Liegt es am Prozessor oder am Code?
IMHO die meisten Arduinos nutzen einen ATmega328, manche einen SAM3X8E 
ARM und den ESP8266 bzw. den ESP32 von Espressif kann man auch wie einen 
Arduino benutzen. Letzter haben aber einiges im Hintergrund laufen, was 
evtl. das Timing kaputt macht.
Auf den INA219 kannst du maximal im High Speed Mode des I2C zugreifen 
(Umschaltung s. Datenblatt 8.5.6.1 High-Speed I2C Mode).

Vielleicht hilft dir der folgende Thread weiter, der die Wire-Bibliothek 
beim Arduino umgeht und für den Zugriff direkt auf den C-Code aufsetzt.
https://electronics.stackexchange.com/questions/29457/how-to-make-arduino-do-high-speed-i2c

Henry schrieb:
> PS: ich verwende kein delay (meistens)
Das wäre ja auch noch schöner ;-)

von STK500-Besitzer (Gast)


Lesenswert?

Henry schrieb:
> Wozu auf das schlechte gehen wemm es etwas besserens gibt

Wenn man damit schnell mal Sachen testen kann?!
Es gibt da z.B. den I²C-Bus-Scanner, der sämtliche Geräte anzeigt, die 
am Bus erkannt werden.
Wenn man ein System komplett neu entwickelt, und mit irgendwelchen 
Sensoren ausstattet, die man nur vom Datenblatt kennt, dann ist es ganz 
praktisch, wenn man die mit einem System testen kann, wo zumindest die 
Schnittstellengeschichte schon mal funktioniert.

von Henry (Gast)


Lesenswert?

Einen Scanner für den I2C Bus habe ich (nicht Arduino) in C geschrieben. 
Anzeige ist auf einem Display mit 4x16 Zeichen. Das ist immer der erste 
Test um zu schauen was los ist.
Verwende den Atm 128 und für grössere Sachen den SAM21D. Bin am ESP 32 
dran. Ist aber eine andere Klasse für mich und brauche noch Zeit um es 
zu verstehen.
Trotzdem bleibt die Frage nach dem INA 219 und ein paar Beispiele dazu.

LG Henry

von Wolfgang (Gast)


Lesenswert?

Henry schrieb:
> Trotzdem bleibt die Frage nach dem INA 219 und ein paar Beispiele dazu.

Alles, was spezifisch beim Handling des INA219 spezifisch ist, kannst du 
doch ohne Probleme aus den weit verbreiteten Bibliotheken abgucken und 
dabei deine Basis-I2C-Routinen verwenden. Optimieren auf dein Timing 
kannst du immer noch, wenn die grundlegende Funktionalität erstmal 
gegeben und verstanden ist.
https://github.com/adafruit/Adafruit_INA219

von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

Henry schrieb:
> Wozu so viel?

Willst Du hier den Troll geben oder eine Lösung haben?

Wenn Du wirklich C programmieren kannst, dürftest Du aus einer 
Arduino-Library die notwendigen Beispiele herausziehen können.

von Henry (Gast)


Lesenswert?

Habe das PDF mit den Daten des Herstellers soweit gelesen. Wie weit ich 
es verstanden habe ist eine andere Sache.
Wenn ich richtig gelesen habe hat der INA219 5 Register zur Einstellung 
und zum lesen. Muss ich zuerst die Regsiter setzen und kann auslesen?
Die Ausgabe erfolgt als erstes im MSB und dann im LSB.
1
ret = i2c_start(ina219);          // Start Lesen des LM75
2
  if (ret == 0)
3
  {                         // Wenn LM75 ein OK sendet...
4
    msb_strom = i2c_readAck();    //...speichere oberes Bit
5
    lsb_strom = i2c_readNak();    //...speichere unteres Bit
6
  }
7
  else                                // Fehlererkennung
8
  {                              // Wenn LM75 kein OK sendet
9
    lcd_command(LCD_CLEAR);      // Leere Display
10
    lcd_printlc(1,13,"READ");    // "Lesevorgang"
11
    lcd_printlc(2,13,"NOK");    // "Nicht OK (NOK)"
12
  }
Mit diesem Code kann ich überprüfen ob mein Slave vorhanden ist und MSB 
und LSB auslesen.
1
stromfassung();                        // Unterprg Strom.auslesung
2
    strom_wrd = (msb_strom << 8 | lsb_strom);  // Zusammensetzung von o. & u. Byte
3
    strom = msb_strom;                  // Umwandlung in ein Signed Char
damit wird dann strom_wrd gebildet und kann dann verarbeitet werden
Bleibt die Frage mit den Registern.

LG Henry

von Henry (Gast)


Lesenswert?

Möchte nicht als Troll hingestellt werden. Leider habe ich Probleme mit 
dem Code in deinem Beispiel. Der ist in C++ geschrieben. Arbeite aber 
mit C und es gibt dabei doch unterschiede die ich nicht verstehe.

LG Henry

von STK500-Besitzer (Gast)


Lesenswert?

Henry schrieb:
> Arbeite aber mit C und es gibt dabei doch unterschiede die ich nicht
> verstehe.

Dann stell genau zu diesen Problemen Fragen.
Einfach nur zu sagen "Ich brauche ein Beispiel in C für den INA219." 
klingt nach "Kann mir mal jemand die Schnürsenkel binden?!".

Henry schrieb:
> Bleibt die Frage mit den Registern.

Welche? (kann natürlich sein, dass ich das mal wieder überlesen habe)

Der Sensor verwendet 16-Bit-Register, also immer zwei Bytes.
Und immer zuerst das MSB und dann das LSB im Datenstrom.

von Fragenüberfragen (Gast)


Lesenswert?


von Henry (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Einfach nur zu sagen "Ich brauche ein Beispiel in C für den INA219."

Hatte gedacht das ich es so gesagt habe.

STK500-Besitzer schrieb:
>> Bleibt die Frage mit den Registern.

Welche Register hat der INA219 und welches Regsiter dient wozu?

Jetzt die richtigen Fragen gestellt?

LG Henry

von Viktor (Gast)


Angehängte Dateien:

Lesenswert?

Henry schrieb:
> Welche Register hat der INA219 und welches Regsiter dient wozu?
Siehe Datenblatt.

Laß Dir doch mal die Werte der ersten drei Register ausgeben und prüfe 
auf Plausibilität.

von Stefan F. (Gast)


Lesenswert?

> Das mit der Reaktionszeit hat mit Arduino zu tun.
> Da scheinbar vorrangig delay benutzt wird ist die Zeit
> einfach zu langsam um auf das Display zu reagieren.

Das Display ist ein Ausgabegerät, mir ist unklar, worauf du da reagieren 
möchtest. Ob und wie intensiv jemand die delay Funktion verwendet, gibt 
das Arduino Framework nicht vor.

> In anderen Beiträgen wird hier auf das "Grottenschlechte"
> IDE von Arduino verwiesen.

Anstatt die Meinung anderer zu wiederholen, solltest Du dir besser deine 
eigene Meinung durch praktische Erfahrung aufbauen. Die IDE von Arduino 
ist in erster Linie einfach, Anfänger-freundlich, und ganz sicher nicht 
schlecht. Sie funktioniert zuverlässig (sehr viel zuverlässiger als z.B. 
das Atmel Studio), sie tut was sie soll.

Wenn du eine komplexe IDE bevorzugst: Bitte, dann verwende sie. Heule 
dann aber  nicht herum, dass Dich die vielen Einstellmöglichkeiten 
verwirren oder dass du mit irgend einer Tastenkombination etwas verbockt 
hast und nun nicht mehr zurück findest.

Das Arduino Framework unterstützt die Verwendung anderer IDE 
ausdrücklich, und zwar gleich doppelt. Du kannst Arduino als Compiler in 
deine IDE einbinden, oder du nutzt deine IDE nur als "besseren" 
Text-Editor und verwendest weiterhin die Arduino IDE zum Kompilieren und 
Flashen.

> wenn ich im Netz nach Beispielen oder Anwendung dazu suche bekomme
> ich fast ausschliesslich die Sachen Sparkfun oder was mit Arduino.

Was wohl daran liegt, dass dieser Chip im Arduino Umfeld beliebt 
geworden ist. Die Hersteller von Arduino Shields veröffentlichen dazu 
passende Programmierbeispiele, damit sie ihre Hardware besser verkaufen 
können.

Wenn du das als Nachteil empfindest (finde ich Unsinnig, aber egal), 
dann entscheide Dich für einen anderen Chip. Aber erwarte nicht, dass 
der Chip-Hersteller großartige Programmierbeispiele liefert. Das hat er 
nämlich nicht nötig, denn er verkauft seine Chips in großen Mengen an 
Firmen, die das selbst hinbekommen oder für entsprechenden Support 
bezahlen.

Außerdem sind die wenigen Programmbeispiele der Chip-Hersteller zu 95% 
Wahrscheinlichkeit nicht in der Sprache oder der IDE verfasst, die du 
gerade sehen möchtest.

von Henry (Gast)


Lesenswert?

Habe weiter gemacht. Code sieht jetzt so aus:
1
/////////// REGISTER DEFINITION /////////////////
2
#define INA219_CONFIG              0x00
3
#define INA219_SHUNT_V             0x01
4
#define INA219_BUS_VOLT            0x02
5
#define INA219_POWER               0x03
6
#define INA219_CURRENT             0x04
7
#define INA219_CALBLATION          0x05
8
9
#define ina219 0x80           // Leseadresse des INA219 0x81
10
11
i2c_start(ina219 +1);    // Auslesen Adresse + 1
12
Data_1 = i2c_readAck();        // liest Eingang MSB
13
Data_2 = i2c_readNak();        // liest Eingäng LSB
14
i2c_stop();
Mit diesen beiden kann ich Spannung und Strom auslesen:
1
#define INA219_SHUNT_V             0x01
2
#define INA219_BUS_VOLT            0x02
Wenn ich das richtig verstanden habe, kann ich mit SHUNT_V die Spannung 
über den Shunt lesen und mit BUS_VOLT die die Spannung am Shunt lesen.
Wie kann ich einstellen was gelesen werden soll?
Kommen beide Werte als 16 Bit?
Was kommt ich am Power lesen?

LG Henry

von Henry (Gast)


Lesenswert?

Habe noch ein Stück vergessen
1
i2c_start(ina219);      // Angabe Adresse
2
  i2c_write(INA219_SHUNT_V);
3
  i2c_stop();

von Wolfgang (Gast)


Lesenswert?

Stefan U. schrieb:
> Du kannst Arduino als Compiler in
> deine IDE einbinden, oder du nutzt deine IDE nur als "besseren"
> Text-Editor und verwendest weiterhin die Arduino IDE zum Kompilieren und
> Flashen.

Was hat Arduino mit Compiler zu tun. Die Arduino IDE verwendet den GCC

von Stefan F. (Gast)


Lesenswert?

> Was hat Arduino mit Compiler zu tun?

Warscheinlch bist Du gewohnt, make zu benutzen. Arduino hat dafür einen 
eigenen spezifischen Ersatz.

Der avr-gcc muss mehrfach mit unterschiedlichen Parametern aufgerufen 
werden, um die einzelnen Dateien zu compilieren und zu linken. Um diese 
Ablaufsteuerung kümmern sich Kommandozeilentools, welche die Arduino IDE 
aufruft.

von Viktor (Gast)


Lesenswert?

Henry schrieb:
> Wie kann ich einstellen was gelesen werden soll?
Datenblatt lesen: http://www.ti.com/lit/ds/symlink/ina219.pdf
Seite 16

> Kommen beide Werte als 16 Bit?
Ja.

> Was kommt ich am Power lesen?
Erstmal 0x0000.

Schreib Dir mal zwei Funktionen, damit Du Struktur in Deinen Code 
bekommst:
1
uint16_t ina219_read_word( uint8_t reg)
2
{
3
   ... bitte selber ausdenken ...
4
}
5
6
void ina219_write_word( uint8_t reg, uint16_t value)
7
{
8
   ... bitte selber ausdenken ...
9
}

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.