Hallo Community,
Ich versuche jetzt schon länger eine Regressionskurve für meinen
Temp-Sensor zu erstellen. Die dazugehörige Funktion möchte ich dann dazu
verwenden um die Temperatur möglichst genau auszugeben. Allerdings habe
ich ein kleines Problem mit der Genauigkeit des ADC.
Wenn man die Formel ADC = (Vin x 1024) /2.56V nach Vin umstellt
sprich die Spannung die am Sensor anliegt dann habe ich bei manueller
Rechnung mit dem eigenen Taschenrechner immer leicht andere Werte als
der ADC mir Werte auf den LCD bringt.
Berechne ich manuell die Spannung am Sensor komme ich bis auf die 2
Stelle nach dem Komma auf den gleichen Wert den mir mein Multimeter
ausspuckt.
Wie bekomme ich den ADC noch genauer? Ich benutze in meinem Source
double Werte mit 2Stellen nach dem Komma. Ich gehe davon aus das es
nicht an den Variablen und der Ausgabe am LCD liegt.
btw. µc = Atmega8, ADC mit interner Referenzspannung von 2,56V
Wär für einen Tipp sehr dankbar!
Gruß R.
Hallo,
zu der Rechnung etc. kann ich jetzt nichts beitragen, aber vielleicht
zum Thema Genauigkeit/Auflösung. Schaue mal in google nach den Begriffen
adc avr oversampling
Mag hilfreich sein oder nicht.
Grüsse
Axel
Die interne Referenz streut ziemlich. Miss' sie mal an Vref nach und
setze diesen Wert statt der 2,56 in Deine Formel. Das Ergebnis sollte
um Einiges genauer sein.
Hallo,
Heißt das ich müsste noch mehr Nachkommastellen nehmen?
Es ist schon merkwürdig. Ich berechne und bekomme auch mit dem
Multimeter beispielsweise 1,33Volt für den Sensor, der ADC aber zeigt
mir am LCD 1,21 an. Vielleicht würde man sagen das ist nicht wirklich
ungenau aber später bei der Umrechnung un in der Anzeige der Temperatur
schlägt sich das locker mit +- 1,2°C etwa nieder...
Gruß
R.
Schau mal ins Datenblatt, die interne Referenz ist zwar recht stabil,
unterliegt aber nicht zu vernachlässigenden Fertigungstoleranzen.
Desweiteren gibt es im Datenblatt Hinweise auf die ADC-Fehler. Bei Atmel
gibt es glaube auch eine Appnote zur ADC-Fehlerkorrektur
(ADC-Calibration).
Mit Fließkommazahlen (Double) würde ich da nicht herangehen. Der ADC
liefert nur 10-Bit-Ganzzahlen. Zum Skalieren halte ich
Festkomma-Arithmetik für besser geeignet. Das kann aber auch daran
liegen, dass ich in ASM werkele und immer bestrebt bin, unnötigen
Aufwand zu vermeiden. Mein kleines Voltmeterchen mit Tiny24 geht z.B.
erfreulich genau:
Beitrag "Re: 13 Bit Genauigkeit mit Atmega messen ?"
...
r4m0n schrieb:> Ich berechne und bekomme auch mit dem> Multimeter beispielsweise 1,33Volt für den Sensor, der ADC aber zeigt> mir am LCD 1,21 an.
Das liegt innerhalb der 10%, die die interne Referenz etwa streuen kann.
Vielen Dank an alle Antwortenden!!!
Werde mir jetzt mal die PDF und google Links zu den Atmel ADC
Calibration zu Gemüte führen.
Melde mich dann wieder wenn ich ne Temp. bis auf die 90zigste Stelle
genau hinter dem Komma anzeigen kann (kleiner Spaß :O)... )
Gruß
R.
Ich hatte mal ein ähnlich gelagertes Problem.
Bei mir ging es um eine Wochenend-Selbstbau-Kühlschranksteuerung.
Ich habe mir einen Temperatur-Sensor herausgesucht, der im gewollten
Bereich einigermaßen linear verläuft.
Im Programm habe ich den ADC min-Wert und max-Wert vorgegeben und durch
die beiden Punkte eine "virtuelle" Gerade gelegt.
Mein ADC berechnete in 10 Dürchläufen mit anschließender
Mittelwertbildung einen Wert, der irgendwo auf der Geraden liegen musste
-> das war dann umgerechnet mein Temperaturwert.
Als Referenz habe ich ein Digitalthermometer verwendet.
Mit Veränderung von min- und max-Wert konnte ich die Gerade entsprechend
verschieben, bis alles soweit passte.
Ist zwar alles recht grob (ca. +- 0,5 °C) aber für meinen Anwendungsfall
ausreichend (Nichtlinearität des analogen Temperatursensors).
Meine Erfahrung mit dem ADC generell ist, dass ein aufgenommener Wert
alleine absolut nicht taugt. (1.Messung sollte eh verworfen werden ->
Datenblatt)
Also min. 10 Werte aufnehmen und den Mittelwert bilden + eine
Möglichkeit einbauen, etwas offset einzustellen.
@ Marc Meise,
ich verwende 4 Messungen und bilde den Mittelwert. Der erste VOR der
eigentlichen Messung wird natürlich verworfen. da mein Temp-Sensor auch
nicht linear ist habe ich eine Wertetabelle gefüllt von 0 - 80°C.
Aus den gemessenen Spannungen bilde ich dann eine Regressionskurve
mittels Office. Die dazugehörige Funktion (annährend Mittelwert) nehme
ich dann zur Berechnung. Funktioniert wie Dein Verfahren und ist recht
genau.
gruß R.
@ Zimmerer,
Dein Tipp war Gold Wert!!!!
Statt 2,56 liegen 2,72 Volt an. Eingebaut in die Formel ergibt das EXAKT
bis auf eine Nachkommastelle den Wert am Sensor an den auch das
Multimeter misst.
Wow darauf wär ich so schnell nicht gekommen.
VIELEN DANK!!!
Gruß an Alle!
R.
Na prima. Der eingebaute ADC ist schon nicht schlecht, nur die Referenz
taugt wenig. Man sollte schon auf den tatsächlichen Wert kalibrieren
oder eine externe Referenz verwenden.
Eins noch: Der erste eingelesene Wert nach Umschalten der Referenz
(also auch der allererste nach Reset) sollte verworfen werden, ansonsten
kann ich die Ratschläge, vielfach zu messen, nicht ganz nachvollziehen
-- es sei denn, das Signal ist von Störungen überlagert.
Ja das erste Signal wird jedesmal verworfen bevor es richtig los geht.
Ich habe den ADC sowie die gemessene Spannung gleichzeitig auf dem
Display stehen um das "Springen" zu beobachten. Dein Einwand / Frage mit
den Mehrfachmessungen ist berechtigt. Habe das so aus dem GCC-Tutorial
hier entnommen. Ich nehme auch an das man mit dem Mittelwert
irgendwelche Spannungsspitzen, Schwankungen etc. aus dem Weg räumen
möchte.
Gruß
R.
@ r4m0n (Gast)
Und weil jetzt dein ADC so schön genau ist, kannst du gleich noch was
lernen. Nämlich dass man Fließkommazahlen und Rechnung oft nicht
braucht, Festkommaarithmetik tuts meist deutlich einfacher und
resourcenschonender.
MFG
Falk
@Falk
Dank Dir für den Tipp! Hatte selbst auch schon die Vermutung das das
Rechnen mit Floats nicht gerade das Beste ist was man dem µc antun
kann....
Gruß R.
hat der Attiny26 den genauesten ADC unter den Attinys und Atmegas?
im Datenblatt
(http://www.atmel.com/dyn/resources/prod_documents/doc1477.pdf) auf
Seite 131 steht unter "Absolute Accuracy (Including INL, DNL,
Quantization Error, Gain and Offset Error)" nur 1 bis 2 LSB - bei allen
anderen Datenblätter der Attinys/Atmegas habe ich nur größere Werte
gefunden...
Das sind typische Werte, keine garantierten. Die kannst Du den Hasen
geben oder wahlweise glauben oder nicht.
Bei anderen AVRs sind worst-case-Werte angegeben - nur darauf kannst Du
aufbauen.