Hallo zusammen. Kann mir jemand bei der Umrechnung der ADCwerte in eine Temperatur (Celsius)erklären. Am besten anhand einer nachvollziehbare Gleichng und eines C-Codes wären super. Ich habe den ADCpin mit einem Spannungsteiler (einen KTY81-210 und 2,7Kohm Festwiderstand) beschaltet. ich erhalte eine eineigermaßen lineare Kennlinie in einem Bereich von -55° bis 120° Celsius. in diesen Bereich soll auch die Erfassung der Werte erfolgen. ich habe mal ein paar Werte berechnet. ich komme aber nicht darauf wie ich diese in °Celsius umwandle. Berechnung mit kty81-210: -55°C : U=5*980/(980+2700) = 1,33V; ADC=(1024/5)*1,33 = 272 0°C : U=5*1630/(1630+2700) = 1,88V; ADC=(1024/5)*1,88 = 385 25°C : U=5*2000/(2000+2700) = 2,13V; ADC=(1024/5)*2,13 = 436 40°C : U=5*2117/(2117+2700) = 2,20V; ADC=(1024/5)*2,20 = 450 120°C : U=5*3817/(3817+2700) = 2,93V; ADC=(1024/5)*2,93 = 600 150°C : U=5*4400/(4400+2700) = 3,01V; ADC=(1024/5)*3,01 = 616 Danke im Voraus Gruß Sticky
Wie wäre es, wenn Du dir erstmal ausrechnest, um wieviel mV sich die Spannung ändert, wenn sich die Temperatur um 1 Kelvin ändert? Wenn Du zufällig noch die Grundlagen für lineare Gleichungen kennst: y = m * x + c Aus der Kennlinie bekommst Du die Parameter. m = Steigung der Geraden c = Schnittpunkt mit der y-Achse (Offset) Dann kannst Du Dir ein Diagramm erstellen, bei dem man zu jeder Temperatur die Spannung ablesen kann. Dann kannst Du wieder eine Gleichung der obigen Form konstruieren. x sollte dann die Spannung sein, die gemessen wurde und als y sollte dann die Temperatur herauskommen. Den ADC Messwert würde ich in die tatsächliche Spannung umrechnen: Also 5V Referenz und 10-Bit (wenn ich das oben richtig sehe). Gibt 4,88 mV/ADC-Step. ADC-Wert * 4,88mV = Spannung am ADC Eingang in mV Diese Spannung dann in die obige Gleichung einsetzen (Temp. aus SPannung) Fertig.
> ich erhalte eine eineigermaßen lineare Kennlinie
Das wundert mich, weil ja der KTY schon eine lineare
Temperaturabhängigkeit hat (aus Datenblatt: R= 1630 + T*16.9 Ohm).
Zusammen mit einem Widerstand kann das nur nichtlinear werden...
Berechne noch ein paar Stützpunkte mehr, leg die Werte in eine Tabelle
ab. Dann berechne die Temperatur ziwschen den Stützpunkten einfach
entsprechend einer Geraden:
T adc
-55 = 272
0 = 385
25 = 436
40 = 450
:
:
120 = 600
150 = 616
1 | if adc<272 then T = -56; // Untergrenze |
2 | else if adc<385 then T = 0 - ((0 -(-55))*(385-adc)/(385-272)); |
3 | else if adc<436 then T = 25 - ((25 - 0 )*(436-adc)/(436-385)); |
4 | else if adc<450 then T = 40 - ((40 - 25 )*(450-adc)/(450-436)); |
5 | :
|
6 | :
|
Das ist geradezu für ein Array und eine Schleife geschaffen. Alternativ kannst du die Gerade des KTY in eine Formel pressen, den 2k7 Widerstand dazuklemmen, und daraus die Temperatur berechnen.
1 | T = ((2700/((1024/(float)adc)-1)-1630)/16.9; -- 1024, weil vermutlich 10-bit-Wandler? |
Du solltest dir aber im Klaren sein, dass du hier mit Fließkommazahlen arbeiten mußt. BTW: Liege ich mit dieser Aussage richtig: Der 2k7 hängt offenbar an VCC, der KTY an GND?
Matthias wrote: > Wenn Du zufällig noch die Grundlagen für lineare Gleichungen kennst: > > y = m * x + c > > Aus der Kennlinie bekommst Du die Parameter. > m = Steigung der Geraden > c = Schnittpunkt mit der y-Achse (Offset) > genau das war mein erster lösungs ansatz, doch habe ich keinen schnittpunkt mit der y-achse. da im datenblatt des kty- nur widerstandswerte bis -55°angegeben werden und höchst wahrscheilisch die kennlinie nicht mehr liear ist.
> Liege ich mit dieser Aussage richtig: > Der 2k7 hängt offenbar an VCC, der KTY an GND? ja ist richtig wieso?
Lothar Miller wrote: > Alternativ kannst du die Gerade des KTY in eine Formel pressen, den 2k7 > Widerstand dazuklemmen, und daraus die Temperatur berechnen. >
1 | > T = ((2700/((1024/(float)adc)-1)-1630)/16.9; -- 1024, weil vermutlich |
2 | > 10-bit-Wandler? |
3 | >
|
> Du solltest dir aber im Klaren sein, dass du hier mit Fließkommazahlen > arbeiten mußt. ja 10-bit wandler (ATMega168) ist es denn möglisch in einem atmega fließkomma zu nutzten? kannst du mir die formel etwas erleutern?
> ja ist richtig wieso? Na, weil sonst die Formel falsch wäre :-/ > ist es denn möglisch in einem atmega fließkomma zu nutzten? Ja, aber das braucht Platz und dauert... > kannst du mir die formel etwas erleutern? Ja, kann ich. Sieh dir das PDF an.
Amir B-a wrote: > Matthias wrote: > >> Wenn Du zufällig noch die Grundlagen für lineare Gleichungen kennst: >> >> y = m * x + c >> >> Aus der Kennlinie bekommst Du die Parameter. >> m = Steigung der Geraden >> c = Schnittpunkt mit der y-Achse (Offset) >> > > genau das war mein erster lösungs ansatz, doch habe ich keinen > schnittpunkt mit der y-achse. Doch hast du :-) Du musst nur ein klein wenig Arithmetik betreiben > da im datenblatt des kty- nur > widerstandswerte bis -55°angegeben werden und höchst wahrscheilisch die > kennlinie nicht mehr liear ist. Ich würde das alles sowieso vergessen. Ist deine Kennlinie hinreichend gut eine Gerade im interessierenden Bereich oder ist sie das nicht. Wenn sie es ist: Häng den Sensor in Eiswasser. Wart bis er die Temp angenommen hat und lies den Wert ab. Eiswasser hat (für deine praktischen Zwecke hinreichend genaue) 0°C. Sagen wir mal dein ADC wirft 189 aus Häng den Sensor in Wasserdampf. Auch hier wieder. Für praktische Zwecke genau genug hat der Dampf 100°C. Der ADC sagt dazu 850 Damit hast du 2 Temperaturen und die dazugehörigen ADC Werte Und du hast die lineare Gleichung Temp = m * ADC + d bei der du m und d nicht kennst. Aber du kennst 2 Wertepaare die diese Gleichung erfüllen, du hast sie ja gemessen. Also setzt du die mal ein 0 = m * 189 + d 100 = m * 850 + d 2 Gleichungen in 2 Unbekannten. Damit lässt sich m und d bestimmen. Gleichung 1 von Gleichung 2 abziehen, ergibt 100 = ( m * 850 ) + d - ( m * 189 ) - d das d kürzt sich weg und übrig bleibt 100 = ( 850 - 189 ) * m etwas umstellen m = 6.61 das in eine der Gleichungen einsetzen 0 = m * 189 + d 0 = 6.61 * 189 + d 0 = 1249.29 + d d = -1249.29 Deine Gleichung zur Umrechnung vom ADC Wert in eine Temperatur lautet also Temp = 6.61 * ADC - 1249.29 Voraussetzung: Der Zusammenhang zwischen Temperatur und ADC Wert ist tatsächlich hinreichend linear. Ist er das nicht, kann man immer noch in einzelnen Stücken arbeiten und dort eine Gerade annehmen.
>> ist es denn möglisch in einem atmega fließkomma zu nutzten? > Ja, aber das braucht Platz und dauert... dauern darf es (was meinst du wie lange es dauert?) was meinst du mit platz? T soll acht bit lang sein (wird auf den LIN-Bus verschickt.) MSB vorzeichen der rest Temperatur wert (-55 bis 120) danke für die Erklärung
Karl heinz Buchegger wrote: > Ist deine Kennlinie hinreichend gut eine Gerade im interessierenden > Bereich oder ist sie das nicht. Ist sie nicht. Bzw, wäre sie, wenn der Sensor mit Konstantstrom versorgt würde. Der ist aber "nur" Bestandteil eines Spannungsteilers :-/ > Voraussetzung: Der Zusammenhang zwischen Temperatur und ADC Wert ist > tatsächlich hinreichend linear. Ist er das nicht, kann man immer noch in > einzelnen Stücken arbeiten und dort eine Gerade annehmen. Womit wir wieder bei der Geradengleichung wären ;-) EDIT: > was meinst du mit platz? Programmspeicherplatz.
danke auch dir karl heinz. absolut verständlisch. werde wohl diese lösung anwenden.
> werde wohl diese lösung anwenden.
Du hast keine Gerade.
Dann wird deine Temperatur nur an den beiden Eichpunkten stimmen.
Na, egal... (Regie: L. wendet sich resigniert ab) :-/
Lothar Miller wrote: >> werde wohl diese lösung anwenden. > Du hast keine Gerade. Dann ist das tatsächlich ein Problem (ich hab die Kennlinie vom PTC / Spannungsteiler nicht im Kopf). Aber man kann doch sicherlich auch die Kurve mit mehreren Geradengleichungen annähern. Im Grunde machst du genau das gleiche, nur dass du eine Geradengleichung für -50 bis 0°C hast, 0° bis 20°, usw. Je nach ADC Wert wird dann entschieden, welche Geradengleichung zum Einsatz kommt. Falls das aus irgendeinem Grunde nicht geht (weil man zb. zuviele Geradengleichungen hat, kann man immer noch auf quadratische Gleichungen mit 3 Kalibrierpunkten pro Bereich ausweichen. Das Verfahren ist völlig analog dazu) > Na, egal... (Regie: L. wendet sich resigniert ab) :-/ Das was mich immer traurig stimmt ist, dass soviele schon mit einer simplen Geradengleichung überfordert sind. Edit: Hab grad in dein PDF reingesehen. Du hast das über den Spannungsteiler gerechnet. Noch besser, was will man mehr. Dann hätt ich mir meinen Exkurs über Geradengleichungen sparen können :-) Aber wer weiss, sowas kann man immer brauchen und wenn er was dabei gelernt hat ... ZUmindest weiss er jetzt wie er sich die von dir verwendete Gl. Rk =1630 +T ×16,9 aus den angegebenen Werten bestimmen kann, und so Aussagen wie ... > genau das war mein erster lösungs ansatz, doch habe ich keinen > schnittpunkt mit der y-achse. da im datenblatt des kty- nur > widerstandswerte bis -55°angegeben werden .. gehören der Vergangenheit an.
Lothar Miller wrote: > Du hast keine Gerade. > Dann wird deine Temperatur nur an den beiden Eichpunkten stimmen. > Na, egal... (Regie: L. wendet sich resigniert ab) :-/ wende dich nicht ab ungläubiger. sei stark in deinem glauben und auch du wirst erleuchtet :-) also die kennlinie habe ich mal in exel erzeugt und sieht sehr linear aus. (siehe pdf) >Bzw, wäre sie, wenn der Sensor mit Konstantstrom versorgt würde. >Der ist aber "nur" Bestandteil eines Spannungsteilers :-/ hier zu mal ein link der das gegenteil beweist. und zwar das der spannungsteiler linear ist und mit einer konst. spannungsquelle eben nicht. (fals es dich interessiert) http://www.sprut.de/electronic/temeratur/temp.htm
> Aus dem Datenblatt entnehme ich: > Rk =1630 +T ×16,9 wo genau entnimmst du das? oder wie ergibt sich diese gleichung? (wo kommt die konstante 16,9 her?) ich kann nichts dergleichen finden. ein screenshot wäre nett.
Wenn ordentlich Rechnen mit dem µC schon akzeptiert wird (inkl. float), kann man sich auch z.B. mit dem Newtonschen Interpolationspolynom (ist echt nicht so schlimm, wie es sich anhört!) das Polynom (die Kurve, die die Widerstandswerte in Abhängigkeit der Temperatur ergeben) der Widerstandswerte ausrechnen. Die Anzahl der Stützstellen sollte natürlich nicht zu groß werden, um kein Polynom weiß_nich_5_ten_grades zu bekommen. Die Genauigkeit kann man ja jederzeit mit seinem errechneten Polynom und dem Datenblatt ausrechen/kontrollieren. Oder man nimmt z.B. einen KTY 10-6 von Infenion, der liefert gleich die richtige Formel im Datenblatt mit: RT = R25 x (1 + alpha * delta T + beta * delta T²) mit a = 7.88 10- 3 K-1; b = 1.937 10-5 K-2 wobei RT der über den ADC gemessene/errechnete aktuelle Widerstandswert des KTY ist. Nur nach delta T umstellen und fertig.
Da habe ich doch ein paar Tricks auf Lager: 1. Meist hat man genug Programmspeicher, um eine Linearisierungstabelle mit 1024 Einträgen anzulegen: Beitrag "ADC-Wert z.B. in Spannung umrechnen und dezimal ausgeben mittels Tabellen, auch Linearisieren" 2. Wenn man die Vref extern speist (ebenfalls mit dem Mittelpunkt des Spannungsteilers), wird es wieder linear. Man muss den ADC-Wert von 1024 abziehen, weil normalerweise der differenziellen Eingänge an Mittelpunkt und Vcc liegen. Nennt sich "ratiometric measure" siehe z.B. Ohmmessung im Datenblatt vom Intersil ICL7106 / MAX138
Lothar Miller wrote:
...
>
1 | > T = ((2700/((1024/(float)adc)-1)-1630)/16.9; |
> 1024, weil vermutlich 10-bit-Wandler? > > Du solltest dir aber im Klaren sein, dass du hier mit Fließkommazahlen > arbeiten mußt. Letzteres halte ich für Overkill. 10-bit Integers 'rein, 8-bit Integers 'raus. Und dazwischen Fließkomma? Falk
mahmoud wrote: > kann mir jemand erklären > Rk =1630 +T ×16,9 Rk: ist der widerstands wert des kty bei einer temperatuer T T: ist die umgeungstemperatur 1630: iste der wirdestandswert des KTY bei null Grad wo die 16,9 her kommt würde ich auch gern wissen. die sollen ja aus dem datblatt stammen. kann ich aber nicht finden.
Amir B-a wrote: >> Rk =1630 +T ×16,9 > 1630: iste der wirdestandswert des KTY bei null Grad > > wo die 16,9 her kommt würde ich auch gern wissen. die sollen ja aus dem > datblatt stammen. kann ich aber nicht finden. Da habe ich aus Versehen die Geradensteigung im Kopf ausgerechnet, und einen Rechenfehler reingebracht: 1630 Ohm bei 0 Grad und 3392 Ohm bei 100 Grad gibt (3392-1630) = 1762 Ohm pro 100 Grad Das sind dann also (korrekt) 17,62 Ohm pro Grad. Mein Fehler war: Ich hatte aus der Tabelle vom NXP-Datenblatt aus Versehen den min. Wert bei 100 Grad genommen (3318 Ohm). Also: die Gleichung für den Widerstand beim KTY81-210 lautet richtig: Rk = 1630 + T×17,6 Und jetzt zur Kontrolle: Die Temperatur sei 150°C ==> Rk = 1630 + 150*17,6 = 4270 Ohm. Der Wert aus dem DB ist 4280 Ohm. Die Temperatur sei 50°C ==> Rk = 1630 + 50*17,6 = 2510 Ohm. Der Wert aus dem DB ist 2417 Ohm. Ein kleiner Übersteiger... Die Temperatur sei -30°C ==> Rk = 1630 - 30*17,6 = 1102 Ohm. Der Wert aus dem DB ist 1247 Ohm. Hier wird der Sensor nichtlinear :-/ Jetzt passts ;-) Ich habe gerade eben erst die Temperatur-Spannungs-Kennlinie gesehen. Im Bereich von 0-100°C ist die tatsächlich schön linear. Da könntest du direkt die Geradengleichung ansetzen: Aus Diagramm abgelesen sind 0°C = 1,78V = 365 adc 100°C = 2,78V = 570 adc daraus ergibt sich eine Temperaturformel mit Offset = 365 Steigung für 100°C = 570-365 = 205 Steigung pro °C = 2,05 T = (adc-365)/2.05; // Temperatur in Grad, allerdings float nötig Mit passender Skalierung ( 20/41 = 1/2.05 ) wirds noch einfacher: T = ((adc-365)*20)/41; // Temperatur in Grad, nur integer nötig EDIT: die letzten 5 Zeilen korrigiert ;-)
Nur zu Errinerung: Beitrag "Re: wie aus AD-Wert die Temperatur berechnen" und noch weitere Erklärung: Beitrag "Re: wie aus AD-Wert die Temperatur berechnen"
> T = ((adc-365)*20)/41; // Temperatur in Grad, nur integer nötig
was ist so sclimm an float?
ansonsten danke das du dch doch nochmal gemeldet hast :-)
> was ist so sclimm an float?
Auf einem PC ist float = flink, weil der eine extra Recheneinheit dafür
hat. Auf einem uC (ohne FPU) muß (fast) jedes Bit von Hand sortiert,
geschoben und verrechnet werden.
Und das dauert... und braucht Programmspeicherplatz... :-(
Der Link von branko ist für dich Gold wert und sagt eigentlich alles.
Die eigentlich etwas nichtlinieare Kennlinie des KTY wird durch einen
Spannungsteiler begradigt (das hast du selber auch schon
herausgefunden). Genauer brauchst du das nicht machen, weil ja der KTY
selber schon eine Toleranz von +-2°C hat.
Hier eine Excel-File mit der die genauen Werte > Aus Diagramm abgelesen sind > 0°C = 1,78V = 365 adc > 100°C = 2,78V = 570 adc > daraus ergibt sich eine Temperaturformel mit Es lässt sich nicht vermeiden beim Ablese Fehler zumachen. da excel nicht die x-achse mit 0 gekennzeichnet hat sondern bei -10°C das ist nicht so leicht zu erkennen daher eine kleine Korrektur 0°C =1,88V = 385 100°C =2,78V = 570 somit kommt man auf eine steigung von 1,85. Gruß Sticky
Amir B-a wrote: > Hier eine Excel-File mit der die genauen Werte > >> Aus Diagramm abgelesen sind >> 0°C = 1,78V = 365 adc >> 100°C = 2,78V = 570 adc >> daraus ergibt sich eine Temperaturformel mit > > Es lässt sich nicht vermeiden beim Ablese Fehler zumachen. > da ich die Werte habe eine kleine Korrektur > > 0°C =1,88V = 385 > 100°C =2,78V = 570 > > somit kommt man auf eine steigung von 1,85. Die tatsächlichen Werte muss jeder sowieso für sich selbst vor Ort ermitteln. Dein Serienwiderstand wird nicht exakt 2k7 haben, der KTY wird Fertigungstoleranzen haben, etc.. Drum ist es auch so wichtig, die Mathe dahinter zu verstehen und nicht einfach nur stumpfsinnig irgendwelchen Code abzukupfern.
Lothar Miller wrote: >> was ist so sclimm an float? > Auf einem PC ist float = flink, weil der eine extra Recheneinheit dafür > hat. Auf einem uC (ohne FPU) muß (fast) jedes Bit von Hand sortiert, > geschoben und verrechnet werden. > Und das dauert... und braucht Programmspeicherplatz... :-( Sollte man aber auch noch dazu sagen: Beides kann ein Problem sein, muss es aber nicht. Dazu kommt dann noch, dass man mit float sich leicht in ein Genauigkeitsproblem manövrieren kann. float hat so um die 6 signifikante Stellen. Kannst ja mal versuchen in einer Schleife zu einer Ausgangszahl 12345.0 immer wieder und immer wieder 0.000001 zu addieren, bis die Zahl 12346.0 geworden ist. Die Chancen stehen nicht schlecht, dass diese Schleife
1 | float x; |
2 | |
3 | x = 12345.0; |
4 | while( x != 123456.0 ) |
5 | x += 0.000001; |
nie abbricht.
werde wohl folgende gleichung nehmen. T = ((adc-385)*20)/37 ist auch am einfachsten zu dokuemtieren. abgesehen davon das es perfomenter ist. Danke nochmal an alle
hi ich habe eine Frage und zwar, ich möchte die Temperatur (KTY81-210) mit atmega8 messen, ich habe nur das datenblatt von KTY sonst nichts, (KTY ist mit einem Widerstand 2,7kOhm in Reihe). wie lautet das verhältnis zwischen T und U_adc
mahmoud wrote: > hi > ich habe eine Frage und zwar, ich möchte die Temperatur (KTY81-210) mit > atmega8 messen, ich habe nur das datenblatt von KTY sonst nichts, > (KTY ist mit einem Widerstand 2,7kOhm in Reihe). > wie lautet das verhältnis zwischen T und U_adc Gegenfrage: Hast du diesen Thread überhaupt gelesen?
ja habe ich, aber das stimmt nicht mit der linearität, das heisst T= a*adc+b stimmt in diesem fall nicht!!! oder??
mahmoud wrote: > ja habe ich, aber das stimmt nicht mit der linearität, das heisst > T= a*adc+b stimmt in diesem fall nicht!!! > oder?? Weiss ich nicht. Du hast das Datenblatt! Dort entnimmst du die Kennlinie des Sensors, entwickelst die Formel für die Serienschaltung mit deinem Widerstand und simulierst das einfach mal mit Excel für deinen Temperaturbereich durch. Dann lässt du dir von Excel die ADC Werte in Bezug zur Temperatur mal in einer Grafik auswerten und schaust dir den Graphen mal an, ob er dir linear genug ist. Und dann kannst du weiter schauen. (Das das so schwer ist, sich mal selbst zu behelfen. Jaaaaa. Programmieren bedeutet nicht einfach nur irgendwelchen Code in einen Editor reinzuklopfen. Programmieren heist auch, im Vorfeld Probleme klären! Dazu muss man sich auch überlegen, mit welchen Hilfsmitteln man einem Problem auf den Grund gehen kann. Wenn du nicht weisst ob der lineare Zusammenhang gegeben ist, dann musst du das eben rausfinden. Wie findet man das raus: Indem man sich die Werte ansieht und im einfachsten Fall ein Lineal an ein Diagram des Zusammenhangs legt. Liegt die Kurve überhaupt nicht vernünftig am Lineal an, dann wirds wohl nicht linear sein. Also lautet die nächste Frage: Wo krieg ich das Diagram her. Nachdem dir das keiner zeichnen wird, wirst du das wohl selbst machen müssen. Um ein Diagramm zu zeichnen, braucht man aber Werte. Wo kommen die wieder her? Na aus der Formel für Seriensschaltung von KTY und Widerstand. Also wird man diese Formel erst mal brauchen. 2 Widerstände in Serie und das ganze als Spannungsteiler ist ja formelmässig nicht gerade Raketentechnik. Da du das ganze über einen bestimmten Temp-Bereich haben willst, wirst du wohl oder übel die KTY Widerstandswerte in diesem Temp- Bereich brauchen. Jetzt kann der Zusammenhang Temp zu KTY Wert entweder eine Formel im Datenblatt sein, oder eine Tabelle für einige Werte oder, wenn du gar nichts hast muss man sich diese Werte für ein paar Temperaturen selbst mit einem Ohmmeter bestimmen. Formel ist gut, denn dann kannst du deine Temperaturen die im Diagram auftauchen selbst bestimmen. Mit einer tabelle wird dir das aufgezwungen. Macht aber nichts. Ob die Werte nach dem Spannungsteiler auf einer Geraden liegen sollte immer noch erkennbar sein. Und so fügt sich eins zum anderen, wie man an die Aufgabenstellung herangeht: Gibt es einen linearen Zusammenhang oder nicht.
@ Karl heinz Buchegger > (Das das so schwer ist, sich mal selbst zu behelfen. > Jaaaaa. Programmieren bedeutet .... > .... linearen Zusammenhang oder nicht. syntax error : missing ')' SCNR :-)
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.