Atmega168/328: interner Temperatursensor

OP #5143974
Lesenswert?

Hat wer Erfahrung mit dem internen Temperatursensor der Atmegas 168/328 
?
Mein "Problem" (eigentlich frag ich nur der Interesse halber) ist, dass 
bei meinem aktuell benutzten 168 der Temperaturoffset bei schmalen ~30 
°C liegt. Das Datenblatt sagt aber eigentlich sollten es maximal 10 °C 
sein. Ist das normal? Da bin ich ja mit ner 1N4148 defaultmäßig genauer. 
Mich interessiert eh nur die ungefähre Temperaturänderung, ich frag hier 
wirklich nur interessehalber.
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include "adc.h"
4
#include "lcd.h"
5

6
int main(void)
7
{
8
    // insert your hardware initialization here
9
    // setUp ADC, Parameter siehe adc.h/.c
10
    // Prescaler: 128, ADLAR aus, Refquelle: 1.1V Bandgap
11
    adcInit(128, 0, 3);
12
    // andere Initialisierungen
13
    lcd_init(LCD_DISP_ON);
14
    lcd_clrscr();
15
    lcd_puts_p(PSTR("Temperatur: "));
16

17
    char valueToPrint[5];
18
    
19
    for(;;){
20
        // insert your main loop code here
21
        
22
        dtostrf(ADC*1100.0/1024.0-314.0+25.0,
23
                5,
24
                2,
25
                valueToPrint);
26
        lcd_gotoxy(13,0);
27
        lcd_puts(valueToPrint);
28
        adcReadMittel(8,10);   // von www.microcontroller.net
29
    }
30
    return 0;   // never reached
31
}
Gast #5144015
Lesenswert?

In jedem AVR Datenblatt steht, frei Übersetzt:
"Verwende die 2 Punkt Kalibrierung!"

Tipp:
Tue das!

Ursache deiner Fehlmessung:
Der Sensor liegt 10% daneben
Deine 1,1V Referenz liegt 10% daneben.

Das kann sich bei manchen fast ausgleichen, bei dir scheint es eher 
andersrum zu gehen.
OP #5144033
Lesenswert?

Arduino F. schrieb:
> Ursache deiner Fehlmessung:
> Der Sensor liegt 10% daneben
> Deine 1,1V Referenz liegt 10% daneben.

10% + 10% macht bei mir Pi mal Daumen 20%. Bei mir ists ca 30 ° zu hoch, 
bzgl. der Raumtempertur hier sind das > 100% daneben.

Arduino F. schrieb:
> In jedem AVR Datenblatt steht, frei Übersetzt:
> "Verwende die 2 Punkt Kalibrierung!"

Ich weiß, so genau brauch ichs aber gar nicht. Ich muss quasi nur grob 
schätzen...und zwar die Temperaturänderung und da genügt mir der interne 
Sensor, der Offset kann mir hierbei sogar egal sein. Mich verwundert nur 
grade der große Offset weil er nicht zum Datenblatt passt, daher wollte 
ich nur wissen ob der normal/erwartungsgemäß ist.
Gast #5144056
Lesenswert?

M. K. schrieb:
> 10% + 10% macht bei mir Pi mal Daumen 20%.

Da du deine Messgrößen nicht additiv verarbeitst, sonden eher die 
Multiplikation verwendest, multiplizieren sich die Abweichungen auch 
eher.

Die Eigenerwärmung auch schon mit eingerechnet?
so ca 3 bis 5°C sind da auch immer zu erwarten.



M. K. schrieb:
> der Raumtempertur hier sind das > 100% daneben.
10 * 10 = 100

M. K. schrieb:
> daher wollte
> ich nur wissen ob der normal/erwartungsgemäß ist.
Ist er.


-------

Ich verwende den internen Sensor gerne um OSCAL Values zu ermitteln.
Dazu wird eine Lookup Tabelle (Array) ins Flash oder EEPROM gelegt, und 
gut ist.
Die Abweichungen von Aref und Sensor interessieren mich da nicht.

Meine Ansicht:
Du sägst Sägemehl.
OP #5144108
Lesenswert?

Arduino F. schrieb:
> M. K. schrieb:
>> der Raumtempertur hier sind das > 100% daneben.
> 10 * 10 = 100

Das üben wir aber noch. 10% * 10% sind nicht 100% sondern 1%: 10%*10% => 
0.1 * 0.1 = 0.01 => 1% ;)

Arduino F. schrieb:
> Die Eigenerwärmung auch schon mit eingerechnet?
> so ca 3 bis 5°C sind da auch immer zu erwarten.

Yo, die würde jetzt auch nicht soviel ändern. Wie gesagt, im Datenblatt 
steht eigentlich dass der Sensor auf ±10 °C genau sein soll, mit meinen 
+30 °C bin ich hier schon um die Faktor 2 neben dem maximalen Fehler. 
Das verwunderte ;)

Arduino F. schrieb:
> Ist er.

OK
#5144179
Lesenswert?

M. K. schrieb:
> Das üben wir aber noch. 10% * 10% sind nicht 100% sondern 1%: 10%*10% =>
> 0.1 * 0.1 = 0.01 => 1% ;)

Da denken wir aber nochmal genau nach... ;)

Wenn das so wäre könnte man ja superhohe Genauigkeiten durch einfaches 
Hintereinanderschalten von toleranzbehafteten Stufen erreichen. Die 
richtige Lösung steht 1 drüber. (1+10%)*(1+10%)=1,21 -> 21%.
Gast #5144197
Lesenswert?

Mit der Formel stimmt was nicht!
1
void setup() 
2
{
3
  Serial.begin(9600);
4

5
  float erwarteterMesswert = 330.0; // ADC
6
  Serial.println(erwarteterMesswert*1.21*1100.0/1024.0-314.0+25.0,3);
7
  Serial.println(erwarteterMesswert*1.0*1100.0/1024.0-314.0+25.0,3);
8
  Serial.println(erwarteterMesswert*0.79*1100.0/1024.0-314.0+25.0,3);
9
}
10

11
void loop() 
12
{
13

14
}
Ergebnis:
139.936
45.492
-8.951
#5144224
Lesenswert?

Meiner Meinung nach ist der Temperaturmesswert unabhängig von der 
Toleranz der 1.1V, da diese sowohl als ADC-Referenz als auch als 
Temperatursensor-Referenz verwendet wird.

Ansonsten:
Es werden hier unterschiedliche Werte verglichen. +/- 10°C hat nichts 
mit +/- 10% zu tun und kann auch nicht (direkt) miteinander verrechnet 
werden. Sollte die Ungenauigkeit der 1.1V Referenzspannung tatsächlich 
den Messwert beeinflussen, dann würde bereits eine Toleranz von 2% eine 
Temperaturänderung von 20°C bewirken, da: 1mV entspricht ca. 1°C:
"The voltage sensitivity is approximately 1 mV/°C" (datasheet 24.8).

Kann es sein, dass Dein Messwert gar nicht so weit daneben liegt, weil 
der ATmega sich in Deiner Schaltung bereits selbst erwärmt?
Um das auszuschliessen, könntest Du die Schaltung eine Weile unbestromt 
lassen (> 30min), dann einschalten und den 2. Messwert speichern und 
anzeigen.

Gruß, Stefan
OP #5144413
Lesenswert?

Bernd S. schrieb:
> Da denken wir aber nochmal genau nach... ;)

Ich habe nur gesagt, dass 10% * 10% nicht 100% ergibt, ich habe nicht 
gesagt, dass die Multiplikation richtig ist, vergleiche Beitrag 3 ;)
Du hast natürlich völlig recht ;)

Arduino F. schrieb:
> Mit der Formel stimmt was nicht!

Hab nur vom Datenblatt abgeschrieben: 314 mV sollen 25 °C entsprechen 
und die Empfindlichkeit liegt bei 1 mV/K. Ich rechne also den ADC-Wert 
in eine Spannung um (ADC*1100.0/1024.0), ziehe ich 314 mV 
(ADC*1100.0/1024.0-314) ab und addiere 25 °C.

Das VREF hab ich auch gemessen, liegt bei 1,064 V. Erklärt die 
Abweichung also nicht komplett.

Stefan K. schrieb:
> Kann es sein, dass Dein Messwert gar nicht so weit daneben liegt, weil
> der ATmega sich in Deiner Schaltung bereits selbst erwärmt?
> Um das auszuschliessen, könntest Du die Schaltung eine Weile unbestromt
> lassen (> 30min), dann einschalten und den 2. Messwert speichern und
> anzeigen.

War meine erste Idee heute morgen gewesen, hat keine Änderung bewirkt. 
Eigenerwärmung ist es also nicht.
Gast #5144504
Lesenswert?

Vergiss es einfach....

2 Punkt Kalibrierung, und gut ist.
Da muss man sich um nichts anderes kümmern

Hier mal ein Beispiel aus meiner Wühlkiste
1
#include <Adc.h>
2

3
#ifndef ADC_MODELL_WITH_THERMO 
4
  #error Dieser AVR hat keinen eingebauten Temperatursensor
5
#endif
6

7
/**
8
 * 
9
 * Lesen des eingebauten Temperatursensors 
10
 * Ausgabe der Temperatur
11
 * 
12
 * Kalibrierung
13
 * wir brauchen, einen UNO, ein Referenzthermometer, einen Kühlschrank und einen Backofen
14
 * 
15
 * Messwertaufnahme Kalibrierpunkt 1
16
 * Uno in Plastiktüte in den Kühlschrank
17
 * Referenz Termometer beilegen
18
 * Dann zügig den ADC Wert auslesen
19
 * 
20
 * Messwertaufnahme Kalibrierpunkt 2
21
 * Uno in den Backofen, kleinste Stufe
22
 * Referenz Termometer beilegen
23
 * Dann zügig den ADC Wert auslesen
24
 * 
25
 * Die beiden Referenzpunkte in den Code eintragen
26
 * 
27
 * 
28
 * Tipp:
29
 * http://www.atmel.com/Images/Atmel-8108-Calibration-of-the-AVR%27s-Internal-Temperature-Reference_ApplicationNote_AVR122.pdf
30
 * https://de.wikipedia.org/wiki/Punktsteigungsform
31
 * 
32
*/
33

34
Adc adc;
35

36
struct Kalibrierung
37
{
38
   // Werte für die 2 Punkt Kalibrierung 
39
  int   a1; // ADC Wert bei niedriger Temperatur
40
  float t1; // gemessene niedrige Temperatur
41
  float m ; // Steigung
42
  
43
  Kalibrierung(int a1, float t1,int a2, float t2): a1(a1),t1(t1) 
44
  {
45
    m = (t2-t1)/(a2-a1); // Steigung berechnen
46
  }
47
  
48
  float operator()(int analogValue) // adc2temperatur
49
  {
50
    return m*(analogValue-a1)+t1;
51
  }
52
};
53

54
// hier bitte die beiden Messpunkte für die Kallibrierung eintragen
55
// im Beispiel sind das:
56
// Punkt 1: 342 bei 9.5 Grad
57
// Punkt 2: 397 bei 53.2 Grad
58
Kalibrierung kalibriere(342,9.5,397,53.2);
59

60

61
void setup() 
62
{
63
   Serial.begin(9600);
64

65
   adc  .enable()
66
        .setReference(Adc::REF_11)
67
        .setClockDivisor(Adc::DIV_128)
68
        .setSource(Adc::MUX_THERMO);
69
}
70

71
void loop() 
72
{
73
  int   adcWert    = adc();
74
  float temperatur = kalibriere(adcWert);
75
  
76
  Serial.print("Gelesener ADC Wert ");      Serial.println(adcWert);
77
  Serial.print("kalibrierte Temperatur ");  Serial.println(temperatur,1);
78
  Serial.println("---");
79
  delay(1000);
80
}
Wenn du die Adc Klasse auch noch sehen möchtest, dann gerne..
Aber du kannst auch einfach deine Werte/AdcRoutinen da einsetzen.
Gast #5144591
Lesenswert?

Stefan K. schrieb:

> Meiner Meinung nach ist der Temperaturmesswert unabhängig von der
> Toleranz der 1.1V, da diese sowohl als ADC-Referenz als auch als
> Temperatursensor-Referenz verwendet wird.

Das ist falsch. Die 1.1V-Referenz wird nur als Referenzspannung für die 
Temperaturmessung benutzt. Der Temperatursensor selber (also der andere 
Eingang der ADC) wird davon in keinster Weise behelligt.

Sprich: die zulässigen relativen Fehler von Sensor und Referenz sind in 
erster Näherung völlig unabhängig voneinander (müssen also schlicht 
addiert werden -> 20%).

In zweiter Näherung allerdings sind sie über die gemeinsame 
Chip-Temperatur  und die ebenfalls gemeinsame Verorgungsspannung 
gekoppelt. Wie sich das auswirkt, kann man durch Einrechnung der drei 
relevanten typischen Kennlinien ermitteln. Also Referenzspannung vs. 
Temperatur und vs. Versorgung sowie Sensor vs. Versorgung. Was da am 
Ende rauskommt, sind aber Peanuts im Verhältnis zum zulässigen 
Grundfehler. Wenn ich mich nicht verrechnet habe, ergeben sich über den 
gesamten Bereich der zulässigen Spannung und Temperatur nur knappe zwei 
Extraprozentpunkte, sind wir also bei 22%.

Davon ist nicht mehr sehr weit bis zu den ANGEBLICH beobachteten 30%.

Nach meiner Erfahrung allerdings landet man in der Realität bei den AVR8 
eher irgendwo im Bereich deutlich unter 5%. Man muss bloß richtig 
rechnen, nämlich in Kelvin. Wie es Physiker, Elektroniker und überhaupt 
alle tun, die irgendetwas von der Sache verstehen, mit der sie da 
hantieren...

Selbst wenn man weder Physiker noch Elektroniker noch sonst irgendwer 
mit einem Hauch einer Andeutung einer Ahnung ist, aber immerhin 
wenigstens über grundlegendste mathematische Fähigkeiten verfügt, sollte 
einem immer noch der dramatische Sprung (inclusive Singularität) des 
ANGEBLICHEN Fehlers in der Umgebung von 0°C (oder im Falle von Amis 
auch 0°F) ordentlich auffallen. Und Leute mit einer minimalen 
Eigenintelligenz würden sich dann fragen: wo kommt das eigentlich her, 
da kann doch irgendwas grundsätzlich nicht stimmen in meinem Ansatz zur 
Betrachtung der Messwerte...
Gast #5144677
Lesenswert?

M. K. schrieb:
> Hat wer Erfahrung mit dem internen Temperatursensor der Atmegas 168/328
> ?
"Wer hat Erfahrung" oder "hat jemand Erfahrung"

> Mein "Problem" (eigentlich frag ich nur der Interesse halber)
Ich frage mit e am Ende.

Wenn Du mit dem internen Sensor die Umgebungstempertur messen willst, 
kann das nicht funktionieren: Der Sensor befindet sich auf dem Die des 
Controllers und wird sehr fix auf Stromänderungen des µC reagieren. Wir 
reden hier nur um einige oder einige zehn Milliwatt, aber diese fallen 
in direkter Nähe des Sensor auf einer sehr kleinen Fläche an. Durch das 
umgebende Gehäuse dauert es recht lange, bis diese an die Umwelt 
abgegeben werden.

Im Datenblatt finde ich dazu keinen eindeutigen Hinweis, meine aber, es 
in einer Apllikationsschrift von Atmel gesehen zu haben.

Ich habe hier die Tage eine Temperaturmessung mit einem niederohmigen 
NTC aufgebaut. Da erlaube ich mir, dessen Speisestrom nur für die Zeit 
der Messung aufzuschalten, um Eigenerwärmung auszuschließen.
Gast #5145123
Lesenswert?

Manfred schrieb:
> Wenn Du mit dem internen Sensor die Umgebungstempertur messen willst,
> kann das nicht funktionieren: Der Sensor befindet sich auf dem Die des
> Controllers und wird sehr fix auf Stromänderungen des µC reagieren. Wir
> reden hier nur um einige oder einige zehn Milliwatt, aber diese fallen
> in direkter Nähe des Sensor auf einer sehr kleinen Fläche an. Durch das
> umgebende Gehäuse dauert es recht lange, bis diese an die Umwelt
> abgegeben werden.

Kann ich so nicht bestätigen. Lasse ich den ATmega48PA aus obigem Test 
mit minimalem Strom von 0.4 mA, d.h. 2.0 mW, laufen, liefert der ADC 
332, mit hohem Strom von 5.1 mA, d.h. 25.5 mW, sind es 333, gerade mal 1 
mehr.
  Diese Datenblattangabe von 314 mV bei 25 °C ist einfach irreführend, 
auch wenn darüber "Typical Case" steht.
#5145195
Lesenswert?

Hi

S. Landolt schrieb:
> Diese Datenblattangabe von 314 mV bei 25 °C ist einfach irreführend,
> auch wenn darüber "Typical Case" steht.

Wenn bei 10 Millionen µC im Schnitt 314mV gemessen wurden, ist Das der 
Duchschnitt.
Daß dort dann einzelne Exemplare (massiv) abweichen, lässt Herr Gauß 
erwarten.
Warum aber Du gerade nur extrem abweichende Exemplare hast, gleicht 
einem Lotto-Gewinn :)

Nimm Es, wie ein Mann:
Es ist so, mach was draus!

MfG
Beitrag #5145221 wurde von einem Moderator gelöscht.
#5145263
Lesenswert?

Mal so als neuer Gedanke, falls Eigenerwärmung als Ursache 
ausgeschlossen werden konnte:

Hast du womöglich aus einer dubiosen Quelle gekauft (ebay, Chinamann), 
welche die Chips aus dem Müllcontainer der Fertigung gekratzt und 
billigst in Umlauf gebracht hat?

Soll ja schon vorgekommen sein, und nicht so unwahrscheinlich, da du 
wohl nur den einen Chip hast. ;-)
OP #5145563
Lesenswert?

S. Landolt schrieb:
>> womöglich aus einer dubiosen Quelle
>
> Also wo M. Köhler sein Exemplar her hat, muss er beantworten. Meine
> kommen von Reichelt.

Da kommen meine auch her. Für mich ist eh alles geklärt, Abweichungen 
von  30 Grad und mehr können durchaus vorkommen. Ich dachte nur, dass 
bei den 10 Grad schon alle Fehlerquellen enthalten sind. Sind sie 
anscheinend nicht, ok. Damit ist für mich alles klar.

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