Forum: Mikrocontroller und Digitale Elektronik genauere AD-Wandlung


von Libby (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
ich programmiere einen ATMega32 (AVR Studio) in Assembler
und habe Probleme mit der Genauigkeit des AD-Wandlers.
Ich möchte (wenn ausreichend genau) einen LM135Z direkt an den analog 
Kanal anschliessen und auswerten. Die Temperatur soll auf einem 
LC-Display ausgegeben werden.

Info:
Analog-Digital-Wandler:
5V Referenzspannung mit 10µH + 100nF an AVCC
im Free Running Mode, liefert 10 Bit ADC-Wert
Auflösung 5V/1024=4,88mV
-->Spannung auf 3 Stellen nach dem Komma entscheidend z.B. 1,001V
LM135Z liefert 10mV/K

Ich verarbeite den ADC-Wert zu der dazugehörigen Temperatur in dem 
Unterprogramm "Berechnung_pro_Kelvin" korrekt.

Beispiel:
Spannung=2,731V    Kelvin = 273,15    Grad=0
bei 1,819V somit   Kelvin = 181,9     Grad= -91,25

Zunächst habe ich den LM135Z noch nicht angeschlossen, sondern
Spannung über Spannungsteiler an Analogkanal.

Hier 1,819V an Analogkanal
Ausgabe auf dem Display:
-93,9..-94,4    Mittelwert -94,4°C   (256 Messungen)
--> -3 Grad zu viel

2.)
bei U=2,52?
-24,1..-24,6   Mittelwert -24,6
bei 252,0K = -21,15   bei 252,9K = -20,25
--> also mind. -3 Grad zu viel

3.)
bei U=4,41?
+162,8..163,8  Mittelwert 163,3
bei 441,0K = 167,85°C   bei 441,9K = 168,75°C
--> mind. +4 Grad zu viel

Habe zur Spannung die dazugehörige Temperatur vom Mikrocontroller 
ausgeben lassen.
Und zwar einmal
1.) in einer Schleife ohne Mittelwertbildung
2.) mit Mittelwertbildung

Auszug Quelltext siehe Anhang
Die Resultate sind oben gepostet.

Nun meine Frage. Wie kann die Abweichung (schaltungstechnisch?) 
verbessern? Welche Genauigkeiten können eigentlich mit dem AD-Wandler 
erreicht werden? Wie stark rauscht der ADW? Wer hat Erfahrungen in 
diesem Bereich und kann mir helfen?
Könnte man evt. auch was bei der Initialisierung des Free-Running-Mode 
falsch machen? Bin mir nicht ganz sicher, ob ich dies richtig mache.

Vielen Dank

von Timmo H. (masterfx)


Lesenswert?

Du musst natürlich auch bedenken, dass der Temp.sensor auch eine 
Abweichung hat (unkalibriert bis zu 9°C,kalibriert ~1°C). Der ADC hat 
eine Abweichung von bis zu +-2 LSB und einen Offset von 0,5 LSB.
Das unterste Bit kann man eigentlich vergessen, das zappelt immer ein 
bissl rum. Durch die Mittelwertbildung ist das Zappeln quasi 
rausgerechnet, die effektive Auflösung ist dadurch aber auch nicht mehr 
wirklich 10 Bit.
Der Free-Running-Mode ist nicht wirklich ausschlaggebend für die 
Genauigkeit, die Taktung des ADC schon eher. Je schneller du wandelst 
desto geringer wird die Genauigkeit. Also lieber den ADC so langsam wie 
möglich takten.
Willst du eine höhere Genauigkeit solltest du zu externen ADCs greifen. 
Die haben meist eine geringere Abweichung und haben dann auch 12 oder 
mehr Bit Auflösung.

von Libby (Gast)


Lesenswert?

Hallo Timmo
Das der Temperatursensor auch eine Abweichung hat, ist mir klar. Nur ist 
dieser noch gar !nicht! angeschlossen, sondern ich gebe eine feste 
Spannung über einen Spannungsteiler auf den Analogeingang.
Kann es sein, dass die von dem AD-Wandler gemessene Spannung wirklich um 
0,1V variiert?
Wie genau kann man den Spannungen/Temperaturen mit dem ATMega messen? 
Auf 0,5°C? Oder doch nur auf 1°C?
Angeschlossen ist ein 11MHz Quarz, Vorteiler 128.

Libby

von Düsentrieb (Gast)


Lesenswert?

hast du nen kondensator direkt am a/d input ? (wg. hf-störungen usw.)

von yalu (Gast)


Lesenswert?

Stimmen die per Spannungsteiler angelegten Spannungen überhaupt?
Entweder du hast ein Multimeter, das genau genug misst (z.B. 0,1%),
oder du nimmst für den Spannungsteiler Präzisionswiderstände (mit 0,1%
Toleranz). Sonst sind deine Angaben nur grobe Schätzungen.

Im Datenblatt des Controllers stehen auch ein paar Tipps, wie man bei
der Messung interne Störungen durch Ausschalten unbenutzter Subsysteme
minimieren kann.

Wie sieht denn das Ergebnis bei 0V und 5V aus? Dort sollten die Werte
auf jeden Fall stimmen. Sind die Messfehler bei anderen
Spannungswerten systematisch oder ändern sie sich von Messung zu
Messung zufällig?

von Libby (Gast)


Lesenswert?

Hallo

nein, ich habe bisher keinen Kondensator direkt am a/d input. Wie groß 
müsste dieser denn sein?
Will den Sensor noch so über 2-3 Meter Kabellänge betreiben.

>Stimmen die per Spannungsteiler angelegten Spannungen überhaupt?
>Entweder du hast ein Multimeter, das genau genug misst (z.B. 0,1%),
>oder du nimmst für den Spannungsteiler Präzisionswiderstände (mit 0,1%
>Toleranz). Sonst sind deine Angaben nur grobe Schätzungen.

Zunächst einmal ich verwende Widerstände mit ±1%, also keine 
Präzisionswiderstände.
Weiterhin habe ich mal geschaut, wie genau mein Multimeter ist.
Ist anscheinende nicht so genau: DC voltage: 200m/2/20/200V ±0.5%

Bei der gemessen Spannung von 1,819V und den ±0,5% vom Messgerät,
würden dies dann max. entweder 1,828V oder 1,8099V sein.
Dies entspräche einer Temperatur von  -90,35  bzw. -92,25.

Doch auf dem Display wurde ja zwischen -93,9 und -94,4 bzw. Mittelwert 
-94,4°C ausgegeben, also immer noch ne Abweichung von mind. -l Grad.

zur 2.Messung:
bei U=2,52?  -24,1..-24,6   Mittelwert -24,6
bei 252,0K = -21,15   bei 252,9K = -20,25
--> also mind. -3 Grad zu viel

Toleranz Messgerät 2,532V bzw. 2,507V entspricht -19,95  bzw. -22,45
-->Abweichung von mind. -2 Grad


>Im Datenblatt des Controllers stehen auch ein paar Tipps, wie man bei
>der Messung interne Störungen durch Ausschalten unbenutzter Subsysteme
>minimieren kann.
--> Wo genau steht dies? Wird wahrscheinlich jedoch nicht in Betracht
kommen, da ich nahezu alles von meinem Controller später benutzen werde.
Es wird ein größeres Projekt. Doch ich kann ja noch mal einen Blick 
drauf werfen.


Hier nochmal die Ergebnisse bei 0V und 5V:
bei U=0V    entspricht 0K   wird -273,1°C angezeigt --> stimmt somit
bei U=5V    entspricht 500K wird 226,3°C  angezeigt
500K = 226.8°C  Abweichung von 0,5°C --> damit gebe ich mich zufrieden

Libby

von Düsentrieb (Gast)


Lesenswert?

>bisher keinen Kondensator direkt am a/d input
mach zb 10nf ran : in--analogmasse
und direkt davor zb 470 ohm , dann sollten mittelwert aus 16 messungen 
recht gut aussehen (11..12 bit auflösung)

zwecks temp.genauigkeit: vergiss die vergeiche mit dem multimeter
mach den sensor ran, bringe sensor+vgl.thermometer auf gleiche temp.
als genaueste referenz würde ich so ein dig. fieberthermometer nehmen, 
beide ein paar minuten zusammen auf zb 38° ; korrekturwert zu deiner 
messung...
dann hast du ne echte genauigkeit von etwa 0,1° (das müssen die 
fieber-dinger afaik können)

von coldtobi (Gast)


Lesenswert?

- Was für ein Messgerät ist es denn? Analog oder Digital?

- Fehler sind (uminderst bei Analog) bezogen auf den 
Messbereichsendwert. Also in Deinem Fall (Messbereich 2V?) +-0.1Volt. 
Bei  Digital muss man ins Manual schauen, da ist es nicht einheitlich. 
Meistens ist es aber ein prozentualer Wert + eine Anzahl von "Digits".

von yalu (Gast)


Lesenswert?

> Wo genau steht dies?

Kapitel "Analog to Digital Converter", Abschnitt "ADC Noise Canceler".

> Wird wahrscheinlich jedoch nicht in Betracht kommen, da ich nahezu
> alles von meinem Controller später benutzen werde.

Die Subsysteme werden nur für die Dauer der Messung deaktiviert. Das
betrifft insbesondere die CPU, die so lange schlafen gelegt wird (in
deinem Code dreht die während der Messung sowieso nur Däumchen.). Man
kann zusätzlich die Timer anhalten, dafür sorgen, dass während der
Messung keine Datenübertragung über serielle Schnittstellen
stattfindet usw.

Was mich ein wenig wundert, dass die von dir angegeben Min-/Max-Werte
der einzelnen Messungen nur relativ wenig streuen. Das deutet darauf
hin, dass der Fehler nicht primär durch Störungen verursacht wird.

Am ADC selbst kann es aber auch kaum liegen: Da die Messwerte für 0V
und 5V stimmen, müsste die Nichtlinearität bei einem Fehler von 4°
40mV bzw. 8 LSB betragen. Laut Datenblatt liegt die Nichtlinearität
aber unter 1 LSB.

Ich vermute deswegen, dass der Wurm irgendwo in der Spannungsteilerei,
der Spannungsmessung mit dem Multimeter oder der Referenzspannung zu
suchen ist. Wie groß sind denn die Widerstände des Spannungsteilers?
Hoffentlich klein zum Innenwiderstand des Multimeters.

Du könntest auch einmal die Linearität des gesamten Systems prüfen,
indem du mittels eines Potis die Spannung am ADC in Schritten von
ungefähr 0,2V von 0V bis 5V hochdrehst und jedesmal die mit dem
Multimeter und die mit dem ADC gemessene Spannung aufschreibst. Aus
dem Fehlerverlauf über der Spannung kann man vielleicht auf die
mögliche Fehlerursache schließen.

von Karl H. (kbuchegg)


Lesenswert?

yalu wrote:

> Du könntest auch einmal die Linearität des gesamten Systems prüfen,
> indem du mittels eines Potis die Spannung am ADC in Schritten von
> ungefähr 0,2V von 0V bis 5V hochdrehst und jedesmal die mit dem
> Multimeter und die mit dem ADC gemessene Spannung aufschreibst. Aus
> dem Fehlerverlauf über der Spannung kann man vielleicht auf die
> mögliche Fehlerursache schließen.

Ich würde auch erst mal die Temperaturwerte beiseite legen und
mir direkt die ADC Messwerte, so wie sie vom ADC kommen, ansehen.

von Libby (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
vielen Dank schonmal für die vielen Antworten.

Nochmal zu meinem Messgerät. Kann nicht behaupten, dass es besonders gut 
ist. Es ist lediglich ein Mastech M-830B.
Und was die Widerstände des Spannungsteiler angeht, habe ich die wohl zu 
groß gewählt (6,8K 12,2K und 1K), weil ich grad nix anderes hatte.

Habe noch mal, wie geraten die Spannung um 0,2V Schritte verändert (20k 
Poti). Allerdings nicht den ADC-Wert ausgeben lassen. Müsste dann noch 
eine neue Routine zur Ausgabe in Assembler schreiben. Nur bin ich noch 
vollkommender Anfänger in Assembler und das würde glaube ich einfach zu 
lange dauern.

Hier das Resultat:

    Mittelwert
U[V]    Grad
5,00    221,9
4,98    220
4,96    218
4,94    216,1
4,92    213,6
4,90    212,2
4,88    210,2
4,86    207,3
4,84    205,8
4,82    203,9
4,80    201,4
4,78    199,9
4,76    197,5
4,74    195,6
4,72    193,6
4,70    191,2
4,68    189,7
4,66    187,2
4,64    185,3
4,62    183,8
4,60    181,9


2,78    1,7
2,76    -0,2
2,74    -2,6
2,73    -4,1
2,72    -4,6


2,60    -16,8
2,58    -18,7
2,56    -20,7
2,54    -22,1
2,52    -24,1
2,50    -26
2,48    -28
2,46    -30,4
2,44    -32,9
2,42    -34,3
2,40    -36,3

Ist ja eigentlich ganz gut.
Lässt sich daraus jetzt schließen, dass mein Messgerät einfach zu 
schlecht ist?

Habe noch mal die Routinen zur Mittelwertberechnung und Berechnung der 
Temp. angehängt.

Libby

von Libby (Gast)


Lesenswert?

Möchte keiner mehr antworten?

von yalu (Gast)


Lesenswert?

Die Messwerte sehen ganz gut aus. Trägt man sie als Punkte in ein
Koordinatensystem ein und legt eine bestangepasste Gerade durch die
Punkte, liegen die Abweichungen bei etwa +/-0,5°, was +/-1 LSB
entspricht. Das ist ok.

Was mich allerdings wundert: Weiter oben hast du gemessen

> bei U=5V    entspricht 500K wird 226,3°C  angezeigt

Nun misst du

> U[V]    Grad
> 5,00    221,9

Das sind 4,4° oder 9 LSB Unterschied. Da stimmt doch irgendetwas an
deiner Messung nicht.

von Libby (Gast)


Lesenswert?

Zu den unterschiedlichen Messungen bei 5V:
Dies lag daran, dass ich bei der ersten Messung die Spannungsversorgung 
an den  Analogkanal gelegt hatte und diese nicht expliziet gemessen 
hatte.

Ich war davon ausgegangen, das sie 5V beträgt.
Exakt beträgt sie aber 5,04V.
Also 5,04V   226,3°C
und  5,00    221,9°C

Also um ein Fazit zu ziehen: Ich kann also davon ausgehen, dass der 
AD-Wandler gut wandelt?!

Und die Abweichung durch ein falsches Messen meines Messgerät herüht?

Da z.b. bei 5V  221,9°C ausgeben wird (eigentliche 500K entspricht 
226.85°C sein müsste) es aber tatsächlich ~4,95V, somit 495K und 
221,85°C sind.

2.)
bei U=2,52 Mittelwert -24,6
tatsächlich 2,485   248,5K und -24,65°C

Also mein Messgeräat so um ~0,03 - 0,05V zu viel misst.

von Gast (Gast)


Lesenswert?

womit speist du denn eigentlich den analog-eingang? und womit steuerst 
du dein prozessor-board an??

von Matthias L. (Gast)


Lesenswert?

Am Besten, du befolgst erstmal den Rat von Karl Heinz. Die Umrechnung 
ist meistens auch problematisch, da dort wahrsch. gerundet etc. wird.

>Ich würde auch erst mal die Temperaturwerte beiseite legen und
>mir direkt die ADC Messwerte, so wie sie vom ADC kommen, ansehen.

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.