adc-temperature.c

Famille STM32 Nucleo-64 F4 — modelo insignia: Nucleo-F401RE · Archivo : adc-temperature.c · Lenguaje : C · Uso : Lire le capteur de température interne via l'ADC

El sensor térmico interno cuelga de un canal dedicado del ADC: este programa lo convierte, aplica la calibración típica de la ficha técnica e imprime la temperatura del circuito en grados Celsius por el puerto serie.

Hardware

Una Nucleo F4 (STM32F401RE/F411RE, Cortex-M4) programada via ST-LINK (USB), pines de 3,3 V. Ninguno: sensor interno + cable USB para el terminal serie.

Cableado

Sin cableado. En CubeMX activa el canal «Temperature Sensor» del ADC y el reloj TSVREFE.

Funcionamiento

HAL_ADC_PollForConversion espera el fin de la conversión; el valor de 12 bits pasa a tensión y luego a temperatura con V25=760 mV y pendiente 2,5 mV/°C (valores típicos).

Ejecución

Crea un proyecto STM32CubeIDE (elige Nucleo-F401RE o F411RE), pega el codigo en main.c, configura los perifericos en el .ioc y pulsa Run. El terminal serie del ST-LINK muestra los printf a 115200.

Variantes

Añade sobremuestreo hardware en CubeMX, o lee también la referencia interna VREFINT para corregir la tensión de alimentación.

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);
    }
  }
}

← Volver a la ficha