Forum: Mikrocontroller und Digitale Elektronik MSP430 und interner temperatursensor?


von Falk W. (dl3daz) Benutzerseite


Lesenswert?

Hallo,
ich versuche, die Temperatur mit der eingebauten Temperaturdiode zu 
"messen":
1
static void adcInit() {
2
    ADC12CTL0 &=~ENC;
3
    P6SEL |= 0xef;
4
5
    ADC12CTL0 = MSC + ADC12ON + REFON + REF2_5V + SHT0_15;
6
    ADC12CTL1 = SHP+CONSEQ_3;
7
8
    ADC12MCTL0 = SREF_2+INCH_0;         
9
    ADC12MCTL1 = INCH_10+EOS;           
10
11
    ADC12IE = 0x2;
12
13
    ADC12CTL0 |= ENC;                         // Enable conversions
14
    ADC12CTL0 |= ADC12SC;                     // Start conversion
15
}

Der ADC gibt für Kanal1 etwa 1394 aus. Bei Erwärmung steigt der Wert, 
bei Abkühlen sinkt er.

Ändere ich
1
ADC12MCTL1 = INCH_10+EOS;
in
1
ADC12MCTL1 = SREF_2 + INCH_10+EOS;

Ändert sich nichts am ausgelesenen Wert.

Kanal0 mißt wunderbar!

Bitte nehme jemand das Brett von meinem Kopf ;-)

Falk

von Christian R. (supachris)


Lesenswert?

Die interne Temperatur-Diode funktioniert nur mit der internen 
Referenz-Spannung.

von Falk W. (dl3daz) Benutzerseite


Lesenswert?

Christian R. wrote:
> Die interne Temperatur-Diode funktioniert nur mit der internen
> Referenz-Spannung.

Oh, das konnte ich der Doku nicht entnehmen.

Außerdem: Warum zeigt das Ding auch bei Verwendung der 2,5V-Referenz 
eine Temperatur, die <-100°C ist?

Falk

von Johnny Maxwell (Gast)


Lesenswert?

> Außerdem: Warum zeigt das Ding auch bei Verwendung der 2,5V-Referenz
> eine Temperatur, die <-100°C ist?

Wir rechnest du denn die Temperatur um? Im Datasheet steht, dass man den 
Offset der Temperaturkurve selbst kalibrieren muss...

von Christian R. (supachris)


Lesenswert?

Naja, im User Guide steht´s zumindest, dass man dazu nur die interne Ref 
nehmen kann. Wenn man das Ergebnis richtig umrechnet, kommt schon so 
etwas in der Größenordnung der Umgebungstemperatur raus. Aber nur ganz 
grob. Das taugt höchstens zum Schätzen.

von Stefan (Gast)


Lesenswert?

>Naja, im User Guide steht´s zumindest, dass man dazu nur die interne Ref
>nehmen kann.
Wo steht das denn ?
Die interne Referenzspannung wird beim Kanal 0x1010 (Temp.Diode) 
automatisch aktiviert, da diese sozusagen als "Betriebsspannung" für die 
interne Temp.Diode benötigt wird. Die daraus resultierende 
Temp.-Spannung wird dann allerdings genauso wie ein externes Signal über 
den Eingangsmultiplexer eingespeist und kann natürlich mit jeder 
beliebigen (auch externen) Referenzspannung gesampled werden. Die 
Ref-Spannung muss natürlich entsprechend der Temp.-Spannung gewählt 
werden!

>Das taugt höchstens zum Schätzen.
Kommt darauf an, welche Genauigkeit man erreichen will!
Wenn man den µC beim Messen immer in einem definierten Betriebszustand 
hält und in diesem Zustand auch (zumindest den Offset) kalibriert, 
erreicht man schon eine Genauigkeit von +-1,5°C

von Christian R. (supachris)


Lesenswert?

Hm, Tatsache, in der aktuellen Version des User Guide steht´s anders 
drin. In meinem Buch steht, es geht nur die interne Ref, und ich bin mir 
sicher, das in einem älteren UG auch gelesen zu haben.

von Falk W. (dl3daz) Benutzerseite


Lesenswert?

Johnny Maxwell wrote:
>> Außerdem: Warum zeigt das Ding auch bei Verwendung der 2,5V-Referenz
>> eine Temperatur, die <-100°C ist?
>
> Wir rechnest du denn die Temperatur um?

Wie in fet140_adc12_10.c aus TIs Beispielen beschrieben:
1
temp = ADC12MEM0;
2
IntDegC = (temp - 2692) * 423;
3
IntDegC = IntDegC / 4096;

Mit meinem Wert von 1815 komme ich so auf -90°C.

> Im Datasheet steht, dass man den
> Offset der Temperaturkurve selbst kalibrieren muss...

Klar, aber um >130°? Irgendwo ist da der Wurm drin.

Falk

von Stefan (Gast)


Lesenswert?

>Wie in fet140_adc12_10.c aus TIs Beispielen beschrieben:
1
>temp = ADC12MEM0;
2
>IntDegC = (temp - 2692) * 423;
3
>IntDegC = IntDegC / 4096;
>Mit meinem Wert von 1815 komme ich so auf -90°C.

Ich denke, Du benutzt Vref=2,5V ?!
Die obige Formel bezieht sich auf VRef=1,5V !!!

von Stefan (Gast)


Lesenswert?

Schau zur Grundlage der Berechnung mal in den User Guide:

VTemp = N/4095 * 2500mV = 1815/4095 * 2500mV
Temp = (VTemp - 986mV) / 3,55mV/°C

Ergibt bei N=1815 Temp=34,38°C

von Falk W. (dl3daz) Benutzerseite


Lesenswert?

Stefan wrote:
>>Wie in fet140_adc12_10.c aus TIs Beispielen beschrieben:
>
1
>>temp = ADC12MEM0;
2
>>IntDegC = (temp - 2692) * 423;
3
>>IntDegC = IntDegC / 4096;
4
>
>>Mit meinem Wert von 1815 komme ich so auf -90°C.
>
> Ich denke, Du benutzt Vref=2,5V ?!
> Die obige Formel bezieht sich auf VRef=1,5V !!!

Danke. Ich habe noch mal nachgesehen. Ich hatte vermutet, mit
1
ADC12MCTL4 = SREF_1 + INCH_10+EOS;
die 1,5Vref anzusprechen.
damit wähle ich aber nur generell die interne Referenz, die ich mit
1
ADC12CTL0 = MSC + ADC12ON + REFON + REF2_5V + SHT0_15;
 auf 2,5V gesetzt hatte.

Jetzt messe ich 30°C, was IMO im Bereich des normalen Fehlers ist.

Danke fürs Brett-vorm-Kopf-abreißen ;-)

Falk

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.