ESP32 Analog Wert am Spannungsteiler ungenau vs Arduino Analog Wert
Ich habe bisher immer mit einem Arduino UNO gearbeitet. Nun habe ich mir
einen ESP32 gekauft.
Heute wollte ich einen Analogen Eingang testen. Leider habe ich
feststellen müssen, dass er sehr ungenau ist.
Folgendes habe ich gemacht. Erst habe ich den Sketch mit meinem Arduino
UNO getestet.
Ich habe mit zwei gleichen Widerständen einen Spannungsteiler aufgebaut.
Wenn ich nun in der Mitte den Analogen Wert am Arduino auslese, sollte
ich einen Wert von 512 bekommen, da der Arduino eine 10 Bit Auflösung
hat (1024) . Das klappt auch soweit.
Nun Spiel ich den gleichen Sketch auf meinen ESP32 der eine Auflösung
von 12 Bit hat. Eigentlich sollte ich auch hier die Hälfte als Messwert
bekommen 4095 geteilt durch 2 also 2048. Ich bekomme aber immer nur 1800
als Wert obwohl am Messpunkt 1,64 V anliegt. Also die Hälfte von 3,3V.
Weiß jemand woran es liegen kann?
Danke für die schnelle Antwort.
Beim ESP32 bekomme ich dann 4095 als Wert wenn ich 3,3V anlege. Das
stimmt also.
Bei 0V bekomme ich auch einen Wert von 0. Das stimmt also auch.
Dazwischen passt es nur nicht.
Sandro N. schrieb:> Dazwischen passt es nur nicht.
Wie groß sind die Widerstände in deinem Spannungsteiler und wie groß ist
der Ladekondensator am ADC-Eingang?
Ich habe 2 mal 1k Widerstände. Habe Es aber auch schon mal mit vier
Stück in Reihe versucht. Das gleiche Ergebniss.
Die Frage nach dem "Ladekondensator" verstehe ich nicht. Was soll das
bitte sein?
Sandro N. schrieb:> Das ist der Link zum Hersteller. Für mich leider nicht ersichtlich, wie> jetzt die Lösung ist :-(.
Wir wissen auch nicht, was DU falsch gemacht hast! Aber mit ziemlicher
Wahrscheinlichkeit steht die Lösung auf dieser Seite! Also lies es Dir
durch und verstehe, wie der ADC funktioniert!
Hint: Hast Du z.B. Attenuation richtig eingestellt?
Gruss Chregu
Das mit dem analogSetAttenuation(ADC_11db); habe ich versucht. Habe alle
Möglichkeiten probiert. ( 0db, 2,5 db und 6 db) macht die Sache nur
schlimmer.
Eigentlich ist der Testaufbau einfach. Mit dem UNO und dem Mega geht es
ja auch. Mich würde mal interessieren was Andere beim gleichen Test für
Werte bekommen. Also: Wer hat auch einen ESP32 und kann einen
Spannungsteiler stecken und den Analog-Wert zwischen den Widerständen
mal messen?! Vielleicht ist mein ESP32 einfach nur kaputt?
Hast du beachtet, dass ein Teil der ADCs sich nicht sinnvoll nutzen
lassen, solange du Wlan aktiviert hast?
Der Verlauf des ADC ist nicht wirklich schön linear. Es gibt aber
genügend Webseiten, die dir bei diesem Problem weiterhelfen können.
Auch ein guter Gedanke mit dem WLan. Das habe ich auch schon gelesen.
Aber 1. habe ich kein Wlan an, da ich im Sketch nichts mit Wlan
geschrieben habe und 2. sind die Analogen Eingänge unterteilt in zwei
Gruppen ADC1 und ADC2. Ich habe Analoge Eingänge aus beiden Gruppen
getestet. Immer das gleiche Ergebnis.
Hier noch mal der Sketch und ein Bild vom Testaufbau. Kann das bitte
einmal jemand bei sich nachstellen und mir den Wert schreiben. Dauert ja
nur 10 min.
void setup() {
Serial.begin(115200);
}
void loop() {
int Wert = analogRead(33);
Serial.println(Wert);
delay(1000);
}
Danke !
Sandro schrieb:> Leider habe ich> feststellen müssen, dass er sehr ungenau ist.
Ja, das ist so bei den ESP Chips. Sie rauschen stark, fangen nicht bei
0V an und sind deutlich nicht-linear.
Wenn du WLAN aus schaltest, wird es besser, aber so richtig
zufriedenstellende Ergebnisse bekommst du nur mit externen ADC, zum
Beispiel dem MCP3008.
Sandro N. schrieb:> Die Frage nach dem "Ladekondensator" verstehe ich nicht. Was soll das> bitte sein?
Der ADC hat im Innern einen Kondensator mit ein paar pF, den er bei
jeder Messung kurz mit der Signalquelle verbindet:
https://www.asdlib.org/onlineArticles/elabware/Scheeline_ADC/ADC_ADC_SandH.html
Bei jeder Messung wird die Quelle belastet, um diesen Sample&Hold
Kondensator (so heißt der) aufzuladen. Was in deinem Fall dazu führt,
dass die Spannung kurz absackt. Jetzt kommt es darauf an, dass die
Widerstände der Quelle im Verhältnis zum Sample&Hold Kondensator
ausreichend niederohmig ist, so dass der Kondensator in dem kurzen
Moment annähernd vollständig geladen wird.
Wenn du deine Quelle (den Spannungsteiler) mit einem wesentlich größeren
Kondensator (z.B. 100nF wie Espressif empfiehlt) stabilisierst, dann
wird bei jeder Messung ein kleiner Teil der Ladung von dem externen
großen Kondensator in den internen umgeladen. Die Spannung sackt dadurch
weniger ab. Wichtig ist dabei, dass man zwischen den Messungen
ausreichend große Pausen lässt, dass sich der externe Ladekondensator
wieder "erholen" kann.
https://copter.rocks/makerpaket/batterie-ueberwachung/
Außerdem blockt der Ladekondensator HF Einstreuung von dem WLAN Teil ab.
Ich habe hier nur 220uF Kondensatoren liegen. Das ist zwar weniger als
du vorschlägst aber um eine kleine Besserung der Messwerte zu bekommen
habe ich es eben getestet. Bringt nichts.
Ich meine Arduino bekommt das doch auch hin. Ich kann mir einfach nicht
vorstellen das der neue ESP32 der doch so gut sein soll das nicht kann.
Also wenn ich 1800 als Wert bekomme anstatt 2048 ist das schon ziemlich
daneben. Und dann haben die ja noch eine Auflösung von 12 Bit und der
Arduino nur 10Bit. Was soll das bringen, wenn der eh so ungenau ist.
Sandro N. schrieb:> Ich habe hier nur 220uF Kondensatoren liegen.> Bringt nichts.
Kein Wunder, die sind zu träge.
> Ich meine Arduino bekommt das doch auch hin.
Nein, das Arduino Framework kann aus schlechten Messwerten keine guten
machen. Falls du die Arduino Boards mit anderen Mikrocontrollern meinst:
Die sind halt für analoge Messungen besser geeignet.
> Also wenn ich 1800 als Wert bekomme anstatt 2048> ist das schon ziemlich daneben.
Wenn man aber bedenkt, dass die Zahlen erst ab ca 100mV ansteigen, passt
es wieder.
> Was soll das bringen, wenn der eh so ungenau ist.
Frag das Espressif. Die haben von Anfang an unter Featureitis gelitten.
Schon der ESP8266 wurde mit zahlreichen Funktionen beworben, die er am
Ende nicht hatte. Manches kam nur als Software Emulation (z.B. PWM und
I2C), manches kam gar nicht. Zum Wakeup nach Deep-Sleep äußere ich mich
mal lieber nicht, sonst kotze ich wieder.
Sandro N. schrieb:> Ich habe hier nur 220uF Kondensatoren liegen. Das ist zwar weniger als> du vorschlägst aber um eine kleine Besserung der Messwerte zu bekommen> habe ich es eben getestet. Bringt nichts.Stefanus F. schrieb:> (z.B. 100nF wie Espressif empfiehlt)
200µF sind gut einen Faktor 1000 zu groß. So ein Riesending ist viel
zu langsam. Der 100nF Kondensator muss direkt vom ADC-Eingang an Gnd
gehen.
Es gibt zumindest theoretisch auch schnelle 220 µF Kondensatoren, aber
du hast wohl einen Elko verwendet, und die sind halt träge.
Mit einem Kondensator änderst du aber nicht den Offset von ca. 100mV.
Damit wird lediglich das Rauschen geringer.
Und das Absacken der Spannung beim Laden des S&H Kondensators, aber das
ist hier wohl nicht dein Problem, da dein Spannungsteiler niederohmig
genug ist.
Die interne Referenzspannung beim ESP32 liegt zwischen 1000mV und
1200mV.
Was verwendest du als Referenz für den ADC.
Wenn du beim Arduino mit einem 1:2 Spannungsteiler genau 512 misst,
verwendest du dort wahrscheinlich die Versorgungsspannung als Referenz.
Vielleicht hast du noch ein grundlegendes Verständnisproblem bzgl.
Referenzspannung, Messbereich/ADC-Kennlinie und ratiometrische Messung
vs. Absolutmessung.
Moin zusammen,
ist zwar alles schon ein paar Tage her, dennoch:
Zu genüge wurde hier auf das nicht lineare Verhalten des ESP32 ADC
hingewiesen. Auch ich versuche mit dem frisch erworbenem ESP32s NodeMCU
die Spannung ca 10-33 Volt zu messen. Benutzt habe ich dafür den
Spannungsteiler mit 100k und 10k Widerständen. Mit dem ArduinoNano
klappte das recht genau, nun mit dem ESP eben nicht. Ich habe versuchte
die Referenzspannung, bei mir 3,3 Volt zu manipulieren zwecks
Kalibrierung, jedoch ist es immer nur für das aktuelle Messpotenzial
genau, wegen der Nichtlinearität des ESP32 eben.
Gefunden habe ich dann das hier:
h***s://www.youtube.com/watch?v=RlKMJknsNpo
Der Gudde hat die Kennlinie durch eine Polynomfkt. ersetzt und siehe da,
schon liefert das Voltmeter brauchbare Werte.
der Code ist unter github:
h***s://github.com/G6EJD/ESP32-ADC-Accuracy-Improvement-function/blob/ma
ster/ESP32_ADC_Read_Voltage_Accurate.ino