Forum: Mikrocontroller und Digitale Elektronik ATmega328p - Interner Temperatursensor


von Schokio (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

Nicht nur der Offset ist meist riesig, auch das k ist von den 
"approximately 1mV/°C" deutlich entfernt. Normale Zweipunktkalibrierung 
durchführen.

von Klemmschrauber (Gast)


Lesenswert?

TNC-Landolt?

von S. Landolt (Gast)


Lesenswert?

Nein, der (seit neuestem schräge) Landolt aus dem Schwarzen Wald.

von Schokio (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

Schokio schrieb:
> Du meinst jetzt den Code, oder?

Ja

von Stefan F. (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> Innentemperatur genau bestimmen

In größeren Zeitabständen aus Power-down-Modus aufwecken und auslesen, 
dann ist die Innentemperatur ja gleich der Außentemperatur.

von Schokio (Gast)


Lesenswert?

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
}

von Wolfgang (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von Schokio (Gast)


Lesenswert?

Okay, jetzt leuchtet es mir auch ein.
Danke für die rasche Hilfe, werde mich dann mal jetzt an paar Messungen 
setzen.

von Stefan F. (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> Power-down-mode... Geringe Spannung und geringer Takt

Oder ganz Stromlos machen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Joachim B. (jar)


Lesenswert?

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
von Einer K. (Gast)


Lesenswert?

Joachim B. schrieb:
> Marc V. schrieb:
>> Der interne TempSensor

Zur Temperaturkompensation des internen Taktes.
(Serial im Außenbereich)

von foobar (Gast)


Lesenswert?

"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).

von Stefan F. (Gast)


Lesenswert?

Lies doch einfach ADC, die Details erledigt der Compiler.

von c-hater (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.