Guten Abend,
Ich möchte den internen Temperatursensor des ATmega328p auslesen und hab
dazu die nötige Formel aus dem Datenblatt rausgesucht. Das Auslesen des
Wertes funktioniert, jedoch scheint mein Sensor einen hohen Offset zu
haben, so dass die typischen Werte bei mir keine Anwendung finden.
Bsp: Habe beim Einschalten bei einer Zimmertemperatur von 22°C, nach
Abgleichen mit der 1,1 Referenzspannung, einen Wert von ~380mV. Laut den
typischen Werten läge ich 85°C. Ziemlich unwahrscheinlich.
Wenn ich jetzt mit der Formel angleichen möchte, stehe ich vor der Frage
wie ich Tos und k ermittle. Also ich verstehe nicht genau wie die da
beschriebene Kalibrierung erfolgen soll
Mit freundlichen Grüßen
Schokio schrieb:> Also ich verstehe nicht genau wie die da> beschriebene Kalibrierung erfolgen soll
So wie im Datenblatt beschrieben. Wenn du uns Einblick in deinen
konkreten Versuch gewähren würdest, können wir mehr dazu sagen.
Stefan F. schrieb:> Wenn du uns Einblick in deinen> konkreten Versuch gewähren würdest, können wir mehr dazu sagen.
Du meinst jetzt den Code, oder?
S. Landolt schrieb:> Normale Zweipunktkalibrierung> durchführen.
Was ist unter "normale Zweipunktkalibrierung" gemeint ?
Also hätte ich einen normalen Temperatursensor, wüsste ich was ich
machen soll. Zu zwei Referenzwerten messen, aber hier kann ich ja nicht
die Innentemperatur genau bestimmen.
Schokio schrieb:> Was ist unter "normale Zweipunktkalibrierung" gemeint ?
Du misst zwei bekannte Temperaturen. Daraus kannst du Änderung pro Grad
ableiten, sowie den Offset.
Zeichne die beiden Punkte in ein Diagramm ein (x-Achse = Temperatur,
y-Achse = Messwert) und verbinde sie mit einer Linie. Dann sollte
offensichtlich werden, wie das gemeint war.
> Innentemperatur genau bestimmen
In größeren Zeitabständen aus Power-down-Modus aufwecken und auslesen,
dann ist die Innentemperatur ja gleich der Außentemperatur.
Schokio schrieb:> Wenn ich jetzt mit der Formel angleichen möchte, stehe ich vor der Frage> wie ich Tos und k ermittle.
Das sind zwei unbekannt Größen. Also wirst du auch zwei Kalibrierpunkte
benötigen, um die beiden Größen zu bestimmen.
Stichwort: Zwei (lineare) Gleichungen mit zwei Unbekannten.
Stefan F. schrieb:> Du misst zwei bekannte Temperaturen. Daraus kannst du Änderung pro Grad> ableiten, sowie den Offset.
ist ja jetzt besonders einfach,
Fenster auf bis alles im Zimmer Aussentemperatur hat auch der Atmel,
Werte notieren.
Fenster zuu bis alles im Zimmer wieder Heiztemperatur hat auch der
Atmel, Werte notieren.
Diese 1,1V Referenz ist schon nur ein grober Richtwert. Sie kann
durchaus auch mal 100mV mehr oder weniger sein, was bei 1mV pro Grad
schon zu 100°C falscher Anzeige führt.
Dazu kommen die beiden unbekannten Parameter des Temperatursensors.
Ohne Zweipunkt-Kalibrierung wirst du keine verwendbaren Ergebnisse
erreichen.
Dein Code sieht Ok aus.
Schokio schrieb:> Was ist unter "normale Zweipunktkalibrierung" gemeint ?
Genau das.
> Also hätte ich einen normalen Temperatursensor, wüsste ich was ich> machen soll. Zu zwei Referenzwerten messen
Genau das machst du auch mit dem internen Sensor.
> aber hier kann ich ja nicht> die Innentemperatur genau bestimmen.
Doch, kannst du. Du musst einfach den Wärmeeintrag durch die MCU so
gering wie möglich halten, dann entspricht die Innentemperatur
näherungsweise der Umgebungstemperatur, jedenfalls ist sie so nah dran,
dass der ADC den Unterschied eh' nicht mehr auflösen könnte.
Sprich: vor der Messung längere Phase im Power-down-mode, damit das
thermische Gleichewicht erreicht wird, dann kurz aufwachen lassen und im
"ADC noise reduction mode" die Messung abfackeln. Geringe Spannung und
geringer Takt können auch nicht schaden.
Letztlich ist das alles in den allermeisten Fällen aber völlig unnötiger
Aufwand. Was normalerweise interessiert, ist ja nicht die
Innentemperatur, sondern die Umgebungstemperatur unter normalen
Betriebsbedingungen, also kalibriert man auch unter normalen
Betriebsbedingungen gegen selbige und hat damit ganz automagisch den
Fehler rauskalibriert, der durch den Wärmeeintrag der MCU entsteht.
Jedenfalls bezüglich dessen, was man eigentlich wissen will.
Stefan F. schrieb:> c-hater schrieb:>> Power-down-mode... Geringe Spannung und geringer Takt>> Oder ganz Stromlos machen.
Viel zu viel nutzloser Aufwand.
Der interne TempSensor war nie dafür gedacht, Umgebungstemperatur
zu messen.
Dazu ist der Sensor mit einer Genauigkeit von +/- 10°C viel zu
ungenau.
Marc V. schrieb:> Der interne TempSensor war nie dafür gedacht, Umgebungstemperatur> zu messen.
eben, der DIE heizt ja, aber als Schätzeisen brauchbar wie eine DS3231,
nutze ich gerne als RTC und Temperaturwertgeber.
"temp = ADCL|(ADCH<<8);" ist nicht korrekt. Die Reihenfolge, in der
hier ADCL und ADCH gelesen werden, ist hier nicht definiert aber wichtig
(s. Manual; erst ADCL, dann ADCH).
Marc V. schrieb:> Der interne TempSensor war nie dafür gedacht, Umgebungstemperatur> zu messen.> Dazu ist der Sensor mit einer Genauigkeit von +/- 10°C viel zu> ungenau.
Na du bist ja ein ganz Schlauer. Tip: die vom TO beabsichtigte
Kalibrierung dient ja gerade dazu, die Meßgenauigkeit gegenüber dem
Auslieferungszustand dramatisch zu verbessern.
Und das geht. Ca. 0,5..1°C Genauigkeit ist ziemlich problemlos
erreichbar. Und zwar fast egal, ob man auf Die-Temperatur oder auf
Umgebungstemperatur kalibriert.
Bei Messung der Umgebungstemperatur ist natürlich die Mess-Strategie
ggf. an "Lastwechseln" auszurichten und mit mehreren Sätzen
Kalibrierdaten zu arbeiten (oder mit einer Interpolation zwischen den
beiden Extremen).
Wirklich kritisch ist dabei aber nur eine Situation: Aufwachen aus der
Vollnarkose, wenn bis kurz vor dem Einschlafen längere Zeit Vollast
geherrscht hat (also ein recht ungewöhnliches Szenario). Das Problem
hierbei ist hauptsächlich: der µC hat keine Information über die Dauer
der PowerDown-Phase.
Dann wird für eine gewisse Zeit eine zu hohe Umgebungstemperatur
gemessen werden, die sich aber auch dann relativ schnell wieder der
realen Umgebungstemperatur annähert. Und selbst diese Situation läßt
sich recht leicht erkennen, eben gerade wegen der ungewöhnlich schnellen
Änderung des Messwertes...
Also: wenn man weiß, was man tut: alles kein Problem. Der ganze Kram
läßt sich mit insgesamt ca. 150 Bytes Code und konstanten Daten und
einer kaum erwähnenswerten Menge an Rechenzeit abhandeln...