AVR ATtiny824 on-chip temperature sensor

OP #7454547
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
}
Gast #7454566
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.

Gast #7454836
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.

Gast #7454880
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.

#7455100
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...

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