Forum: Mikrocontroller und Digitale Elektronik ESP32 Analog Wert am Spannungsteiler ungenau vs Arduino Analog Wert


von Sandro (Gast)


Lesenswert?

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?

von Tim (Gast)


Lesenswert?

Welchen wert erhältst du wenn du die 3,3 Volt anlegst?

von Sandro N. (nick2245)


Lesenswert?

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.

: Bearbeitet durch User
von Timmo H. (masterfx)


Lesenswert?


von Sandro N. (nick2245)


Lesenswert?

Das ist der Link zum Hersteller. Für mich leider nicht ersichtlich, wie 
jetzt die Lösung ist :-(.

von Wolfgang (Gast)


Lesenswert?

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?

von Sandro N. (nick2245)


Lesenswert?

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?

von Christian M. (Gast)


Lesenswert?

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

von Sandro N. (nick2245)


Lesenswert?

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?

von Sven B. (sb2048)


Lesenswert?

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.

: Bearbeitet durch User
von Sandro N. (nick2245)


Angehängte Dateien:

Lesenswert?

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 !

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

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.

von Sandro N. (nick2245)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Klaus R. (klara)


Lesenswert?

Sandro schrieb:
> Weiß jemand woran es liegen kann?

Der Link zur API-Referenz wurde Dir ja schon genannt.

https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/adc.html#analog-to-digital-converter

ADC Calibration
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/adc.html#adc-calibration

Hier wird Dir erklärt im welchen Bereich der ADC arbeitet. Er fängt 
nicht bei 0 V an. Das ginge auch nur mit einer intern erzeugten 
negativen Spannung. Das hat man sich eben erspart.

Calibration Values
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/adc.html#calibration-values

Man kann den ADC aber kalibrieren. Das zeigt Dir der oben angeführte 
Link. Ein Beispiel ist auch dabei. Für 9,99 € und WiFi und .... und .... 
und ... kann man eigentlich nicht mehr erwarten. Beim Messen sollte, wie 
schon gesagt, WiFi deaktiviert sein.
mfg Klaus

von Wolfgang (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Don D. (Firma: HelloWorld) (donrusso)


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch User
von Holger S. (holger_s)


Lesenswert?

Hallo Don,

Genial, genau was ich gesucht habe, die Rechnung funktioniert ziemlich 
gut, für meinen Zweck völlig ausreichend.

Gruß aus Potsdam
Holger

: Bearbeitet durch User
von Luigi A. (spok)


Lesenswert?

Don D. schrieb:
> Gefunden habe ich dann das hier:
> h***s://www.youtube.com/watch?v=RlKMJknsNpo

Top, hatte das selber Problem, hiermit gelöst.

Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.