STM32 und interner Temperatursensor

OP #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:
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.