hi,
hat jemand eine Ahnung wie die Auflösung bzw. die Interprätation der
internen Temperaturwandlung ist beim Xmega ist?? Hab weder einen Beitrag
hier im Forum finden können, noch was brauchbares aus'm Datasheet.
Hab die Wandlung am laufen, aber ob das was ich auslese brauchbar ist,
weiss ich nicht... kann somit auch nix umrechnen ;)
Danke vorab schon mal!
ADC ist im 12-Bit signed Mode (also 11 Bit Auflösung)
Modesetting:
// Controller Interne Temperaturmessung
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1,
ADC_CH_INPUTMODE_INTERNAL_gc,
ADC_CH_GAIN_1X_gc);
Muxer:
ADC_Ch_InputMux_Config( &ADCA.CH1, ADC_CH_MUXINT_TEMP_gc,
ADC_CH_MUXNEG_PIN0_gc );
Auslesen des CH1 bringt 620 ... und nu??
Hallo,
steht im Daten blatt nicht etwas von
[quote]
TEMPSENSE0 - Temperature Sensor Calibration Register 0
TEMPSENSE0 and TEMPSENSE1 contains the 12-bit ADCA value from a
temperature measurements done with the internal temperature sensor. The
measurements is done in production
test at 85C and can be used for single- or multi-point temperature
sensor calibration.
...
25.3.4 Internal inputs
Four internal analog signals can be selected as input and measured by
the ADC.
• Temperature sensor
• Bandgap voltage
• VCC scaled
• DAC output
The voltage output from an internal temperature reference can be
measured with the ADC and
the voltage output will give an ADC result representing the current
temperature in the microcon-
troller. During production test, the ADC measures a fixed temperature
using the internaltemperature sensor, and the value is store in the
production calibration row and can be used for
temperature sensor calibration.[/quote]
Also der Wert für 85 Grad Celsius ist bekannt.
Wenn Du also einen Kaltstart bei 20 Grad machst und sofort mißt,
könntest Du vielleicht etwas sinnvolles hinbekommen.
hmm, irgendwie bringt mir das nicht sehr viel....
Der 85°C-Wert den die atmel fab da reinschreibt, bringt mir doch
eigentlich nur was, wenn "ich" weiss das ich jetzt 85°C Tu habe, dann
seh ich evtl. eine Abweichung und kann somit mein Ergebnis Offset
kompensieren.
Mit dem 85°C Wert und einer unbekannten Tu kommt man nicht wirklich
weiter, oder? Eine Differenzbildung ist dann ja immer noch ein
unbekanntes Delta, bzw. Digit/°C, ganz zu schweigen das es sowieso nicht
linear sein wird...
Ich bräuchte einen formellen Zusammenhang oder eine Tabelle um
weiterzukommen...
trotzdem danke für die Info
Wenn man von einem Linearen Zusammenhang ausgeht, braucht man zwei
Punkte um die zwei unbekannten der Kennlinie (Steigung, Offset) zu
berechnen. Man hat aber nur einen, das heißt man müsste, wie schon
gesagt, einen zweiten Punkt aufnehmen (was dann wieder mit
Ungenauigkeiten verbunden wäre) oder Atmel gibt entweder Offset oder
Steigung der Gerade im Datenblatt vor (was ich aber noch nicht entdecken
konnte).
Soweit zur Problematik.
Der Temperatursensor ist sicher nur als extremwertgeber gedacht und
keinesfalls als hochauflösendes Thermometer, sonst stünden die Daten und
Formeln zur Berechnung mit Sicherheit im Datenblatt. Auch wird der
Sensor in seinen Werten von Chip zu Chip streuen.
Also wenn er nur als Extremwertgeber nutzbar ist, dann kann man wohl nix
anderes machen, als den in der Signature Row in TEMPSENSE0 / TEMPSENSE1
abgelegten Wert mit dem aktuell gemessenen Wert vergleichen und weiss
somit das 85°C vorhanden sind, mehr ist dann wohl nicht möglich!? Seh
ich das richtig?
Najaa - so extrem nun auch nicht. Es wird wohl möglich sein, über
manuelle Kalibrierung von 2 Punkten eine Temperatur in Grad Celsius zu
messen, aber das muß bei jedem Chip wieder neu vermessen werden. Wer´s
mag...
achso falls doch jemand Interesse an dem Schätzeisen hat!
In der Application Note AVR122: Calibration of the AVR's internal
temperature reference
Ist die prinzipielle Vorgehensweise erklärt.
Dank geht an Travel Rec. für die guten Hinweise!
Tschö
Sieht interessant aus. Ich frage mich aber warum TravelRec sich so
sicher ist, dass das beim ATxmega genau so sein sollte. Denn immerhin
bekommt man hier einen (augenscheinlich sehr genauen 16 Bit-)
Kalibrationswert im Chip mitgeliefert.
Muss also gar nicht sein, dass das Ding so ein Schätzeisen ist, wie bei
anderen AVRs.
Vielleicht ist der Temperatursensor ja (wie viele andere Sachen) noch
TBD (To be determined).
>Ich frage mich aber warum TravelRec sich so>sicher ist, dass das beim ATxmega genau so sein sollte.
Moment: ich habe keinen Vergleich mit den Temp-Sensoren der Tinys
angestellt. Ich gehe nur davon aus, daß der Sensor im XMega sooo genau
nicht sein kann, sonst wäre er direkt in der Feature-Liste und mit
separatem Beschreibungstext im Manual aufgetaucht. Es gibt auch keine
Appnote, wie bei allen anderen wichtigen Peripherien.
Ich nehme mich morgen der Sache mal an. Schreibe sowieso gerade an einem
Projekt mit XMega und ADC herum. Also dann bis morgen ;-)
Travel Rec. schrieb:
>>Ich frage mich aber warum TravelRec sich so>>sicher ist, dass das beim ATxmega genau so sein sollte.>> Moment: ich habe keinen Vergleich mit den Temp-Sensoren der Tinys> angestellt. Ich gehe nur davon aus, daß der Sensor im XMega sooo genau> nicht sein kann, sonst wäre er direkt in der Feature-Liste und mit> separatem Beschreibungstext im Manual aufgetaucht.
Ok, stimmt ;)
> Es gibt auch keine> Appnote, wie bei allen anderen wichtigen Peripherien.
Noch nicht. Naja, wahrscheinlich kommt da auch nichts mehr.
> Ich nehme mich morgen der Sache mal an. Schreibe sowieso gerade an einem> Projekt mit XMega und ADC herum. Also dann bis morgen ;-)
Bin gespannt.
also die ganzen Vermutungen könnt ihr euch ersparen, habe den Hinweis
auf die App Note und den Hinweis das die Vorgehensweise die gleiche ist
vom Atmel Support bekommen...
Der Kalibrierte Wert mag hochgenau sein, aber die Aufnahme eines zweiten
Punkts ist immer noch nötig.. und dann kann es sogar sein, das es
relativ genau ist das Ganze... aber ich kann mir in meiner Applikation
keine "Ich erfasse jetzt einen zweiten definierten Temperaturwert
Algorithmus" erlauben, da es kein Einzel-Projekt ist, sondern eine
Serienfertigung in hohen Stückzahlen geplant ist, da wäre es einfach
viel zu aufwendig!
Also ich habe mal eine Wandlung gestartet mit interner Referenz 1.00V
und im signed mode, Gain1, das Ergebnis bei Zimmertemperatur (etwa 24°C)
liegt bei dezimal 1670, mit einer kleinen Glühlampe aufgeheizt brachte
der Sensor 1720, ich schätze mal, daß es 35-40 Grad waren. Die
Kalibrierdaten dieses Controllers sagen 3769 bei 85°C, das könnte ja
hinkommen. Für genauere Messungen müßte ich mal einen Temperatursensor
auf den XMega kleben und mitloggen. Das packe ich aber momentan zeitlich
nicht. ich habe auch mal an den Atmel-Support geschrieben.
nur mal so in den Raum geworfen, warum machen die Hersteller (Atmel)
nicht die zweite Referenzmessung und erfreuen den Anwender mit zwei
kalibrierten Werten, die zwei Register müssten doch noch zu finden sein,
wo man die abspeichern kann ;) Wenn man bei 85°C einen Referenzwert
erfasst muss das doch theoretisch auch bei 25°C möglich sein. Für den
Anwender ist es ja immer mit Aufwand verbunden den zweiten Punkt zu
definieren!?
Najaa - Der Atmel-Support hat sich schon gemeldet und ebenfalls noch
keine Antwort auf unsere Fragen gefunden. Der Herr will sich nun mit der
IC-Entwicklung bei Atmel kurzschließen. Das sollte uns sicher
weiterbringen.
Hier die neuesten Informationen:
Atmel schrieb:
I now have some more information regarding the temperature sensing.
1) The 1.00 V reference is used for all calibration measurements.
2) As for temperature sensitivity, the assumption is that a value of
0x0000 represents 0 Kelvin,
while a reading equal to the calibration value represents 358 Kelvin
(85C, as you mentioned).
Of course, with only this one calibration point, the accuracy is not
very good.
We suggest using a two-point calibration scheme to improve on this.
I hope this is all you need.
Best Regards,
Martin Etnestad Johansen
Atmel Technical Support Team
Aha, dachte ich mir doch sowas! Die angedachte Kalibrierung ist also
eine lineare Interpolation, wobei die gerade durch den
Kalibrierungspunkt und durch (0x0000|0 K) bzw (0x0000|-273,15°C) geht
So habe ich das jezt auch verstanden ;-). Die Sache ist nur die, daß die
Kalibrierung im Unsigned-Single-Ended Modus vorgenommen wurde. Mißt man
differenziell, muß man die Werte erst wieder uminterpretieren.
> nur mal so in den Raum geworfen, warum machen die Hersteller (Atmel)> nicht die zweite Referenzmessung und erfreuen den Anwender mit zwei> kalibrierten Werten, die zwei Register müssten doch noch zu finden sein,> wo man die abspeichern kann ;)
Weil die Messung so dein Geld und nicht Atmels Geld kostet.
> Wenn man bei 85°C einen Referenzwert erfasst muss das doch theoretisch> auch bei 25°C möglich sein.
Sicher ist das auch praktisch möglich. Ich vermute mal, dass Atmel die
Bausteine aus anderen Gründen sowieso kontrolliert auf 85°C aufheizt
(Überprüfung des Temperaturbereiches?) und sich die Messung des 85°C
Referenzwerts dabei für Atmel kostengünstig nebenbei erledigen lässt.
Zusammen mit der Annahme einer linearen Kurve und dass der Wert 0 der
Temperatur 0 Kelvin entspricht sieht Atmel das vermutlich als "gut
genug" für den Verkauf an.
Ollz schrieb:
>> Wenn man bei 85°C einen Referenzwert erfasst muss das doch theoretisch>> auch bei 25°C möglich sein.>> Sicher ist das auch praktisch möglich. Ich vermute mal, dass Atmel die> Bausteine aus anderen Gründen sowieso kontrolliert auf 85°C aufheizt> (Überprüfung des Temperaturbereiches?) und sich die Messung des 85°C> Referenzwerts dabei für Atmel kostengünstig nebenbei erledigen lässt.>> Zusammen mit der Annahme einer linearen Kurve und dass der Wert 0 der> Temperatur 0 Kelvin entspricht sieht Atmel das vermutlich als "gut> genug" für den Verkauf an.
So vermute ich das auch mal.
Simon, könntest Du mal ´ne Messung machen, signed 12bit mit interner
Referenz bei Raumtemperatur, was da hex oder dezimal bei Dir ´rauskommt
- ich würde gerne mal die Werte vergleichen.
Travel Rec. schrieb:
> Simon, könntest Du mal ´ne Messung machen, signed 12bit mit interner> Referenz bei Raumtemperatur, was da hex oder dezimal bei Dir ´rauskommt> - ich würde gerne mal die Werte vergleichen.
Ja, kann ich machen. Muss aber erst noch den Teil im ADC Kapitel
durchlesen, hab da noch nix mit gemacht. Hab allerdings die erste Chip
Revision. Kann das sein, dass da der ADC nicht funktioniert?
Warum eigentlich im signed Modus? Unsigned macht doch viel mehr Sinn
dabei. Vielleicht weil es die Rechnung vereinfacht? :D
Okay, interessant.
Kalibrationsdaten für beide ADCs sind irgendwie gleich (0x1FF). Aber
egal. Hab die trotzdem benutzt.
85°C hat 0x0A44 (2628 dez.) nach Kalibrationsdaten.
Init:
Und dann zyklisch abgefragt.
Der Chip hat vielleicht 40°C (da ist direkt ein Spannungsregler neben,
der gut ackert). Außerdem ist es in dem kleinen Zimmer hier ziemlich
warm.
Ich lese 0x050A (1290 dez.) als Temperaturwert.
Aber irgendwie kann das mit den 0 K = 0x00 nicht stimmen. 0 °C = 0x00
schon eher.
0 K = 0x00, okay Achsenabschnitt ist 0, Steigung laut Kalibrationsdaten
des Temperatursensors ist (273,16 + 85) K / 2628 = 0,1363 K / LSB.
Für 1290 gibt das aber 175,81K, das wären immerhin irgendwas um die
-100°C.
0 °C = 0x00, Steigung ist dann 85/2628 = 0,0323. Für 1290 gibt das 41,67
°C.
Na das ist ja interessant. Das sind nämlich die Werte, die ich in etwa
auch heraus bekomme. Allerdings könnte man dann nicht unter 0°C messen
und das wiederum kann ich mir auch nicht vorstellen. Zumal bei der
Messung 'Unsigned Single ended internal mode' die Masse einem Meßwert
von etwa dezimal 200 entspricht. Rätsel über Rätsel...
Ollz schrieb:
> Zusammen mit der Annahme einer linearen Kurve und dass der Wert 0 der> Temperatur 0 Kelvin entspricht sieht Atmel das vermutlich als "gut> genug" für den Verkauf an.
und schon hat man ein Feature mehr auf'm Datenblatt stehen... ;)
Also ich hab's abgehakt, +/-10% geben sie an, evtl. auch +/-2% "depends
on chip"... lassen wir mal lieber die Finger davon...
Ich verstehe die ganze Aufregung nicht.
Temperatursensoren, die über 1mW verbraten, sind eh nur Schätzeisen, da
dann die Eigenerwärmung zur Fehlerquelle wird.
Und man wird ja nicht nen Xmega nehmen, um ihn dann zu 99% im Power-down
laufen zu lassen, nur damit die Temperaturmessung stimmt.
Ich hab das sogar beim DS18B20 gemerkt, daß der sich deutlich aufheizt,
wenn man öfter als 5s wandelt.
Peter
Hallo,
was will man denn auch mehr erwarten.
Es ist doch wirklich nur eine Art Überlastunsensor.
Ich würde ja auch nicht mit einem Pentium oder Athlon onChip
Temperatursensor die Raumtemperatur messen, wenn ich es genau haben
möchte ;-)
Nix Aufregung. Es geht nur darum, die Gradzahl aus den Eichwerten
errechnen zu können und da scheint in der Tat etwas nicht zu stimmen.
Ich habe jetzt hier noch eine Weile herumgerechnet, aber so richtig
schlau werde ich aus der Angabe der Daten in Verbindung mit der
Meßmethode des ADC nicht.
> Ich verstehe die ganze Aufregung nicht.
Ich sehe hier auch keine Aufregung, nur den Versuch ein Feature zu
verstehen und die Grenzen auszuloten damit man entscheiden kann, ob's
sich lohnt.
Wenn man den Sensor zur Temperaturüberwachung der Schaltung einsetzen
möchte, sind 85 C als einziger bekannter Referenzpunkt ungünstig. Erst
bei 85 Grad XMEGA-Temperatur den Lüfter einzuschalten ist etwas spät.
Also braucht man einen anderen Referenzpunkt. Den zu bekommen scheint
nicht einfach zu sein.
Wenn man Zeit und Lust hat, kann man einen externen Sensor direkt auf
den XMega bappen und selber eine 2-Punkt-Kennlinie aufnehmen.
Einigermaßen linear scheint der Sensor zu sein. Schöner wäre aber eine
klare Formel...
mit dem "Feature" lässt sich doch ohnehin nur die interne Chip
Temperatur messen.... wie soll man da gross auf die Umgebungstemperatur
schliessen können!?
Wenn der Chip für 85°C laut Datenblatt einsetzbar ist, kann man doch
eigentlich nur die Info erhalten, dass die Chip Temperatur mittlerweile
einen Bereich erreicht hat, wo dem Teil evtl. bald die Lichter ausgehen
oder er zu spinnen anfangen kann.... Frequenz läuft weg, Leckströme etc.
was halt so passieren kann wenn eine Halbleiter seine Grenztemperatur
erreicht...
Ja schon, aber bislang habe ich mit keiner Messmethode den eingetragenen
Kalibrierwert erreicht, trotzdem ich, mit einem SHT11 und einem
Heißluftfön bewaffnet, den XMega mal bis auf 85°C aufgeheizt habe. Ich
habe den Support nochmal angetriggert, mal sehen, was kommt.
Also wenn ich so Eure Meßergebnisse interpretiere, dann zeigt er wohl
0x0000 bei 0°C an, und 0x0A44 (2628 dez.) bei 85°C. Also hat der
Atmelsupport °C mit K vermatscht.
Negative temperaturen werden vermutlich mit neg. Zahlen (signed)
angezeigt ?
Übrigens habe ich immer so meine Zweifel, ob ein aufgeflanschter Sensor
wirklich die Temp. eines Teils einigermaßen akurat mißt. Schließlich
entstehen doch schon gewisse Differenzen, wenn der Chip von open (mit
Sensor vielleicht noch huckepack) geheizt wird, während er untenrum
auskühlt.
Ich hatte mir mal folgendes ausgedacht, was ich bei meinem jetzigen
Projektchen mal so machen werde, um zu testen, ob die vorgesehene
Kühlung ausreicht:
- 1 Draht an Masse (oder Udd), und ein Draht an einen freien I/O-Pin
(zumindest darf er nicht niederohmig beschaltet sein)
- Meßgerät im Diodenmeßbereich ran (oder R-Meßbereich, wenn Meßspannung
> Uf einer Diode) - viele Meßgeräte zeigen ja dabei die Spannung an den
Meßleitungen an (bzw. ist proportional dazu)
- Platine in einen Wassertopf mit destilliertem (!!!) Wasser
- Wasser-Temp. messen, und Uf der dahinterliegenden Schutzdiode messen
- Wasser heizen auf sagen wir mal 85°C
- wieder Uf messen
Die Platine bleibt beim Messen im Topf, so daß das temperierte Wasser
mit Sicherheit für gleichmäßige Temp. im/um den Chip herum sorgt (ist ja
destilliertes Wasser, also keine Probleme mit möglicher Eeigenleitung).
Damit hat man seine Temp Kennlinie via Uf einer Eingangsschutzdiode, die
man sicherlich auch während des Betriebs später dann als OnDie-Sensor
verwenden kann (solange der Pin als Input ohne Pullup und ohne störende
Ausenbeschaltung genutzt wird). Bzw. damit kann man dann den inneren
Sensor eichen (man sollte natürlich immer dieselbe Schutzdiode des Chips
nehmen).
Destilliertes Wasser ist nicht sonderlich gut dafür. Durch die Platine
kannst du schon genug Verunreinigung reinbringen, dass die Eigentleitung
wieder ausreicht. Andererseits sind das ja Kleinstspannungen...und die
Modellbauer hängen ihre Motoren bei 14V auch ins Wasserglas
(Leitungswasser) zum einlaufen.
Wenn Du sicher gehen willst nimm Öl (Sonnenblumenöl z.B.) oder flüssiges
Silikon. Das leitet auch die Wärme gut und ich hab sogar schonmal
gesehn, dass einer seinen ganzen PC zur Kühlung in ein Silikonbad
gehängt hat.
Gruß
Fabian
iiiihhhh - Öl - und wie kriege ich das Ding wieder sauber ohne
irgendwelche zusätzliche Chemikalie?
Hast zwar recht, daß wenige Verunreinigungen wieder die Eigenleitung
erhöhen, aber was ist auf einer Leiterplatte denn so alles drauf auser
das halbverbrannte Flußmittel, was das Wasser wieder signifikant
leitfähig machen sollte (oder ist Flußmittel wasserlöslich?)? Ich meine,
die Uf-Messung wird ja nicht im unteren µA-Bereich gemacht, sondern im
oberen oder gar mA - da stören paar nA/µA zusätzlich durchs Wasser nicht
so sehr.
es reicht schon der Staub auf der Platine und schon isses nimmer
destilliertes Wasser. Zumal du vermutlich kein destilliertes sondern nur
entmineralisiertes Wasser hast (das von der Tankstelle z.B.)
Aber probiers doch mit ner kleinen Platine mit nem billigen Atmel mal
aus.
Wie gesagt, bei den Modellbauern klappts auch...
Gruß
Fabian
lds XL, TempSens0 ;calibration value read from calibration row
7
lds XH, TempSens1
8
9
lds Temp, TempAdj0 ;manually stored adjust values
10
lds TempH, TempAdj1
11
add XL, Temp
12
adc XH, TempH
13
andi XH, $0F
14
15
lsl XL ;multiplicate with 4
16
rol XH
17
lsl XL
18
rol XH
19
20
ldi Temp, 179 ;factory test temperature 85°C -> 358K/2
21
clr Temp3
22
23
_CT1:
24
sub XL, Temp ;calculate divisor (steps per °K)
25
sbc XH, Null
26
brcs _CT2
27
inc Temp3
28
rjmp _CT1
29
30
_CT2:
31
lds XH, TemperH ;read ADC values from temp sensor
32
lds XL, TemperL
33
lsl XL ;multiplicate with 16
34
rol XH
35
lsl XL
36
rol XH
37
lsl XL
38
rol XH
39
lsl XL
40
rol XH
41
42
ldi Temp,1
43
mov Di0, Temp
44
clr Temp
45
clr TempH
46
47
_CT3:
48
sub XL, Temp3 ;divide with steps/K
49
sbc XH, Null
50
brcs _CT4
51
add Temp, Di0
52
adc TempH, Null
53
rjmp _CT3
54
55
_CT4:
56
ldi XL, low(273) ;transform °K -> °C
57
ldi XH, high(273)
58
sub Temp, XL
59
sbc TempH, XH
60
ret
Sie funktioniert mit allen getesteten XMegas, abgesehen von einem
Exemplar, welches ich anfangs zum Testen verwendete und deshalb nichts
stimmte :-0 Der "TempAdj0/1" Korrekturwert gibt eine Abweichung vom
programmierten Kalibrierwert an, um den Controller nachzueichen.
Also ich würde mal vermuten, dass zur internen Temperaturmessung die
Durchlassspannung einer Si-Diode genutzt wird (und die streut!).
Dann wäre der 0°C-Wert aber nicht Null!
Wenn der ADC-Wert bei steigender Temperatur kleiner wird, wäre dies ein
Beleg für meine Annahme. Außerdem sollte dann der 85°C-Wert ca.
Der Temperaturkoeffizient wäre dann aber ca.(streut auch!) -3mV/°C - was
man mit der verwendeten Referenzspannung (1,00V wäre geeignet) umrechnen
müsste:
Temperaturfaktor= 1V / -3mV/°C = -333,33.../ ADC-Fullscale-Wert
[°C/delta-ADC].
Temperatur= 85°C + (ADC-Wert - Scale-Wert(12 Bit - nicht 16 Bit!)) *
Temperaturfaktor
Da die Messung onehin nur die interne Temperatur misst - die man selbst
nicht messen kann, bleibt einem (ohne Angaben im Datenblatt) nur die
Möglichkeit, mit zwei externen Temperaturen (z.B. die Gehäusetemperatur)
die Kennlinie selbst zu bestimmen.
Falls man einigermaßen genau eine externe Temperatur messen will,
braucht man einen externen Sensor! Dafür gibt es verschieden genaue:
Si-Diode (ungenau), KTYxx (ziemlich genau) und PT100 / PT1000 (sehr
genau, sehr großer Temperaturbereich, aber winziger
Temperaturkoeffizient => Auswerte-Verstärker!).
PS: Habe gerade den ADC-Wert für die Tempsense ausgelesen - es kommt
eine errechnete Spannung von 0,6V (= Diodenspannung) heraus! Q.E.D ;-)
Alexxx
PPS:
habe auf http://de.wikipedia.org/wiki/Diode#Temperaturabh.C3.A4ngigkeit
einen (theoretischen) Wert von -1,7mV/K gesehen (dachte immer -3mV/°C).
Der Temperaturfaktor wäre dann -588,2 / ADC-Fullscale-Wert
[°C/delta-ADC]
=> d.h. ca. -0,144
Alexxx