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

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.

image

Standard ist hier das “Heartbeat”-Schema, das die RGB-LED alle 4 Sekunden blau blinken lässt. Das kann man nun konfigurieren per

# Configure RGB-LED.
'rgb_led': {
    'heartbeat': False,
},

In dem Fall blinkt die LED beim Start des Datenloggers zweimal kurz grün – bis auf weiteres.

1 Like

Etwas Strom frisst diese allerdings auch. Wenn auch bei weitem nicht so viel wie das Expansionsboard. Die LED die auf dem USB to TTl Adapter drauf sind werden über RX und TX gespeist.
Allerdings, wenn man nicht die ganze Zeit loggen möchte kann man die Verbindung im Betrieb trennen und wieder anstecken sobald man der Meinung ist man müsse nach schauen.
Klappt mit Atom wunderbar.
In der entwicklungs Umgebung lande ich mit ‘make repl’ allerdings in der Shell mit Eingabeaufforderung und nicht im logging/debuging.
Wie heißt da der make Befehl?

Nein, viel schlimmer:

Per design the ADC reference voltage is 1100mV, however the true reference voltage can range from 1000mV to 1200mV amongst different ESP32s.

(https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/adc.html - lesenwesert und sehenswerte Grafiken; dort auch Kalibrierung beschrieben)

Note that the ADC is not completely accurate. Even in the full 0 to 3.3 V range, many of the values seem to be around 0.2 V off. You can test this with a multimeter to verify.

(MicroPython Programming Tutorial: Getting Started with the ESP32 Thing - SparkFun Learn)

Die Unlinearitäten sind bei 11dB am größten (siehe z.B. hier: [Answered] What are the ADC input ranges? - ESP32 Forum , oder https://github.com/espressif/esp-idf/issues/164) , insofern wäre 0dB die Wahl sowie ein Vorteiler, der die max. 1V ausnutzt.

money quote aus Github ESP-IDF issue#164:

The ADC has a non-linear response, and we are working on producing characterisation data which will be added to esp-idf to produce a linear output.

Aha, sie haben oder wollen eine lookup table einbauen, damit die Nachlässigkeiten ihrer Elektronik nicht so auffallen?! m(

Alles in allem ist das also eher ein Schätzometer als ein Meßgerät, betreibt also nicht so ein Aufwand damit, sonst ist keine Zeit mehr für die wirklich wichtigen Dinge! ;)


Der ESP32 hat vor dem ADC keinen PGA (im eigentlichen Sinne). Einen amplifier mit Verstärkungsfaktor kleiner 1 darf man gewiß auch Verstärker nennen, das versteht nur keiner mehr, und ein PGA ist nun mal ein ‘programmable gain amplifier’ und kein ‘programmable gain attenuator’. - Was sie tatsächlich verbaut haben, müssen weitere Bilder dieser Art zeigen, oder ein disclosure des Herstellers… ;)

Komplett zustimmen muß ich allerdings Deiner Maximalforderung:

Wenngleich dies wünschenswert ist, müßte es auch in den Workshops gemacht werden - oder es wird leider nicht stattfinden…

2 Likes

Was will man wie genau messen? Aus meiner Sicht geht es darum, die untere Betriebsspannung Vin von 3.5 V zuverlässig zu erkennen, um dann Massnahmen zu ergreifen, dass der Akku nicht völlig leer gelutscht wird.
Die Spannungsmessung muss irgendwie konfiguriert werden, z.B. mit dem Spannungsteiler R1 und R2. Dabei werden die Toleranzen der Widerstände ( 10 % bei Billigware ) und im Signalweg ( PGA bzw. attn beim ADW ) nicht berücksichtigt. Man kann auch das Teilungsverhältnis R1 / ( R1 + R2 ) konfigurieren.

Aus meiner Erfahrung ist es einfacher, das Verhältnis “über alles” ( ADW-Wert / Vin ) zu konfigurieren, wie beim HX711 der Waage.

Hey,

danke für Eure Rcükmeldungen zu diesem Thema.

Genau, ich glaube/hoffe, dass wir hier so langsam genug geleistet haben und nach dem Pferde tränken ans weiterreiten denken könnten.

Ich würde bei dem übernächsten Testlauf meines Testbench-FiPys (an Expansion Board 3.1 mit 2x1000kOhm) dann also einfach mal auf 0dB runtergehen (also weder 6dB noch 11dB), damit wir entsprechende Werte aus der Praxis bekommen, ja?

Viele Grüße,
Andreas.

Dann bräuchte aber jeder der es konfigurieren möchte ein Multimeter richtig?

Nein, bitte nicht! mit 0 dB spuckt der 1 M /1 M-Teiler viel zu hohe Werte aus und du kannst nix messen! Geht nur mit einem anderen Spannungsteiler, der dann auch bei 5 V Eingang irgendwas mit < 1 V ausgibt, z.B. mit meinem Board und dem 10 M / 2 M-Teiler geht das!

@weef Danke für den Link mt der Grafik! Sehr aufschlussreich!

2 Likes

Gut, dann warte ich damit bis zum nächsten Hardware-Upgrade ;].

1 Like