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).
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
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.
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
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
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!
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?
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?
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
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?