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
voidset_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_tread_onboard_Temp()
11
{
12
uint8_tlow=0;
13
int16_ttemp=0;
14
15
ADCSRA|=(1<<ADSC);// Start A/D Wandlung
16
while(ADCSRA&(1<<ADSC));// warten auf fertige Wandlung
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.
> 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.
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.
"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?
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.
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?
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:
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_tread_onboard_Temp()
2
{
3
uint8_tlow=0;
4
int16_ttemp=-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
returntemp;
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.
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.
> Was ist 'calibration data'?
Ist, wie schon oben angemerkt, in der 'Device Signature Imprint Table'
zu finden, in meiner Datenblattversion Table 23-6.
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.
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."
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.
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
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?
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
ADCL17
2
ADCH1
3
ADC273// LSB
4
Temp-2// °C (LSB-275)
5
ImprintTable(addr0x00...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)
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.
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
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.