Forum: Mikrocontroller und Digitale Elektronik AVR ATtiny824 on-chip temperature sensor


von Georg M. (g_m)



Lesenswert?

Ich teste jetzt den Temperatursensor unter den günstigsten Bedingungen 
(3.0V, 25°C), und trotzdem beträgt der Messfehler +10 Grad.

Übersehe ich etwas, oder ist der Temperatursensor tatsächlich so 
schlecht kalibriert?

1
#define F_CPU 2000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <string.h>
5
#include <stdio.h>
6
7
void USART0_sendString(const char *str)
8
{
9
  for(uint8_t i = 0; i < strlen(str); i++)
10
  {
11
    while(!(USART0.STATUS & USART_DREIF_bm)){}  // wait until transmit data register is empty
12
    USART0.TXDATAL = str[i];                    // transmit data
13
  }
14
}
15
16
int main(void)
17
{
18
  _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_10X_gc | CLKCTRL_PEN_bm);   // 2MHz main clock
19
20
  PORTB.DIRSET = PIN2_bm;             // PB2 output (USART0 TxD)
21
  USART0.BAUD =  833;                 // 9600 Bd @ 2.0 MHz
22
  USART0.CTRLB = USART_TXEN_bm;       // enable transmitter
23
24
  ADC0.CTRLA = ADC_ENABLE_bm;                                   // enable ADC
25
  ADC0.CTRLB = ADC_PRESC_DIV4_gc;                               // ADC clock 500 kHz
26
  ADC0.CTRLC = ADC_REFSEL_1024MV_gc | (2 << ADC_TIMEBASE_gp);   // ADC reference and timebase
27
  ADC0.CTRLE = 16;                                              // sample duration (~33µs)
28
  ADC0.MUXPOS = ADC_MUXPOS_TEMPSENSE_gc;                        // ADC input
29
  ADC0.COMMAND = ADC_MODE_SINGLE_12BIT_gc;                      // ADC mode
30
31
  while(1)
32
  {
33
    ADC0.COMMAND |= ADC_START_IMMEDIATE_gc;        // start ADC conversion
34
    while(!(ADC0.INTFLAGS & ADC_RESRDY_bm));       // wait until conversion is done 
35
 
36
    uint16_t adc_reading = ADC0.RESULT >> 2;       // 12-bit to 10-bit
37
    int8_t sigrow_offset = SIGROW.TEMPSENSE1;      // temperature sensor offset
38
    uint8_t sigrow_gain = SIGROW.TEMPSENSE0;       // temperature sensor slope
39
    uint32_t temp = adc_reading - sigrow_offset;   // offset correction
40
    temp *= sigrow_gain;                           // multiply by slope
41
    temp += 0x80;                                  // correction
42
    temp >>= 8;                                    // temperature in Kelvin
43
    uint16_t temperature_C = temp - 273;           // temperature in degree Celsius
44
45
    char chst[4];                                  // 3-char-string
46
    sprintf(chst, "%d", adc_reading);              // integer to string
47
    USART0_sendString("ADC: ");
48
    USART0_sendString(chst);
49
    sprintf(chst, "%d", temperature_C);            // integer to string
50
    USART0_sendString("    temperature: ");
51
    USART0_sendString(chst);
52
    USART0_sendString(" °C");
53
    USART0_sendString("\r\n");
54
    _delay_ms(2000);
55
  }
56
}

von Oliver S. (oliverso)


Lesenswert?

Woher kennst du denn die tatsächliche Temperatur "On Chip"?

Oliver

von Ingo L. (corrtexx)


Lesenswert?

Georg M. schrieb:
> Übersehe ich etwas, oder ist der Temperatursensor tatsächlich so
> schlecht kalibriert?
Die internen Temperatursensoren der Controller sind eigentlich nur dazu 
da um abzuschätzen ob der Controller in Flammen steht oder eingefroren 
ist.

von Sebastian R. (sebastian_r569)


Lesenswert?

Oliver S. schrieb:
> Woher kennst du denn die tatsächliche Temperatur "On Chip"?
>
> Oliver

Das.

Das Die im Gehäuse dürfte deutlich wärmer sein als die Lufttemperatur in 
der Umgebung.

von Michael (Firma: HW Entwicklung) (mkn)


Lesenswert?

Schon nach DB typ +4,5°C Abweichung bei 25°C und der Chart '34.6 
TEMPSENSE Characteristics' lässt auch nicht frohlocken.
ADC Characteristics werden gemessen wenn man alles andere schlafen 
gelegt hat.
Gerade beim Tempsense misst Du natürlich die Eigenerwärmung mit.
Gerade deshalb ist es sinnvoll in der realen Applikation unter realen 
Bedingungen die Korrekturwerte zu ermitteln.

Wenn man das tut ist der Sensor nicht ganz furchtbar und kann z.B. für 
OTP benutzt werden.

von Wastl (hartundweichware)


Lesenswert?

Michael schrieb:
> Schon nach DB typ +4,5°C Abweichung bei 25°C und der Chart '34.6
> TEMPSENSE Characteristics' lässt auch nicht frohlocken.

Insbesondere sagt ein typischer Wert nichts aus über einen
garantierten Wert. Das kann nur als Orientierung dienen.
Ausreisser nach oben und unten dürfen praktisch "beliebig"
sein solange keine Min-/Max-Werte angegeben sind.

von Peter B. (gast_123)


Angehängte Dateien:

Lesenswert?

versuche es einmal mit der alternativen Berechnung, welche ich im DS des 
AVR128 gefunden habe. Hier wird der ADC-Wert vom Offset abgezogen und 
nicht umgekehrt. (siehe Anhang) Beim Tiny817 hat's geholfen.

von Oliver S. (oliverso)


Lesenswert?

Peter B. schrieb:
> Hier wird der ADC-Wert vom Offset abgezogen und
> nicht umgekehrt.

Nun ja, zumindest nach den Regeln des alten Adam Riese dreht das halt 
das Vorzeichen um. Kann man machen, dürfte aber im Falle des TO sinnlos 
sein.

Oliver

von Stefan F. (Gast)


Lesenswert?

Georg M. schrieb:
> Übersehe ich etwas, oder ist der Temperatursensor tatsächlich so
> schlecht kalibriert?

Ich glaube, der ist gar nicht kalibriert. "Not covered by production 
test", daher auch keine min/max Angaben.

von Michael (Firma: HW Entwicklung) (mkn)


Lesenswert?

Stefan F. schrieb:
> Ich glaube, der ist gar nicht kalibriert. "Not covered by production
> test", daher auch keine min/max Angaben.

'The individual compensation
factors determined during the production test are stored in the 
Signature Row:
• SIGROW.TEMPSENSE0 is a gain/slope correction
• SIGROW.TEMPSENSE1 is an offset correction'
The result of the temperature sensor measurement must be processed in 
the application software using
compensation values from device production or user calibration to 
achieve more accurate results.'

Es werden nur keine Min / Max Werte über den vollen Arbeitsbereich 
kontrolliert.
Die werkseitig voreingestellten Werte können nicht sehr gut sein.
Dazu muss man min ein 2punkt Kalibrierung an zwei weit entfernten 
Punkten machen, bei konstanter VCC der realen Schaltung.
Beim Production Test wird eigentlich nur im Schnelldurchlauf entschieden 
ob es sich lohnt das Die ins Gehäuse zu packen.
Da fährt man nicht von 0°C is 100°C ab inkl. Einschwingzeit.
Das ist ja nur eine Diodenstrecke die zur Messung benutzt wird und kein 
PT100.

Ingo L. schrieb:
> Die internen Temperatursensoren der Controller sind eigentlich nur dazu
> da um abzuschätzen ob der Controller in Flammen steht oder eingefroren
> ist.
Unkalibriert ist das so.
Man bekommt die auf ein paar Grad genau, mit einer eigenen Kalibrierung, 
die man im eeprom ablegt.
Hat man keine externe Schnittstelle, kann man auch stumpf davon ausgehen 
das beim ersten Einschalten nach Programmierung die Temperatur X 
herrscht und die nimmt man als Referenz und korrigiert damit die 
Werksseitige Kalibrierung.
Für vieles genau genug.
Je weiter man sich vom Kalibrierpunkt entfernt umso ungenauer wird es.

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Beim ATtiny402 ist der Messfehler wesentlich kleiner: nur +2 Grad.

Eigentlich müsste die tinyAVR® 2 Family besser sein als die Vorgänger.
Etwas stimmt nicht.

von Stefan F. (Gast)


Lesenswert?

Georg M. schrieb:
> Etwas stimmt nicht.

Du erwartest maximale Abweichungen, die das Datenblatt nicht verspricht. 
Ich glaube dir ja gerne, dass dein gemessener ATtiny402 besser ist. Das 
heißt aber nicht, das alle besser sind. Doch selbst wenn es so wäre, 
wäre das völlig OK, denn der Hersteller verspricht beim ATtiny824 nichts 
konkretes. Jeder gelieferte Mikrocontroller darf vom versprochenen 
typischen Wert beliebig weit abweichen.

von C-hater (c-hater)


Lesenswert?

Michael schrieb:

> Es werden nur keine Min / Max Werte über den vollen Arbeitsbereich
> kontrolliert.
> Die werkseitig voreingestellten Werte können nicht sehr gut sein.
> Dazu muss man min ein 2punkt Kalibrierung an zwei weit entfernten
> Punkten machen, bei konstanter VCC der realen Schaltung.

So ist es. Erklärt aber nicht die extremen Abweichungen beim TO, der ja 
angeblich in der Nähe von 25°C ambient hantiert.

Da sind die Ergebnisse bei zumindest einigen der neueren AVR8-Typen 
(also die XMega-Erben) nach meiner Erfahrung typisch deutlich besser. 
Etwa so im Bereich bis maximal +-2°C (unter Benutzung der werksseitig 
hinterlegen Kalibrierungswerte).
Bei deutlich von 25° abweichendender Temperatur wird der Fehler dann 
(erwartungsgemäß) tendenziell immer größer. Wobei sich natürlich die 
Situation ergeben kann, dass er zunächst sogar kleiner wird, dann aber 
in die entgegen gesetzte Richtung wächst. Hängt halt davon ab, wie bei 
der Kalibrierung der gemessene Fehler auf die beiden Kalibrierungswerte 
verteilt wurde.

Wie auch immer, bei 25°C Umgebungstemperatur sollte es jedenfalls schon 
so halbwegs passend sein. +10°C sind ungewöhnlich. Da stimmt irgendwas 
nicht. Vermutlich an der Schaltung. Mit einem geeigneten 
Schaltungsfehler wäre es natürlich recht problemlos möglich, die 
Die-Temperatur in Sekundenschnelle auf 10° über ambient zu bringen...

von Hermann W. (hermannw)


Lesenswert?

Georg M. schrieb:
> Übersehe ich etwas, oder ist der Temperatursensor tatsächlich so
> schlecht kalibriert?

Ja, der ist so schlecht kalibriert. Ich habe das mal bei einem T85 
nachgemessen, der wohl nicht viel anders ist.
Beitrag "Re: ATtiny85 ADC differentiell 20x gain 1.1 int. Ref."
Faktor 0,77 und Offset 187,7

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.