Forum: Mikrocontroller und Digitale Elektronik ATmega8 ADC mit Spannungsteiler sehr ungenau


von Max E. (Gast)


Lesenswert?

Hallo!

Ich will eine Spannung am ADC eines ATmega8 über einen Spannungsteiler 
mit 7.5K/1% und 1.5K/1% von 9.0V bis 15.0V messen. Soweit läuft der AVR 
auch aber die Messergebnisse sind sehr ungenau.

Als Referenzspannung verwende ich die internen 2.56V.

Wenn ich 15V am Spannungsteiler habe, dann ist die Spannung über den 
Spannungsteiler am ADC bei 2.5474V, was in Ordung ist.

Ich rechne das ganze folgendermassen um:

dim adcvlaue as byte
dim adcvoltage as single
dim voltage as single

adcvalue = getadc(0)            'ADC auslesen
adcvoltage = adcvalue * 0.0025  'ADC-Wert in Spannung umrechnen (Ergenis 
stimmt, nachgemessen)
voltage = adcvoltage * 6        'gemessene Spannung im Verhältnis des 
Spannungsteiler multiplizieren (*6)

Wenn ich jetzt 10.0V Spannung habe, dann kommt als Ergebnis 10.4V raus. 
Bei 15.0V Spannung habe ich 13.6V als Ergebnis.

Einen ELKO (1µF) und Kerko (100n) habe ich auch schon am ADC Eingang 
gegen Masse versucht, hat aber nichts gebracht.

Weiß jemand an was das liegen könnte?

Max

von Tobi (Gast)


Lesenswert?

Hi!

Die Spannung berechnet sich mit (bei 8 Bit Auflösung):

(ADC-Wert/256)*Umax

wobei Umax die Spannung ist, bei der 2,56V am ADC-Eingang liegen.
Bei dir ist Umax also 15.36V

von Max E. (Gast)


Lesenswert?

Hallo!

Kannst du mir das mal genauer erläutern? Ich versteh das irgendwie 
nicht.

Ich rechne meine Spannung im Moment wie folgt aus:

1024 / 2.56 = 0.0025
ADC-Spannung = ADC-Wert / 0.0025
Spannung = ADC-Spannung * 6

wobei Spannung gleich die Spannung am Spannungsteiler ist (z.B. 15V) und 
Faktor 6 weil der Spannungsteiler das Verhältnis 6:1 hat (7.5K zu 1.5K)

Müsste doch so stimmen oder?

Max

von Helmut L. (helmi1)


Lesenswert?

dim adcvlaue as byte
                ^^^^
adcvalue = getadc(0)            'ADC auslesen

Der ADC hat doch 10 Bit die passen nicht in 8 Bit

Gruss Helmi

von Max E. (Gast)


Lesenswert?

@helmi
Sorry, hab mich vertippt beim Abschreiben. Lautet natürlich:
Dim adcvalue as word

von Helmut L. (helmi1)


Lesenswert?

Hast du denn mal hinter dem Spannungsteiler gemessen mit einem 
Multimeter ?

von Tobi (Gast)


Lesenswert?

OK, du hast also 10 Bit Auflösung :-)

Jeder ADC-Wandler arbeitet immer mit einer Referenzspannung, die hier 
2.56V beträgt.
Man kann also nur Spannungen zwischen 0V und der Referenzspannung 
messen. Bei der Referenzspannung hat der ADC vollen Ausschlag, also bei 
uns den Wert 0x03FF. Genau genommen hat der ADC den obersten Digitalwert 
beim Atmega8 schon bei Uref-1Bit.

Daraus folgt:

Die Spannung, die am ADC anliegt (jetzt mal ohne Spannungsteiler) 
berechnet sich mit:

U=(ADC-Wert/1024)*2.56V

Das könnte man in der Tat auflösen zu:

U=ADC-Wert*0.0025

Also '*' nicht '/' !!!!

Der Schritt *6 stimmt dann wieder.

von Tobi (Gast)


Lesenswert?

Allerdings ist eine Gleitkommaoperation bei einem 8-Bitter Atmega8 
meiner Meinung nach möglichst zu verhindern :-)

von Max E. (Gast)


Lesenswert?

Ja hab ich mit einem Multimeter nachgemessen. Die Spannung passt auch 
mit der überein, die mit der ADC des ATNELs ausgibt.

Nur die Berechnung der Spannung, die an dem Spannungsteiler anliegt 
stimmt nicht. Die Widerstände sind in Ordnung und habe auch den 
richtigen Wert mit dem ich rechne. Ist die Toleranz mit 1% der 
Widerstände evtl. zu groß?

Das Verhältnis von 6:1 passt ja auch bei 7.5K und 1.5K. Dann muss ich ja 
nur die Spannung, die der ADC liefert mit 6 multiplizieren.

von Tobi (Gast)


Lesenswert?

Nein, die Toleranz passt!

Die Berechnung ist nur noch nicht ganz richtig:

Nimm einfach die Formel:

U=(ADC-Wert/1024)*15.36V

Vorrausgesetzt natürlich es kommt ein 10Bit Wert bei dir im Programm an.
Siehe Helmut's Beitrag!

von Tobi (Gast)


Lesenswert?

2.56V*6=15.36V

von Jan M. (mueschel)


Lesenswert?

Wie Tobi schon sagte, float-Operationen solltest du vermeiden. Mach doch 
deine komplette Rechnung in Millivolt, dann hast du das Problem nicht.

Also

Voltage =  ADC*(2560/1024) * 6;

bzw. Voltage = ADC * 15;


Sieht doch schon viel einfacher aus, oder?

von Tobi (Gast)


Lesenswert?

@ Jan,

ganau! Das geht ja sogar auf, hab ich gar nicht gesehen :-)

von Michael U. (amiga)


Lesenswert?

Hallo,

miß auch mal die Referenzspannung Deines AVR am AREF-Pin.
Die Spannung ist zwar recht stabil, der Wert selbst kann aber 
exemplarabhängig ziemlich weit abweichen.

Gruß aus Berlin
Michael

von Helmut L. (helmi1)


Lesenswert?

>Voltage =  ADC*(2560/1024) * 6;
                 ^^^^^^^^^

Was rechnet der Compiler da fuer eine Konstante aus ?
Wenn alles Integer gemacht wird kommt da 2 raus .

Voltage = ADC* (2560*6)/1024

Vieleicht sollte Max erstmal den ADC wert direkt ausgeben bevor er den 
umrechnet.

von Jan M. (mueschel)


Lesenswert?

Helmut Lenzen wrote:
>>Voltage =  ADC*(2560/1024) * 6;
>                  ^^^^^^^^^
>
> Was rechnet der Compiler da fuer eine Konstante aus ?
> Wenn alles Integer gemacht wird kommt da 2 raus .

Richtig, dem Compiler darf man das natuerlich nicht so geben. Also 
entweder 2560.0/1024*6 oder (2560*6)/1024, wenn man es ausfuehrlich in 
den Code schreiben moechte.

von Paul Baumann (Gast)


Lesenswert?

Man muß noch einen Zwischenschritt rechnen lassen, da nur 2 Terme pro 
Rechenoperation benutzt werden können, d.h. die Formel muß noch in 2 
Teilaufgaben gespalten werden.

MfG Paul

von Max E. (Gast)


Lesenswert?

Hallo!

Erstmal vielen Dank für Eure Hilfe. Leider funktioniert das ganze 
immernoch nicht so wie es sein soll.

Ich habs jetzt so in Bascom:

Dim Adcvalue as Word
Dim Adcvoltage as Word
Dim Voltage as Word

Adcvalue = Getadc(0)
Adcvoltage = Adcvalue * 25
Voltage = Adcvalue * 15

Print Voltage ; Adcvoltage ; Adcvalue

Bei 12V Am Spannungsteiler kommt raus:
Voltage = 12555 ; Adcvoltage = 20925 ; Adcvalue = 837

Die Spannung von 2.09V liegt am ADC an. AREF gemessen liegt bei 2.6V.

Wo liegt der Fehler das ich eine Abweichung von mehr als 0.5V habe 
(12555) ?

Danke schonmal

Max

von Benedikt K. (benedikt)


Lesenswert?

Wie kommst du auf 0,5V Abweichung?
Wenn du 2,09V am ADC misst, dann liegen am Eingang mit deinem oben 
beschrieben Spannungsteiler 2,09V/0,166667=12,54V an. Wenn die Software 
jetzt 12,555 anzeigt, dann sind das doch nur 0,015V Abweichung.

von Max E. (Gast)


Lesenswert?

Rein rechnerisch schon. Aber wenn ich am Spannungsteiler vor dem 7.5K 
Widerstand mit einem Multimeter nachmesse, dann sind da genau 12.01V.

Am Spannungsteiler hab ich dann komischerweise 2.09V. Die Widerstände 
sind richtig, hab ich auch Spannungslos mit einem Multimeter 
nachgemessen. 7.52K und 1.49K haben die als gemessenen Wert.

Ich hab keine Ahnung woran das liegen könnte das ich dann 12.555V 
rausbekomme.

Max

von Benedikt K. (benedikt)


Lesenswert?

Vermutlich an den Toleranzen von deinem Messgerät, denn irgendwie passen 
deine gemessenen Werte nicht zusammen.

von Max E. (Gast)


Lesenswert?

An dem Messgerät kanns nicht liegen. Ist ein Fluke, das ist sehr genau.
Ausserdem verwende ich noch ein hochwertiges Netzteil, das mit auch 
genau 12.0V als Ausgangsspannung liefert und anzeigt.

Ich hab jetzt mal alles Spannungen von 9V bis 15V am Spannungsteiler 
gemessen und musste folgendes feststellen:

Spannung - ADC-Spannung - Verhältnis Spannungsteiler (alles gemessen)
15.05V - 2.57V - 5.86
12.04V - 2.09V - 5.76
11.04V - 1.93V - 5.72
10.04V - 1.77V - 5.67
 9.03V - 1.60V - 5.64

Es nimmt also das Verhältnis des Spannungsteiler mit niedrigerer 
Spannung auch ab. Ich vermute da liegt der Fehler. Aber wie kann ich ihn 
beseitigen? Alternative zu dem Spannungsteiler ausser 
Operationsverstärker?

Max

von Benedikt K. (benedikt)


Lesenswert?

Ich bleibe dabei: Deine Messungen passen nicht:
Wo misst du die Spannung, bzw. wo ist deine Masseleitung vom Messgerät? 
Direkt am 1,5k Widerstand oder wo anders?

von Max E. (Gast)


Lesenswert?

Ich messe direkt am Spannungsteiler. Also vor dem 7.5K Widerstand die 
Spannung, nach dem 7.5K Widerstand die ADC-Spannung bzw. direkt am Mikro 
und nach dem 1.5K Widerstand hab ich meine Masse vom Messgerät, die mit 
der Masse des Netzteils und allen anderen Massen verbunden ist.

Max

von Benedikt K. (benedikt)


Lesenswert?

Max E. wrote:
> ich meine Masse vom Messgerät, die mit
> der Masse des Netzteils und allen anderen Massen verbunden ist.

Wo verbunden?
Am Netzteil oder am Spannungsteiler?
Wenn die am Netzteil verbunden ist, würde der Spannungsabfall an der 
Zuleitung diesen Unterschied erklären.

von Max E. (Gast)


Lesenswert?

Vom Netzteil gehe ich mit Plus und Masse auf eine Klemme an der Platine. 
Von dort geht es zum Spannungsregler für die Elektronik. Direkt von der 
Klemme an der Platine geht es zum Spannungsteiler, einmal Plus und 
einmal Masse mit ca. 4cm langen Leitungen.

Max

von Bastler (Gast)


Lesenswert?

hast du auch nen kleinen C an Vref?

von Der Stack (Gast)


Lesenswert?

Kannst Du ein Bild von Deinem Aufbau machen?

von Jadeclaw D. (jadeclaw)


Lesenswert?

PullUp am ADC-Eingang ausgeschaltet?

von Helmut L. (helmi1)


Lesenswert?

>Es nimmt also das Verhältnis des Spannungsteiler mit niedrigerer
>Spannung auch ab. Ich vermute da liegt der Fehler. Aber wie kann ich ihn
>beseitigen? Alternative zu dem Spannungsteiler ausser
>Operationsverstärker?

Mach doch mal testweise die Widerstaende kleiner.
Mal sehen ob der Teilerwert sich dann auch aendert.

Hast du das mit einem oder mehren AVR mal getestet. Es konnte ja auch 
noch ein defekt am Controller vorliegen.


Gruss Helmi

von Mensch_Z (Gast)


Lesenswert?

ist der Spannungsteiler nun 6:1 oder 5:1 ?

von Mensch_Z (Gast)


Lesenswert?

na klar 6:1

von Analog (Gast)


Lesenswert?

Hast Du Vref über ein C an Masse, wie Bastler schon gefragt hat.

- Spannungsversorgung ?
- Block-Kondensatoren ausreichend eingesetzt ?


Woran mißt Du letztendlich, vielleicht ist auch eine galvanische 
Trennung nötig ?

von Max E. (Gast)


Lesenswert?

Hallo!

Problem gelöst :-)

Habe leider vergessen den Pullup am ADC-Pin wieder auszuschalten. 
Deswegen kamen die krumen Werte raus.

Rausgefunden habe ich das ganze, ind em ich den Mikro aus der Fassung 
gezogen habe und dann den Spannungsteiler gemessen habe. Da passten die 
Spannungen dann auf einmal, aber mit einer Differenz von 10mV zu den 
gemessenen Werten wenn der Mikro in der Fassung war.

Danke an alle die mir geholfen haben.

Max

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.