Forum: Mikrocontroller und Digitale Elektronik ESP32: zyklische Schwankungen bei analogem Input


von Ulrich Winter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte mit einem ESP32 einen analogen Messwert erfassen.
Wenn ich den Input mit einem 10k Drehpotentiometer beschalte, dass einen 
Spannungsteiler zwischen GND und 3.3V aufspannt, funktioniert das:
Ich messe den erwarteten Zahlenwert zwischen 0 und 4095 je nach Lage des 
Potis.
Trivial.

Aber:
Wenn ich den Input Pin ausschließlich über einen 470 Ohm Widerstand 
gegen GND beschalte, erhalte ich die im Anhang geplotteten Werte 
(Abstand zwischen dne Messwerten: 1 sec):
- es gibt jeweils eine zeitlang (20-30 sec) dauerhaft den erwarteten 
Wert 0
- der erhaltene wert steigt auf Werte bis ca 240 an und fällt wieder auf 
0 ab (Dauer jeweils 30 - 60 sec).

Woher kommt das und was kann ich dagegen tun?


Der Artikel in Beitrag "ESP32 Analog Wert am Spannungsteiler ungenau vs Arduino Analog Wert" und auch die 
ESP32 Doku beschreibt, dass der ADC ungenau bzw. unlinear ist. Aber 
daraus kann ich mir nicht diese zyklischen Schwankungen ableiten.

Was ich schon ausgeschlossen habe:
- WLAN-Schnittstelle ist deaktiviert
- verschiedene Inputs zeigen das gleiche Verhalten (z.B: Input 0 und 
Input 32)
- verschiedene Devices am USB-Port (unterschiedliche Computer, 
Netzteile, USB-Kabel), da es Hinweise im Netzt gibt , dass der ESP 
Probleme mit der Spannugnsversorgung haben kann: 
https://arduino-hannover.de/2018/07/25/die-tuecken-der-esp32-stromversorgung/
- setup des IOs mit "pinMode(analogpin,INPUT_PULLUP)" statt nur 
"pinMode(analogpin,INPUT)" (ich programmiere den ESP32 mit Arduino)


Wozu das alles?
Ich habe einen Stromzähler mit 4-20mA Ausgang (aktiv).
Ich möchte den Sensor per ESP32 auslesen.
Dazu soll der Spannungsabfall über der Bürde am analog-IO-Pin des ESP 
gemessen werden.
Ich weiß: dafür gibt es extra Sensor-Schaltungen, die per I2C angebunden 
werden können. Aber warum sollte das nicht auch so funktionieren?

Und das obige Problem tritt ganz ohne angeschlossenen Sensor auf: 
einfach nur ein Widerstand zwischen IO-Pin und GND und sonst nichts.

von Nick M. (Gast)


Lesenswert?

Ulrich Winter schrieb:
> Woher kommt das und was kann ich dagegen tun?

Mal am Eingang messen (Oszi, MM) was tatsächlich anliegt?
Welche Einheit haben die ominösen "240"?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ulrich Winter schrieb:
> Woher kommt das und was kann ich dagegen tun?
Wie sieht die tatsächliche Schaltungsaufbau samt Stromversorgung aus? 
Ist der "GND" bei der 240 Ohm Lösung der selbe wie bei der 
Spannungsteiler-Variante?

> den erwarteten Zahlenwert zwischen 0 und 4095 je nach Lage des Potis.
Und der ist auch dauerhaft stabil, wenn du das Poti z.B. auf den Wert 
100 einstellst?

: Bearbeitet durch Moderator
von Klaus R. (klara)


Lesenswert?

Ulrich Winter schrieb:
> Woher kommt das und was kann ich dagegen tun?

Benutzt Du ein Steckbrett?
mfg Klaus

von Ulrich W. (ulrich_w749)


Lesenswert?

ja.

Außerdem habe ich auch schon einen Ladekondensator 100nF zwischen Input 
und GND geschaltet.
Wie hier empfohlen:
Beitrag "Re: ESP32 Analog Wert am Spannungsteiler ungenau vs Arduino Analog Wert"

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ulrich W. schrieb:
> ja.
... ist die Antwort auf welche der 6 Fragen?

von Ulrich W. (ulrich_w749)


Lesenswert?

Nick M. schrieb:


> Welche Einheit haben die ominösen "240"?
Das ist der Zahlenwert des 12Bit AD-Wandlers am analogen Eingang.
0: 0V
4095: 100% des Messbereiches: in diesem Fall 3.3V

Wenn ich an den Input das Drehpoti anschließe, liegen diese Werte genau 
in diesem Bereich: 0 bis 4095 je nach Stellung.

> Mal am Eingang messen (Oszi, MM) was tatsächlich anliegt?
Guter Punkt.
Oszi hab ich keines.
Multimeter: zwischen Input-PIN und GND: Hier messe ich 2 mV


Aber: So lange die Multimeter-Messspitzen anliegen, liefert der ADC 
konstant den Wert 0.
Nehme ich die Messspitzen wieder weg, schwankt der Zahlenwert, den 
"analogRead()" liefert wieder.

von Ulrich W. (ulrich_w749)


Lesenswert?

Lothar M. schrieb:
> Ulrich W. schrieb:
>> ja.
> ... ist die Antwort auf welche der 6 Fragen?

Sorry, für die Unachtsamkeit.

die Frage war:
>Benutzt Du ein Steckbrett?

JA ich benutze ein Steckbrett.

von Nick M. (Gast)


Lesenswert?

Ulrich W. schrieb:
> Nehme ich die Messspitzen wieder weg, schwankt der Zahlenwert, den
> "analogRead()" liefert wieder.

Na, dann weißt du ja wo du suchen musst. Jedenfalls nicht im Code, 
sondern der 'Mechanik'.
Lötstelle? Gar keine Masseverbindung? Wackelkontakt?

von Ulrich W. (ulrich_w749)


Lesenswert?

Lothar M. schrieb:
> Ulrich Winter schrieb:
>> Woher kommt das und was kann ich dagegen tun?
> Wie sieht die tatsächliche Schaltungsaufbau samt Stromversorgung aus?

Ich habe ein Modul "NodeMCU 'ESP32" von Joy-IT
http://anleitung.joy-it.net/?goods=nodemcu-esp32

Das wird über USB mit Strom versorgt.
Das ist der selbe USB-Port, über den auch die Arduino-IDE den code 
hochlädt,
bzw. die Messwerte über den Seriellen Port ausgelesen werden.

Das Modul steckt auf einem Breadboard.
An das Modul angeschlossen sind:
- der genannte 470 Ohm Widerstand zwischen PIN 33 und dem GND-Pin des 
DevModuls
- der 100nF Ladekondensator zwischen PIN 33 und GND (den kann ich 
weglassen, da ändert sich nix)


> Ist der "GND" bei der 240 Ohm Lösung der selbe wie bei der
> Spannungsteiler-Variante?

ja - identisch.
Nur ist eben bei der Spannungsteiler-Variante auch der 3.3V-Pin des 
Dev-Moduls an den 3. Pin des Potis angeschlossen.


>> den erwarteten Zahlenwert zwischen 0 und 4095 je nach Lage des Potis.
> Und der ist auch dauerhaft stabil, wenn du das Poti z.B. auf den Wert
> 100 einstellst?

Ja - hab ich schon minutenlang laufen lassen.
Da schwankt nix.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ulrich W. schrieb:
> Ja - hab ich schon minutenlang laufen lassen.
> Da schwankt nix.
Dann nimm mal deine "Potilösung", stell das Poti "unten" auf 470 Ohm ein 
und lass den "oberen" 3,3V Anschluss offen:
1
      3V3 o--    
2
3
4
                  x   
5
                  |
6
                  -
7
                 | |
8
                 | |
9
                 | |
10
                 | |<----->> ADC-Eingang
11
                 | | 470R
12
                  -           µC
13
                  |
14
       GND o------o------->> GND
Was passiert?

: Bearbeitet durch Moderator
von Ulrich W. (ulrich_w749)


Angehängte Dateien:

Lesenswert?

Nick M. schrieb:
> Ulrich W. schrieb:
>> Nehme ich die Messspitzen wieder weg, schwankt der Zahlenwert, den
>> "analogRead()" liefert wieder.
>
> Na, dann weißt du ja wo du suchen musst. Jedenfalls nicht im Code,
> sondern der 'Mechanik'.
> Lötstelle? Gar keine Masseverbindung? Wackelkontakt?

Die Frage ist nur, was da getan werden kann.
Die Schaltung steckt auf einem Steckbrett (siehe Foto).
Ich habe alle Verbindungen mehrfach neu gesteckt.
Es sind ja nicht viele: nur der Widerstand und zwei Drahtbrücken.

von Ulrich W. (ulrich_w749)


Lesenswert?

Lothar M. schrieb:
> Dann nimm mal deine "Potilösung", stell das Poti "unten" auf 470 Ohm ein
> und lass den "oberen" 3,3V Anschluss offen:
> Was passiert?


Alles klar - Problem gefunden:

Die Versorgungsleitungen am Rand des Steckbrettes sind in der Mitte 
unterbrochen.
(In dem Foto der Schaltung ist an den Stellen ein "W" im Brett zu 
sehen.)

D.h. der Widerstand war nicht mit GND verbunden.
Der IO-Pin war also letztlich offen.

Anfängerfehler.
Vielen Dank allen Beteiligten.

von Einer K. (Gast)


Lesenswert?

Ulrich W. schrieb:
> (siehe Foto).

Ich vermute:
Dort wo das W auf dem Steckbrett zu finden ist, sind die langen 
Leiterbahnen unterbrochen.
Der Rechte Schaltungsteil ist somit abgekoppelt.

EDIT:
Zu spät, aber doppelt hält besser.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ulrich W. schrieb:
> D.h. der Widerstand war nicht mit GND verbunden.
Da hattest du aber echt "Glück", dass am Poti die 3,3V anlagen. Einen 
Pin weiter und du hättest diesen "W"-Effekt selber herausgefunden.

> Alles klar - Problem gefunden
Deshalb gleich meine allererste Frage nach dem realen Aufbau...  ;-)

: Bearbeitet durch Moderator
von Ulrich W. (ulrich_w749)


Lesenswert?

Ich finde es dennoch spannend, dass da an einem offenen ADC-Eingang so 
ein Verlauf erscheint.
Also nicht irgendwelche Zufallswerte, sondern eben sowas wie ein Signal, 
das langsam ansteigt und auch zeitweise (10-20 sec) ganz auf 0 liegt.

Lässt sich sowas erklären?

von Einer K. (Gast)


Lesenswert?

Ulrich W. schrieb:
> Lässt sich sowas erklären?

Ja klar!

Ein offener Eingang ist eine Antenne, welche jeden Dreck, den das 
Universum von sich gibt, einsammelt und an deine Auswertungseinheit 
weiter gibt.

Wo das Signal her kommt, und wie es aussieht, ist dabei total 
uninteressant.
Dreck ist Dreck, und bleibt Dreck.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ulrich W. schrieb:
> Lässt sich sowas erklären?
Interferenzartefakte durch Unterabtastung. Ein auch mit digitalen Oszis 
gern gemachter Messfehler: https://de.wikipedia.org/wiki/Alias-Effekt

Wenn du schnell genug abgetastet (so im kHz-Bereich), wirst du sehen, 
dass da viel, viel mehr passiert als du da siehst.

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Ulrich W. schrieb:
> Ich finde es dennoch spannend, dass da an einem offenen ADC-Eingang so
> ein Verlauf erscheint.

Kommt vom Funksignal.

Offene Leitungen empfangen Funksignale und in Kombination mit den ESD 
Schutzdioden im Eingang des Mikrocontrollers hast du einen 
Gleichrichtenden Effekt, daher positive Messwerte.

Wenn du das mal mit einem empfindlichen Mikrofon-Verstärker machst 
kannst du auf diese Art mit etwas Glück einen Radiosender empfangen.

von controllergirl (Gast)


Lesenswert?

Bin zwar jetzt auch zu spät, aber genau diesen Effekt hatte ich bei 
Arduino auch, als dort mal de Masse zum AD-Eingang fehlte.
Hat also alles "richtig" gemacht und der ESP ist auch "ok" :O)
Same Procedure as every Year!

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.