Forum: Mikrocontroller und Digitale Elektronik STM32 und interner Temperatursensor


von Tim K. (timkl94)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich möchte bei meinem STM32L031 den internen Temperatursensor auslesen 
und bekomme keinen vernünftigen Wert.
Ich habe den Code für die Berechnung der Temperatur aus dem Refmanual 
des STM32 übernommen.

Mein Code sieht so aus:

#define TEMP130_CAL_ADDR ((uint16_t*) ((uint32_t 0x1FF8007E))  // 916
#define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t 0x1FF8007A))   // 671
#deifne VDD_CALIB ((uint16_t) (300))
#deifne VDD_APPLI ((uint16_t) (330))

int32_t temp;

temp = ((uint32_t) measure[3] * (VDD_APPLI / VDD_CALIB); //measure[3] = 
605
temp = temp - ((int32_t) *TEMP130_CAL_ADDR;
temp = temp * (int32_t) (130 - 30);
temp = temp / (int32_t) (*TEMP130_CAL_ADDR - *TEMP30_CAL_ADDR);
temp = temp + 30; // temp = - 102 °C


Hat jemand eine Idee, was da genau schief läuft?

: Bearbeitet durch User
von klammern (Gast)


Lesenswert?

Was tut das:
((uint16_t*((uint32_t 0x1FF8007E))? Sollten da due Klammern nicht anders 
gesetzt sein?

von Nop (Gast)


Lesenswert?

Tim K. schrieb:

> #deifne VDD_CALIB ((uint16_t) (300))
> #deifne VDD_APPLI ((uint16_t) (330))

> (VDD_APPLI / VDD_CALIB)

Das ist Integer-Division. Das Ergebnis von 330/300 ist immer 1 und 
wahrscheinlich nicht das, was Du willst.

von Nop (Gast)


Lesenswert?

Tim K. schrieb:

> #deifne

Ach ja, und das ist sicherlich nicht Dein Code, denn das compiliert 
nichtmal.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

INT bei Division ist keine gute Idee, es wird immer nur Integerteil 
(INT) als Ergebnis genommen.

von Tim K. (timkl94)


Lesenswert?

Nochmal der Code ohne Schreibfehler...

#define TEMP130_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007E))  // 916
#define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007A))   // 671
#define VDD_CALIB ((uint16_t) (300))
#define VDD_APPLI ((uint16_t) (330))

int32_t temp;

temp = ((uint32_t) measure[3] * (VDD_APPLI / VDD_CALIB); //measure[3] =
605
temp = temp - ((int32_t) *TEMP130_CAL_ADDR;
temp = temp * (int32_t) (130 - 30);
temp = temp / (int32_t) (*TEMP130_CAL_ADDR - *TEMP30_CAL_ADDR);
temp = temp + 30; // temp = - 102 °C

Nop schrieb:
> Tim K. schrieb:
>
>> #deifne VDD_CALIB ((uint16_t) (300))
>> #deifne VDD_APPLI ((uint16_t) (330))
>
>> (VDD_APPLI / VDD_CALIB)
>
> Das ist Integer-Division. Das Ergebnis von 330/300 ist immer 1 und
> wahrscheinlich nicht das, was Du willst.

Da hast du Recht. Aber auch mit dem Faktor 1,1 passt das Ergebnis am 
Ende nicht...

von Martin L. (maveric00)


Lesenswert?

Hallo,

statt

Tim K. schrieb:
> temp = temp - ((int32_t) *TEMP130_CAL_ADDR;

muss es

temp = temp - ((int32_t) *TEMP30_CAL_ADDR);

heißen (bei der linearen Interpolation wird der untere Grenzpunkt 
abgezogen, nicht der obere).

Schöne Grüße,
Martin

P.S. und die fehlende Klammer muss natürlich auch dazu ;-)

: Bearbeitet durch User
von Daniel B. (dbuergin)


Lesenswert?

1
/* Temperature sensor calibration value address */
2
3
#define TEMP130_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007E))
4
#define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007A))
5
#define VDD_CALIB ((uint16_t) (300))
6
#define VDD_APPLI ((uint16_t) (330))
7
8
int32_t temp;
9
temp = (((uint32_t) measure[3] * VDD_APPLI / VDD_CALIB) - (int32_t) *TEMP30_CAL_ADDR );
10
temp = temp * (int32_t)(130 - 30);
11
temp = temp / (int32_t)(*TEMP130_CAL_ADDR - *TEMP30_CAL_ADDR);
12
temp = temp + 30;

Du sollst die Klammern bei der ersten "temp = ..." Zeile richtig setzen. 
So wie es im Referenzmanual steht....

von Tim K. (timkl94)


Lesenswert?

So passt es.

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.