Forum: Mikrocontroller und Digitale Elektronik Atmega168/328: interner Temperatursensor


von M. K. (sylaina)


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
}

von Einer K. (Gast)


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.

von M. K. (sylaina)


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.

von Einer K. (Gast)


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.

von Harald W. (wilhelms)


Lesenswert?

Arduino F. 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.

Dann sinds 21%, soviel mehr also auch nicht.

von M. K. (sylaina)


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

von Bernd S. (wirrer_haarschopf)


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%.

von Einer K. (Gast)


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

von Stefan K. (stefan64)


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

von M. K. (sylaina)


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.

: Bearbeitet durch User
von Einer K. (Gast)


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.

von S. Landolt (Gast)


Lesenswert?

1
Raumtemperatur 18 °C
2
Leistung: 5.0 V * 0.4 mA = 2.0 mW
3
4
Typ                    Ubg    ADCtemp
5
ATmega48PA-PU (1024)  1.097    332
6
ATmega328P-PU (1545)  1.092    344
7
ATmega328P-PU (1426)  1.074    344

von M. K. (sylaina)


Lesenswert?

Arduino F. schrieb:
> Wenn du die Adc Klasse auch noch sehen möchtest, dann gerne..
> Aber du kannst auch einfach deine Werte/AdcRoutinen da einsetzen.

Nö, die Adc-Klasse ist nicht erforderlich. Coole Sache auf jeden Fall, 
danke dafür ;)

von c-hater (Gast)


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

von Manfred (Gast)


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.

von Glashaus (Gast)


Lesenswert?

Manfred schrieb:
> des Sensor

des Sensors

Manfred schrieb:
> Apllikationsschrift

Hä?

von THOR (Gast)


Lesenswert?

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

Da hat wer ganz viel deutsch, wa

von S. Landolt (Gast)


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.

von Patrick J. (ho-bit-hun-ter)


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

von S. Landolt (Gast)


Lesenswert?

> Es ist so, mach was draus!

Aus einem Lottogewinn? Nichts lieber als das...

Beitrag #5145221 wurde von einem Moderator gelöscht.
von S. Landolt (Gast)


Lesenswert?

> 10% !

Habe ich im Datenblatt nicht gelesen, wo finde ich das?

von Einer K. (Gast)


Lesenswert?

S. Landolt schrieb:
>> 10% !
>
> Habe ich im Datenblatt nicht gelesen, wo finde ich das?
http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

28.8. Temperature Measurement
"The voltage sensitivity is approximately 1mV/°C, the accuracy of the 
temperature measurement is ±10°C."

von Michael L. (michaelx)


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. ;-)

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

S. Landolt schrieb:
>> 10% !
> wo finde ich das?

sind keine 10% sondern 10°
(Darum habe ich auch meinen Beitrag gelöscht, weil sachlich falsch)

von S. Landolt (Gast)


Lesenswert?

> womöglich aus einer dubiosen Quelle

Also wo M. Köhler sein Exemplar her hat, muss er beantworten. Meine 
kommen von Reichelt.

von M. K. (sylaina)


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.

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.