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
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.
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
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?
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
>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)
- 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".
> 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.
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.
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
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.
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.
womit speist du denn eigentlich den analog-eingang? und womit steuerst du dein prozessor-board an??
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.