Stromsensor INA219

NEU: Beispiel 2

Mit dem Stromsensor INA219 und einem in den Verbraucherkreis geschalteten Shunt-Widerstand kann durch Messung der Shunt-Spannung (shunt voltage) und der Bus-Spannung (bus voltage)l der Strom durch den Verbraucher und die Leistung des Verbrauchers gemessen werden.

Die maximale Bus-Spannung ist mit 26 V begrenzt, die maximale Shunt-Spannung kann 320 mV betragen. Bei einem Shunt-Widerstand von 0,1 Ohm kann somit ein maximaler Strom von 3,2 A gemessen werden.

          

Abbildung 1: INA219 auf Breakout Board von Adafruit mit 0,1 Ohm (= R100) Shunt-Widerstand. Auf der rechten Seite sind die beiden Lötbrücken der Adresseingänge A0 und A1 zur Änderung der I2C-Adresse angeordnet.

Beschaltung eines INA219 mit Shunt- und Lastwiderstand:


Abbildung 2: Beschaltung des INA219 mit Shunt- und Lastwiderstand. Der Shunt-Widerstand befindet sich auf dem INA219-Breakout Board.


I2C-Adresse:

Der INA219-Chip besitzt zwei Adresseingänge A0 und A1. Durch Beschaltung der Adresseingänge mit GND, VCC, SCL oder SDA könnte der INA219 auf insgesamt 16 mögliche Adressen (0x40 bis 0x4F) eingestellt werden.

Auf dem INA219-Breakout Board (siehe Abbildung 1) sind die Adresseingänge bereits mit Pulldown-Widerständen versehen, so dass standardmäßig die I2C-Adresse 0x40 eingestellt ist. Die beiden Adresseingänge können über zwei Lötbrücke mit VCC verbunden werden, dadurch sind zusätzlich noch folgende Adressen einstellbar:

  • A0 auf VCC            : 0x41
  • A1 auf VCC            : 0x44
  • A0 und A1 auf VCC: 0x45


Testaufbau:

Verwendete Bauteile:

  • 1 Arduino Nano
  • 1 INA219 Breakout Board
  • 1 Netzgerät, z.B. 0-30 V, 3 A
  • 1 Lastwiderstand (z.B. niederohmiger Drahtwiderstand mit hoher Leistung) -> siehe nachfolgende Auslegungshilfe


Abbildung 3: Testaufbau des INA219 mit Lastwiderstand


Auslegung bzw. Auswahl des Lastwiderstandes:

(Alle nachfolgende Werte gelten für einen Shunt-Widerstand von 0,1 Ohm!)

Bei der Auswahl des Lastwiderstandes ist folgendes zu berücksichtigen: Ist der Lastwiderstand groß gewählt, z.B. 100 Ohm, so beträgt der maximale Strom bei 26 V Versorgungsspannung nur 0,26 A. Ist der Lastwiderstand allerdings sehr klein gewählt, z.B. 3 Ohm, so beträgt der Strom bereits bei knapp 10 V Versorgungsspannung sein Maximum von 3,2 A. Der Lastwiderstand müsste dann für eine Leistung von mindestens 30 W ausgelegt sein und auch das Netzteil muss in der Lage sein, diesen Strom zu liefern (siehe Abbildung 4).


Abbildung 4: Beispiel Berechnung von Strom und Leistung mit einem Lastwiderstand von 3 Ohm


Die Auslegung des Lastwiderstandes bzw. die Überprüfung der Werte bei einem vorhandenem Lastwiderstand kann mit diesem Excel-File INA219 Auslegung Lastwiderstand.xlsx.txt erfolgen. Dazu die Datei speichern und das Suffix ".txt" aus dem Dateinamen entfernen. Durch Vorgabe von Shunt-Widerstand, Versorgungsspannung und Lastwiderstand werden die Spannungsabfälle am Shunt- und Lastwiderstand, sowie der Strom durch und die Leistung am Shunt-Widerstand berechnet.

Bei meinem Testaufbau verwende ich als Lastwiderstand RL zwei parallelgeschaltete 18 Ohm, 9 W Widerstände (was einen Gesamtwiderstand von 9 Ohm, 18 W ergibt) aus meiner Bastelkiste, angeblich Kathodenwiderstände aus einem Röhrenverstärkern, wie sie auch noch z.B. auf Ebay erhältlich sind. Damit decke ich für meine Testschaltung bei einer Versorgungsspannung von bis ca. 13 V einen Laststrom bis zu 1,43 A (was einer Leistung von ca. 18 W entspricht) ab.

Achtung: Bereits bei geringen Leistungen am Lastwiderstand RL wird der Lastwiderstand sehr warm und bei höheren Leistungen richtig heiß, daher Vorsicht vor Verbrennungen bzw. Beschädigung von dem Lastwiderstand nahekommenden oder anliegenden Teilen (wie z.B. dem Steckbrett).

Library MyINA219 für Arduino und Attiny45/85:

Folgende Funktionen stehen derzeit zur Verfügung:


  • Abfrage, ob der Baustein über I2C ansprechbar ist
  • Setzen von Betriebsparametern (Auflösung, Spannungsbereich, Verstärkung)
  • Setzen der Größe des Shunt-Widerstandes  1)
  • Start einer Einzelmessung
  • Start der kontinuierlichen Messung
  • Auslesen der Rohwerte
  • Berechnen von Shunt- und Busspannung, Strom und Leistung
  • Auslesen von Spannungsbereich und Verstärkung
  • Setzen von Betriebsmoden (einschließlich Schlafmodus = power-down Modus  2))
  • Abfrage, ob Strom- oder Spannungsbereich überschritten ist
  • Abfrage, ob Daten zum Auslesen bereit sind
  • Rücksetzen des Bausteins
  • Ausgabe des Configuration-Register am Seriellen Monitor (nur für Kontrollzwecke, nicht für Attiny)  3)


1)  Standardmäßig ist auf dem INA219 Breakout-Board ein 0,1 Ohm Shunt-Widerstand verlötet. Die Funktion muss nur dann aufgerufen werden, wenn der verwendete Shunt-Widerstand davon abweicht.

2)  Die Stromaufnahme des INA219 im Schlafmodus beträgt ca. 6 µA.

3)  Zur Kontrolle der Parameter des Sensors kann der Inhalt des 16 Bit breiten Configuration-Register am Seriellen Monitor angezeigt werden. Die Bedeutung der einzelnen Bits sind hier ersichtlich: Register


ADC-Wandlungszeiten und Auflösungen:

Sowohl für Analog-Digital-Wandlung der Bus-Spannung, als auch für die Shunt-Spannung kann jeweils die Bit-Auflösung (9, 10, 11 oder 12 Bit) des ADC (Analog-Digital-Converter) vorgegeben werden. Standardmäßig (= Defaultwert) verwendet der ADC die höchste Auflösung von 12 Bit. In Abbildung 5 ist die Wandlungszeit in Mikrosekunden in Abhängigkeit der Bit-Auflösung bzw. der Anzahl der Abtastungen (Samples) ersichtlich.

Da aber meistens bei einer Strommessung sowohl die Bus-Spannung als auch die Shunt-Spannung eingelesen wird (Vorgabe über den Modus möglich), verdoppelt sich die angegebenen Wandlungszeiten, da ja der ADC die Wandlungen der beiden Spannungen hintereinander ausführt.


Abbildung 5: Wandlungszeiten des ADC in Abhängigkeit der Auflösung bzw. der Anzahl der Abtastungen (Samples)


In Abbildung 6 sind die möglichen Auflösungen von Bus- und Shunt-Spannungen bzw. des Stromes und der Leistung (bei einem Shunt-Widerstand von 0,1 Ohm) ersichtlich. Die Auflösungen der Spannungen hängt einerseits von den vorgegebenen Bit-Auflösungen und andererseits von den vorgegebenen Spannungsbereichen ab. So beträgt z.B. die höchste Auflösung der Shunt-Spannung beim Messbereich 40 mV und einer Bit-Auflösung von 12 Bit 9,77 µV/Bit. Die schlechteste Auflösung der Shunt-Spannung tritt bei einem Messbereich von 320 mV und einer Bit-Auflösung von 9 Bit auf, nämlich 625 µV/Bit. Und auch bei der Bus-Spannung ergeben sich je nach gewähltem Spannungsmessbereich (16 oder 32 V) und der Bit-Auflösung (9, 10, 11, oder 12 Bit) Auflösungen zwischen 3,91 und 62,50 mV/Bit. Auf Basis der gewählten Spannungsauflösungen können nun in der Abbildung 6 auch die Auflösungen des Stromes (µA/Bit) und der Leistung (µW/Bit) abgelesen werden. Die Auflösungen für Strom und Leistung sind allerdings nur bei einem Shunt-Widerstand von 0,1 Ohm - wie er standardmäßig auf den INA219 Breakout Boards verwendet wird - richtig. 

Abbildung 6: Auflösungen von Shunt- und Bus-Spannung, Strom und Leistung bei einem Shunt-Widerstand von 0,1 Ohm


Die Anpassung der Werte in Abbildung 6 auf einen anderen Shunt-Widerstandswert kann mit dem Excel-File INA219 Auflösung.xlsx.txt durchgeführt werden. Dazu die Datei speichern und das Suffix ".txt" aus dem Dateinamen entfernen. Im Tabellenblatt links oben kann ein anderer Shunt-Widerstandswert eingegeben werden. Auch die maximalen Ströme, die in Abhängigkeit des Shunt-Spannungsbereiches und des Shunt-Widerstandes gemessen werden können, werden im Excel-File, wie in Abbildung 7 ersichtlich, angezeigt.


Abbildung 7: Maximal messbare Ströme bei einem Shunt-Widerstand von 0,1 Ohm


Die Library kann hier heruntergeladen werden:

Sollte die Library jemand verwenden oder testen, würde ich mich über eine Rückmeldung sehr freuen!

Version 1.0

MyINA219.cpp.txt

MyINA219.h.txt

keywords.txt

Leider kann ich hier keine "cpp"- oder "h"-Files hochladen, daher zum Verwenden der Library das Suffix ".txt" aus diesen Dateinamen entfernen und in einem neuen Verzeichnis mit dem Namen "MyINA219" im Sketchbook-Ordner im Ordner "libraries" speichern.


Zur Auflistung der Funktionen der Library geht es hier: Funktionen

Programmbeispiele:

Beispiel 1:

Jede Sekunde wird eine Einzelmessung mit einer Spannungsauflösung (Shunt- und Bus-Spannung) von 12 Bit (Default-Einstellung) gestartet. Da eine maximale Shunt-Spannung mit der Anweisung setGain() von +/-40 mV vorgegeben ist, beträgt der maximal messbare Strom 400 mA (I = U / R = 40 mV / 0,1 Ohm = 400 mA). Die maximale Bus-Spannung ist mit der Anweisung setRange() mit 16 V vorgegeben. Sofern nicht der maximale Strom oder die maximale Bus-Spannung überschritten wird, werden aus den vom Sensor erhaltenen Rohwerten, die Werte Shunt-Spannung, Bus-Spannung, Strom und Leistung berechnet und am Seriellen Monitor angezeigt. Durch Anpassung der setRange()- und/oder setGain()-Anweisung kann der maximal messbare Strom erhöht werden.

//Programmbeispiel fuer INA219
//Code fuer Arduino und Attiny45/85
//Author Retian
//Version 1.0


#include <MyINA219.h>

MyINA219 INA(0x40); //I2C-Adresse = 0x40


float shuntVoltage, busVoltage, power, current;


void setup() {
  Serial.begin(115200);

  INA.reset(); //Ruecksetzen aller Register des INA219
  INA.setRange(INA219_RANGE_16); //Messbereich Bus-Spannung = 16 V
  INA.setGain(INA219_GAIN_40); //Messbereich Shuntspannung = +/-40 mV
  INA.init();
}

void loop()

{
  INA.startSingleMeas(); //Start einer Einzelmessung (Modus SHUNT_BUS_VOLTAGE_TRIG)
  while (!INA.conversionReady()); //Warte, bis Messung fertig ist
  if (!INA.currentOverflow() && !INA.voltageOverflow())
  {
    INA.readRawValues(); //Einlesen der Rohwerte


    //Berechnen der Shunt- und Bus-Spannung, des Stromes und der Leistung
    shuntVoltage = INA.calcShuntVoltage();
    busVoltage = INA.calcBusVoltage();
    power = INA.calcPower();
    current = INA.calcCurrent();
   
    Serial.print("Shunt-Spg.: ");
    Serial.print(shuntVoltage, 4);
    Serial.println(" mV");
    Serial.print("Bus-Spg.  : ");
    Serial.print(busVoltage, 4);
    Serial.println(" V");
    Serial.print("Leistung  : ");
    Serial.print(power, 4);
    Serial.println(" mW");
    Serial.print("Strom     : ");
    Serial.print(current, 4);
    Serial.println(" mA");
    Serial.println();
  }
  else Serial.println("Overflow");

  delay(1000);

}


Beispiel 2: INA219 Zähler für Arbeit und Ladung mit automatischer Umschaltung des Messbereichs

Hier geht's zum Zähler