Forum: Mikrocontroller und Digitale Elektronik ADC Teilbereich auslesen (Spannungsteiler)


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 Karl (Gast)


Lesenswert?

Hallo zusammen.

Ich habe vor einen variablen Widerstand (0-180 Ohm) an einem ADC Port 
eines ATMega32 auszulesen. Hatte mir vorgestellt das mit einem 
Spannungsteiler zu realisieren.
Mein Problem bezieht sich darauf das der Widerstand von Haus aus mit 
Masse verbunden ist (Sensor) und sich für mich dann nur die eine 
Möglichkeit des Spannungsteilers ergibt.
1
+5V ----RRRRRR----o----RR(0-180 Ohm)RR----GND
2
                  |
3
                  |
4
                 ADC
Sieht in meinem Kopf ungefähr so aus.

Doch jetzt entsteht das Problem das der Wert nie den ganzen Bereich des 
ADC erreichen würde? Wie lese ich diesen dann richtig aus? Habe bis 
jetzt immer nur den ganzen Bereich des ADC verwendet. Oder gibt es eine 
andere Schaltung die man dafür verwenden könnte?

Ich wäre über jede Hilfestellung dankbar.

Ps. Der Messwert muss nicht der genaueste sein er dient nur der 
Orientierung. Und ich programmiere in Bascom

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl schrieb:

> Doch jetzt entsteht das Problem das der Wert nie den ganzen Bereich des
> ADC erreichen würde?

Das kommt drauf an.
Wenn du den Spannungsteiler 'oben' an 5V legst und dich an die übliche 
Gepflogenheit hältst, dass der 2.te Widerstand ebenfalls 180Ohm hat, dan 
erreichst du am Spannungsteiler maximal die Hälfte der Spannung. Also 
2.5V

Jetzt könnte man natürlich das obere Ende des Spannungsteilers auch an 
10V legen und kriegt so dann am Abgriffpunkt eine Spannung im Bereich 5V 
bis 0V.

Anstatt da mit 10V zu hantieren, könnte man natürlich dem ADC auch eine 
andere Referenzspannung geben. Wenn man dem ADC als Referenz die 2.5V 
vorgibt, dann löst er den Spannungsbereich von 0 bis 2.5V wieder in 
seiner maximalen Auflösung auf.

ALternativ könnte man auch die Spannung am Spannungsteiler mit einem 
Faktor von 2 multiplizieren (OpAmp als Verstärker) und hat dann auch 
wieder einen Spannungsbereich von 0 bis 5V

Oder aber man könnte einfach mal durchrechnen, ob man mit dem halben 
Wertebereich des ADC durchkommt, weil die damit ermittelten 
Widerstandswerte immer noch genau genug sind.

von Achim S. (Gast)


Lesenswert?

Wie Karl Heinz schon geschrieben hat: wenn der Verlust von 1 Bit an 
Auflösung akzeptabel ist, dann kannst du einfach mit dem halbierten 
Spannungsbereich leben. Du solltest dann auch noch prüfen, ob der Strom 
durch deinen Sensor nicht zu groß werden kann (nicht jeder resistive 
Sensor mag Ströme > 10mA).

Falls der große Strom dich doch stören sollte und du keinen "externen" 
OPV-Verstärker nutzen willst, kannst du den Vorwiderstand des Teilers 
auch größer machen, so dass am Sensor nur max. 0,5V abfallen. Dann gibst 
du den Sensor differentiell auf den ADC des ATMega und schaltest dessen 
interne Verstärkung auf x10. (Dabei verlierst du allerdings auch wieder 
ein Bit an Auflösung, weil der differentielle Eingangsbereich dann von 
+Vref bis -Vref reicht).

von Karl (Gast)


Lesenswert?

Danke ihr zwei für die schnellen Antworten.

Leider kommt die Anpassung der Referenzspannung nicht in frage da ich 
noch andere Kanäle mit 5V messe und ich den bereich gerne lassen würde. 
(aber darauf hätte ich eigentlich auch kommen können..)

Ich habe auch eine 9V Spannungsquelle zur verfügung die könnte man ja 
als Quelle nehmen und dann den ersten Spannungsteiler Widerstand auf 
180ohm nehmen. Würde zwar nur ca. 4,5v maximal sein aber für mich würde 
es reichen.

Achja.. ist es vielleicht eine gute idee noch eine Z Diode 
dazuzuschalten einfach nur um sicher zu sein?

Ich werde mir auch mal anschauen wie das mit den Verstärkern geht (habe 
ich noch nie verwendet)

Ich danke erstmal für die Hilfestellung.

von Simpel (Gast)


Lesenswert?

Moinsen...

"Leider kommt die Anpassung der Referenzspannung nicht in frage da ich
noch andere Kanäle mit 5V messe und ich den bereich gerne lassen würde.
(aber darauf hätte ich eigentlich auch kommen können..)"

Kannst du trotzdem, indem du zur Laufzeit per Code die jeweils zum Kanal 
passende Referenz von Acc_5V, Ref._intern, oder Ref._extern 
einstellst...

von Karl (Gast)


Lesenswert?

Servus

"Kannst du trotzdem, indem du zur Laufzeit per Code die jeweils zum 
Kanal passende Referenz von Acc_5V, Ref._intern, oder Ref._extern 
einstellst..."

Das ist natürlich auch eine gute Variante.
Hab das alles immer vor dem eigentlichen Programm eingestellt.
Ich habe noch nicht soviel erfahrung mit Programmieren. Aber dank der 
Denkanstöße hier fällt das dazulernen auf jeden fall leichter.

von Joachim B. (jar)


Lesenswert?

Karl schrieb:
> Leider kommt die Anpassung der Referenzspannung nicht in frage da ich
> noch andere Kanäle mit 5V messe und ich den bereich gerne lassen würde.
> (aber darauf hätte ich eigentlich auch kommen können..)

du könntest mit einem Multiplexer externe REF anschalten nach Bedarf, 
aber

Simpel schrieb:
> Kannst du trotzdem, indem du zur Laufzeit per Code die jeweils zum Kanal
> passende Referenz von Acc_5V, Ref._intern, oder Ref._extern
> einstellst...

ist noch besser, es gibt AVR mit 1,1V Ref intern das dürfte mit größerem 
Vorwiderstand an 5V zu deinen 180 Ohm die bessere Auflösung geben als 
nur 1/2.

Schon bei Uref 2,56V hast du mit Rv 180 Ohm die volle Auflösung wenn der 
Strom nicht stört.

: Bearbeitet durch User
von Karl (Gast)


Lesenswert?

Der ATMega32 hat ja eine Referenzspannung von 2,56V. Also müsste ich 
quasi nur am Anfang jeder Messung die config des ADC`s machen?
Habe hier mal einen kleinen Entwurf gemacht.

(Die Befehle Text2s Konvertieren den Wert in ein für ein Display gut 
darstellbares Format und "Call Createtxt" und "Call Displaytxt" geben 
den Eingelesenen Wert an ein Display weiter)


Sub Messung

Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Wert = Getadc(2)                          'KanalEingang

Text2s = Fusing(Wert , "#.&")
Text2s = " " + Text2s + " ^C"
Call Createtxt
Call Displaytxt

Stop Adc
End Sub


Würde das so funktionieren? Da müsste ich die config Zeile ja vor jede 
Messung schreiben?

von Joachim B. (jar)


Lesenswert?

Karl schrieb:
> Würde das so funktionieren? Da müsste ich die config Zeile ja vor jede
> Messung schreiben?

kA

ich bin nicht der BASCOM Kenner, aber bei

Karl schrieb:
> Reference = Internal

fehlt da nicht welche? es gibt doch mehr als eine?
m32 schaue aber jetzt nicht ins Datenblatt

kannst auch nur REF einstellen und ein Dummyload mchen

von Achim S. (Gast)


Lesenswert?

wenn du die 5V gleichzeitig als Versorgung für den Spannungsteiler und 
als Vref verwendest, machst du eine ratiometrische Messung: Drifts und 
Ungenauigkeiten der 5V wirken sich dann nicht auf dein Messergebnis aus.

Wenn du den Spannungsteiler mit 5V versorgst, aber als Vref eine davon 
unabhängige Spannung wählst, fällt dieser Vorteil weg. Ein Fehler von 5% 
bei der 5V Versorgung ergibt dann einen Fehler von 5% in deinem 
Messergebnis. Dieser Nachteil kann sehr schnell der Vorteil von 2 Bit 
zusätlicher Auflösung überwiegen.

5% Fehler hast du bei Allerweltsspannungsreglern übrigens schnell 
beisammen.

von Karl (Gast)


Lesenswert?

ok ich werde die variante wählen

Achim S. schrieb:
> wenn du die 5V gleichzeitig als Versorgung für den Spannungsteiler und
> als Vref verwendest, machst du eine ratiometrische Messung: Drifts und
> Ungenauigkeiten der 5V wirken sich dann nicht auf dein Messergebnis aus.

Danke an alle für die Hilfestellung.

von m.n. (Gast)


Lesenswert?

Karl schrieb:
> Ps. Der Messwert muss nicht der genaueste sein er dient nur der
> Orientierung.

Warum schreibst Du nicht, wie genau es sein sollte? :-(

Der ATmega32 hat vor seinem ADC einen Verstärker (x200), den Du 
unbedingt nutzen solltest. Bei Vref = 5 V wären max. 25 mV Meßspannung 
notwendig. Die Genauigkeit wird vermutlich bei max. 7-8 Bits liegen, 
aber für ein 1% Ergebnis ist das ausreichend. Eine ratiometrische 
Messung bleibt ja weiterhin möglich.

Die zuvor genannten Meßverfahren verbrauchen mir viel zu viel Strom. 
Irgendwo stehen auch 9 V, weshalb ich einen Batteriebetrieb vermute. Da 
ist geringe Stromaufnahme m.E. schon wichtig.

von Karl (Gast)


Lesenswert?

m.n. schrieb:
> Warum schreibst Du nicht, wie genau es sein sollte? :-(

Also die Genauigkeit die ich eingestellt habe/haben will liegt bei 0,1. 
Also z.b "5,4°C" oder "12,8°C"

zur Versorgung:

m.n. schrieb:
> Die zuvor genannten Meßverfahren verbrauchen mir viel zu viel Strom.
> Irgendwo stehen auch 9 V, weshalb ich einen Batteriebetrieb vermute. Da
> ist geringe Stromaufnahme m.E. schon wichtig.

Verbaut ist momentan ein Spannungsregler der die 9V zu Verfügung stellt. 
Also Stromverbrauch ist nicht so wichtig.

von m.n. (Gast)


Lesenswert?

Karl schrieb:
> Also die Genauigkeit die ich eingestellt habe/haben will liegt bei 0,1.
> Also z.b "5,4°C" oder "12,8°C"

Das ist aber ganz schön kalt, macht aber nichts, da der Widerstand bei 
höheren Meßströmen gut aufgewärmt wird ;-)
Wieder verräts Du nicht Alles. Welchen Meßbereich bildet denn die 
Widerstandänderung von 0 - 180 Ohm ab?
Bei 0 - 20 °C kann man die Sache entspannter sehen, bei -50 - 200 °C 
nicht mehr.

Such hier im Forum nach PT100 oder PT1000. Da ist schon jede Menge dazu 
geschrieben worden.

von Karl (Gast)


Lesenswert?

Ganz so kalt wirds leider nicht :) war ja nur ein Beispiel für die 
Formatierung.

m.n. schrieb:
> Wieder verräts Du nicht Alles. Welchen Meßbereich bildet denn die
> Widerstandänderung von 0 - 180 Ohm ab?

Sorry mein Fehler,
habe nochmal ins Datenblatt geschaut.

Der Sensor misst von 0-150°C und verwendet dabei eine Auflösung von 10 - 
184 Ohm.
Wie gesagt wenn ich an die 0,1 komme wäre es schon gut.

Ich kann leider bauartbedingt nicht auf einen anderen Sensor ausweichen 
sonst wäre ein PT100 oder PT1000 eher meine Wahl gewesen.

von m.n. (Gast)


Lesenswert?

Karl schrieb:
> Der Sensor misst von 0-150°C und verwendet dabei eine Auflösung von 10 -
> 184 Ohm.
> Wie gesagt wenn ich an die 0,1 komme wäre es schon gut.

Das ist doch schon einmal gut, da klar wird, daß der 10 Bit ADC eines 
ATmega32 diesen Dynamikbereich (10,0 - 150,0) nicht bietet;-)

> Ich kann leider bauartbedingt nicht auf einen anderen Sensor ausweichen
> sonst wäre ein PT100 oder PT1000 eher meine Wahl gewesen.

Aber auch da hättest Du das Problem der Eigenerwärmung, daß sich bei 0,1 
K Auflösung schon deutlich bemerkbar macht.
Einige hier schwören auf einen hochauflösenden ADC (MCP3551), mit dem am 
Sensor nur ein paar Millivolt Spannungsabfall gemessen werden und seine 
Verlustleistung daher klein bleibt. Eine Signalverstärkung ist nicht 
notwendig.
Eine andere Möglichkeit wäre, mit einem etwas höheren Spannungsabfall am 
Sensor zu arbeiten, diesen zu verstärken und per schnellerem 12 Bit ADC 
(MCP3201) auszulesen. Hierbei wird der Sensor nur mit einem 
Tastverhältnis <= 1% gemessen, wodurch die Eigenerwärmung minimiert 
wird. Sobald mehrere Kanäle gemessen werden sollen, ist dies die 
kostengünstigere Variante. Hier ein Beispiel: 
Beitrag "Temperatursensor KTY81 am ATmega328 (Arduino UNO), 1-6 Kanäle"

Wichtig: in beiden Fällen sollte ratiometrisch gemessen werden!
Eine Schaltung dazu, die entsprechend angepaßt werden muß und noch den 
ADC braucht: Beitrag "Re: PT1000 Schaltung / Programmierung"

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.