jeudi 7 janvier 2021

Mesurer la température avec le capteur interne du STM32

Les microcontrôleurs STM32 comportent un capteur de température intégré, qu'on peut utiliser afin d'obtenir une mesure de la température ambiante.


Le sketch ci-dessous est un exemple tiré du STM32Duino Wiki. Je l'ai testé avec une carte STM32F103C "Blue Pill" ainsi qu'avec une carte Nucleo F030R8, toutes les deux programmées avec l'IDE Arduino et le core STM32 officiel (voir ce précédent article pour des informations concernant l'installation du core STM32 officiel).

-

/*
Mesure de température par le capteur interne
du STM32.
Exemple tiré du Wiki STM32Duino:
https://github.com/stm32duino/wiki/wiki/API#adc-internal-channels
*/
#include "stm32yyxx_ll_adc.h"
// valeurs moyennes tirées des fiches techniques:
// (peuvent être modifiées pour calibration)
#define CALX_TEMP 25
#if defined(STM32F1xx)
#define V25 1430
#define AVG_SLOPE 4300
#define VREFINT 1200
#elif defined(STM32F2xx)
#define V25 760
#define AVG_SLOPE 2500
#define VREFINT 1210
#endif
#define LL_ADC_RESOLUTION LL_ADC_RESOLUTION_12B
#define ADC_RANGE 4096
void setup() {
Serial.begin(9600);
analogReadResolution(12);
}
static int32_t readVref()
{
#ifdef __LL_ADC_CALC_VREFANALOG_VOLTAGE
return (__LL_ADC_CALC_VREFANALOG_VOLTAGE(analogRead(AVREF), LL_ADC_RESOLUTION));
#else
return (VREFINT * ADC_RANGE / analogRead(AVREF));
#endif
}
#ifdef ATEMP
static int32_t readTempSensor(int32_t VRef)
{
#ifdef __LL_ADC_CALC_TEMPERATURE
return (__LL_ADC_CALC_TEMPERATURE(VRef, analogRead(ATEMP), LL_ADC_RESOLUTION));
#elif defined(__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS)
return (__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(AVG_SLOPE, V25, CALX_TEMP, VRef, analogRead(ATEMP), LL_ADC_RESOLUTION));
#else
return 0;
#endif
}
#endif
void loop() {
int32_t VRef = readVref();
#ifdef ATEMP
Serial.print("Temperature (°C)= ");
Serial.println(readTempSensor(VRef));
#endif
delay(1000);
}

-


Dans mon cas, les valeurs mesurées étaient supérieures à la température ambiante de plusieurs degrés (la mesure était de 26°C alors que la température ambiante était d'environ 20°C). 

Pour calculer la température, le sketch utilise les constantes V25 (tension à 25°C) et AVG_SLOPE (variation de tension correspondant à une variation de température de 1°C). La valeur de ces deux constantes provient des fiches techniques des microcontrôleurs STM32, mais ces valeurs peuvent varier considérablement d'un spécimen à l'autre.

Comme le montre le tableau ci-dessus, la valeur de 1430 assignée à la constante V25 n'est qu'une valeur moyenne. Pour une carte en particulier, elle peut prendre n'importe quelle valeur située entre 1340 et 1520. On a assigné à la constante AVG_SLOPE une valeur typique de 4300, mais sa valeur réelle pour la carte que vous utilisez peut se situer n'importe où entre 4000 et 4600.

Si vous désirez obtenir des valeurs de température raisonnablement précises, il faudra modifier la valeur de V25 et de AVG_SLOPE (ce qui implique de mesurer VRef pour quelques valeurs de températures mesurées au moyen d'un thermomètre fiable).

À lire également:

Yves Pelletier (TwitterFacebook

Aucun commentaire:

Enregistrer un commentaire