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

Sorry für die späte Antwort bin gerade etwas im Stress und habe die Beiträge nur überflogen
Was ist denn die höchste Spannung die wir messen wollen?
Der FiPy verträgt meines Wissens nicht mehr als 5,5 V richtig?
Und der Pin an dem wir messen wollen 1.1V
Wenn ich jetzt die Werte von Clemens Board rechne (10M/2M). Komme ich bei 6V Vin auf 1V. Für mich nahezu Perfekt mit etwas Reserve.

Bei mir sind die Werte aus der Beispiel total daneben, und wenn ich die Richtigen Werte nach Clemens Board eintrage 6 zu 1 (ja das Verhältnis reicht) aufs mV genau.

Fürs Expansionsboard kann ich heute Abend Mal ausrechnen, welche Werte wir da nehmen können.

Zähes Thema, wenn man sich so gar nicht auskennt! :-/ Wenn jetzt jemand denkt Physik x-te Klasse (vielleicht noch einstellg Klasse) möge er / sie / divers schweigen. ;-) Ich habe hier etwas Info gefunden, wie man eine Verstärkung in dB in einen Verstärkungsfaktor umrechnet: http://www.sengpielaudio.com/Rechner-db.htm, d.h. mit 2,5 dB hat man einen Verstärkungsfaktor von 1,334

2019-06-18%2018_26_12-dB-Rechner%20dB%20berechnen%20Spannung%20Leistung%20Dezibel%20Rechner%20Feldgroesse%20Energiegro

Wenn wir bei 0 dB 1,1 V haben wären es bei 2,5 dB
1,1 V x 1,334 (Faktor) = 1,467 V

oder einfacher berechnen mit http://www.sengpielaudio.com/Rechner-verstaerkung.htm

  0 dB  -  1,1 V
2,5 dB  -  1,467 V
  6 dB  -  2,195 V
 11 dB  -  3,903 V 

Wir kommen mit 5 V maximal (USB-Stromversorgung) und den unterschiedlichen voltage dividern der expansion boards auf um die 1,7 V, siehe posting weiter oben mit unseren eigenen aktuellen voltage dividern auf meiner Platine deutlich darunter!

D.h. mit einem attenuation-Faktor von 6 dB sind wir für alle board save!! Wenn wir den range des ADCs mit meinem voltage divider (10 MΩ / 2 MΩ, bei Vin = 5 V max.: Vout = 0,833 V) besser ausnutzen wollten, wäre auch ein Faktor von 0 dB möglich!

So, schwere Geburt, aber ich glaube jetzt haben wir es!

Dämpfungsfaktor

Exzellent, dann lassen wir den Wert attn=ADC.ATTN_6DB im Code erstmal hartkodiert und wir müssen ihn nicht in die settings tun – sofern dazu keine Widersprüche von anderen kommen. Danke.

Widerstände

Bzgl. der Konfiguration für die Widerstandswerte:

Schön wäre, wenn Ihr mir auf Basis der hier gesammelten Erkenntnisse (vielen Dank!) die oben erstellte Tabelle ggf. aktualisiert, wenn ich da etwas falsch aufgeschnappt haben sollte.

… plus der Frage, was denn eigentlich los ist, wenn ich “BOB Shield on Expansion Board” habe. So sieht meine aktuelle Hardwarekonfiguration gerade aus und so ist es u.U. auch bei anderen.

Wenn wir die Widerstands-Werte für das expansion board 3.1 rausfinden wollen: Tja, gute Frage, da die Version zwischen den beiden Versionen liegt, wo sich was geändert hat könnte es noch die alten oder schon die neuen (oder andere) Werte habe, entweder wir versuchen es mit trial and error oder wir versuchen die traces auf der Platine zu verfolgen und die Widerstände zu identifizieren und diese dann durchzumessen, oder wir finden die Doku bzw. jemand schreibt die … ;-)

Da wir bei der Kombi meine Platine plus expansion board für die Messung der Batteriespannung aber eh den voltage divider auf der weißen Platine verwenden müssen, da der fest verbaut ist und wir nur den des expansion boards deaktivieren können, tun wir dies:

Bitte den Jumper Batt auf dem expansion board herausnehmen oder wie zu alten Mainboard-Konfigurationszeiten auf nur einen Pin setzen.

Dann in der settings.py “meine” Werte, die der verbauten 10 M / 2M Widerstände eintragen. Kann man schon die Widerstände oder muss man noch die Summe eintragen?

Late or not, I wanted to share appropriate pointers to the Pycom forum anyway.


Best comment - as always - by robert-hh from Pycom forum:

Das liest sich für mich wie eine Empfehlung für eine Referenzimplementierung. Die Widerstandswerte entsprechen den von @didilamken vorgeschlagenen.

1 Like

Nach der ganzen Theorie haut die Praxis bei mir nicht hin:

   15.0659 [terkin.sensor.system     ] DEBUG  : Reading battery level with voltage divider 12/2
   15.1764 [terkin.datalogger        ] ERROR  : Reading sensor "SystemBatteryLevel" failed
Traceback (most recent call last):
  File "/flash/lib/terkin/datalogger.py", line 170, in read_sensors
  File "/flash/lib/terkin/sensor/system.py", line 134, in read
ZeroDivisionError: division by zero

Surprise!! Die aller erste Version meines boards (grüne Platine) hatte noch keinen voltage divider drauf!

Ähm, @Andreas, du hast nicht zufällig auch eine grüne?! Oder schon die weiße?

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

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.