Hallo,
ich habe einen STM32L07x uC der mit einer externen, variablen
Spannungsversorgung zw. 3.0V-3.4V.
Ich muss die Spannungsversorgung und die uC Temperatur monitoren. Der uC
hat am VREF+ Eingang leider keine Referenz angeschlossen, weil ich mich
auf die Aussage aus dem Datenblatt verlassen habe:
Internal voltage reference (VREFINT)
The internal voltage reference (VREFINT) provides a stable (bandgap)
voltage output for the
ADC and Comparators. VREFINT is internally connected to the ADC_IN17
input channel. It
enables accurate monitoring of the VDD value (when no external voltage,
VREF+, is available
for ADC). The precise voltage of VREFINT is individually measured for
each part by ST during
production test and stored in the system memory area. It is accessible
in read-only mode.
Mit der internen Referenz-Spannung habe ich jeoch bei der
Temperaturmessung eine starke Abhängigkeit von der Versorgungsspannung.
Plausible und eher korrekte Temperaturen messe ich bei genau 3.3V.
Hier ist ein Macro von ST für die Temperaturberechung (TS_ADC_DATA ist
ADC Wert vom Tempsensor):
1 | #define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007A)) /* Internal temperature sensor, parameter TS_CAL1: TS ADC raw data acquired at a temperature of 30 DegC (+-5 DegC), VDDA = 3.3 V (+-10 mV). */
|
2 | #define TEMP130_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007E)) /* Internal temperature sensor, parameter TS_CAL2: TS ADC raw data acquired at a temperature of 130 DegC (+-5 DegC), VDDA = 3.3 V (+-10 mV). */
|
3 | #define VDDA_TEMP_CAL ((uint32_t) 3000) /* Vdda value with which temperature sensor has been calibrated in production (+-10 mV). */
|
4 | #define VDDA_APPLI ((uint32_t) 3300) /* Value of analog voltage supply Vdda (unit: mV) */
|
5 |
|
6 | /* This calibration parameter is intended to calculate the actual VDDA from Vrefint ADC measurement. */
|
7 | #define COMPUTATION_TEMPERATURE_TEMP30_TEMP130(TS_ADC_DATA) \
|
8 | (((( ((int32_t)((TS_ADC_DATA * VDDA_APPLI) / VDDA_TEMP_CAL) \
|
9 | - (int32_t) *TEMP30_CAL_ADDR) \
|
10 | ) * (int32_t)(130 - 30) \
|
11 | ) / (int32_t)(*TEMP130_CAL_ADDR - *TEMP30_CAL_ADDR) \
|
12 | ) + 30 \
|
13 | )
|
Dachte mir, setze ich für die definierte VDDA_APPLI die gemessene
Spannung ein. Wie es aussieht, ist diese aber ziemlich ungenau.
Habt Ihr eine Idee bzw. schon mit dem Problem zu tun gehabt?