STM32 PT100温度采集系统:硬件固件全解,工业测温参考设计

发布时间:2026/10/17 3:14:20
STM32 PT100温度采集系统:硬件固件全解,工业测温参考设计 简介面向嵌入式开发者与学习者这套STM32 PT100铂电阻温度采集系统完整方案围绕四线制铂电阻测量、ADC采样与温度换算展开涵盖硬件原理、软件编程和系统集成全过程适用于工业温度采集、课程设计等场景。包内共277个文件以C源码和H头文件为主同时包含工程配置、编译输出、原理图PDF、DOC文档以及图片视频辅助材料压缩包整体约18.09MB目录结构便于按模块检索。目前已有2082人学习下载。通过这套资料可掌握PT100电阻-温度特性查表或多项式换算、STM32 ADC多通道配置、四线制消除线路电阻误差等关键设计原理图与硬件文档可辅助理解外围电路源码覆盖定时器、LCD显示等模块适合作为实战参考和二次开发基础。1. 基于 STM32 的 PT100 温度采集一套硬件固件都能直接抄的工业测温样板做工业测温绕不开 PT100 铂电阻但把这颗传感器接到 STM32 上并让读数稳定到小数点后一位中间隔着信号调理、线性化算法和接线规范。这套「基于 STM32 的 PT100 温度采集系统」压缩包把程序、原理图和全套设计资料打包齐了硬件上从探头到 ADC 引脚的链路完整固件里采样、滤波、温度换算、串口输出一应俱全不是只贴一段代码的零散 demo。适合两类人刚入门嵌入式、想打通 ADC、运放、传感器这条信号链的新手以及要做批量测温产品、需要能直接改直接生产的参考设计的工程师。拆完这套资料我最深的感受是测温精度往往不由 ADC 位数决定而是由信号调理电路和 PT100 接法决定。后面所有章节都围绕这条主线展开。2. 硬件信号链拆解从 PT100 探头到 STM32 ADC 引脚的完整链路2.1 PT100 的温度特性为什么裸接 ADC 必然翻车PT100 的名字来源于它在 0℃ 时刚好 100Ω 的标准阻值测温原理就是阻值随温度近似线性变化。按 IEC 60751 标准0200℃ 区间可以写成R(T) R0 × (1 A·T B·T²)其中 R0 100ΩA 3.9083×10⁻³B -5.775×10⁻⁷。换算过来温度每升高 1℃阻值增加约 0.385Ω。这个灵敏度放在电学层面看相当低如果用 STM32 的 3.3V 参考电压、12 位 ADC 直接测一个由 100Ω 精密电阻和 PT100 组成的分压器每个 LSB 对应的温度变化可能超过 1℃在工业现场这是个没法用的数字。具体算一下就知道了。3.3V 供电、100Ω 固定电阻和 PT100 串联0℃ 时中间点电压 1.65V100℃ 时 PT100 变成 138.5Ω分压点电压约 1.918V整个量程只变了 0.268V。12 位 ADC 的量化步进是 3.3V / 4096 ≈ 0.8mV折算理论分辨率不到 0.3℃看着还行但这个结论建立在固定电阻精确、电源无纹波、导线电阻为零的前提上。实际接 1 米普通导线约 0.1Ω误差就接近 0.3℃导线再长一点、环境再嘈杂一点整体偏移会迅速超过 5℃所以在原理图上看到 PT100 不是直接进 ADC 引脚而是先进调理电路这是此类设计的基本盘。低温段还要注意一个细节0℃ 以下的阻值-温度关系不再是一条抛物线IEC 60751 在公式里额外加了一项 C·(T-100)·T³C -4.183×10⁻¹²。这意味着固件里做温度换算时0℃ 上下必须走两套逻辑否则零下温度会系统性偏高。后面第 4 章的代码会分别处理这两段。2.2 信号调理电路恒流源加差分放大参数怎么定的我看到这套项目原理图的调理电路时第一反应是标准的工业仪表结构一颗 1mA 恒流源给 PT100 供电传感器两端电压经仪表放大器差动放大后送进 STM32 的 ADC。相比电桥方案恒流源方案最大的好处是计算直观——PT100 两端的电压就是 I × R固件里反推阻值只差一个除法不用解电桥平衡方程。恒流源常见做法是用运放加 TL431 基准搭建或者直接用集成恒流芯片。电流选 1mA 是权衡过的结果电流太小信号幅度低容易被运放失调电压和 ADC 噪声淹没电流太大PT100 自热效应会引入误差。典型参数是 0.4mW/℃ 自热系数1mA 在 200Ω 上产生 0.2mW 自热影响约 0.05℃可以接受若用到 5mA自热误差就会到 0.5℃ 以上这在精密测温里是致命的。运放增益的选择直接决定量程。以 3.3V ADC、1mA 恒流源为例PT100 在 0℃ 时电压 100mV300℃ 时约 212mV。若增益取 15 倍0℃ 对应 1.50V300℃ 对应 3.18V刚好在 3.3V 量程内留余量若增益取 20 倍300℃ 时输出 4.24V超出量程实际只能测到约 165℃这就是「原理图看着没问题但一测高温就饱和」的常见翻车点。原理图里的具体增益由反馈电阻决定RF 和 RG 的比值按目标量程倒推改量程时最先动的就是这两个电阻。ADC 参考电压这里有个容易忽略的设计点恒流源和运放都用 3.3V 供电时ADC 的 VREF 最好也接 3.3V做成比例测量ratiometric。这样电源波动会被约掉——ADC 读到的永远是电压比值而不是绝对电压。原理图里 VREF 一般直接连 3.3V 而非独立基准芯片就是基于这个考量。如果 VREF 用了外部基准而传感器供电来自内部 LDO那两个电源的纹波和温漂会同时进入测量链路校准系数再准也没用。2.3 三线制接线的误差模型导线电阻是怎么被抵消的前面说的信号调理解决的是「0.385Ω/℃ 太低」的问题三线制解决的是「导线电阻混进测量结果」的问题。PT100 探头引出三根线两根电流线加一根电压反馈线。恒流源电流从一根线流进 PT100从另一根线流出电压反馈线接到运放的高阻输入端几乎无电流流过所以反馈线上没有压降。运放是差分输入看到的是 PT100 两端的电位差两根电流线上的压降只要线阻一致、电流一致就基本被差分输入抵消掉。这就是三线制比两线制精度高一个数量级的原因。具体数字上两线制下 10Ω 导线电阻导致的误差是 10 / 0.385 ≈ 26℃三线制下同样的线径和长度误差主要来自两根线阻的不一致性通常能控制在 0.1℃ 以内。拿到原理图后我习惯先找这三根线的去向哪根接恒流源输出、哪根接地回路、哪根接运放正输入。固件里所有补偿逻辑都建立在这个接法上一旦线序接反后面校准系数全都不对而且是在现场很难排查的那种「看起来能测、精度却稀烂」的状态。四线制在原理上完全消除导线电阻但要占更多的 IO 和调理通道这套项目选三线制是精度和成本平衡得最好的方案。3. 工程结构拆解压缩包里哪些文件决定了你能不能快速跑通3.1 资料包目录结构与文件职责拿到压缩包先别急着双击工程文件。这类「程序加原理图加全套资料」的压缩包内部目录通常按文档、固件、硬件三块划分先花五分钟把目录过一遍能省掉后面半天找资料的时间。常见结构如下目录/文件类型用途Doc/PDF、Word使用说明、接线图、调试记录Hardware/原理图、PCB 源文件原理图源工程、Gerber 或 BOM 表Firmware/C 工程STM32 固件源码含 CubeMX 和 MDK 工程元器件清单Excel/CSV电阻、电容、运放的选型与封装明细我拿到手会按这个顺序看先打开使用说明里的接线图确认 PT100 三根线接到板子的哪个端子再打开 BOM 表看运放型号和增益电阻阻值大致算出量程最后才打开固件工程直接搜索 ADC 初始化和温度计算函数。这个顺序保证你在看代码之前已经知道硬件上信号是「怎么走、放大多少倍、量程到多少度」的代码里的每个数都能和器件对上。3.2 外设初始化时钟、GPIO、ADC 与 UART 的配置顺序这套固件用的是 STM32 标准外设库风格初始化集中在 main 函数开头顺序一般是时钟 → GPIO → ADC → UART。时钟配置是所有外设工作的前提ADC 的时钟分频系数尤其关键。STM32F1 系列的 ADC 输入时钟上限约 14MHz如果 PCLK2 是 72MHz分频系数必须取 6 或以上否则 ADC 采样结果会不稳定表现就是读数跳变。这个配置藏在外设初始化里很多人换了主频之后忘了同步改分频导致采样值忽大忽小。GPIO 配置要注意模拟输入和复用功能的区别ADC 采样引脚要设置成模拟输入模式而不是普通的浮空输入UART 的 TX/RX 要设置成复用推挽输出。这两个搞反了ADC 读数会异常偏高或偏低串口则完全发不出数据。一个排查技巧是先用示波器或万用表量引脚电平再回头查模式配置。UART 初始化相对常规波特率根据使用说明里的设定值来常见是 115200 或 9600。数据位 8、无校验、1 停止位是默认组合。固件里串口承担两个作用调试时打印原始 ADC 值和换算后的温度方便对照正常运行时输出格式化温度帧给上位机或下一级控制器解析。所以 UART 的缓冲区和中断优先级也要留够避免高频打印时丢数据。3.3 主循环架构轮询采样与模块划分主循环的逻辑是这个固件里最好懂也最容易改的部分。整体是一个无限循环按固定节拍执行「采样 → 滤波 → 换算 → 输出」四步每步封装成独立函数模块之间通过全局变量或结构体传递数据。用轮询而非中断组织数据采集在单通道测温场景下是完全合理的——采样周期几十毫秒根本不需要中断来抢 CPU。我一般会把应用层拆成三层底层是 ADC 驱动和 UART 驱动只做寄存器封装中间是信号处理层负责滤波、阻值反算、温度换算顶层是业务层决定什么时候采样、什么时候打印、显示什么。这套项目代码虽然不是严格的这种分层但函数边界基本清晰改造时按这个思路重排成本不高。有一点值得注意如果固件里发现有用delay做采样间隔的写法改造成定时器触发采样会更稳因为delay期间 CPU 空转中断来了反而会影响时序。4. 核心代码逐段拆解从 ADC 采样到温度输出的完整实现4.1 ADC 采样与滑动平均滤波先看 ADC 初始化。无论用标准库还是 HAL 库关键参数是分辨率、对齐方式、采样时间这三个。以下代码用 HAL 库风格写逻辑和标准库一一对应static ADC_HandleTypeDef hadc1; static void MX_ADC1_Init(void) { hadc1.Instance ADC1; hadc1.Init.ClockPrescaler ADC_CLOCK_SYNC_PCLK_DIV6; /* 72MHz/612MHz必须低于14MHz */ hadc1.Init.Resolution ADC_RESOLUTION_12B; /* 12位分辨率 */ hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; /* 右对齐方便直接当无符号数用 */ hadc1.Init.ScanConvMode DISABLE; /* 单通道不需要扫描 */ hadc1.Init.ContinuousConvMode DISABLE; /* 单次转换配合轮询 */ hadc1.Init.NbrOfConversion 1; /* 规则组里只有1个通道 */ HAL_ADC_Init(hadc1); }分频系数 DIV6 是把 72MHz 降到 12MHz 的关键超过 14MHz 会导致采样电容充电时间不足。采样时间的选择影响等效输入阻抗PT100 调理电路的输出阻抗不低采样时间太短会把信号源拉垮工程上常用 239.5 周期的档位牺牲一点转换速度换输入稳定性。滤波用滑动平均16 次采样的均值作为一次有效结果#define SAMPLE_COUNT 16 uint16_t PT100_GetRawAverage(void) { uint32_t sum 0; for (uint8_t i 0; i SAMPLE_COUNT; i) { HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); /* 超时10ms防止卡死 */ sum HAL_ADC_GetValue(hadc1); } return (uint16_t)(sum / SAMPLE_COUNT); }16 次采样约耗时十几毫秒对温度这种缓变信号完全够用而且 16 是 2 的幂除法在编译时会被优化成移位。如果现场干扰特别强可以把滤波改成「先去掉最大值最小值再求平均」的中值平均代价是代码多几行但对毛刺的抑制更彻底。4.2 PT100 阻值反算从 ADC 码值到欧姆有了稳定的 ADC 码值下一步就是反推 PT100 的当前阻值。这一步的公式依赖调理电路的参数恒流源电流 I_SRC、运放增益 GAIN、ADC 参考电压 V_REF。换算逻辑如下#define V_REF 3.3f /* ADC参考电压与运放供电同源 */ #define GAIN 15.0f /* 运放闭环增益由原理图反馈电阻决定 */ #define I_SRC 0.001f /* 恒流源电流单位A */ float PT100_CalcResistance(uint16_t adc_raw) { float v_amp (float)adc_raw * V_REF / 4095.0f; /* 运放输出端电压 */ float v_pt v_amp / GAIN; /* 反推PT100两端电压 */ float r_pt v_pt / I_SRC; /* R V / I */ return r_pt; }这里的三个宏定义必须和原理图实际电路严格一致。改任何一个电阻或换运放都要同步更新这三个值。我见过最典型的翻车是把 GAIN 从 15 改成 22 之后忘了改代码结果整条温度曲线偏了接近 50%。另外注意adc_raw是 12 位右对齐所以除数是 4095 而不是 4096这个细节虽然只差 0.02%但在精密测温场景下校准阶段会体现出来。4.3 温度换算CVD 公式与查表插值拿到阻值后就是温度换算了。0℃ 以上的区间用 CVD 公式反解一元二次方程这段代码很简洁#include math.h float PT100_CalcTempPositive(float resistance) { const float R0 100.0f; const float A 3.9083e-3f; const float B -5.775e-7f; /* 令 R R0(1 A*t B*t^2)整理成关于t的一元二次方程 */ float c 1.0f - resistance / R0; float t (-A sqrtf(A * A - 4.0f * B * c)) / (2.0f * B); return t; }取正根的原因是二次项系数 B 为负抛物线开口朝下物理上对应 0℃ 以上的单调区间。这个公式在 0200℃ 范围内的理论精度优于 0.1℃完全够用。但要注意它只能用于 0℃ 以上如果测量环境可能低于零度必须走带 C 项的完整 CVD 公式并且用牛顿迭代求根因为四次方程没有简单的解析解。迭代写法如下float PT100_CalcTempSubzero(float resistance) { const float R0 100.0f; const float A 3.9083e-3f; const float B -5.775e-7f; const float C -4.183e-12f; float t -10.0f; /* 初始猜测迭代会快速收敛 */ for (uint8_t i 0; i 20; i) { float r R0 * (1.0f A*t B*t*t C*(t - 100.0f)*t*t*t); float dr R0 * (A 2.0f*B*t C*(4.0f*(t - 100.0f)*t*t*t t*t*t*t)); t t - (r - resistance) / dr; if (fabsf(r - resistance) 1e-4f) break; } return t; }迭代法和查表法是这个领域两种主流做法的代表。查表法的优势是省去sqrtf这类浮点运算在一些没有 FPU 的型号上速度快很多缺点是表要占 Flash、表项间隔要手动权衡精度。实际工程里我常用折中方案用 CVD 公式计算但在代码里预留#ifdef USE_LUT的宏切换方便在资源紧张时切换成查表。4.4 数据输出串口格式化与状态指示温度算出来之后输出环节决定了这套系统是「自己看」还是「给别人用」。串口输出是最常见的调试方式char buf[48]; snprintf(buf, sizeof(buf), R%.2f,T%.2f\r\n, r_pt, temperature); HAL_UART_Transmit(huart1, (uint8_t*)buf, strlen(buf), 100);%.2f输出两位小数既满足精度展示需要又不至于让日志刷得太长。串口波特率 115200 时每帧约 20 字节耗时不到 2ms对一个 50ms 周期的采样循环没有压力。如果有多字节需要稳定解析建议在帧头加固定字节比如0xAA 0x55和 CRC 校验方便上位机按帧切割。显示方面如果硬件带了 OLED 或 LCD固件里通常会把温度值转成字符串后刷新到屏幕。刷新频率不用太高每秒 23 次就足够人眼看不出区别还能省掉大量 I2C/SPI 通信时间。OLED 屏的 I2C 地址常见 0x3C和初始化序列要跟屏的驱动 IC 对上这部分代码一般是移植现成驱动注意确认引脚号和时序时序参数即可。5. 烧录调试与常见问题排查三个最容易翻车的细节5.1 工程导入与烧录流程先把工程跑起来。用 Keil 打开固件里的.uvprojx工程文件后第一件事检查 Target 选项里的芯片型号和 Flash 容量型号不对会导致下载失败或程序跑飞。然后确认调试器设置ST-Link 选 SWD 模式速度建议先设 4MHz稳定后再往上调。编译通过后连接开发板点 Download 烧录如果提示No target connected先查 SWDIO 和 SWCLK 两根线有没有接反以及板子是不是处于复位状态。上电后串口应该有周期性的温度数据输出。如果完全没输出用示波器量 TX 引脚有没有波形有波形但电脑收不到查 USB 转串口的驱动和波特率是否一致。这个过程走完系统就算跑通了接下来进入排查阶段。5.2 避坑一读数整体偏移冰水混合物里不是 0℃现象把探头放进冰水混合物串口打印 3℃ 甚至 8℃用精密电阻替换 PT100 测试读数和电阻标称值对不上。原因三个环节都有可能——恒流源电流实际不是 1mA、运放增益电阻误差、ADC 参考电压不是精确 3.3V。最常见是增益电阻用了 1% 精度的普通电阻15 倍增益会有约 2% 的偏差反映到温度上就是好几度。解决先做软件两点校准。用 100Ω 和 138.5Ω 两个精密电阻对应 0℃ 和 100℃分别替换探头记录固件算出的原始阻值得到偏移量和斜率然后在校准代码里做线性修正。校准公式是R_corrected (R_raw - offset) * R_scale其中 offset 是 100Ω 时的读数偏差R_scale 是 138.5Ω 与 100Ω 两点的实际斜率除以理论斜率。校准后系统精度能回到 ±0.5℃ 以内。如果换器件这两个系数要重新标定。5.3 避坑二温度值跳变超过 1℃读数像心电图现象探头位置不动串口输出的温度在 ±1℃ 甚至更大范围来回跳滤波改了也没明显改善。原因干扰进的是模拟链路而不是数字部分。常见来源是开关电源的纹波、长导线的天线效应、ADC 采样时间配置过短导致采样电容没充满。此外如果采样间隔和 PWM 或通信恰好同步干扰会以差模形式叠加到信号上滤波效果大打折扣。解决硬件上把 PT100 的导线换成双绞屏蔽线屏蔽层单端接地软件上把 ADC 采样时间调到最长档239.5 周期并把滑动平均次数从 16 提到 32。如果跳变依然明显检查恒流源和运放的供电是否直接来自 LDO必要时加一颗 10μF 钽电容和 100nF 陶瓷电容做电源去耦。还有一个容易被忽略的点不要在主循环里紧挨着 ADC 采样调用 UART 发送发送瞬间的电流脉冲会通过地线耦合进模拟前端把采样时序和发送错开几毫秒。5.4 避坑三三线制接错线序读数随线长神奇变大现象用短导线测试一切正常换成 5 米延长线后温度读数整体偏高了 25℃而且线越长偏得越多。原因三根线里电流线和电压反馈线接反了或者电压反馈线悬空。电流线压在运放差分输入端之间直接叠加到测量电压上等于退化成两线制测量。解决用万用表电阻档先找出探头三根线之间的阻值关系——两根电流线之间的阻值接近 100Ω 量级随温度变而电压线到任意一根电流线之间阻值也接近 100Ω但压降路径完全不同。最可靠的办法是看原理图里三个端子对应接入的位置对照实物一一确认。接入后做一个「导线补偿测试」先用短线测一次室温再换 5 米线看读数变化变化小于 0.2℃ 才是接线正确。6. 二次开发实战从单点测温到多点采样与闭环温控这套项目最值得动手改的方向有三个。第一是扩展多通道如果只是多接几路 PT100优先复用 ADC 的多个通道把规则组通道数改成 N每次转换后用 DMA 搬运结果CPU 只在 DMA 完成中断里做一轮换算。这个做法的前提是每一路都要有独立的恒流源和运放因为 ADC 是分时复用的调理电路不能共享。第二是加通信协议把裸的串口帧改造成 Modbus RTU上位机组态软件就能直接读温度改造量集中在协议封装层底层采样代码完全不用动。第三是做闭环温控在温度换算基础上加一个 PID 输出用定时器 PWM 控制加热器功率把系统从「测温」升级成「控温」。改完一定要做的验证是三步走先用精密电阻箱模拟 0℃、50℃、100℃ 三个点确认阻值-温度换算的端到端误差再把探头和标准水银温度计放进同一恒温槽记录 10 分钟稳定性最后做连续 72 小时的老化测试确认没有缓慢漂移。任何一步不通过都先回到第 5 章的排查清单不要急着调 PID 参数。我自己后来再做测温类项目强制自己先画一张信号链路图从 PT100 到 ADC 的每一级标上电压和增益代码里所有常量都和这张图对一遍才动烙铁。这个习惯救过我好几次最典型的就是增益改版后忘改代码导致整条曲线偏移的问题——现在每次打板回来第一件事就是核对 BOM 里的增益电阻和固件里的 GAIN 宏是否一致。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询