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); | |
} |
-
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:
Aucun commentaire:
Enregistrer un commentaire