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

Auf dem Expansion board sind niedrige Widerstände verbaut, was es einfach macht Spannung zu messen, was aber auch einen höheren Energieverbrauch zu Folge hat.

Das ist nicht für den low power-Betrieb designed, daher würde ich die Werte nicht 1:1 übernehmen (und habe das damals auch nicht gemacht ;-).

Bei den Werten habe ich mich am Design des voltage dividers des Seeeduino Stalker orientiert. Verbaut sind 10 MΩ (R1) und 2 MΩ (R2) parallel zum 2 MΩ-Widerstand ist ein 100 nF Kondensator verbaut, der mit den hohen Widerstandswerten das Signal etwas glättet.

Hintergrund ist dort ein potentielles 6V-Signal auf 1V zu droppen, so viel bräuchten wird nicht, weil der FiPy afaik eh nur maximal 5V Eingang verträgt.

2019-06-17%2019_29_51-Voltage%20Divider%20Calculator%20-

2 Likes

Gut wäre jetzt Mal interessant die Innenwiederstände der Pins des Pycom und des anderen Boards zu vergleichen.

Evtl lässt sich eine low Power Variante auch mit dem internen pullupwiederständen und einem externen zur Masse realisieren. Werden die pullup nicht im Deep Sleep deaktiviert?

Edit: wahrscheinlich zu einfach gedacht. Die pullup lassen sich im analog in Modus sicher nicht aktivieren. Und gehen an 3V3. Ich bringe besser Mal die Kinder zu Bett und schau mir das in Ruhe an 😁

1 Like

Könntet Ihr diese Sache noch einmal mit den richtigen Werten für @clemens’ BOB-Board testen und Bescheid geben, ob sich dann plausiblere Werte ergeben? Merci!

So habe mal ein bissel gerechnet. Habe aber leider nicht die Werte für den Voltage divider des Pycom Boards gefunden. @clemens vielleicht kannst Du Mir den nachreichen.

Wenn wir jetzt die 12 MOhm wie auf deinem Board nehmen liegen wir bei 0,00041mA bei 5V bei 3,7V natürlich weniger. wenn ich mich nicht verrechnet habe und der Akku keine Selbstentladung haben würde, komme ich auf 5400 Jahre bis der Akku leer ist und ich richtig gerechnet habe ?!?.
Tippe mal im Pycom-Board liegen wir bei R1+R2 bei ca 30 bis 40KOhm

Ich rechne hier mal mit 30K:
I=U/R
3,7V/30000OHM = 0,000123333 A
bei unserem 2AH Akku
Ah/A = Std.Betriebszeit
2/0,000123333*60= 16.216 Std = ca 675 Tage Laufzeit die sicher Vertretbar sind.

Laut Doku verschieden für unterschiedliche Versionen, Expansion Board

Das wäre ja nicht die Gesamtlaufzeit, sondern nur die Laufzeit, wenn das System keine Energie fürs Messen und fürs Versenden brauchen würde. Aber ja, 5000 Jahre (habs nicht nachgerechnet) müssen es auch nicht zwingend sein, wobei ich es schon cool fände, wenn ein Sensor von mir in 5000 Jahren noch Daten sendet! ;-)

Ja 5000 Jahre wär sicher cool, aber das wär ja nur der Strom der fürs Messen drauf geht.

denke mal das wir mit wie bei Version 3.2 ganz gut mit 2MOhm fahren, die Innenwiederstände der Pins habe ich leider im Datenblatt auch nicht finden können, ebenso wie der Strom der zum messen fließen muß. Wüsste da jetzt leider nicht, wie ich mit so vielen unbekannten die idealen werte errechnen könnte.
kann ja ein wenig mit den werten Spielen. habe denke ich genug Wiederstände hier rum liegen und mein Netzteil kann Spannungsverläufe simulieren.

Was mich allerdings immer noch etwas verwundert, ist das der eine FiPy so weit mit seinen werten so extrem abweicht. Die interne Temp ist ja auch betroffen. als ob man irgendwo noch einen Faktor oder eine ref. spannung setzen könnte der/die beim Neuaufspielen nicht mit einbezogen wird. habe ihn auch son 2 mal gelöscht und neu aufgespielt immer das selbe.
Hatte Ihn allerdings noch nicht auf deinem Board, vielleicht sollte ich das mal schleunigst tun.

mom…
Edit: Ja sobald der FiPy auf Clemens Board hängt zeigt er nur 1/3 der Spannung an. messen tut er anscheinend richtig. habe mal 3 Spannungswerte Werte aufgegriffen und mal 2,953 gerechnet. dann passt es bei mir aufs mV genau.

Würde folgende Lösung vorschlagen: in den Settings noch eine weitere Variable in der man den Faktor angeben kann. und dieses in die Berechnung der Spannung einfließen lassen. So kann man dann zusätzlich auch noch diejenigen glücklich machen, die es 100% genau haben möchten.

Der System Temperaturwert weicht jetzt aber auch wieder gewaltig ab. er zeigt beim 2. FiPy jetzt 47 °C

@Andreas sehe wieder mal, das Du schneller warst als ich.

1 Like

Hab auch mal versucht den Innenwiederstand der Pins zu ermitteln. Sollte bei um die 120MOhm ±30% liegen. Meine Messgeräte machen da schlapp habe daher die große Abweichung angegeben.

Die 12MOhm aus Deiner Schaltung @clemens Schaltung kann man aber bei den Wert gefahrlos nehmen. Ich denke im Kopf irgendwie immer noch mit ttl Chips und Anfangszeiten der Mosfet Technik wo 30k Standard waren.

Wo weichen sie denn ab, bei dir, @MKO vs. @Andreas oder bei deinem Fipy vs. WiPy? @Andreas wo hast du denn den LiPo angeschlossen, an der Platine oder am expansion board? Die beiden Möglichkeiten gibt es ja auch noch! ;-)

Bei gleichzeitiger Verwendung von expansion board und Platine müssen wir auf jeden Fall den voltage divider auf dem expansion board per jumper deaktivieren, da der gleiche pin zur Messung versendet wird und dann zwei voltage divider vorhanden wären.

Das sollte mit dem Jumper “enable VBATT signal” gehen

0%20%C2%B7%20GitBook%20-

Generell sollten wir etwas aufpassen mit der Batterie und unbekannten voltage dividern, bei der einzigen etwas ausführlichern Doku zum expansion board habe ich das gefunden:

The following conditions WILL CAUSE THE WiPy TO BE PERMANTLY
DAMAGED.
[…]
When a voltages above 1.8V is applied to an analogue input.

Wenn wir also mit der attenuation rumspielen, und die ggf. nicht gesetzt ist oder auf einen zu geringen Wert beschädigt uns ein LiPo ggf. den FiPy / WiPy. Daher sollten wir zumindest einen voltage divider verwenden, der unter 1,8 V droped, damit auch bei nicht oder falsch gesetzter attenuation keinen Schaden anrichten!

In den example settings sind die Werte falsch. Die erste Variable beinhaltet die Summe beider Widerstandswerte.

    'vcc': {
        # -> Expansion board v3.0, voltage divider is 115 kΩ / 56 kΩ
        # Expansion board v3.1, voltage divider is unclear, not documented yet
        # Expansion board v3.2, voltage divider is 1 MΩ / 1 MΩ
        # BOB shield Clemens, voltage divider is 10 MΩ / 2 MΩ

        # Sum of resistor values.
        'resistor_sum': 171,


        # Resistor between input pin and ground.
        'resistor_pin': 56,
    }

In /terkin/sensor/system.py ist attn in Zeile 114 für unseren pin 16 gerade mit 6DB angegeben:

    adc_channel = self.adc.channel(attn=ADC.ATTN_6DB, pin='P16')
    adc_samples = [0.0] * self.adc_sample_count
    adc_mean = 0.0

Why does this always happen to me?

@clemens: I will rename the configuration settings to resistor_r1 and resistor_r2 and do the summation internally in order to minimize confusion. This will happen in one of the next commits.

To get noticed about changes like these, you might want to subscribe to the list of watchers (https://github.com/hiveeyes/hiveeyes-micropython-firmware/watchers) in order to minimize friction.

Thanks for your input and thanks likewise for listening.


Vielen Dank auch für die Übersicht. Habe sie noch um BOB-HAT-V5 ergänzt.

Voltage divider resistor values for different boards for Pycom devices.

  • Expansion board v3.0: 115 kΩ / 56 kΩ
  • Expansion board v3.1: Unclear, not documented yet
  • Expansion board v3.2: 1 MΩ / 1 MΩ
  • BOB shield: 10 MΩ / 2 MΩ
  • BOB-HAT-V5: u.U. 1 MOhm / 470 kOhm or 220 kOhm
1 Like

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.