@Philipp Das verregnete Wochenende genutzt und mit dem AN219 experimentiert. Modifikationen am Modul: 1. Shunt ausgetauscht, 20mOhm/2W, 2.: Die Leiterbahnen zum Shunt mit 3x0,5er Draht verstärkt, dies verdrillt als Anschlüsse genutzt. Die Klemmen haben 3,5er Raster und fragwürdige Qualität. Modifikation an der IBT2: Klemmen und Elko runter, Elko 330µ durch 0,47µ Folie ersetzt. In der Plus-Leitung hängt das AN219-Modul, alles so kompakt wie möglich verbaut. Vor dem AN219 ist ein Elko 1000µ/25V verbaut. I²C parallel zum Display verdrahtet. Bei der Masseführung darauf achten das Elko-, Batt- des IBT und der GND-Anschluss des INA219-Moduls möglichst kurz und kräftig aufgebaut sind. Freifliegend verdrahtet für ersten Test gab es nur Datenmüll, insbesondere die Spannungsmessung des INA219 war, freundlich ausgedrückt, schwankend.
Als Lib habe ich die INA219_WE benutzt, damit lässt sich das Ding am komfortabelsten nutzen. In Setup gleich die nötigen Parameter wie Rshunt übergeben
(0.02 Ohm, SAMPLE_MODE=8, Rest default gelassen). Dann für ersten Test quick&dirty überall wo VAmpINT auftauchte getCurrent_mA() eingebaut, ein bisschen Typenkonvertierung (ganze mA..) und --- es geht :-)
Da der INA219 intern eine Mittelwertbildung durchführen kann muss das der ESP/Arduino nicht tun. Mit den gewählten Parametern steht alle rund 4 mS ein neuer Wert bereit, das reicht auch für den Kurzschlussschutz.
Noch ein bisschen am Code rumgepfuscht und auch der ESP8266 kann die Gleisspannung ausgeben :-) Allerdings lastabhängig mit einer Abweichung von etwa 0,2V bei 6A. Das sind etwa 1% vom Messbereich, also im Rahmen dessen was ein einfaches Multimeter schafft, falls jemand das zu ungenau sein sollte...
Zum Auslesen gebe ich dem INA219 neue Parameter mit wenn der Servicemode aktiv ist, anstelle 320 mV 80 mV Range, dann gehen zwar nur noch maximal 4A, aber mit einer Auflösung von etwa 1 mA, und des Timings wegen ina219.setADCMode=BIT_MODE_12, dann steht alle rund 0,5 ms ein neuer Wert bereit. Um als ACK erkannt zu werden müssen 6 Messungen erhöht sein (~3,5 ms).
Auch in dem Bereich getCurrent_mA () großzügig verteilt und nach Behebung einiger Folgefehler (Datentypen...) und setzen passender Schwellen wurde ein Decoder mit simulierter Last (1K an den Motoranschlüssen) problemlos gelesen. Bei rund 16mA ACK-Pulsen :-)
ToDo:
- Code aufräumen, saubere Funktionen bauen, entsprechende #define-Statements anlegen
- testen ob die Adafruit-Library sinnvoller sein könnte, Haken da ist das sie ohne Umbauten keinen anderen Shunt als den serienmäßigen auf dem Board kennt. Out-of-the-box müsst man da bei anderen Shunts eine Umrechnung einbauen bzw. gleich die Raw-Werte verarbeiten.
- testen ob ACK-Erkennung durch Wahl eines geeigneten Sample-Mode zu verbessern ist. SAMPLE_MODE=4 liefert alle rund 2ms einen Wert, also wäre ACK zwei oder drei Messwerte lang und die Messungen dank Mittelwertbildung zuverlässiger
- Möglichkeit im Webfrontend den maximalen Strom für die Abschaltung im Kurzschussfall einzustellen einbauen.