Forum: Mikrocontroller und Digitale Elektronik ESP32 ADC für 0-5V


von Bernhard S. (b_spitzer)


Lesenswert?

Hallo zusammen,
eines vorweg - durch die hier beschriebenen Massnahmen wird der ADC des 
ESP32 auch nicht viel besser, aber man kann ihn vielleicht für 
einfachere Projekte ohne viel Grübeln nutzen.

Mein Problem war, am Ain einen MQ-135 Gassensor auszuwerten. Jetzt gibt 
der Sensor bei niedrigem CO2-Gehalt nur sehr geringe Spanungen aus 
(Beispiele für den AtMega nennen z.B. 55 als Offset, das wären bei 5V 
Bereich und 10Bit gerade mal 27mV). Der ADC des ESP32 misst unter 150mV 
Eingangsspannung aber einfach gar nichts.
Folgende Beschaltung des Analogeingangs habe ich mir ausgedacht:
1
 
2
                               VCC 3,3V            
3
                               |                     
4
                              .-. R2               
5
                              | | 330k             
6
                     R1       | |                  
7
                     27k      '-'                  
8
           ___       ___       |                   
9
   Sensor |___>-----|___|------o-----o--------o  Ain0    
10
                               |     |               
11
              |               .-.    | C1   |
12
              |           R3  | |   ---     |
13
       Uein   |           47k | |   ---     |  Uaus
14
              |               '-'    | 100n |
15
              v                |     |      v
16
             ---              ---   ---    ---
17
                               GND
18
  (created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)
Die Berechnung der Ausgangsspannung Uaus mit dem Überlagerungssatz:
1
1. Fall Uein ist Kurzgeschlossen (R1||R3 = R13)
2
        Uaus' = R13 / (R2+R13) * VCC
3
2. Fall VCC ist Kurzgeschlossen  (R2||R3 = R23)
4
        Uaus''= R23 / (R1+R23) * Uein
5
Überlagerung
6
        Uaus = Uaus' + Uaus''
Mit den hier gezeigten Bauteilwerten ergibt sich ungefähr
1
        Uaus = 0,60376 * Uein + 0,0494 * VCC
2
             = 0,60376 * Uein + 0,163
Nutzen der Schaltung:
- ergibt einen Offset von ca. 160mV, da der ADC des ESP32 unter 150mV 
nichts misst.
- ergibt eine Anpassung des Eingansspannungsbereiches auf 0-5V ==>> 
0,16-3,18V
- kann mit einer einfachen MAP-Funktion abgebildet werden.
- Variationen der Versorgungsspanung gehen nur gering in die 
Ausgangsspannung ein

Damit bekommt man zumindest das Problem in den Griff, dass unter 150mV 
nicht mehr gemessen werden kann. Die ADC-Kennlinie verläuft allerdings 
nur bis ca. 2,45V Eingangsspannung einigermaßen linear => über 3,8V 
Eingangsspannung (Entspricht dann AD-Wert 3040) sollte man auf eine 2. 
MAP-Funktion umschalten.

von Michael F. (sharpals)


Lesenswert?

Schau mal hier : https://github.com/e-tinkers/esp32-adc-calibrate

Ja die ADC´s im ESP32 sind etwas .......
Das ist mir in meinem webradio auch schon aufgefallen , bei dem bereich 
von 0 - 0,15v ist er unbrauchbar und dasselbe ab ca 2,9V.

https://microcontrollerslab.com/adc-esp32-measuring-voltage-example/

Deine schaltung soll also die spannung auf 150mv anheben und dann sich 
mit der spannung des sensors überlagern ?

In diesem fall müßten aber die widerstandwerte genau auf den sensor 
abgetimmt sein ( er hat ja einen generatorwiderstand ).

Die schwierigkeit sehe ich , das alle spannungen unter 150mv dann immer 
noch nicht gemssen werden können ( kirchhofsches gesetz , summe aller 
ströme ), da ja dann der stromfluß vom widerstandsnetzwerk in den sensor 
laufen würde.

Aufgrund des aufbaus wird das wohl nicht passieren, aber erst bei 150mv 
wird dann sich etwas ändern.

Persönlich würde ich masse des sensors hoch (präzisionsdiode z.b) ziehen 
( Ok , bei einem 3,3V system ist da nicht mehr viel spielraum).

: Bearbeitet durch User
von Bernhard S. (b_spitzer)


Lesenswert?

Michael F. schrieb:
> In diesem fall müßten aber die widerstandwerte genau auf den sensor
> abgetimmt sein ( er hat ja einen generatorwiderstand ).

Im Zweifelsfall kann man ja noch einen Buffer (Spannungsfolger) davor 
setzten, dann ist der Innenwiderstand der Quelle egal. Aber hier ist die 
Anpaßschaltung absichtlich recht hochohmig ausgelegt. Da muss der Sensor 
schon sehr hochohmig sein.

> Die schwierigkeit sehe ich , das alle spannungen unter 150mv dann immer
> noch nicht gemssen werden können ( kirchhofsches gesetz , summe aller
> ströme ), da ja dann der stromfluß vom widerstandsnetzwerk in den sensor
> laufen würde.

Ja, der Sensor nimmt bei Spannungen unter 150mV Strom auf. Das 
funktioniert in dem Fall aber ohne Probleme. Auch mit vorgeschaltetem 
Spannungsfolger fließt Strom zurück (bei 0V Eingansspannung etwa 5,5µA, 
das verträgt der Sensor...)

von Michael F. (sharpals)


Lesenswert?

Dan würde ich einen rail to rail OP amp nehmen, damit wird dann alles 
erschlagen. Dort kann dann der offset eingestellt werden und die 
vertärkung so angepasst werden, wie es benötigt wird.

Der rest wird dann mit einer korrekturtabelle erschlageb, so denn es 
notwendig ist.

Oder man verwendet direkt einen besseren adc :-) So denn die präzision 
benötigt wird.

von Bernhard S. (b_spitzer)


Lesenswert?

Wenn man einen OPv einbaut kann man auch gleich einen besseren ADC 
nutzen (ein ADS1115 ist als Modul leichter zu verbauen wie z.B. ein 
aktueller RR-OPv im SO-8 Gehäuse).
Viele Anfänger nehmen aber einfach den internen ADC und wundern sich 
vielleicht über die schlechten Werte (oder dass immer nur 0 gelesen 
wird).
Und wie ich gleich am Anfang geschrieben habe, ist das eine 
Sofortmaßnahme für mittelmäßige Anforderungen. Ein Temperatursensor 
lässt sich damit auf 1°C genau auswerten, ein GP2D12 kann auf einige mm 
genau ausgewertet werden und bei einem Fotowiderstand ist der 
AD-Vergleichswert eh im Test einzustellen.

von Michael F. (sharpals)


Lesenswert?

Ja, wenn man die volle funktionalitär benutzen will ist es ein schönes 
teil.

Nur finde ich keinen unter 14 euro :
https://www.adafruit.com/product/1085
Gut ich würde ihn sowiso auflöten, aber auch dann wirds nicht günstiger.

Wärend der OP für 0.5 - Max 1e zu bekommen ist...

von Stefan F. (Gast)


Lesenswert?

Ich finde den MCP3208 (12Bit ADC, 8 Kanäle, SPI) sehr handlich. Bei 
Reichelt kostet er im DIP Format 2,91€, in SMD etwas weniger. 
http://ww1.microchip.com/downloads/en/devicedoc/21298e.pdf

Entweder speist du ihm mit 3,3V und machst einen Spannungsteiler vor den 
analogen Eingang, oder du speist ihn mit 5V und packst einen 
Pegelwandler in die SPI Schnittstelle zum ESP32.

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.