Problem mit Lib für INA219 High-Side Current/Power Shunt Monitor

Hallo,

nutze den INA219 High-Side Current/Voltage/Power Shunt Monitor an einem 24V(nominal) Akkusystem (20-27V) an einem 0,001Ohm (1milliOhm) Shunt mit max +30A (Laden) und -120A (entladen).

Da ich es nicht geschafft habe die Adafuit-Lib entsprechnd anzupassen nutze ich diese hier:

Habe dort schon festgestellt, dass ab 16V ein int value überlauft und in u_int geändert (Issue #3). Jetzt geht es bis 32V (ja laut Datenblatt nur bis 26V aber auf eigenes Risiko)

Probleme habe ich aber bei dem kleinen Shunt und großen Strömen/Leistungen mit diesen Werten. Vermute auch hier einen Variablen Überlauf. Mir ist aber nicht ganz klar, was ich wo ändern muss um es hin zu bekommen.

z.B. bei 25,1V und -5,2mV am Shunt (Also -5,2A) bekomme ich folgende Werte:

raw shunt voltage: 697
raw bus voltage: -15166

shunt voltage: 3.9000 mV
shunt current: 177.5542 mA
bus voltage: 25.1720 V
bus power: 4468.9951 mW

Nutz jemand zufällig auch diese (oder eine andere Lib und kann mir bei der Einstellung/Anpassung an meinen Aufbau helfen?
Vielen Dank für Tipps und Hinweise! :slight_smile:

Mein Code:

/**********************************************

    INA219 library example
    10 May 2012 by johngineer
    this code is public domain. **********************************************/

#include
#include "INA219.h"

INA219 monitor;

void setup()
{
Serial.begin(115200);
monitor.begin(64);
// U-Range 0: 16V, 1:32V; I-Gain 2: 160mV, 3: 320mV; Bit/Avr U; Bit/AVR I; D_MODE 7: cont.
monitor.configure(1, 2, 10, 10, 7);

// Shunt[Ohm]; max Shunt [V]; max U [V]; max ecp. I [A]
monitor.calibrate(0.001, 0.160, 30, 130);

}

void loop()
{

Serial.println("******************");

Serial.print("raw shunt voltage: ");
Serial.println(monitor.shuntVoltageRaw());

Serial.print("raw bus voltage: ");
Serial.println(monitor.busVoltageRaw());

Serial.println("--");

Serial.print("shunt voltage: ");
Serial.print(monitor.shuntVoltage() * 1000, 4);
Serial.println(" mV");

Serial.print("shunt current: ");
Serial.print(monitor.shuntCurrent() * 1000, 4);
Serial.println(" mA");

Serial.print("bus voltage: ");
Serial.print(monitor.busVoltage(), 4);
Serial.println(" V");

Serial.print("bus power: ");
Serial.print(monitor.busPower() * 1000, 4);
Serial.println(" mW");

Serial.println(" ");
Serial.println(" ");

delay(1000);

}

Warum nutzt du keinen Hallsensor? Googele mal nach Hallsensor und Arduino. Bei großen Strömen sind die Dinger einfacher zu handhaben. Auch in (Gleich)Stromzangen für DMM's steckt nichts anderes.
Oder du nutzt statt einem Shut ein ohnehin vorhandenes Kabel der Anlage, an dem du vorne und hinten misst. Und wenn der Spannungsabfall gerade einen Überlauf erzeugt und du kannst den Wertebereich der Variablen nicht erhöhen, dann nutze einen Spannungsteiler, oder ändere die Referenzspannung am AD-Wandler :wink:

Vielen Dank für die umfangreichen Tipps zur Hardware.

nix_mehr_frei:
Warum nutzt du keinen Hallsensor?

Was das angeht habe ich mich schon festgelegt. Aus folgenden Gründen: Hall ist sehr ungenau bei kleinen Strömen um Null. Da das Gnaze für ein BMS mit Bilanzierendem AH-Zähler ist, sind aber auch gerade kleine Ströme (über lange Zeit) sehr wichtig. Das genauste Messverfahren für Stöme ist der Shunt. Und der INA219 ist genau dafür gedacht, sowie er misst auch gleich Spannung und berechnet die Leistung. Also Perfekt.

'Lediglich' die Software, die Library ist (so vermute ich) das Problem in diesem Fall.

nix_mehr_frei:
Oder du nutzt statt einem Shut ein ohnehin vorhandenes Kabel der Anlage, an dem du vorne und hinten misst.

Auch eine gute Idee, aber die Leitung ist so als ganzes in der Länge nicht da bzw. mit 25mm² recht niederohmig. Würde mir "auch nur" den Leistungsbafall über den Shunt ersparen (P=0,001Ohm*(120A)²=14,4W bei 3000W Gesamtleistung = 0,48Prozent. Schon etwas aber so nicht machbar.

nix_mehr_frei:
Und wenn der Spannungsabfall gerade einen Überlauf erzeugt und du kannst den Wertebereich der Variablen nicht erhöhen, dann nutze einen Spannungsteiler, oder ändere die Referenzspannung am AD-Wandler :wink:

So einfach beim INA219 meines Wissens nicht machbar. Alleine schon der Zusätzliche RC-Tiefpass-Filter hat bei R>10Ohm Einfluss auf das Messergebnis.

Würde gerne die Library entsprechend anpassen oder die Lib von Adafruit nutzen, wenn jemand nen Tip für die Konfiguration in meinem Fall hat. :slight_smile:

Vielen Dank. :wink:

Nur für den Fall, Du bekommst es mit den Bibliotheken nicht in den Griff, würde ich die zwei Register Shunt Voltage und Bus Voltage auslesen, Bus Voltage drei Bit nach rechts schieben und mit 4 mV multiplizieren. Die Leistungsbestimmimg ist dann etwas Rechnen auf dem Arduino. Als Testsketch, ob das IC die richtigen Werte sieht, würde ich das sowieso mal machen.