Forum: Mikrocontroller und Digitale Elektronik ESP32: Wie das beste aus dem ADC herausholen?


von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Ich mache zu dem Thema am besten mal einen neuen Thread auf anstatt den 
alten mit ungenauem Titel weiterzuverwenden.

Eigentlich ist der ESP32 ja ein toller Controller, aber nach einigem 
Lesen stellt man fest, daß die Chinesen zwar laut Datenblatt gerne 
gekonnt hätten, aber es dann stellenweise leider doch nicht so gut 
konnten. Bestes Beispiel ist der ADC, der zwar viele Kanäle und 12 Bit 
hat, dafür aber mit großen Nichtlinearitäten und hohem Offsetfehler 
glänzt, zudem ist er sehr viel langsamer als im Datenblatt angegeben.

Ich würde trotzdem gerne eine MSR-Aufgabe mit diesem Schaltkreis 
probieren, die WLAN-Konnektivität ist der ausschlaggebende Punkt, aber 
ich brauche trotzdem einen einsetzbaren ADC.

Daher die Frage, wie holt man zumindest in dem Messbereich, in dem der 
ADC des EPS32 ausreichend linear arbeitet, das beste Ergebnis heraus? 
Wer hat Erfahrungen mit dem ADC, was machen machen sollte und was besser 
nicht bzw. was hat keinen Sinn?

Die Alternative wäre sicherlich ein externer 8fach 12/16Bit ADC, der 
sich über SPI oder I2C anbinden lässt, aber habe ich nicht da, kostet 
Geld und ich wüsste auch erstmal keinen, bzw. nur 4fach gibt's bei der 
Arduino-Fraktion gute Lösungsansätze. Aber dann brauche ich auch keinen 
ESP32, dann kann ich die eigentliche Regelaufgabe auch mit einem AVR 
machen und zur Kommunikation den einfacheren ESP8266 verwenden.

von Gustl B. (-gb-)


Lesenswert?

Ben B. schrieb:
> dafür aber mit großen Nichtlinearitäten und hohem Offsetfehler
> glänzt

Das kann auch von der externen Beschaltung abhängen. Die Referenz sollte 
nicht rauschen, die Versorgung bei Last nicht einbrechen, ...

Und sonst würde ich die Fehler versuchen herauszukalibrieren. Kostet 
nichts und geht schön in Software.

Ben B. schrieb:
> Die Alternative wäre sicherlich ein externer 8fach 12/16Bit ADC, der
> sich über SPI oder I2C anbinden lässt, aber habe ich nicht da, kostet
> Geld und ich wüsste auch erstmal keinen

Also SPI ADCs gibt es sehr viele auch mit vielen Kanälen.
https://www.mouser.de/c/semiconductors/data-converter-ics/analog-to-digital-converters-adc/?interface%20type=3-Wire%2C%20QSPI%2C%20SPI~~I2C%7C~SPI&number%20of%20channels=4%20Channel%2F8%20Channel%7C~8%20Channel~~8%20Channel%2F16%20Channel%7C~10%20Channel%7C~12%20Channel~~16%20Channel&resolution=16%20bit&instock=y&rp=semiconductors%2Fdata-converter-ics%2Fanalog-to-digital-converters-adc%7C~Number%20of%20Channels%7C~Interface%20Type

von Alexander (alecxs)


Lesenswert?

hattest Du nicht schon die Lösung? eine Mapping Tabelle

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

So unintelligent, wie es klingt ist es nicht, wenn die ADC über ein 
kleines Binärprogramm (in Assembler geschrieben) die Werte einlesen 
würden. (Hobby)Theoretisch bringt das was, praktisch ist es vergeudete 
Lebenszeit.

Wenn es noch viel langsamer sein darf, wäre "Oversampling" beim Einlesen 
ein Methode. Hierzu gibt man zusätzliche bekannte modulierte kleine 
Störspannungen auf den Eingang und rechnet das korrigierend heraus.

von Alexander (alecxs)


Lesenswert?


von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?


von Frank K. (fchk)


Lesenswert?

Ben B. schrieb:

> Die Alternative wäre sicherlich ein externer 8fach 12/16Bit ADC, der
> sich über SPI oder I2C anbinden lässt, aber habe ich nicht da, kostet
> Geld und ich wüsste auch erstmal keinen

https://www.microchip.com/en-us/product/mcp3208

Wird dich auch nicht arm machen, und der funktioniert.

fchk

von Björn W. (bwieck)


Lesenswert?

Ben B. schrieb:
> Ich würde trotzdem gerne eine MSR-Aufgabe mit diesem Schaltkreis
> probieren, die WLAN-Konnektivität ist der ausschlaggebende Punkt, aber
> ich brauche trotzdem einen einsetzbaren ADC.

Was ist denn die Aufgabe? Ich vermute das für deine Aufgabe der ESP 
schon ausreichend gut genug ist und falls nicht, eine Kalibrierung in 
Software ausreichend ist.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Danke euch allen und danke für die Links, da habe ich erstmal was zum 
Lesen.

Oversampling wäre das einzige, was mir bislang brauchbar erschien. Die 
aktive Einkopplung einer Störspannung kann man sich beim ESP32 sparen, 
das macht der mit aktiviertem WiFi ganz alleine.

Ich wollte erst einmal ein wenig mit dem Ding herumprobieren, evtl. mal 
einen Solar-MPP-Tracker damit bauen. Wenn er das kann, dann reicht er 
für alles andere auch.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Ben B. schrieb:
> Oversampling wäre das einzige, was mir bislang brauchbar erschien.
Damit kannst du die Kennlinie nicht linearisieren.

Ben B. schrieb:
> das macht der mit aktiviertem WiFi ganz alleine.
Hat  er nicht 2 ADC?
Von denen einer viel empfindlicher auf BT/Wlan Gezappel reagiert als der 
andere....

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Linear sollte er im Bereich 0,2..2,5V einigermaßen sein, der 
Offsetfehler soll recht groß sein und die Exemplarstreuung ist hoch...

Bei aktivem WiFi braucht der ESP den ADC2 selbst, man kann daher sowieso 
nur ADC1 benutzen.

von Stefan F. (Gast)


Lesenswert?

Solange WLAN aktiv ist, bleiben dir von den vielen Bits des ADC nicht 
einmal 8 Bits übrig. Der größte Knackpunkt ist die Nähe des zum RF 
Schaltkreis. Die Naturgesetze gelten auch für Espressif.

Auch ich empfehle dir die Nutzung eines externen ADC. Mit dem MCP3208 
bin ich sehr gut zurecht gekommen. Abstand zum ESP Modul, eine gut 
gefilterte Stromversorgung, niederohmige Widerstände und eine externe 
Antenne können hilfreich sein.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Solange WLAN aktiv ist, bleiben dir von den
> vielen Bits des ADC nicht einmal 8 Bits übrig.
Mich würde interessieren ob das auch noch gilt wenn ich 64 oder 128 
ADC-Messungen zusammenaddiere und die unteren 6/7 Bits vom Ergebnis 
wegschmeiße. Wie genau ist der Teil, der dann noch stehenbleibt?

von Stefan F. (Gast)


Lesenswert?

Ben B. schrieb:
> Mich würde interessieren ob das auch noch gilt wenn ich 64 oder 128
> ADC-Messungen zusammenaddiere und die unteren 6/7 Bits vom Ergebnis
> wegschmeiße. Wie genau ist der Teil, der dann noch stehenbleibt?

Das wirst du im Einzelfall durchprobieren müssen. Bedenke, dass die 
Aktivität im WLAN kaum vorhersehbar ist und ganz andere Störungen 
verursacht, als allgemeines Rauschen.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Yep, sehe das schon kommen... aber wenns schiefgeht kann ich die Platine 
mit dem ESP32 immer noch wieder runternehmen und stattdessen eine mit 
AVR oder externen ADCs draufpacken, dann würde die Schaltung immerhin 
trotzdem funktionieren.

Was ich mit dem ESP32-Board mal testen werde: 47k/47k Spannungsteiler 
mit 3,3V an den ADC-Eingang, mal mit und mal ohne Abblock-C, WiFi im 
Access-Point Mode (dann hat man alle 100ms schicke Beacons) und mal 
schauen was passiert, evtl. ein kurzes Script drauf was den Mittelwert 
über viele Messungen und die maximalen Abweichungen speichert.

Für den "professionellen Einsatz" habe ich mich schon damit abgefunden, 
daß die internen ADCs nicht zu gebrauchen sind und man zwingend was 
externes braucht. Schade, macht solche Projekte dann wieder ein gutes 
Stück teurer.

von Stefan F. (Gast)


Lesenswert?

Ben B. schrieb:
> 47k/47k Spannungsteiler

Zu hochohmig, da streut dir das Funksignal stark rein. Gehe auf 2,2 kΩ 
runter oder schalte einen Kondensator parallel zum "unteren" Widerstand, 
um HF Anteile kurz zu schließen.

> mal mit und mal ohne Abblock-C

Meinst du damit einen Abblock-Kondensator an der Stromversorgung? Auf 
den sollte man nie verzichten. Typischerweise 100 bis 220 µF an VCC/GND 
zusätzlich zu den kleineren Kondensatoren, die sich bereits unter dem 
Abschirmblech befinden.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

>> 47k/47k Spannungsteiler
> Zu hochohmig
Ich weiß, absichtlich zu hochohmig.

Ich versuche es eigentlich zu vermeiden, mehr als 0,5 oder 0,1mA durch 
solche Spannungsregler zu jagen - ich will einfach sehen wie schlecht 
das Ergebnis wirklich wird.

Praktisch nehme ich für sowas gerne 10k als unteren 
Spannungsteilerwiderstand, oder 4,7k wenn's sein muss, aber das ist dann 
echt schon viel Strom durch das Ding. Normalerweise wird das Ergebnis 
eines (10 Bit) AVR-ADCs mit 10k/10nF schon sehr gut und stabil.

> Meinst du damit einen Abblock-Kondensator an der Stromversorgung?
Nein, daß man den nicht weglassen darf, ist mir klar.

Ich meinte den Kondensator parallel zum unteren 
Spannungsteilerwiderstand, mit dem man sonst versucht, ein stabileres 
Signal hinzukriegen. Espressif selbst hätte da gerne satte 100nF an 
ADC-Pins, aber wenn man etwas mehr Streuung für Oversampling möchte, 
dann interessiert mich, in welchen Bereichen man damit arbeiten kann.

von Rainer W. (rawi)


Lesenswert?

˙ɟ uɐɟǝʇs schrieb:
> Solange WLAN aktiv ist, bleiben dir von den vielen Bits des ADC nicht
> einmal 8 Bits übrig.

Was verstehst du unter "WLAN aktiv"?
Solange gerade nicht gesendet wird, kann sooh viel schlimmes nicht 
passieren.
Ansonsten ist es vielleicht sinnvoll,  ADC- und WLAN-Aktivität zeitlich 
aufeinander abzustimmen.

von Stefan F. (Gast)


Lesenswert?

Ben B. schrieb:
> wenn man etwas mehr Streuung für Oversampling möchte,
> dann interessiert mich, in welchen Bereichen man damit arbeiten kann.

Dabei will man das Eigen-Rauschen des ADC nutzen, die zu messende 
Spannung muss stabil sein.

von Stefan F. (Gast)


Lesenswert?

Rainer W. schrieb:
> Was verstehst du unter "WLAN aktiv"?
> Solange gerade nicht gesendet wird, kann sooh viel schlimmes nicht
> passieren.

Genau.

Wenn WLAN aktiv ist, wird ab und zu (typisch mehrmals pro Sekunde) etwas 
gesendet, um die Verbindung aufrecht zu erhalten.

> Ansonsten ist es vielleicht sinnvoll,  ADC- und WLAN-Aktivität
> zeitlich aufeinander abzustimmen.

Das hast du als Anwendungsentwickler nicht unter Kontrolle. Du müsstest 
die WLAN Schnittstelle aus schalten, damit sie inaktiv ist.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Ansonsten ist es vielleicht sinnvoll,  ADC- und WLAN-Aktivität
> zeitlich aufeinander abzustimmen.
Keine Chance, man weiß ja nicht wann über die WLAN-Verbindung Daten 
hereinkommen und ich weiß nicht ob der IC sowas kann wie RX only und 
dann später kein TX mehr nachdem man die Antwort gesendet hat. Kein 
Plan, ob man das synchronisiert bekommt, selbst bei nur RX müsste man ja 
auch ein Ack senden, nachdem man einen Datenframe empfangen hat.

> Dabei will man das Eigen-Rauschen des ADC nutzen,
> die zu messende Spannung muss stabil sein.
Nein. Der ADC des AVR z.B. ist in sich so stabil, daß das eigene 
Rauschen dafür nicht reicht. Man kann das Oversampling ja auch benutzen, 
um einem ADC zu mehr Auflösung zu verhelfen - dazu pro zusätzlichem Bit 
die Samples vervierfachen, alles addieren und das Ergebnis halbieren. 
Wenn das Rauschen zu gering ist, entstehen Treppeneffekte und dann muss 
man ein zusätzliches Störsignal in die Messgröße oder in die 
Referenzspannung einkoppeln.

Mich interessiert im Moment, ob man das Ergebnis damit einfach nur 
stabil und ausreichend genau bekommt, wenn man z.B. 128 Messungen 
addiert, aber keine zusätzlichen Bits nutzt. 12 Bit Auflösung würden mir 
eigentlich reichen, aber Auflösung alleine bringt genau gar nichts wenn 
die Genauigkeit für'n Arsch ist und sich auch nicht durch eine einfache 
Offset-Kompensation zurechtbiegen lässt.

von Rainer W. (rawi)


Lesenswert?

Ben B. schrieb:
> Mich interessiert im Moment, ob man das Ergebnis damit einfach nur
> stabil und ausreichend genau bekommt, wenn man z.B. 128 Messungen
> addiert,

Wenn die WLAN-Störungen die Anzahl der effektiven Bits gegenüber der 
Wandlerauflösung um vier reduziert, d.h. um einen Faktor 16, sollte 
Oversampling mit einem Faktor 256 (=(16)^2) die Sache wieder gerade 
biegen - vorausgesetzt die Störungen sind ausreichend stationär und 
unkorreliert. Genau das könnte zum Problem werden. ;-)

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.