STM32 und interner Temperatursensor

#6423172
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?
Angehängte Dateien:
#6423812
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...
#6423896
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....

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