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

Mir ist noch nicht klar, was wir für attn sinnvollerweise nehmen bzw wie ich mit den DB-Angabe die maximal zulässige Voltanzahl berechne.

https://docs.pycom.io/firmwareapi/pycom/machine/adc.html

attn is the attenuation level. The supported values are: ADC.ATTN_0DB , ADC.ATTN_2_5DB , ADC.ATTN_6DB , ADC.ATTN_11DB

ADC pin input range is 0-1.1V . This maximum value can be increased up to 3.3V using the highest attenuation of 11dB . Do not exceed the maximum of 3.3V , to avoid damaging the device.

Wenn man mit 0db maximal 1,1 V verwenden darf und mit 11db 3,3 V ist das eine Verstärkung um 3 (1,1V x 3 = 3,3 V).

Vielleicht können uns an der Stelle @MKO, @didilamken, @weef oder @roh weiterhelfen.

Für die Spannungsmessung würde ich nicht viel rechnen, sondern die Spannung nur mit einem Multimeter messen und dann den Teilungsfaktor mit Dreisatz berechnen. Für nicht so genaue Messungen reicht ein fester Faktor im Code ( z.B. wenn man 4.2 V von 4.1 V unterscheiden möchte).

Die vielen Toleranzen der beiden Widerstände, des PGA und ADW lassen sich viel einfacher ausmessen. Für genauere Messungen benutze ich den 16-bit ADS1115 und normale Metallfilm-Widerstände. Durch Ausmessen des Faktors kann ich kann ich dann nachher 4.100 V von 4.101 V unterscheiden. Das ist schon sehr genau. Für den Abgleich habe ich ein Spannungs-Referenz-IC von 5.000 V. Im Programm bestimme ich den Faktor nur durch Probieren: ADW-Wert 1896 -> Anzeige 5.000

2 Likes

Es geht um den attn-Faktor in der Software, hier die vorgegebenen 2,5 dB und 6 dB, wie ist dann der maximale Vin?

Haben wir denn eigentlich jenes?

Weil: Dann sind ja auch die aktuell in den Beispielkonfigurationen vorgegebenen Werte komplett falsch. Kurios, dass dann trotzdem plausible Werte herauskommen, nicht?

Ich würde es einfacher machen. Bei einem Spannungsteiler 1 M und 470 K wird die Spannung in etwa gedrittelt. Aus 5 V werden ca. 1.6 V. Der AD-Wandler liefert einen Wert von z.B 1896. Dann ergibt sich Spannung = 5.000 / 1896 * ADW-Wert.

Der analoge Eingang kann eigentlich nur 1,1 Volt mit attn kann man das ändern welchen Wert brauchen wir da für attn??

Schau mal auf die Rückseite des Boards bei mir steht 3.1 und dafür haben wir keine Doku.

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!