Forum: Mikrocontroller und Digitale Elektronik STM32 und interner Temperatursensor


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tim K. (timkl94)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


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

von Nop (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Tim K. schrieb:

> #deifne

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

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


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

von Tim K. (timkl94)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
So passt es.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.