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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bernhard S. (b_spitzer)


Bewertung
0 lesenswert
nicht 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:
 
                               VCC 3,3V            
                               |                     
                              .-. R2               
                              | | 330k             
                     R1       | |                  
                     27k      '-'                  
           ___       ___       |                   
   Sensor |___>-----|___|------o-----o--------o  Ain0    
                               |     |               
              |               .-.    | C1   |
              |           R3  | |   ---     |
       Uein   |           47k | |   ---     |  Uaus
              |               '-'    | 100n |
              v                |     |      v
             ---              ---   ---    ---
                               GND
  (created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)
Die Berechnung der Ausgangsspannung Uaus mit dem Überlagerungssatz:
1. Fall Uein ist Kurzgeschlossen (R1||R3 = R13)
        Uaus' = R13 / (R2+R13) * VCC
2. Fall VCC ist Kurzgeschlossen  (R2||R3 = R23)
        Uaus''= R23 / (R1+R23) * Uein
Überlagerung
        Uaus = Uaus' + Uaus''
Mit den hier gezeigten Bauteilwerten ergibt sich ungefähr
        Uaus = 0,60376 * Uein + 0,0494 * VCC
             = 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
1 lesenswert
nicht 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.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.