STM32使用ADC测量温度传感器信号操作指南

如何用STM32的ADC精准读取内部温度传感器?实战全解析

你有没有遇到过这样的场景:产品已经进入样机阶段,突然发现MCU发热严重,但没有任何温度反馈机制,只能靠手摸判断“是不是快烧了”?又或者为了加一个数字温度芯片,在PCB上绞尽脑汁腾出空间和走线?

其实,你的STM32早就自带了一个“体温计”——片内温度传感器。配合它强大的ADC模块,无需任何外围元件,就能实现对芯片核心温度的实时监控。

今天我们就来彻底讲清楚:如何用STM32的ADC正确、稳定、高精度地读取内部温度传感器数据,并给出从原理到代码再到调试技巧的完整方案。


为什么选STM32内置温度传感器?

在开始动手前,先搞明白一个问题:我该不该用这个功能?

答案是:如果你需要的是“MCU自身是否过热”的判断依据,那它是绝佳选择;如果你想测环境温度,就得谨慎对待

它到底能干什么?

  • ✅ 监控CPU运行时温升
  • ✅ 实现软件级过热保护(比如降频或关断外设)
  • ✅ 在低功耗模式下周期性采样,防止深度睡眠中过热
  • ✅ 替代外部温度IC,节省BOM成本与PCB面积

哪些型号支持?

大多数主流STM32系列都集成了该功能,包括但不限于:

系列是否支持典型通道号
STM32F1
STM32F4/F7ADC Channel 16
STM32L4/L5ADC_IN18
STM32H7多ADC支持,需查手册

📌 提示:具体信息请查阅对应型号的参考手册(RMxxx)第xx章“ADC internal channels”。


核心原理一图看懂

我们先不急着写代码,先把整个流程理清楚:

[硅基带隙传感器] ↓ 输出电压随温度变化 (~ -2mV/°C) [接入ADC内部通道] ↓ 经过采样保持电路 [ADC转换为12位数字值] ↓ 存入DR寄存器 [结合出厂校准点计算实际温度]

关键点在于:
- 这个传感器不是直接输出摄氏度;
- 它输出的是一个与温度成线性关系的模拟电压
- 我们需要用ADC把它变成数字量;
- 再通过两点校准公式反推出当前温度。


ADC怎么配?别再瞎抄例程了!

很多人直接复制CubeMX生成的代码,却不知道某些配置会严重影响测量精度。下面我们一步步拆解最关键的设置。

1. 分辨率必须设为12位

虽然有些型号支持更低分辨率(如8/10位),但温度变化缓慢且信号微弱,建议始终使用12位模式

hadc1.Init.Resolution = ADC_RESOLUTION_12B;

12位意味着你能分辨最小约3.3V / 4096 ≈ 0.8mV的电压变化,这对检测几毫伏级别的温漂至关重要。


2. 参考电压要稳!

ADC的转换结果依赖于参考电压 $ V_{REF}^+ $。如果电源波动,读数就会漂移。

强烈建议:
- 使用独立的LDO给AVDD供电;
- 在VREF+引脚附近放置0.1μF陶瓷电容 + 10μF钽电容双重滤波;
- 不要用DC-DC直接连模拟域!

否则你会发现白天测出来35°C,晚上掉到30°C——其实是电源纹波在作祟。


3. 采样时间不能太短!

这是新手最容易踩的坑!

内部温度传感器等效输出阻抗较高(通常几百kΩ),如果采样时间不够,电容充不满,会导致严重负偏差。

以STM32F4为例,推荐设置为480个ADC周期

sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;

假设ADC时钟为30MHz,则单次采样时间为:
$$
T_{\text{samp}} = \frac{480}{30M} = 16\mu s
$$
足够让信号建立稳定。

📌经验法则:只要不是极端追求速度,一律选最长采样时间。


4. 必须启用内部通道!

很多开发者忘了这一步:默认情况下,内部温度传感器是关闭的!

你需要显式开启它的供电路径:

__HAL_RCC_ADC1_CLK_ENABLE(); __HAL_ADC_ENABLE(&hadc1); // 先使能ADC // 关键宏:开启温度传感器 __HAL_ADC_ENABLE_TEMP_SENSOR();

注意顺序:必须先使能ADC时钟,再调用此宏,否则可能无法正常启动。

此外,首次启用后建议延时至少5~10μs等待信号稳定。


5. 软件触发 or 硬件触发?

对于温度这种慢变量,完全可以用软件触发(比如每秒一次)。但如果系统已有定时器用于其他ADC采集,也可以配置为TIM触发。

示例(软件触发):

hadc1.Init.ContinuousConvMode = DISABLE; // 单次模式 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

然后手动启动:

HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 10); uint32_t adc_val = HAL_ADC_GetValue(&hadc1);

温度怎么算?别只用线性插值!

最常用的计算方法来自ST的应用笔记 AN3116,基于两个出厂校准点进行线性拟合。

出厂校准数据在哪?

不同系列地址略有差异,以STM32F4为例:

温度点地址数据类型
25°C0x1FFF7A2Cuint16_t
110°C0x1FFF7A2Euint16_t

这些值是在工厂高温标定台上实测写入的,每颗芯片都不一样。

标准线性公式

#define TEMP_CALIB_25C_ADDR ((uint16_t*)0x1FFF7A2C) #define TEMP_CALIB_110C_ADDR ((uint16_t*)0x1FFF7A2E) float CalculateTemperature(uint32_t adc_value) { float temp_cal_25 = *TEMP_CALIB_25C_ADDR; float temp_cal_110 = *TEMP_CALIB_110C_ADDR; // 斜率:每LSB对应的温度变化 float avg_slope = (110.0f - 25.0f) / (temp_cal_110 - temp_cal_25); return (adc_value - temp_cal_25) * avg_slope + 25.0f; }

举个例子:
- 若你在室温下读到ADC=1800,
- 查得temp_cal_25=1430,temp_cal_110=4200
- 则斜率为 $ 85/(4200-1430) ≈ 0.0307 °C/count $
- 计算得温度:$ (1800 - 1430) × 0.0307 + 25 ≈ 36.4°C $

看起来很准?但现实往往没那么简单。


实战中的坑与破解之道

❗ 坑点1:自加热干扰太大

当你跑FreeRTOS+DMA+WiFi传输时,MCU自己就在发热,这时候测出来的温度比环境高5~10°C很正常。

解决方案
- 在系统空闲时采样(例如进入idle hook);
- 或者做动态补偿:根据CPU负载乘以经验系数修正;
- 更高级的做法是结合外部NTC做融合估计。


❗ 坑点2:冷机启动时不准

刚上电时芯片温度还没上来,而内部参考电压也未完全稳定,前几次读数容易偏低。

应对策略
- 上电后延迟1~2秒再首次采样;
- 连续采样3次取平均作为初始值;
- 可加入“温度爬升速率”判断逻辑,过滤异常跳变。


❗ 坑点3:噪声干扰导致抖动

即使硬件去耦做得好,ADC读数仍会有±3~5个count的波动,反映到温度上就是±1°C左右跳动。

✅ 推荐加入软件滤波:

移动平均滤波(适合缓变信号)
#define FILTER_LEN 8 static uint32_t buffer[FILTER_LEN]; static int idx = 0; uint32_t apply_filter(uint32_t raw) { buffer[idx] = raw; idx = (idx + 1) % FILTER_LEN; uint32_t sum = 0; for (int i = 0; i < FILTER_LEN; i++) { sum += buffer[i]; } return sum / FILTER_LEN; }

调用方式:

uint32_t filtered_adc = apply_filter(HAL_ADC_GetValue(&hadc1)); float temp = CalculateTemperature(filtered_adc);

⚠️ 注意:不要在中断里做复杂运算!可在主循环中处理。


❗ 坑点4:不同批次芯片差异大

同一型号的两块板子,在相同环境下读数相差3°C以上,并不少见。

✅ 高要求场合建议增加单点现场校准

比如已知当前环境为25.0°C(用红外测温枪辅助确认),记录此时ADC值adc_at_25,后续计算改用:

temperature = (adc_value - adc_at_25) * avg_slope + 25.0f;

这样可以把系统误差控制在±1°C以内。


低功耗场景怎么玩?

在电池供电设备中,我们希望尽可能降低功耗。能不能做到“每天只醒一次,测完温度继续睡”?

当然可以!

方案:Stop Mode + RTC闹钟唤醒 + 自动触发ADC

步骤如下:
1. 配置RTC定时唤醒(如每30秒一次);
2. 进入STOP2模式(仅保留备份域供电);
3. 唤醒后自动触发ADC采样(可通过RTC事件触发);
4. 采样完成后立即处理并重新休眠。

优势:
- 休眠电流可降至<10μA
- 每次唤醒仅耗时几毫秒
- 实现真正的“无人值守”温度监控

📌 注意:进入Stop模式前需确保ADC已预配置完成,避免每次重复初始化。


完整初始化代码模板(HAL库)

ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; void MX_ADC1_TempSensor_Init(void) { // ADC基本配置 hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; 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.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } // 配置通道:内部温度传感器 ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } // 启用内部温度传感器 __HAL_ADC_ENABLE_TEMP_SENSOR(); // 可选:开启DMA或中断 // __HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_EOC); }

结语:把“体温监测”变成系统的本能

当你真正掌握这套机制后,你会发现:

原来MCU也可以有“自我感知”能力

它不再只是一个执行指令的冰冷芯片,而是能感知自身状态、做出反应的智能节点。

下次设计产品时,不妨问问自己:
- 我的系统知道自己有多热吗?
- 如果持续升温,它会主动保护自己吗?
- 故障复盘时,有没有温度日志可供分析?

这些问题的答案,或许就藏在你早已忽略的那个内部通道里。

如果你正在做IoT终端、工业控制器、便携设备或电机驱动项目,强烈建议将这项技术纳入基础能力库。它不仅省成本、省空间,更能显著提升系统的健壮性和可维护性。


💡互动话题:你在项目中用过STM32内部温度传感器吗?遇到了哪些奇葩问题?欢迎留言分享你的实战经验!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1156065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剪映免费版6.0.1附安装包

目录 一、前言 二、安装教程 1.下载之后&#xff0c;解压安装包 2.右键创建桌面快捷方式 3.直接运行exe文件 4.注意&#xff1a;不能更新软件 一、前言 在这个全民自媒体时代&#xff0c;剪辑软件是不可不必备的。近两年&#xff0c;在众多剪辑软件中&#xff0c;剪映凭…

LVGL移植工业HMI设计:手把手教程(从零实现)

从零开始打造工业级HMI&#xff1a;LVGL移植实战全解析你有没有遇到过这样的场景&#xff1f;手头一款性能尚可的STM32芯片&#xff0c;配上一块3.5寸TFT屏&#xff0c;客户却要求做出媲美高端触摸屏的操作体验——滑动流畅、动画自然、界面美观。传统的段码驱动或裸机绘图早已…

OpenCalphad 学习笔记

OpenCalphad 学习笔记 https://www.opencalphad.com/index.php &#x1f4d1; 目录 前置知识&#xff1a;CALPHAD 方法简介OpenCalphad 是什么核心功能与应用场景技术创新点&#xff1a;连续热力学描述如何参与和使用与商业软件的对比扩展阅读与进阶方向 1. 前置知识&#xf…

架构设计方法和工具全景指南:从理论、建模到落地的实用工具集

文 / Kenyon&#xff0c;由于公众号推流的原因&#xff0c;请在关注页右上角加星标&#xff0c;这样才能及时收到新文章的推送。 摘要&#xff1a;本文介绍了架构设计全流程中的实用工具&#xff0c;涵盖建模可视化&#xff08;UML、C4、ArchiMate&#xff09;、协作文档&#…

通过Keil实现断电保护逻辑的设计实例

如何在STM32中构建可靠的断电保护系统&#xff1f;一个基于Keil的实战设计你有没有遇到过这样的场景&#xff1a;设备正在记录关键数据&#xff0c;突然断电&#xff0c;重启后发现配置丢失、日志损坏&#xff0c;甚至程序无法正常启动&#xff1f;这在工业控制、医疗仪器或智能…

STM32CubeMX使用教程:STM32F4串口通信配置操作指南

STM32F4串口通信配置实战&#xff1a;从CubeMX到HAL库的完整流程你有没有遇到过这样的场景&#xff1f;项目进度紧张&#xff0c;却卡在串口收发乱码上——查了又查GPIO配置、时钟使能、波特率计算&#xff0c;折腾半天才发现PA9被误设成了普通输出。这类低级但致命的问题&…

完整指南:构建可工作的ISR项目的全流程步骤

构建一个真正“能干活”的ISR项目&#xff1a;从原理到实战的硬核指南 你有没有遇到过这样的情况&#xff1f; 写好的中断服务例程&#xff08;ISR&#xff09;&#xff0c;代码编译通过了&#xff0c;下载进芯片也确实进了中断——但系统跑着跑着就卡死、数据错乱、甚至直接复…

全球首款能扫楼梯的扫地机器人亮相CES 2026 | 美通社头条

、美通社消息&#xff1a;1月6日&#xff0c;全球瞩目的2026年国际消费类电子产品展览会(CES)在美国拉斯维加斯拉开帷幕。在本届CES上&#xff0c;全球智能清洁领域的领军企业石头科技携多款创新产品重磅亮相&#xff0c;并与皇家马德里足球俱乐部达成深度战略合作。双方以&quo…

Spring源码探究1.0

简单看了看写了些&#xff0c;Spring最简单的一个实现&#xff0c;实现了什么具体如下一、 初始化阶段步骤序号初始化阶段核心方法主要作用关键数据结构变化1加载配置文件doLoadConfig()读取 contextConfigLocation 指定的配置文件&#xff08;如 application.properties&#…

usblyzer在项目初期协议分析中的应用:入门必看

usblyzer实战指南&#xff1a;从零理解USB通信&#xff0c;快速定位项目初期的“黑盒”问题在嵌入式开发的世界里&#xff0c;你有没有遇到过这样的场景&#xff1f;一个精心设计的STM32板子焊好了&#xff0c;固件也烧录成功。你满怀期待地插上电脑——结果设备管理器毫无反应…

IAR使用教程:超详细版菜单功能逐项解析

IAR 使用教程&#xff1a;菜单功能全解析与实战技巧在嵌入式开发的世界里&#xff0c;工具链的选择往往决定了项目的成败。面对日益复杂的微控制器架构和严苛的实时性要求&#xff0c;一个强大、稳定且高效的集成开发环境&#xff08;IDE&#xff09;显得尤为重要。IAR Embedde…

嵌入式系统中单精度浮点转换实战

嵌入式系统中单精度浮点转换实战&#xff1a;从底层原理到工程落地在一片寂静的工业现场&#xff0c;PLC正在读取来自PT100传感器的温度信号。ADC采样值是3278——一个再普通不过的12位整数。但工程师真正关心的不是这个数字本身&#xff0c;而是它背后代表的物理意义&#xff…

jscope实时波形显示优化策略:深度解析

jscope 实时波形显示优化实战&#xff1a;从数据采集到丝滑渲染的全链路调优你有没有遇到过这样的场景&#xff1f;在调试一个电机控制板时&#xff0c;ADC采样频率明明设到了10ksps&#xff0c;可打开 jscope 看波形——画面卡顿、跳变剧烈、甚至直接“断连”。刷新率低得像老…

工业传感器采集系统:CubeMX+FreeRTOS配置详解

从零构建工业级传感器采集系统&#xff1a;CubeMX FreeRTOS 实战全解析在一间现代化的智能工厂里&#xff0c;成百上千个温度、压力、振动传感器实时监控着设备运行状态。一旦某个电机轴承温度异常升高&#xff0c;系统必须在毫秒内捕捉到这一信号&#xff0c;并触发预警流程—…

工业传感器采集系统:CubeMX+FreeRTOS配置详解

从零构建工业级传感器采集系统&#xff1a;CubeMX FreeRTOS 实战全解析在一间现代化的智能工厂里&#xff0c;成百上千个温度、压力、振动传感器实时监控着设备运行状态。一旦某个电机轴承温度异常升高&#xff0c;系统必须在毫秒内捕捉到这一信号&#xff0c;并触发预警流程—…

教学实验中Multisim数据库未找到的图解说明

当Multisim打不开元器件库&#xff1a;一次教学实验中的“数据库未找到”排障实录那天上午第三节课&#xff0c;电子技术实验室的几个学生急匆匆跑来&#xff1a;“老师&#xff0c;Multisim启动后弹窗说‘数据库未找到’&#xff0c;根本没法画电路&#xff01;”这不是第一次…

STM32与PC端串口通信协议设计实战案例

STM32与PC串口通信协议设计实战&#xff1a;从原理到高可靠帧结构的完整实现在嵌入式开发的世界里&#xff0c;STM32 串口通信几乎是一个“标配组合”。无论是调试信息输出、参数配置&#xff0c;还是传感器数据上传&#xff0c;UART总能以极低的硬件成本完成任务。但如果你只…

AI 会写作业了,但学生还会思考吗?

最近&#xff0c;张文宏医生的一段视频被频繁推送到我面前。他说得略微有争议&#xff08;当然也可能是媒体只截了其中一部分&#xff09;&#xff1a;如果年轻医生没有经过系统训练&#xff0c;就直接相信 AI 给出的诊断&#xff0c;这是不负责任的。这句话&#xff0c;看似在…

S32DS使用实战案例:首个工程从零实现流程

从零开始玩转S32DS&#xff1a;我的第一个S32K144工程实战手记 你有没有过这样的经历&#xff1f;买回一块崭新的S32K144开发板&#xff0c;插上电脑却不知道从何下手。官网下载了S32 Design Studio&#xff08;简称S32DS&#xff09;&#xff0c;打开后面对一堆菜单和向导一头…

利用multisim仿真电路图进行频率响应测试:操作指南

用Multisim做频率响应测试&#xff1a;从原理到实战的完整指南你有没有遇到过这样的情况&#xff1f;电路焊好了&#xff0c;通电也正常&#xff0c;可一测信号——高频部分莫名其妙衰减了&#xff0c;相位还乱飘。回头翻设计&#xff0c;才发现某个电容选大了十倍&#xff0c;…