mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik genauere AD-Wandlung


Autor: Libby (Gast)
Datum:
Angehängte Dateien:

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

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Libby (Gast)
Datum:

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

Autor: Düsentrieb (Gast)
Datum:

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

Autor: yalu (Gast)
Datum:

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

Autor: Libby (Gast)
Datum:

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

Autor: Düsentrieb (Gast)
Datum:

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

Autor: coldtobi (Gast)
Datum:

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

Autor: yalu (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Libby (Gast)
Datum:
Angehängte Dateien:

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

Autor: Libby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Möchte keiner mehr antworten?

Autor: yalu (Gast)
Datum:

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

Autor: Libby (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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