ATmega328p - Interner Temperatursensor

Gast #6053146
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
Angehängte Dateien:
Gast #6053181
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.
Gast #6053188
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.
Gast #6053196
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
}
Gast #6053202
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.
Gast #6053219
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.
Gast #6053227
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.
Gast #6054559
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren