adc-temperature.c
Le capteur thermique interne est relié à un canal dédié de l'ADC : ce programme le convertit, applique l'étalonnage typique de la fiche technique et affiche la température du circuit en degrés Celsius sur le port série.
Matériel requis
Une Blue Pill STM32F103C8T6 (Cortex-M3 @ 72 MHz, 64 Ko flash) alimentee par micro-USB ou 3,3 V externe ; programmation SWD ou bootloader serie. Aucun : capteur interne + câble USB pour le terminal série.
Câblage
Aucun câblage. Dans CubeMX, activer le canal « Temperature Sensor » de l'ADC et l'horloge TSVREFE.
Fonctionnement
HAL_ADC_PollForConversion attend la fin de conversion ; la valeur 12 bits devient une tension puis une température via V25=760 mV et slope 2,5 mV/°C (valeurs typiques).
Exécution
Projet STM32CubeIDE (STM32F103C8) ou Arduino (core STM32) : programmer par SWD (ST-LINK, adaptateur DAPLink) ou par le bootloader serie (BOOT0 a 1). Attention : LED PC13 active LOW.
Variantes
Ajouter du sur-échantillonnage matériel dans CubeMX, ou lire aussi la référence interne VREFINT pour corriger la tension d'alimentation.
adc-temperature.c
// Temperature interne via l'ADC (canal interne) + printf.
#include "main.h"
#include <stdio.h>
extern ADC_HandleTypeDef hadc1; // canal interne temperature (16)
extern UART_HandleTypeDef huart2;
int __io_putchar(int ch) {
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
uint16_t brut;
uint32_t t0 = 0;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_ADC1_Init(); // canal temperature + TSVREFE active dans CubeMX
for (;;) {
if (HAL_GetTick() - t0 >= 1000) {
t0 = HAL_GetTick();
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
brut = HAL_ADC_GetValue(&hadc1);
// Calibrage typique ST : V25 = 760 mV a 25 C, slope 2,5 mV/C.
float tension = brut * 3300.0f / 4095.0f; // mV
float temp = 25.0f + (tension - 760.0f) / 2.5f; // C
printf("brut=%u T=%.1f C\r\n", brut, temp);
}
HAL_ADC_Stop(&hadc1);
}
}
}