Batterieüberwachung, voltage divider und attenuation für MicroPython-Firmware

Grün, grün, grün. Darf ich dann davon ausgehen, dass ich a) bald neue bekomme und b) dann halt bei mir doch der voltage divider des Expansion Boards aktiv ist?

ad a) ja, allerdings erst post mutatio domicilii
ad b) ja! also jumper drauflassen und ich teste mal mit den beiden fraglichen Wertpaaren.

Was ziemlich cool ist, habe den WiPy vom grünen board genommen, auf ein weißes (mit voltage divider gesetzt), LiPo angeschlossen und das Ding ohne jegliche andere Sensoren loslaufen lassen, kein Abbruch, läuft auch ohne physikalische Sensoren durch, super gemacht, @Andreas!

Dann per telnet die logging-Infos ausgelesen:

  218.2603 [terkin.sensor.system     ] DEBUG  : Reading battery level with voltage divider 12/2
  218.3724 [terkin.sensor.system     ] DEBUG  : SystemBatteryLevel: Mean of ADC readings (0-4095) = 1337.3330831527710
  218.3867 [terkin.sensor.system     ] DEBUG  : SystemBatteryLevel: Mean of ADC voltage readings (0-1877mV) = 684.9999904632568
  218.3994 [terkin.sensor.system     ] DEBUG  : SystemBatteryLevel: Variance of ADC readings = 31.1976313591003
  218.4119 [terkin.sensor.system     ] DEBUG  : SystemBatteryLevel: 10**6*Variance/(Mean**2) of ADC readings = 17.0000004768372
  218.4275 [terkin.sensor.system     ] DEBUG  : Battery level: 4.11

und das Mutlimeter sagt auch ähnliches:

Ich sitze gerade dran, wenn Du mir also eine Repro zu

schickst, könnte ich das u.U. berücksichtigen, wenn sich eine sinnvollere Fehlermeldung für einen Edge Case bei der Berechnung ergibt. ZeroDivisionError ist ja durchaus sehr sprechend und wäre für mich völlig in Ordnung. Vielleicht bekommt man noch einen Zusatzhinweis für den Nutzer hinzu – aber sonst?

Als Referenz hier die fragliche Zeile im Code:

Test mit den dokumentierten Widerstandswerten des expansion boards Version 3.0 und 3.2 mit dem expansion board 3.1 und Strom über USB (5 V)

115 kΩ / 56 kΩ

   14.9818 [terkin.sensor.system     ] DEBUG  : Reading battery level with voltage divider 171/56
   [...]
   15.1378 [terkin.sensor.system     ] DEBUG  : Battery level: 5.731554

und 1 MΩ / 1 MΩ

   15.0218 [terkin.sensor.system     ] DEBUG  : Reading battery level with voltage divider 2/1
   [...]
   15.1792 [terkin.sensor.system     ] DEBUG  : Battery level: 3.754

Komisch, passt beides nicht!

So hab mal Nachgemessen. Die beiden Wiederstände sind beim 3.1 beide = 1MΩ.wie beim 3.2
Habe mal mit der Holzhammer Methode einfach bei 4V Vin einen der beiden (!!!ohne aufgestecktem FiPy!!!) mit dem Strommesser Kurzgeschlossen = 4μA bei 4V frei nach Ohm sind das genau 1MΩ der andere mit gleicher Messmethode ist genauso groß.

Wer wissen will wo sie sitzen, es sind die 3 SMD (2xR und 1x C) neben dem ‘Bat’-Jumper Aufschrift ist aber leider nicht drauf hatte vorher mit dem Mikroskop geschaut.

Ich habe es bei mir, mit fremd-eingespeistem USB über Labornetzteil angeschaut.
bei mir auch. 3,75 V bei genau 5,00V über USB

ABER!
Er mist die Spannung des Ladereglers/Akkus und nicht die des USB Ports - 0,4 Volt für einen Laderegler?!.

Gruß Michael

*** Edit: Falschaussage bezüglich der gemessenen Spannung korrigiert.***

1 Like

Habe jetzt verschiedenes probiert - immer mit den Einstellungen für 1 MΩ
/ 1 MΩ, immer ohne USB, nur LiPo!

  • LiPo am expansion board mit aufgesetzter Platine (stacking header)
  • LiPo an der weißen Platine mit expansion board(stacking header)
  • ohne Platine nur expansion board

Immer 3,75 V, da passt doch was nicht?

Hmmm, hier leicht andere Werte!

Stimmt ist schon verwirrend. Ja er misst richtig nur kann er nichts höher als 3,75 V Anzeigen. wenn ich unterhalb Dieser Spannung auf Vin gehe misst er aufs mV genau.
3,75V sind Ja bei diesem Spannungsteiler ja schon 1,875‬ V an Pin 16.
aber stimmt er misst nicht die Batterie sondern VIN.
Die Speisespannung über USB ist nochmal um 0,4V höher (da ist also nochmal was dazwischen.)

Habe es oben sicherheitshalber auch mal geändert.

wenn die Bezugsspannung 1,1 V ist (0 dB), dann

11 dB : 3,903 V

wenn 0 dB als 1V , dann

11 dB : 3,548 V

deshalb hat @roadfox dort im zitierten Artikel andere Werte: fullscale hat er als 1V gesetzt, Du / Ihr setzt dort 1,1 V ein.

1 Like

Vielen Dank, das bestätigen auch meine Praxistests. Damit messe ich über den Software-ADC-Sensor "SystemBatteryLevel" mit 6dB Dämpfung 3.822V, während der FiPy über das Expansion Board v3.1 mit Strom über ein USB-Kabel zu meiner Workstation versorgt wird.

Wären an dieser Stelle 3.822V plausibel?


Die Versorgungsspannung Vin des FiPy soll gemessen werden. Laut Datenblatt darf sie 3.5 V bis 5.5 V betragen. Sie kommt entweder von der MicroUSB-Buchse ( Anschluss +5V ) oder Lipo-Akku ( Anschluss Akku JST ). Intern wird der FiPy (ESP32) mit 3.3V betrieben ( Anschluss 3,3V ) . Deshalb kann auch der AD-Wandler an Pin P8 ( Anschluss Tara - Doppelbelegung ) nur bis max. 3.3 V messen, wenn der interne Verstärker PGA eingeschaltet wurde, noch weniger.

Zum Messen wird die Vin durch den Spannungsteiler R10 ( 1M ) und R11 ( 470k ) auf ca. 1/3 geteilt
( 470 / (1000 + 470 )), damit die Messpannung nicht zu hoch für den AD-Eingang wird.
Ein AnalogDigitalWandler wandelt eine analoge Eingangsspannung in einen digitalen Ausgangswert um.
Ein 8bit-Wandler gibt bei seiner max. Eingangspannung von z.B. 3.0 V den Wert 255 aus.
Die genauen Daten des FiPy-ADW sind hier nicht so wichtig, genau so wie die genauen Widerstandswerte. Wichtig ist, dass die Messpannung nicht zu nah an der max. Messpannung liegt, damit man Luft nach oben hat.
Ich messe einfach und multipliziere den Digitalwert so, dass der Spannungswert dem Multimeterwert entspricht. Dann hat man auch alle Toleranzen in den Widerständen, im ADW und PGA berücksichtigt.

3 Likes

Hi Didi,

I hear you. Du wünschst Dir also in Folge als Alternative zur aktuellen Konfigurationsmöglichkeit der beiden Widerstandswerte
https://github.com/hiveeyes/hiveeyes-micropython-firmware/blob/365229955543a8c7801ae3692573bf2fc649c7fe/settings.example-bob.py#L109-L119

eine Möglichkeit, hier statt resistor_r1 bzw. resistor_r2 einfach einen diskreten Faktor konfigurieren zu können, um vom ADC-Rohwert auf den effektiven Spannungswert zu kommen?

Viele Grüße,
Andreas.

Zwischenbericht

Messung seit letzter Nacht mit überarbeiteter Firmware.

Parameter

  • Auf 1000 kΩ / 1000 kΩ korrigierte Widerstandswerte, passend fürs Pycom Expansion Board v3.1.
  • 60 Sekunden deep sleep time zwischen den Meßzyklen.
  • Stromversorgung über Akku.
  • Abgeschaltetes Logging.

Messungen

Bei VCC-Panel auf FiPy-Testbench-Dashboard. Mit Annotationen.

Ok, langsam kommen wir der Sache näher, mit einem voltage divider von 1 M / 1 M haben wir bei Vin = 5 V einen output von 2,5 V. Mit einer attenuation von 6 dB kommen wir genau in den Grenzbereich der Referenz von 1 V vs. 1,1 V mit 1 V wären es 1.995 V max, mit 1,1 V wären es 2,195 V max, jedenfalls alls < 2,5 V und damit können wir mit den aktuellen Einstellungen und der USB-Spannung diesen voltage divider nich bedienen, bzw. er uns! ;-) Oh Mann! Auch mit einem vollen LiPo mit 4,2 V bekommen wir bei 1 M / 1 M 2,1 V output, was bei 1,0er Referenz und 6 dB zu höch wäre.

Zwei Dinge gelernt: Die Referenz scheint nicht 1,1 V, sondern 1,0 V zu sein. Und wir müssten hier einen Faktor von 11 dB verwenden, wenn wir die Batterie messen wollen!

Mein Vorschlag wäre, gerne das mal testen mit 11 dB, wer es machen möchte. Wir sollten für den Produktivbetrieb aber den voltage divider auf “unsere” Platine verwenden und möglichst bei allen Platinen gleich Verhältnisse der Widerstände!! Macht uns das Leben deutlich einfacher! Dann schalten wir den voltage divider auf dem expansion board per jumper aus und können mit einheitlichem dB fahren und Leute können die Platine auch ohne expansion board verwenden!

Bitte einheitlich die Widerstandswerte in der config!

Den Faktor kann man doch bereits angeben.
1 zu 0,25 wär z.B. die gemessene Spannung ist 1/4 der Gesammtspannung.
Beim Expansionsboard 1 zu 0,5.

Andersrum geht es auch. 2 zu 1 = die Gesammtspannung ist doppelt so hoch wie die gemessene.

Gruße

Vielen Dank für Eure Rückmeldungen. Ich will hier kurz zusammenfassen.

  • Wir lassen es einheitlich bei der aktuellen Konfigurationsmöglichkeit per resistor_r1 bzw. resistor_r2, wenn damit alle zufrieden sind.
  • Wir sollten ein paar Messreihen mit 11 dB Dämpfung unternehmen.
  • Auf verschiedenen Boards selbstentwickelter Hardware streben wir einheitliche Widerstandsverhältnisse an, um möglichst interoperabel zu bleiben.

Comments welcome.

2 Likes

Hmm, nicht sehr dolle, nicht mal 8 h Laufzeit!

Btw. das expansion board frisst auch einiges an Strom, stromsparender ist daher der Betrieb ohne expansion board.

Was ich mir fürs logging / debugging vs. Strom sparen auch noch wünschen würde: Aktuell leuchtet die RGB-LED bei ?? Übertragung / Messung, weiß nicht genau, das ist gut für die Entwicklung sollte per settings-Variable aber deaktiviert werden können um Strom einzusparen.

Ja.

Verstanden. Dazu fehlt mehr derzeit leider die Hardware. Zwinker ;].

Ja.