首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何精准读取STM32内部温度传感器数据

如何精准读取STM32内部温度传感器数据

作者头像
不脱发的程序猿
发布2025-08-09 16:14:12
发布2025-08-09 16:14:12
37500
代码可运行
举报
运行总次数:0
代码可运行

作为一名嵌入式工程师,监控芯片温度是保证系统稳定运行的重要任务。大多数STM32微控制器内部都集成了温度传感器,但如何正确读取并获取准确数值却暗藏玄机。

本文将深入探讨STM32内部温度传感器的工作原理、实现方法。

STM32 系列 MCU 内部温度传感器是一枚二极管型传感器,其输出电压与温度成线性关系。

温度传感器的输出经片内多路复用进入 ADC 通道,再由 ADC 转换为数字值。

厂商在数据手册中提供了两点标定值(在 30°C 和 130°C 时 ADC 采样值 TS_CAL1 与 TS_CAL2,要根据芯片数据手册确定)及对应温度,读出 ADC 值后,可使用线性插值公式计算当前温度:

  • TS_CAL2是在 TS_CAL2_TEMP温度下获取的温度传感器校准值(有关 TS_CAL2 的具体值,请参阅数据手册)。
  • TS_CAL1是在TS_CAL1_TEMP温度下获取的温度传感器校准值(有关 TS_CAL1 的具体值,请参阅数据手册)。
  • TS_DATA是模数转换器(ADC)转换后的实际温度传感器输出值。

正确配置ADC是获取温度数据的基础,在CubeMX的Analog选项卡中,选择ADC模块,勾选“Temperature Sensor Channel”。

对于STM32H7/U5等系列,还需启用内部通道转换(设置VSENSESEL位)。并且配置采样通道。

在启动 ADC 转换前,进行一次 ADC 校准:

代码语言:javascript
代码运行次数:0
运行
复制
ADC1->CR2 |= ADC_CR2_RSTCAL;          // 复位校准寄存器
while (ADC1->CR2 & ADC_CR2_RSTCAL);   // 等待完成
ADC1->CR2 |= ADC_CR2_CAL;             // 启动校准
while (ADC1->CR2 & ADC_CR2_CAL);      // 等待完成

在 STM32 的 Flash 内,地址 TS_CAL1(0x1FFF75A8)、TS_CAL2(0x1FFF75CA )存放对应 30°C 和 110°C 时的校准 ADC 值。

注意,不同STM32系列的温度传感器通道和校准值地址有差异。

设计驱动程序如下:

代码语言:javascript
代码运行次数:0
运行
复制
float Read_Temperature(void) {
    HAL_ADC_Start(&hadc1);
    while (HAL_ADC_GetState(&hadc1) != HAL_ADC_STATE_READY);
    uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
    uint16_t ts_cal1 = *(__IO uint16_t *)0x1FFF75A8;
    uint16_t ts_cal2 = *(__IO uint16_t *)0x1FFF75CA;
    float temperature = (float)(130 - 30) / (ts_cal2 - ts_cal1) * (adc_value - ts_cal1) + 30;
    return temperature;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 美男子玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档