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
Was tut das: ((uint16_t*((uint32_t 0x1FF8007E))? Sollten da due Klammern nicht anders gesetzt sein?
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.
Tim K. schrieb: > #deifne Ach ja, und das ist sicherlich nicht Dein Code, denn das compiliert nichtmal.
INT bei Division ist keine gute Idee, es wird immer nur Integerteil (INT) als Ergebnis genommen.
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...
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
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....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.