Forum: Mikrocontroller und Digitale Elektronik ADC Eingangsspannung


von ADC (Gast)


Lesenswert?

Hallo Zusammen,

ich beschäftige mich gerade mit einer Schaltung mit AD-Wandler.

ich habe aber ein Problem mit der Eingangsspannung. wenn ich die 
Spannung mit LtSpice Simuliere komme ich auf den Richtigen Wert, 
allerdings variiert der Wert wenn ich es mit der Formel vom ADC berechne 
----> Uin= ADC*Uref/2^n.

ich berechne eine Abweichung von fast 0.003 V. ich weiss aber nicht 
woran es liegt. hat jemand zufällig eine Antwort.

Danke im Voraus.

von Joe F. (easylife)


Lesenswert?

Vermutlich hast du vergessen zu berücksichtigen, dass Uin= ADC*Uref/2^n 
nur näherungsweise gilt und unterschlägt, dass ein kleiner Strom in den 
ADC Eingang fließt?

von A. S. (Gast)


Lesenswert?

Naja, die Formel ist falsch. Off by one.

8 bit., Nur sind's dann eher 4 mV.

von ADC (Gast)


Lesenswert?

welche Formel soll ich hier benutzen?

Joe F. schrieb:
> ermutlich hast du vergessen zu berücksichtigen, dass Uin= ADC*Uref/2^n
> nur näherungsweise gilt und unterschlägt,

von ADC (Gast)


Lesenswert?

könnte es sein dass Gain oder Offset Fehler die Messungen beinflussen ?

von Thomas (Gast)


Lesenswert?

ADC schrieb:
> ich berechne eine Abweichung von fast 0.003 V

das klingt bei dir ja fast so als ob das viel sein sollte, 3mV.
Vlt. zeigst du mal eine Schaltung?

von A. S. (Gast)


Lesenswert?

Off by one heißt: einen daneben.

Du teilst durch 2^n, der Maximalwert ist aber 2^n-1.

Also bei 8 bit durch 255 teilen, nicht 256.

von Wolfgang (Gast)


Lesenswert?

ADC schrieb:
> ich habe aber ein Problem mit der Eingangsspannung. wenn ich die
> Spannung mit LtSpice Simuliere komme ich auf den Richtigen Wert,
> allerdings variiert der Wert wenn ich es mit der Formel vom ADC berechne
> ----> Uin= ADC*Uref/2^n.
>
> ich berechne eine Abweichung von fast 0.003 V.

LTSpice ist nur eine Schaltungssimulation. Wenn das Ergebnis der 
Rechnung oder der Simulation vom richtige Wert abweichen, passen 
Rechnung und/oder Simulation, die auch nur eine Rechnung ist, nicht zur 
Realität.

Also was simulierst du in LTSpice?
Woher hast du den "richtigen Wert"?
Was genau soll deine Formel beschreiben?

Beispiel: Ein ADC mit 4 Bit kann 16 Werte annehmen, also gäbe es 
zwischen 0V und URef genau 15 Intervalle (Zwischenräume). Wie kommst du 
in diesem Zusammenhang auf obige Formel?

von Leera (Gast)


Lesenswert?

A. S. schrieb:
> Also bei 8 bit durch 255 teilen, nicht 256.

Nö.

Beim Skalieren/Umrechnen ist die Länge der Skala entscheidend,
also 256, nicht der Maximalwert der Skala.

von A. S. (Gast)


Lesenswert?

Leera schrieb:
> Beim Skalieren/Umrechnen ist die Länge der Skala entscheidend,
> also 256, nicht der Maximalwert der Skala.

Die Standardkonvention ist, dass Du mit einer Referenz von 5V eine 
Spannung von 0..5V messen kannst, d.h. der ADC dies in Wert von 0..2^n-1 
wandelt.

Wenn Du nun bei 8 (oder n) Bits den ADC-Wert entsprechend skalierst 
(U=5V*ADC/256), dann ist der maximal mögliche Wert 5V*255/256. Und das 
sind halt nicht 5V.

Man nennt das "off by one" oder "Zaunlattenproblem". Das führt auch 
immer zu der interessanten Frage, wie der ADC den Wert 0 bzw. 2^n-1 
behandeln soll. Beispiel: Ein ADC wandelt 0..1V in Werte von 0..10. Da 
würde man annehmen, die Umschaltschwellen liegen bei 0.05V, 0.15, … 
0.95V. Ein Wert von 3 entspricht dann 0.3V+-0.05V. Dabei überdecken die 
Rand-Werte (0 und 10) aber nur ein halbes Bit ;-)

von Wolfgang (Gast)


Lesenswert?

Zum Thema ADC-Kennlinie gibt es längere Abhandlungen, z.B. die
AN2438 ADC Definitions and Specifications von J.Feddeler und B.Lucas 
(freescale Semi, jetzt NXP)
https://www.nxp.com/docs/en/application-note/AN2438.pdf

von Kai (Gast)


Lesenswert?

Hi,

Ich muss leider sagen, dass ich nichts verstanden habe.

Könnte sich jemand erbahmen und mich etwas unterstützen?
Meine Fähigkeiten liegen eher in der 3d Modell-Erstellung, 3d Druck und 
Holz + Leder Bearbeitung.

Jedenfalls baue ich mit Hilfe eines Esp32 und eines kapazetiven 
Erdfeuchte Messer von Alibaba eine Pflanzesteuerung. Nun scheitere ich 
am auslesen des Signals, weil ich es nicht auf die 1v für den ADC Pin 
runter bekomme.
Habe bereits eine Schaltung mit 3,3v Eingang, 47k und 10k Ohmen in Reihe 
geschalteten Widerstände gebaut und zwischen den beiden Widerständen 
eine Gound Verbindung gemessen. Hier habe ich sie gefunden 
https://www.androegg.de/?product=esp8266-esp32-esp8285-k-0135-regen-wasser-rain-water-1v-adc-sensor-kit
Klappte leider nicht und ich verzweifel.

Hilfe brauche ich bei dem Problem, aber wenn sich jemand an dem Projekt 
beteiligen möchte und mit uns bis zur Platinenentwicklung gehen möchte, 
würde ich mich sehr freuen.

LG Kai

von Route_66 H. (route_66)


Lesenswert?

Kai schrieb:
> Meine Fähigkeiten liegen eher in ... Holz + Leder Bearbeitung.

Jetzt wird mir klar, woher das Sprichwort kommt: "Schuster, bleib bei 
deinem Leisten"!

von A. S. (Gast)


Lesenswert?

Kai schrieb:
> Ich muss leider sagen, dass ich nichts verstanden habe.

Du bist aber nicht der TO, oder? Schildere dann bitte Dein Problem, da 
Du schwerlich das "Luxusproblem" (<<1% Ungenauigkeit) des TOs hast, 
oder?

von Kai H. (kai_h813)


Lesenswert?

Hallo A.S.,

vorab schon mal Danke, dass du mir eine Chance gibst ;)

Mein Problem ist, dass der ADC Pin des ESP32 nur eine maximale 
Eingangsspannung von 1V zulässt (bevor er zerstört wird), der verwendete 
Sensor aber ein Analoges Signal von 3,3V bis 0V ausgibt (bei 3,3V 
Eingangsspannung direkt vom ESP32 am Sensor: 
https://www.amazon.de/Docooler-Kapazitiv-Feuchtigkeit-Stromspannung-Korrosionsbest%C3%A4ndigkeit/dp/B07H56W48G/

Ich verstehe die Schaltung nicht, die mit z.B. mit zwei Wiederständen 
(30kO und 10Ko in Reihe) das Signal auf die maximalen 1V verringert.

Ich habe mir auch den Thread hier durchgelesen, bin aber wegen der 
Eingangsspannung verunsichert: 
Beitrag "ESP32 Analog Wert am Spannungsteiler ungenau vs Arduino Analog Wert"

LG Kai

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

ADC schrieb:
> Uin= ADC*Uref/2^n.

Bedenke hierbei: ADC kann nie 2^n werden sondern nur 2^n-1 da der Spass 
ja bei 0 beginnt zu zählen, nicht bei 1.

A. S. schrieb:
> Die Standardkonvention ist, dass Du mit einer Referenz von 5V eine
> Spannung von 0..5V messen kannst, d.h. der ADC dies in Wert von 0..2^n-1
> wandelt.

Genau genommen kannst du 5V nicht messen denn das wäre der ADC-Wert 2^n, 
der ADC macht aber insgesamt 2^n-Werte und beginnt bei 0 zu zählen (das 
ist sein 1. Wert), daher kann er maximal nur als Wert 2^n-1 annehmen ;)

von Einer K. (Gast)


Lesenswert?

M. K. schrieb:
> Bedenke hierbei: ADC kann nie 2^n werden sondern nur 2^n-1 da der Spass
> ja bei 0 beginnt zu zählen, nicht bei 1.

Ich möchte dir auch was zu denken geben:
Das Datenblatt der AVR, und da mal konkret des ATMega328P (nur als 
Beispiel) behauptet exakt das Gegenteil.
(leider kenne ich das Datenblatt des ESP32 nicht so gut auswendig)

Einer von euch beiden liegt falsch.
Du, oder das Datenblatt.

von Wolfgang (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> M. K. schrieb:
>> Bedenke hierbei: ADC kann nie 2^n werden sondern nur 2^n-1 da der Spass
>> ja bei 0 beginnt zu zählen, nicht bei 1.
>
> Ich möchte dir auch was zu denken geben:
> Das Datenblatt der AVR, und da mal konkret des ATMega328P (nur als
> Beispiel) behauptet exakt das Gegenteil.

Vielleicht kannst du mal etwas genauer zitieren.

Das Datenblatt wird wohl kaum behaupten, dass ein 10-Bit Wandler als 
Wandlungsergebnis 2^10 = 0x0400 liefern kann.

von Achim S. (Gast)


Lesenswert?

Wolfgang schrieb:
> Vielleicht kannst du mal etwas genauer zitieren.
>
> Das Datenblatt wird wohl kaum behaupten, dass ein 10-Bit Wandler als
> Wandlungsergebnis 2^10 = 0x0400 liefern kann.

Nein, macht es tatsächlich nicht. Genau genommen steht dort:

"An n-bit single-ended ADC converts a voltage linearly between GND and 
VREF in 2n steps (LSBs). The lowest code is read as 0, and the highest 
code is read as 2n-1."

Das klingt für mich exakt gleichlautend zu der Aussage von M.K., nicht 
nach deren exaktem Gegenteil.

Ein Stück weiter unten im Datenblatt steht dann:

ADC=V_IN*1024/Vref

Umgeformt wird daraus:

V_IN = Vref*ADC/1024

und die maximal mögliche Spannungsangabe für V_IN wird damit zu

Vref*1023/1024.

Der maximal mögliche Spannungswert, den der ADC liefern kann, wäre bei 
Vref=5V also 5V*1023/1024=4,995V - wie es M.K. geschrieben hat.

Streng genommen sagt der Maximalwert des ADCs natürlich nur aus, dass 
die Analogspannung irgendwo zwischen 4,995V und 5V liegt. Wo genau 
innerhalb dieses Quantisierungsintervalls sie liegt lässt sich nicht 
bestimmen. Man könnte den größten ADC-Wert also ebensogut mit dem 
Mittelpunkt des Quantisierungsintervalls 4,9975V gleichsetzen (und den 
kleinsten möglichen ADC-Wert mit 2,44mV).

Das macht AVR in dem mir vorliegenden Datenblatt aber nicht. Daher 
verstehe ich ebenfalls nicht, wo der Widerspruch zwischen M.K.s Beitrag 
und der Darstellung im Datenblatt liegen soll.

von Einer K. (Gast)


Lesenswert?

http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf

24.7 ADC Conversion Result
page 256

Dort findest du die Formel.

(passend umstellen, wirst du schaffen. die 1024 ändern sich dabei nicht)

von s.c.n.r. (Gast)


Lesenswert?

Kai H. schrieb:
> Ich verstehe die Schaltung nicht, die mit z.B. mit zwei Wiederständen
> (30kO und 10Ko in Reihe) das Signal auf die maximalen 1V verringert.

Es gibt keine "Wiederstände" (oder was soll da wieder stehen) und deine 
Einheitenzeichen für die Werte scheint auch für die Tonne zu sein.
https://de.wikipedia.org/wiki/Internationales_Einheitensystem#Abgeleitete_SI-Einheiten_mit_besonderem_Namen

von Einer K. (Gast)


Lesenswert?

Achim S. schrieb:
> Das klingt für mich exakt gleichlautend zu der Aussage von M.K., nicht
> nach deren exaktem Gegenteil.

Ich habe das so verstanden, dass ihm
> Uin= ADC*Uref/2^n
nicht geschmeckt hat und er statt dessen
> Uin= ADC*Uref/(2^n-1)
sehen wollte.

evtl. ein Missverständnis?

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


Lesenswert?

Kai H. schrieb:
> Mein Problem ist, dass der ADC Pin des ESP32 nur eine maximale
> Eingangsspannung von 1V zulässt (bevor er zerstört wird)
Der taugt dank seines lausigen ADC sowieso nicht zum genauen Messen. 
Nimm einen externen ADC. Siehe dazu den 
Beitrag "ESP32 analogRead Schwankungen"

Achim S. schrieb:
> he lowest code is read as 0, and the highest code is read as 2n-1."
Und das sind dann genau wieviele mögliche Zustände?
Zählen wir mal
0 = 1.
1 = 2.
2 = 3.
:
:
:
n-1 = n.

Und weil es doch ziemlich schwierig ist, das mit 8- oder 10- oder noch 
mehr  Bit Wandlern zu verstehen, empfehle ich mal die Betrachtung mit 
einem 2 Bit Wandler und einer Referenzspannung von 4V.

Dieser ADC hat also bei folgenden Eingangsspannungen folgende 4 Stufen:
Eingangsspannung => ADC-Wert
0,0V..0,99V => 00 = 0
1,0V..1,99V => 01 = 1
2,0V..2,99V => 10 = 2
3,0V..3,99V => 11 = 3

Beim der Formel U = 4V*ADC/4 kommt dann das raus, was man "eigentlich" 
erwarten würde:
ADC => mit der Formel 4V*ADC/4 berechnete Spannung
0 => 0,00
1 => 1,00
2 => 2,00
3 => 3,00

Mit der Formel U = 4V*ADC/3 kommt was raus, was der ADC eigentlich gar 
nicht kann:
ADC => mit der Formel 4V*ADC/3 berechnete Spannung
0 => 0,00
1 => 1,33
2 => 2,66
3 => 4,00
Diese Formel ergibt also schon bei einem Eingangswert von 3,0V eine 
berechnete Spannung von 4V, die der ADC aber eigentlich gar nicht mehr 
wandeln kann.


Aber das kann jeder machen wie er will. Man sollte sich nur bewusst 
sein, was man da gerade tut...

: Bearbeitet durch Moderator
von Kai H. (kai_h813)


Lesenswert?

Danke Lothar,
das war hilfreich.

von Achim S. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> evtl. ein Missverständnis?

da würde ich denn mal auch auf Missverständnis tippen.

Denn für sich allein betrachtet - ohne eigene, weitergehende 
Interpretationen dazuzufügen -  stimmt das von M.K. geschriebene 
vollständig mit der Darstellung im AVR-Datenblatt überein. Inklusive der 
Tatsache, dass die Zahlen von 0 bis 2^n-1 des ADCs natürlich 2^n 
unterschiedliche Werte(intervalle) darstellen.

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.