STM32微控制器系列内置的温度传感器为此提供了一个经济高效的解决方案。本文将详细介绍如何在STM32微控制器上使用内部温度传感器,并通过一个具体的例程展示如何实现温度读取和计算。

一、STM32内部温度传感器简介

STM32系列微控制器内置了一个温度传感器,可用于测量CPU及其周围环境的温度。该传感器通过ADC(模数转换器)的特定输入通道(通常为ADC1_IN16或ADC1_IN18,具体取决于STM32的型号)连接,将温度转换为模拟电压信号,再由ADC转换为数字值。
STM32内部温度传感器的测量范围通常为-40°C至125°C,精度约为±1.5°C。尽管精度不高,但在许多应用场景中已足够使用,特别是在需要节省成本和简化电路设计的场合。

二、温度传感器工作原理

STM32内部温度传感器的输出电压随温度线性变化。通过读取该电压值,并使用特定的转换公式,可以计算出当前的温度。转换公式通常如下:
温度(°C) = {(V_SENSE - V_25) / Avg_Slope} + 25
其中:
V_SENSE是温度传感器的当前输出电压。
V_25是25°C时V_SENSE的电压值(典型值为1.43V)。
Avg_Slope是温度与V_SENSE曲线的平均斜率(典型值为4.3mV/°C)。

三、硬件配置与软件设置

硬件配置
选择STM32微控制器型号,确保支持内部温度传感器。
连接必要的电源和接地线。
根据需要,配置用于调试和通信的外部设备(如串口通信模块)。
软件设置
使用STM32CubeMX或类似的配置工具,启用ADC模块,并配置温度传感器相关的ADC通道(如ADC1_IN16)。
设置ADC的采样时间、分辨率等参数。
启用内部温度传感器功能。
配置串口通信(如USART),以便将温度数据输出到调试终端或上位机。

四、具体例程实现

以下是一个基于STM32 HAL库的简单例程,用于读取内部温度传感器的温度值,并通过串口输出。
#include “stm32f4xx_hal.h”
// ADC句柄声明
ADC_HandleTypeDef hadc1;
// 温度传感器校准参数(典型值)
#define V25_TYPICAL_VALUE 1430 // 25°C时的V_SENSE值(单位为mV)
#define AVG_SLOPE_TYPICAL 4300 // 温度与V_SENSE曲线的平均斜率(单位为μV/°C)
// 初始化ADC
void ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
// 启用ADC1时钟
__HAL_RCC_ADC1_CLK_ENABLE();
// 配置ADC1
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV6;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc1);
// 配置ADC通道(ADC1_IN16,即内部温度传感器)
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
// 启用内部温度传感器
HAL_ADCEx_Calibration_Start(&hadc1);
while(HAL_ADCEx_Calibration_PollForEvent(&hadc1, HAL_ADCEX_CALIBRATION_EVENT) != HAL_OK);

// 启动ADC
HAL_ADC_Start(&hadc1);

}

// 读取温度值
float Read_Temperature(void)
{
HAL_ADC_Start(&hadc1); // 启动ADC转换
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
uint32_t adc_value = HAL_ADC_GetValue(&hadc1); // 获取ADC转换结果

// 将ADC值转换为电压值(单位为mV)
float voltage = (adc_value * 3300.0) / 4096.0;
// 使用转换公式计算温度值
float temperature = ((V25_TYPICAL_VALUE - voltage * 1000.0) / AVG_SLOPE_TYPICAL) + 25.0;

return temperature;

}
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟(根据具体项目需求配置)
MX_GPIO_Init(); // 初始化GPIO(根据具体项目需求配置)
MX_USART2_UART_Init(); // 初始化串口通信(根据具体项目需求配置)
ADC_Init(); // 初始化ADC

while (1)
{
    float temperature = Read_Temperature(); // 读取温度值
    char buffer[50];
    sprintf(buffer, "Temperature: %.2f °C\r\n", temperature); // 格式化温度值为字符串
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY); // 通过串口输出温度值
    HAL_Delay(1000); // 延时1秒
}

}

五、注意事项

温度传感器的线性度
尽管STM32内部温度传感器的输出电压随温度线性变化,但不同芯片之间的温度变化曲线可能存在偏移。因此,在使用时需要注意这一点,并根据实际情况进行校准。
采样时间
为了获得准确的温度读数,应确保ADC的采样时间足够长,以充分捕获温度传感器的输出信号。
电源稳定性
温度传感器的精度受电源稳定性影响。因此,在实际应用中,应确保电源电压稳定,以减少测量误差。

11-17 14:07