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.
Nicht nur der Offset ist meist riesig, auch das k ist von den "approximately 1mV/°C" deutlich entfernt. Normale Zweipunktkalibrierung durchführen.
Nein, der (seit neuestem schräge) Landolt aus dem Schwarzen Wald.
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.
Stefan F. schrieb: > Ja
1 | #define F_CPU 16000000UL |
2 | #include <avr/io.h> |
3 | #include <inttypes.h> |
4 | #include "lcd_328.h" |
5 | #include <stdio.h> |
6 | uint16_t temp = 0; |
7 | |
8 | int main (void){ |
9 | //ADMUX |
10 | ADMUX |= ((1<<REFS1) | (1<<REFS0)); |
11 | ADMUX &= ~(1<<ADLAR); |
12 | ADMUX &= ~((1<<MUX2)|(1<<MUX1)|(1<<MUX0)); |
13 | ADMUX |= (1<<MUX3); |
14 | |
15 | //ADCSRA |
16 | ADCSRA |= (1<<ADEN); |
17 | ADCSRA |= (1<<ADATE); |
18 | ADCSRA &= ~(1<<ADIE); |
19 | ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)); |
20 | |
21 | //ADCSRB |
22 | ADCSRB &= ~((1<<ADTS2)|(1<<ADTS1)|(1<<ADTS0)); |
23 | |
24 | //Initialisierung |
25 | DDRB = 0xFF; |
26 | PORTB = 0; |
27 | lcd_init(); |
28 | ADCSRA |= (1<<ADSC); |
29 | |
30 | while(1){ |
31 | temp = ADCL|(ADCH<<8); |
32 | display_LCD(temp); |
33 | } |
34 | } |
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.
Okay, jetzt leuchtet es mir auch ein. Danke für die rasche Hilfe, werde mich dann mal jetzt an paar Messungen setzen.
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
Joachim B. schrieb: > Marc V. schrieb: >> Der interne TempSensor Zur Temperaturkompensation des internen Taktes. (Serial im Außenbereich)
"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).
Lies doch einfach ADC, die Details erledigt der Compiler.
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...
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.