M5-int ADCAus Attraktor WikiVersion vom 29. Juni 2020, 18:37 Uhr von Kapest (Diskussion | Beiträge) Von Peter (peter@attraktor.org) Bilderprefix: M5-HW-iADC-... InhaltsverzeichnisÜbersichtDem internen ADC des ESP32 geht der Ruf voraus, dass er ziemlich unbrauchbar sein soll. Im Datenblatt sind zum ADC folgende Daten zu finden:
Der maximale Messfehler beträgt lt. Datenblatt:
Es ist dort auch von der großen Ungenauigkeit zwischen verschiedenen Chips von +- 6% die Rede und es wird darauf hingewiesen, dass die Esprif-IDE Methoden zur Kompensation zur Verfügung stellt. Inwieweit die Kompensationsmethoden in die Programmierung der MicroPython und Blockly Elemente eingeflossen sind ist mir nicht bekannt. ADC import machine
adc=machine.ADC(pin)
adc.atten(value)
adc.width(value)
data = adc.read() Da sowohl in Blockly als auch in Micropython der vom ADC gemessene Wert nicht als Rohdatum, sondern in mV zurückgeliefert wird ist anzunehmen, dass adc.read() die Ungenauigkeit des ADC korregiert. Hierzu gibt es im Internet verschiedene Hinweise. Meine MotivationDa ich auf der Suche nach einer einfachen Möglichkeit war die Temperatur eines Leistungs-MOS-Fet zu überwachen, hat es mich interessiert, ob dieser ADC zusammen mit einem NTC dazu in der Lage ist. Dazu habe ich ein kleines Programm mit UIFlow-Blockly geschrieben, das den Wert des ADC ausliest daraus einen maximalen und minimalen Wert ermittelt und ggf. speichert. Weiterhin wird die Summe aller Mesungen gebildet und daraus der Mittelwert ermittelt. Schließlich wird der Mittelwert, der Max- und der Min-Wert und die Anzahl der Durchläufe auf dem Display des M5-StickC angezeigt. Damit habe ich erste Erkenntnisse gewonnen. Leider kann ich dieses Programm hier nicht veröffentlichen, weil ich es in der OnLine-Version von UIFlow entwickelt habe, der Rechner zwischen drinnen abgestürtzt ist und ich natürlich noch nichts gespeichert hatte - weil ich ja noch in der Entwicklung war. Ich weiss, ich verdiene kein Mitgefühl - ich habe ganz einfach selber schuld! Zum Glück hatte ich es schon im M5StickC gespeichert, so dass ich weiterhin damit arbeiten konnte. Die Ergebnisse der Messungen mit einem Vorteiler von 6dB:
Fazit der EinzelmessungenDer ADC des ESP32 macht seinem Schlechten Ruf alle Ehre! Die Abweichung einzelner Messungen zwischen fast 3% am oberen Ende des Messbereichs und mit bis zu 25% am unteren Ende sind schlechter als die eines alten Drehspulmessgerätes mit 1,5% am Skalenendwert. Nun gibt es aber ein Licht am Horizont, wenn man die Mittelwerte der Messungen betrachtet. Hier sind die Abweichungen erheblich geringer. Deshalb habe ich aus den Werten der ersten Tabelle eine weitere angefertigt, die die Abweichung der Mittelwerte von den tatsächlichen Spannungswerten ausgibt:
Fazit der kumulierten MessungenDiese Tabelle bestätigt die Annahme, dass mit kumulierten Messungen die Genauigkeit deutlich erhöht werden kann und extremen Schwankungen der Messwerte gemildert werden können. Bei der Spannung von 99,65 mV treten zwar noch immer Abweichungen 7,5% auf, aber alle Spannungen > 256 mV werden mit einer Genauigkeit besser 0,5% erkannt. Damit lässt sich arbeiten. Nun interessiert noch der Bereich zwischen 99,65 mV und 256 mV. Messung des ÜbergangsbereichsNun möchte ich nicht mit einer weiteren Tabelle nerven, deshalb stelle ich die Ergebnisse hier nur kurz dar: Die interessantesten Messen waren bei 244,2 mV mit 1,09% und 255,5mV mit 0,47% maximaler Abweichung. Bei niedrigeren Spannungen stieg die Abweichung diskontinuierlich an (156,9mV - 2,74%). Die Abweichungen für höhere Spannungen sind schon bekannt. Ab ~250mV sind die Messwerte also gut zu gebrauchen. Nun wird sich mancher schon gefragt haben, warum ich mit so krummen Spannungen arbeite. Der Grund ist das HM8040-2 Netzgerät aus dem ich Spannung bezogen habe. Es ist eine analoge Konstruktion die 2 Poti's (Grob/Fein) zur Spannungseinstellung bereitstellt. Damit lässt sich die Spannung nicht auf 0,1mV genau einstellen. Die Anzeige des Gerätes löst nur in 100mV-Schritten auf. Wie viele Messungen sind erforderlich?Dazu habe ich mir überlegt, dass je mehr Messungen gemacht werden, der Einfluss einer einzelnen Messung immer geringer wird. Ich muss also so viele Messungen durchführen bis der Einfluss der nächsten Messung unter einem festgelegten Limit bleibt. Anzahl der Messungen = Max. Abweichung einer Messung / Limit Die Maximale Abweichung der Messungen lag bei knapp 12%. Ich nehme mal 15% an, um auf der sicheren Seite zu liegen. 15% / 0,1% = 150 Messungen 15% / 0,01% = 1500 Messungen Je nach Genauigkeitsanspruch sind also mit Sicherheitsabstand 200 bis 2000 Messungen erforderlich. Soweit die Theorie. Nun zur PraxisUm die Anzahl erforderlicher Messungen zu ermitteln habe ich wieder ein Programm geschrieben - und gleich gesichert. Ihr könnt es Euch am Ende dieser Seite herunterladen. Dieses Programm Summiert eine Anzahl Messungen (Var: messDistance) auf. Errechnet daraus den Mittelwert und speichert diesen in der Liste messungen ab. Das erfolgt solange bis die vorgegebenen Anzahl Einzelmessungen (Var: anzahl) erreicht ist. Anschliessend wird die Liste messungen ausgewertet. Es wird der Mittelwert aller Einträge errechnet, der größte und kleinste Wert und deren Abweichungen vom Mittelwert in % ermittelt sowie die Anzahl der Einzelmessungen bis zum ersten Auftreten dieser Werte ermittelt. Diese Werte werden schließlich angezeigt. Mit einem Druck auf Taste A kann ein weiterer Messdurchgang gestartet werden.
Spielt gerne mal ein wenig damit herum. Es macht Spass und man lernt etwas dabei. Allerdings dauert ein Messdurchgang bei einer großen Anzahl von Messungen schon mehrere Minuten! Verlasst Euch nicht auf einen Messdurchgang bei einer Spannung - hier spielt der Zufall mit - deshalb wundert Euch nicht wenn Ihr unterschiedliche Ergebnisse bekommt. Achtet auf die Abweichungen. Ich habe Messungen mit den in der Liste oben aufgeführten Parametern durchgeführt und zu meinem Erstaunen festgestellt, dass die Abweichungen zwischen dem Mittelwert und den Extremen nie größer als 1 mV waren und auch die Mittelwerte verschiedener Messungen variierten nur um 1 mV. Das ist übrigens die kleinste Einheit, da das Programm errechnete Werte auf ganzzahlige mV Beträge rundet / abschneidet. Ich habe zuerst mit mit 2 Nachkommastellen gearbeitet, aber das war nur verwirrend. Ohne Nachkommastellen wurde plötzlich alles viel klarer. Hier ein paar Beispiele:
Nun ist aber noch die Frage offen wie viele Einzelmessungen man denn nun kumulieren muss, um zu einem zuverlässigen Wert zu kommen. Das könnt Ihr mit dem Programm ADC_Abweichung.m5f selbst ermitteln dabei Eure individuellen Bedürfnisse zu grunde legen. Für denjenigen, der nich lange herum experimentieren möchte hie meine Empfehlung: Wie genau misst der ADCUm das heraus zu bekommen habe ich wieder ein Programm geschrieben oder besser zusammen gepuzzelt. Damit ich alle Berechnungen im M5-StickC machen kann und nicht noch händisch Werte auf den PC übertragen muss, habe ich die Keyboard-Unit angeschlossen. So kann ich dem Programm die exakten Referenzwerte übergeben und alles andere mach der M5-StickC ): Wie schnell ist der ADCWenn viele kumulierende Messungen erforderlich sind um zu einem brauchbaren Ergebnis zu gelangen, dann interessiert auch wie schnell die Messungen durchgeführt werden können. Das Datenblatt sagt, das 2 MSps also 2.000.000 Messungen in der Sekunde möglich sind. Es schweigt sich jedoch darüber aus, ob dieser Wert für die volle Auflösung von 12bit gilt oder nur bei reduzierter Auflösung. Es hilft alles nichts - es ist wieder Messen angesagt. Eine einzelne Messung in Blockly Eine For-Schleife mit 10.000 Messungen benötigt gut 1.400 ms. Bei 1000 Messungen wären das 140ms also ca. 7 Messungen in der Sekunde. Ein Blick auf den Micropythoncode zeigt, dass neben der Messwertabfrage auch noch range() abgearbeitet werden muss: for count2 in range(10000): messwert = adc0.read() ... und das auch noch interpretiert. Für schnelle Programme ist also C oder Assembler erforderlich. Damit hat die Realität uns wieder. Für meine Temperaturüberwachung dürfte das aber ausreichen. Dieses mal habe ich beim Programmieren alles richtig gemacht und kann das Programm unten auf dieser Seite zum Download bereitstellen. ZusammenfassungZuerst möchte ich betonen, dass die hier vorgestellten Messungen mit einem M5-StickC mit der Seriennummer ... gemacht wurden und deshalb auch nur für diesen stimmen. Ich weiss nicht, wie es sich bei anderen Exemplaren verhält. Da Esprif selbst im Datenblatt Exemplarstreuungen +- 6 % angibt, ist damit zu rechnen, dass entsprechende Abweichungen auftreten werden. Zusammenfassend lässt sich feststellen, dass der interne ADC des ESP-32 seinen schlechten Ruf nicht zu unrecht trägt. Das bedeutet aber nicht , dass er unbrauchbar ist. Durch kumulieren einer Reihe von Messungen lassen sich durchaus aktzeptable Ergebnisse erzielen. Wie kommt die große Streuung der Messwerte zustande?DownloadsZum Download des Programms bitte mit der rechten Mousetaste auf den Link klicken und dann auf "Ziel speichern unter ..." mit der linken Mousetaste klicken. (Ich habe leider keine bessere Möglichkeit gefunden.) Linkshttps://github.com/espressif/esp-idf/issues/164 https://github.com/espressif/arduino-esp32/issues/92 https://esp32.com/viewtopic.php?f=19&t=2881 https://esp32.com/viewforum.php?f=23&sid=430dca374801718984590f3b24158ced https://www.instructables.com/id/Do-You-Know-About-ESP32-ADC-Adjustment/ https://www.youtube.com/watch?v=RlKMJknsNpo https://github.com/G6EJD/ESP32-ADC-Accuracy-Improvement-function |