Forum: Mikrocontroller und Digitale Elektronik ATtiny841 onboard Temperatur auslesen


von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich bekomme bei einer Raumtemp. von ca. 22°C einen Wert von -1°C zurück, 
was ja nicht sein kann, auch wenn es unkalibriert ist. LSB wäre 274.
Der ATtiny841 läuft mit internen 8MHz.
Ist an meinen beiden Funktionen irgendwas falsch?
1
void set_onboard_Temp_Measurement()
2
{
3
  ADMUXA  = (1<<MUX3)|(1<<MUX2);    // enable Temp.Sensor
4
  ADMUXB  = (1<<REFS0);      // set 1,1V Reference
5
  ADCSRA  = (1<<ADPS2)|(1<<ADPS1);  // set Prescaler 64 (125kHz)
6
  ADCSRA |= (1<<ADEN);      // enable ADC
7
}
8
9
10
int16_t read_onboard_Temp()
11
{
12
  uint8_t low = 0;
13
  int16_t temp = 0;
14
  
15
  ADCSRA |= (1<<ADSC);    // Start A/D Wandlung
16
  while(ADCSRA & (1<<ADSC));  // warten auf fertige Wandlung
17
  low = ADCL;      // ADCL vor ADCH auslesen
18
  temp = (ADCH << 8) | low;
19
  return temp;        
20
}

angezeigt bekomme ich
1
ADCL 18
2
ADCH 1
3
ADC  274
4
Temp 274

von Stefan F. (Gast)


Lesenswert?

Nach den Ändern des Multiplexers oder der Referenzsspannung liefert die 
erste Messung häufig einen falschen Wert. Verwerfe das erste Ergebnis 
und messe dann nochmal.

Beitrag #4943223 wurde von einem Moderator gelöscht.
von Veit D. (devil-elec)


Lesenswert?

Hallo,

die Ausgabe ist nicht der erste Messwert, vielleicht der 10., auf jeden 
Fall älter als 5. Ich lasse die gezeigten Werte aller 5sec. ausgeben.

von S. Landolt (Gast)


Lesenswert?

> was ja nicht sein kann, auch wenn es unkalibriert ist
Wo kann man das nachlesen? Ich habe eine Weile im Datenblatt gesucht, 
finde aber nur vage Angaben, keine Grenzwerte.

von Stefan F. (Gast)


Lesenswert?

Im Datenblatt steht, dass die Typische Genauigkeit 10% sei. Wenn wir 
jetzt man zu deinem Wert 274 10% addieren, haben wir 304 was mehr als 
25°C entspricht.

Es könnte also durchaus sein, dass es sich um einen normalen Messfehler 
im Rahmen des Datenblattes handelt. Zumindest dann, wenn sich die 10% 
auf den messwert udn nicht auf die Temperatur in °C bezieht.

von S. Landolt (Gast)


Lesenswert?

"Typically" - was heißt das? Ich kenne den ATtiny841 nicht, muss man die 
'Calibration data for temperature sensor'-Werte aus der 'Device 
Signature Imprint Table' selbst einrechnen?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

in meinem Datenblatt von 5/2014, Kapitel 16.12, Seite 143 steht
1
The measured voltage has a linear relationship to the temperature as described in Table 16-2 The sensitivity is 
2
approximately 1 LSB / °C and the accuracy depends on the method of user calibration. Typically, the measurement 
3
accuracy after a single temperature calibration is ±10°C, assuming calibration at room temperature. Better accuracies 
4
are achieved by using two temperature points for calibration.

das interpretiere ich so, dass er ab Werk auf +/- 10°C genau ist.
Mein Messwert sollte sich demnach zwischen 12 und 32°C bewegen.
So denke ich das jedenfalls. Wenn ich nun -2°C erhalte, müsste noch 
irgendwas faul sein.

von S. Landolt (Gast)


Lesenswert?

Das habe ich auch gelesen, verstehe es aber anders.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

kann folgendes sein?

- die Temperaturmessung geht ohne Kalibrierung erstmal nachdem Mond
- man muss ihn mit Offset usw. kalibrieren
- danach geht er auf +/- 10°C genau, weil 1LSB = 1°C entspricht
- +/- 10°C restliche Ungenauigkeit deshalb, weil die 1,1V Ref. auch nur 
10% genau ist.

Kann man das so interpretieren?

von Karl M. (Gast)


Lesenswert?

Hallo Veit,

ich lese das Datenblatt so, wenn man eine 1 Punkt Abgleich macht, dann 
sind +-10% Genauigkeit möglich.

Ein 1 Punkt Abgleich, bedeutet die absolute Temperatur mit einem 
geeichten Messgerät erfassen und dies mit dem ADC Messwert der µC 
Temperaturmessung gleichsetzen.

Ein 2 Punkt Abgleich {x0,x1} läuft entsprechend über zwei Referenzwerte 
die zwei ADC Messwerten {y0,y1} zugeordnet werden.
Daraus wird dann eine Geradengleichung abgeleitet:
1
f(x) = m * a(x) + n
2
3
a(x):= (x - x0)
4
m:= (y1 - y0) / (x1 - x0)
5
n:= y0

von S. Landolt (Gast)


Lesenswert?

Weiß nicht.
 Vielleicht mal diese 'calibration data' einrechnen und schauen, was 
heraus kommt.

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


Lesenswert?

Veit D. schrieb:
> das interpretiere ich so, dass er ab Werk auf +/- 10°C genau ist.
> Mein Messwert sollte sich demnach zwischen 12 und 32°C bewegen.

 Ja, sehe ich auch so, deswegen habe ich meine erste Antwort gelöscht.


> So denke ich das jedenfalls. Wenn ich nun -2°C erhalte, müsste noch
> irgendwas faul sein.

 Muss nicht unbedingt sein.
 Habe keinen Tiny841 hier, aber:
 5 M328P zeigen zwischen 21.75 und 22.50 C.
 4 Tiny85 zeigen von 21.60 bis 22 C.
 Die einzelnen Messungen schwanken um +/- 0.05 C

 Temperatur ist 22.5 C.

 Offset habe ich abgezogen, habe ich irgendwann mal aufgeschrieben.


 Probiere es mal so:
1
int16_t read_onboard_Temp()
2
{
3
  uint8_t low = 0;
4
  int16_t temp = -252;   /* Das ist dein Offset */
5
  
6
  ADCSRA |= (1<<ADSC);    // Start A/D Wandlung
7
  while(ADCSRA & (1<<ADSC));  // warten auf fertige Wandlung
8
  low = ADCL;      // ADCL vor ADCH auslesen
9
  temp += ((ADCH << 8) | low);
10
  return temp;        
11
}

 Und dann mit bekannten Temperaturen probieren.
 Wahrscheinlich klappt es.

Veit D. schrieb:
> Kann man das so interpretieren?

 Ja, deswegen rechnest du mit einem Offset, in deinem Fall -252.

 P.S.
 Ich rechne mit Float und summiere die Messungen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

kalibrieren kann ich immer noch und werde ich noch machen. Danke für die 
Hinweise diesbezüglich. Ich wollte erstmal das Grundübel verstehen, 
warum das so weit weg ist.

Was ist 'calibration data'? Habe ich das im Datenblatt überlesen?

@ Marc, verstehe ich gerade nicht wirklich, ich meine mit Offset ist das 
ja nun keine Kunst den Wert hinzubiegen. Das hätte ich dann am Ende mit 
kalibrieren gemacht.

von S. Landolt (Gast)


Lesenswert?

> Was ist 'calibration data'?
Ist, wie schon oben angemerkt, in der 'Device Signature Imprint Table' 
zu finden, in meiner Datenblattversion Table 23-6.

von (prx) A. K. (prx)


Lesenswert?

Veit D. schrieb:
> Was ist 'calibration data'? Habe ich das im Datenblatt überlesen?

Ja. Siehe "Device Signature Imprint Table"

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


Lesenswert?

Veit D. schrieb:
> @ Marc, verstehe ich gerade nicht wirklich, ich meine mit Offset ist das
> ja nun keine Kunst den Wert hinzubiegen. Das hätte ich dann am Ende mit
> kalibrieren gemacht.

 Nein mit kalibrieren korrigierst du die Nichtlinearität, deswegen
 2 oder mehr Messpunkte.
 Mit +/- 10 C und 1 C Auflösung braucht man aber normalerweise keine
 Kalibration, ein einmaliges Offset genügt vollkommen - das ist kein
 hinbiegen.

von S. Landolt (Gast)


Lesenswert?

Ich würde das extern, d.h. mit dem Programmiergerät, auslesen und 
einfach mal mit einem Taschenrechner zu den 274 hinzurechnen.

von S. Landolt (Gast)


Lesenswert?

"Sei, Teufel, doch nur nicht wie Brei"

von Veit D. (devil-elec)


Lesenswert?

Hallo,

mit Atmel Studio 7 und meinem AVRISP mkII kann ich die nicht auslesen. 
Nur den OSCCAL kann ich auslesen.

@ Marc, habe verstanden

von Manfred (Gast)


Lesenswert?

Veit D. schrieb:
> ich bekomme bei einer Raumtemp. von ca. 22°C einen Wert von -1°C zurück,
> was ja nicht sein kann,

http://playground.arduino.cc/Main/InternalTemperatureSensor :

"The internal temperature is the temperature inside the chip, just like 
the cpu-temperature of a computer. If the Arduino is not sleeping, this 
temperature will increase. If output pins are used to drive current (for 
example to drive a led) the internal temperature increases more.

This internal temperature can not be used to read the ambient 
temperature."

von Veit D. (devil-elec)


Lesenswert?

Hallo,

mir geht es jetzt nicht um das kalibrieren an sich. Erstmal wollte ich 
wissen ob mein Code fehlerfrei ist. Scheint ja so zu sein, wenn niemand 
meckert. :-)

Jetzt wollte ich mal zum Spass die Imprint Tabelle auslesen.
Allerdings weiß ich nicht wie ich an das jeweils 2. Byte rankomme.
Das haut noch nicht hin. Wer weiß wo ich im Nirwana lese.
1
void read_DeviceSignatureImprintTable ()
2
{
3
  int32_t data = 0;
4
  uart0_puts_P("ImprintTable");    uart0_putc('\n');
5
  
6
  for ( uint16_t i=0; i<0x17; i++) {  // word adress
7
    data = __LPM_enhanced__(i);
8
    uart0_send_int32(data);    uart0_putc('\n');
9
  }
10
}
1
113
2
192
3
139
4
192
5
108
6
193
7
137
8
192
9
136
10
192
11
135
12
192
13
134
14
192
15
133
16
192
17
132
18
192
19
32
20
195
21
130
22
192
23
129

von Veit D. (devil-elec)


Lesenswert?

Hallo,

mit dem Code erhalte ich nur 23x 37807 angezeigt.
1
void read_DeviceSignatureImprintTable ()
2
{
3
  int32_t data = 0;
4
  uart0_puts_P("ImprintTable");    uart0_putc('\n');
5
  
6
  for ( uint16_t i=0; i<0x17; i++) {  // word adress
7
    data = pgm_read_word(&i);
8
    uart0_send_int32(data);    uart0_putc('\n');
9
  }
10
}

und dem auch, nur eine anderer Wert der 23x gleich ist
1
void read_DeviceSignatureImprintTable ()
2
{
3
  int32_t data = 0;
4
  uart0_puts_P("ImprintTable");    uart0_putc('\n');
5
  
6
  for ( uint16_t i=0; i<0x17; i++) {  // word adress  
7
    data = __LPM_enhanced__(&i);
8
    uart0_send_int32(data);    uart0_putc('\n');
9
  }
10
}

Wie kommt man an die Bytes ran?

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


Lesenswert?

Veit D. schrieb:
> Wie kommt man an die Bytes ran?

 Du kannst doch mit diesem Programm weder Bytes noch sonst etwas aus
 Device Signature Imprint Table lesen...

 Das geht doch ganz anders, siehe:
 22.7.1 SPMCSR – Store Program Memory Control and Status Register

von Veit D. (devil-elec)


Lesenswert?

Hallo,

oh oh, ist komplett anders und komplizierter wie ich dachte.
Ich lese mich mal ein.
Danke soweit.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

habe Angst ein falsches Register zu überschreiben. Deswegen frage ich 
lieber vorm testen ob meine Interpretation jetzt so stimmt?
Wegen den 3 Clock Cycles, gehe ich richtig in der Annahme das man 
nachdem setzen des SPMCSR nur 3 Takte Zeit hat zum setzen der Adresse 
die man auslesen möchte? Deswegen muss man die Bits im SPMCSR immer neu 
setzen?
1
void read_DeviceSignatureImprintTable ()
2
{
3
  int16_t data = 0;
4
  uart0_puts_P("ImprintTable");  uart0_putc('\n');
5
    
6
  for (int addr = 0x00; addr<0x2E; addr++)
7
  {   
8
    SPMCSR |= (1<<RSIG) | (1<<SPMEN);
9
    data = __LPM_enhanced__(addr);
10
    uart0_send_int32(data);  uart0_putc('\n');
11
  }
12
}

Haut das hin?

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


Lesenswert?

Veit D. schrieb:
> Haut das hin?

 In etwa.

 Gelesen wird 1 Byte, nicht uint16_t und nicht uint32_t.
 Adressen (Byte Adressen) gehen von 0x00 bis 0x2D.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

naja gut, aber ich muss jetzt nicht noch eine extra serielle Funktion 
schreiben, ein Byte sollte auch in ein int32 passen. :-) Zudem manche 
der Werte signed Bytes sind.   :-)

Habs nun doch mal von der Leine gelassen, ich erhalte folgende Werte
Der Wert 41 von OSCCAL0 haut hin,
der Wert 129 von OSCCAL 1 stimmt nicht,
wenn ich mit meinem mkII auslese erhalte ich 0x00. ???
Allerdings klingt der Temp.Offsetwert wieder plausibel mit seinen 23.
Was der Gain mit 125 sein soll, kann ich nicht sagen, wenn das 1,25 sein 
sollen komme ich auf keinen grünen Zweig.
1
ADCL 17
2
ADCH 1
3
ADC  273  // LSB
4
Temp -2    // °C (LSB-275)
5
ImprintTable (addr 0x00 ... 0x02D)
6
0:  30
7
1:  41    // Calibration data for internal 8MHz oscillator (OSCCAL0)
8
2:  147
9
3:  45
10
4:  21
11
5:  128
12
6:  255
13
7:  129    // Calibration data for internal 32kHz oscillator (OSCCAL1)
14
8:  255
15
9:  44
16
10:  255
17
11:  255
18
12:  255
19
13:  105
20
14:  87
21
15:  52
22
16:  56
23
17:  49
24
18:  52
25
19:  51
26
20:  255
27
21:  7
28
22:  21
29
23:  31
30
24:  23
31
25:  3
32
26:  18
33
27:  5
34
28:  19
35
29:  5
36
30:  255
37
31:  255
38
32:  31
39
33:  255
40
34:  8
41
35:  67
42
36:  68
43
37:  29
44
38:  129
45
39:  130
46
40:  186
47
41:  157
48
42:  248
49
43:  188
50
44:  125    // Calibration data for temperature sensor (gain)
51
45:  23     // Calibration data for temperature sensor (offset)

von Veit D. (devil-elec)


Lesenswert?

Hallo,

habe noch einen zweiten ATtiny841 programmierfertig gemacht und die 
Tabelle ausgelesen.
1
ImprintTable
2
0:  30
3
1:  35      // Calibration data for internal 8MHz oscillator (OSCCAL0)
4
2:  -109
5
3:  43
6
4:  21
7
5:  -128
8
6:  -1
9
7:  -127
10
8:  -1
11
9:  39
12
10:  -1
13
11:  -1
14
12:  -1
15
13:  105
16
14:  87
17
15:  52
18
16:  56
19
17:  49
20
18:  52
21
19:  51
22
20:  -1
23
21:  7
24
22:  31
25
23:  31
26
24:  23
27
25:  3
28
26:  18
29
27:  5
30
28:  19
31
29:  5
32
30:  -1
33
31:  -1
34
32:  31
35
33:  -1
36
34:  8
37
35:  60
38
36:  68
39
37:  24
40
38:  -128
41
39:  -123
42
40:  -69
43
41:  -96
44
42:  -8
45
43:  -68
46
44:  -128
47
45:  15      // Calibration data for temperature sensor (offset)

ADC vom onboard Sensor zeigt mir 272 LSB an, -275 + die 15 wären 12°C.
Kann man vergessen, haut nicht hin. Ohne eigene Kalibrierung geht hier 
nichts los. Wofür der hinterlegte Offset gut sein soll, weiß wohl selbst 
Atmel nicht. Die scheinen den ja beim Sensor auslesen selbst nicht zu 
verwenden. Die könnten den ab Werk kalibrierten Offset wie beim OSCCAL 
automatisch auslesen und mit verrechnen beim LSB auslesen. Naja gut 
genug gemeckert.

Danke für die Kalibriernachhilfe und fürs Code drüberschauen.

von spess53 (Gast)


Lesenswert?

Hi

>Wofür der hinterlegte Offset gut sein soll, weiß wohl selbst
>Atmel nicht. Die scheinen den ja beim Sensor auslesen selbst nicht zu
>verwenden.

Da gibt es sogar eine AppNote:

AN_8108 - AVR122: Calibration of the AVR`s Internal Temperature 
Reference

MfG Spess

von Veit D. (devil-elec)


Lesenswert?

Hallo,

da gehts aber nur um die nachträgliche Kalibrierung. Erklärt nicht warum 
die Temperaturmessung ab Werk so weit daneben liegt und wofür der 
eingespeicherte Offsetwert gut sein soll, wenn der auch nicht stimmt. 
Zumindestens bei meinem 2. ATtiny.

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.