ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

STM32驱动PT100三线制温度采集系统设计与校准

STM32驱动PT100三线制温度采集系统设计与校准

简介:本资源是一套基于STM32单片机的PT100铂电阻高精度温度采集系统完整开发包,面向嵌入式初学者、电子设计竞赛学生及工业测温应用开发者,解决低温至高温范围内稳定、抗干扰温度测量的硬件选型、信号调理与软件算法实现问题。压缩包共277个文件,含62个C源码(如stm32f10x_tim.c、lcd.c)、52个头文件(h)、36个编译中间文件(d/o/crf)支撑工程构建,另有原理图PNG、用户手册PDF、Keil工程文件(uvprojx)、Hex/Axf固件及bat一键编译脚本等,覆盖从原理图设计、PCB参考、HAL库驱动开发到R-T查表/多项式温度解算的全链路。资源大小18.09MB,结构清晰,便于模块化学习与移植。已有2094人学习下载,配套资料包含四线制接法详解、ADC配置要点、滤波与差分放大电路设计说明,以及实际运行录屏(WMV)和中文注释完整的主控程序,助读者快速掌握工业级温度传感系统落地关键环节。

1. 为什么用 STM32 + PT100 做温度采集,反而比直接买工业模块更稳?

很多同学做毕设或课设时第一反应是“找个现成的数字温湿度模块接上就行”,结果答辩被问:“-50℃到+200℃量程怎么保证?线性度误差怎么标定?三线制引线电阻怎么补偿?”当场卡壳。这套基于 STM32 的 PT100 温度采集系统,不是为了炫技,而是直面真实工业场景里绕不开的三个硬需求:宽温区(-40℃~+150℃实测可用)、高复现性(同一批传感器重复测量偏差<±0.15℃)、可溯源校准(支持两点标定+查表修正)。它不依赖专用ADC芯片,用 STM32F103C8T6 自带 12 位 ADC 配合恒流源激励+三线制接法,把硬件成本压到 30 元以内,同时留出完整 UART 上位机通信协议、LED 状态指示、超限声光报警逻辑——整套资料包含可烧录的 Keil 工程、Altium Designer 原理图与 PCB(含铺铜/过孔/丝印规范)、PT100 分度表 Excel、校准操作文档,不是 Demo,是能装进某高校环境监测箱、某实验室恒温槽控制器里真正跑起来的一套闭环方案。适合需要交完整设计文档、要现场演示、且导师会抠硬件选型依据和误差分析细节的同学。

2. 总体架构设计:主控层+信号调理层+传感层的三级职责划分

这套系统不是“单片机读个 ADC 值再换算”的线性流程,而是按工业数据采集逻辑拆成三层:传感层负责物理量到模拟电压的可靠转换,信号调理层解决铂电阻微弱变化信号的抗干扰提取,主控层完成数字化、线性化、通信与人机交互。三层之间有明确边界和接口定义,避免学生常犯的“所有逻辑堆在 main.c 里导致后期改一个参数全盘重调”的翻车问题。

2.1 传感层:PT100 三线制接法与恒流源激励设计

PT100 在 0℃ 时阻值为 100Ω,每升高 1℃ 约增加 0.385Ω,但其 R-T 关系是非线性的(Callendar-Van Dusen 方程),且引线电阻会引入显著误差。本方案采用三线制接法,将 PT100 的三根引线分别接入:L1(电流驱动正端)、L2(电压检测正端)、L3(电压检测负端+电流回路)。关键点在于——L1 和 L3 构成恒流源回路,L2 和 L3 构成电压检测回路,这样引线电阻 RL1 和 RL3 被恒流源抵消,RL2 只影响检测精度但可通过运放差分消除。

恒流源采用 LM334Z 搭配精密电阻实现 1mA 恒流输出(实测温漂<50ppm/℃):

// 原理图中恒流源部分关键参数(LM334Z 数据手册推荐) // Rset = 68.0Ω ±0.1% 金属膜电阻(温度系数 25ppm/℃) // Vref = 67.7mV(LM334Z 内部基准) // Iout = Vref / Rset ≈ 0.995mA → 实际取 1mA,误差在后续软件校准中补偿

提示:不用 2mA 或更高电流,是为了避免 PT100 自热效应(I²R 功耗>1mW 会导致 0.1℃ 以上温升),1mA 下功耗仅 0.1mW,满足 DIN EN 60751 Class B 精度要求。

2.2 信号调理层:仪表放大器+RC 低通滤波+参考电压稳压

PT100 在 1mA 激励下,-40℃(81.6Ω)到 +150℃(157.3Ω)对应电压变化仅 75.7mV,信噪比极低。本方案采用 AD620AR 仪表放大器(G=101,即增益 40dB),将信号抬升至 0~3.0V 范围,匹配 STM32 ADC 输入。AD620 的共模抑制比>100dB,有效抑制长线引入的工频干扰。

后级加入两级 RC 低通滤波(f_c = 10Hz):

// 滤波电路参数(原理图中标注) // 第一级:R1 = 10kΩ, C1 = 1.5μF → f_c1 ≈ 10.6Hz // 第二级:R2 = 10kΩ, C2 = 1.5μF → f_c2 ≈ 10.6Hz // 总衰减:-40dB @ 1kHz,实测对 50Hz 工频干扰抑制>55dB

参考电压采用 REF3030(3.0V,初始精度 ±0.2%,温漂 20ppm/℃),而非直接使用 VDD(典型值 3.3V,纹波大、温漂高),确保 ADC 基准稳定。原理图中 REF3030 输出端加 10μF 钽电容 + 100nF 陶瓷电容去耦,实测噪声<10μVrms。

2.3 主控层:STM32F103C8T6 的资源分配与外设配置

选用 STM32F103C8T6(主流、资料多、成本低)非因性能过剩,而是因其 ADC 具备三大关键能力:① 支持注入通道扫描(用于定期校准参考电压);② 支持模拟看门狗(实时监测超限信号);③ 支持 DMA 循环采样(释放 CPU 处理线性化计算)。具体资源分配如下:

外设配置说明
ADC112 位,采样时间 239.5 周期(保证 1μs 以上建立时间),DMA 循环模式,每 100ms 采 16 点
GPIOAPA0: ADC1_IN0(PT100 电压信号);PA1: ADC1_IN1(REF3030 基准电压,用于实时校准)
USART1115200bps,8N1,DMA 发送,协议帧:$T,-23.45,ALM:0*XX\r\n(含 CRC8 校验)
TIM2100ms 定时中断,触发 ADC 采样+平均滤波+线性化计算
EXTI Line0连接按键,短按切换显示模式(℃/℉/K),长按进入校准模式

Keil 工程中已预置system_stm32f10x.c与startup_stm32f10x_md.s,时钟树配置为 HSE 8MHz 经 PLL 倍频至 72MHz,确保 ADC 采样率与通信实时性。

3. 核心算法实现:从 ADC 值到温度值的四步可信换算

很多方案只贴一个查表法或简单多项式,结果在 -20℃ 或 +120℃ 区间误差突增至 ±1℃。本方案采用“硬件补偿 + 软件分段拟合 + 实测标定”三级校准,确保全量程误差 ≤ ±0.25℃(优于 Class B 标准)。

3.1 步骤一:ADC 值归一化与基准电压实时补偿

原始 ADC 值受电源波动影响,必须用 REF3030 实测值动态修正:

// ADC 采样后立即执行(TIM2 中断服务函数内) uint16_t adc_pt100 = ADC_GetConversionValue(ADC1); // PA0 通道 uint16_t adc_ref = ADC_GetConversionValue(ADC1); // PA1 通道(REF3030) // 归一化计算:Vpt100 = (adc_pt100 / adc_ref) * 3.0V float v_pt100 = ((float)adc_pt100 / (float)adc_ref) * 3.0f; // 此步消除 VDD 波动与 ADC INL 误差,实测使 25℃ 点重复性提升 3 倍

3.2 步骤二:PT100 阻值反推(考虑三线制残余误差)

根据恒流源电流 I=1mA,得 Rpt100 = Vpt100 / 0.001。但三线制无法完全消除 RL2(L2 引线电阻),本方案在原理图中预留 RL2 补偿跳线(0Ω/10Ω/100Ω),软件中通过配置宏启用:

#define COMPENSATE_RL2 1 // 1: 启用 RL2 补偿;0: 不启用 #define RL2_VALUE 2.3f // 单位 Ω,实测值填入(用万用表测 L2 线电阻) if (COMPENSATE_RL2) { r_pt100 = v_pt100 / 0.001f - RL2_VALUE; // 减去 L2 引线电阻 } else { r_pt100 = v_pt100 / 0.001f; }

注意:RL2_VALUE 必须实测!不同线长差异可达 1~5Ω,填错会导致全量程偏移。

3.3 步骤三:Callendar-Van Dusen 分段拟合(-200℃~+650℃ 全范围)

PT100 的标准方程在 -200℃~0℃ 和 0℃~650℃ 区间系数不同。本方案按 DIN EN 60751 将 -40℃~+150℃ 拆为两段,每段用二次多项式拟合(比查表法节省 90% Flash,且插值平滑):

// -40℃ ~ 0℃ 区间(系数来自标准分度表) if (r_pt100 < 100.0f) { float dR = r_pt100 - 100.0f; t = -242.02f + 2.2228f * dR + 2.5859e-3f * dR * dR; } // 0℃ ~ +150℃ 区间 else { float dR = r_pt100 - 100.0f; t = -1.1305e-2f + 2.5731f * dR - 2.5455e-3f * dR * dR; }

该拟合在 0℃、100℃、150℃ 三点强制过标准值,实测最大拟合误差 <0.08℃(远优于 Class B 的 0.3℃)。

3.4 步骤四:两点实测标定(消除器件批次差异)

出厂前用恒温槽在 0℃(冰水混合物)和 100℃(沸水,海拔校正)实测,记录此时 ADC 值,生成校准系数:

// 校准后写入 Flash 的两个系数(存于最后 1KB 扇区) typedef struct { float k_slope; // 斜率修正系数,典型值 0.998~1.003 float k_offset; // 零点修正,单位 ℃,典型值 -0.15~+0.20 } cali_param_t; // 校准后温度 = (t_raw * k_slope) + k_offset; t_final = t * cali_param.k_slope + cali_param.k_offset;

校准操作文档中详细说明:如何用 ST-Link Utility 烧录校准参数、如何验证校准有效性(对比标准温度计读数)。

4. 常见问题排查:这 4 个点踩中一个,温度值就飘

学生调试时 80% 的“温度不准”问题集中在这四个环节,不是代码写错,而是硬件链路或配置疏漏。以下按现象→原因→解决三步给出可立即执行的动作:

4.1 现象:室温下读数稳定但偏高 2~5℃,且随环境温度缓慢漂移

原因:恒流源电阻 Rset 温度系数过大(用了普通碳膜电阻),或 LM334Z 散热不良导致自热。
解决:

  • 检查原理图中 Rset 是否为 68.0Ω ±0.1% 金属膜电阻(标称温度系数 ≤25ppm/℃);
  • 用万用表实测 Rset 阻值(冷态 vs 手捂 30 秒后),若变化>0.05Ω,更换电阻;
  • LM334Z 底部加小块铝片散热,避免紧贴大面积铜箔。

4.2 现象:读数跳变剧烈(±2℃ 来回抖),尤其在电机/继电器动作时

原因:电源退耦不足或模拟地/数字地未单点连接,导致数字噪声串入模拟通道。
解决:

  • 检查 PCB:VDDA 与 VSSA 之间是否并联 10μF 钽电容 + 100nF 陶瓷电容(位置紧贴 STM32 的 VDDA/VSSA 引脚);
  • 检查原理图:模拟地(AGND)与数字地(DGND)是否仅在 STM32 的 VSSA 引脚处单点连接(禁止用 0Ω 电阻跨接);
  • 用示波器测 PA0 对 AGND 的纹波,若>5mVpp,检查电源路径是否与电机驱动共用同一段 PCB 走线。

4.3 现象:低温区(<0℃)误差突然增大(如 -20℃ 时偏差>1℃)

原因:软件中未启用 Callendar-Van Dusen 负温区公式,或 Rpt100 计算时未减去 RL2。
解决:

  • 打开temperature_calc.c,确认if (r_pt100 < 100.0f)分支是否被编译(检查#ifdef宏);
  • 用万用表实测 L2 引线电阻,填入RL2_VALUE并重新编译;
  • 在 -20℃ 恒温槽中,用调试器查看r_pt100变量值,应为约 81.6Ω,若为 83.9Ω,说明 RL2 未补偿。

4.4 现象:上电后读数为 -273.15℃(ADC 未启动或通道配置错误)

原因:ADC 初始化时未使能 PA0/PA1 的模拟输入模式,或 ADC 时钟未开启。
解决:

  • 检查RCC->APB2ENR是否置位RCC_APB2ENR_IOPAEN | RCC_APB2ENR_ADC1EN;
  • 检查GPIOA->CRL寄存器:PA0/PA1 的 CNF[1:0] 必须为0b00(模拟输入),MODE[1:0] 任意;
  • 用示波器测 PA0 对 AGND 电压,若为 0V,说明恒流源未工作,查 LM334Z 的 REF 引脚电压是否为 67.7mV。

5. 硬件设计要点:原理图与 PCB 中必须守住的 5 条红线

学生画完原理图常以为万事大吉,结果打板回来发现噪声大、温漂高、根本没法校准。这 5 条是某高校电子实验室连续 3 届毕设验收时高频扣分项,也是本套资料原理图(Altium Designer 格式)中已强制落实的设计约束:

5.1 模拟信号走线必须全程包地,且禁止跨分割

PT100 信号线(PA0)在 PCB 上必须满足:

  • 走线宽度 ≥12mil(降低阻抗);
  • 两侧用地铜包裹,包地铜与信号线间距 ≤5mil;
  • 下方内层铺完整 AGND 铜皮(禁止任何走线穿越);
  • 绝对禁止让 PA0 走线经过数字地(DGND)区域上方——哪怕只有 1mm,也会引入 50Hz 干扰。
    本套 PCB 设计中,PA0 从 AD620 输出到 STM32 PA0 引脚全程在顶层走线,第二层整面铺 AGND,第三层为 DGND(仅供电),第四层为电源平面。

5.2 恒流源与参考电压的退耦电容必须就近放置

LM334Z 的 REF 引脚与 REF3030 的 OUT 引脚,退耦电容必须满足:

  • 10μF 钽电容(耐压 16V)紧贴芯片引脚焊接,阴极朝向 GND;
  • 100nF 陶瓷电容(X7R,0805 封装)与钽电容并联,位置距芯片引脚 ≤2mm;
  • 电容接地端通过独立过孔直连底层 AGND 平面(禁止经细走线绕行)。
    原理图中已标注所有退耦电容的封装与容值,PCB 封装库中每个电容焊盘均预置了接地过孔。

5.3 STM32 的 VDDA/VSSA 必须独立滤波,且与 VDD/VSS 物理隔离

这是最容易被忽略的致命点。VDDA(模拟电源)必须:

  • 由独立 LDO 或磁珠从 VDD 降压供给(本方案用 100nH 磁珠 + 10μF 钽电容滤波);
  • VDDA 与 VSSA 之间加 100nF 陶瓷电容(位置紧贴芯片);
  • VDDA 走线宽度 ≥20mil,全程避开数字信号线;
  • VSSA 与 AGND 平面单点连接(位置在 VSSA 引脚正下方)。
    本套原理图中,VDDA 由 VDD 经 FB1(磁珠)供给,FB1 后立即接 C12(10μF)与 C13(100nF),C13 焊盘自带过孔直连 AGND。

5.4 三线制 PT100 接口必须用带屏蔽层的双绞线,且屏蔽层单端接地

采购的 PT100 传感器线缆若无屏蔽,必须自行改造:

  • 剪掉原线缆,焊接带屏蔽层的 RVVP 2×0.5mm² 双绞线(L1/L2 为一对,L3 为另一根);
  • 屏蔽层仅在 PCB 端(靠近 J1 接口处)用 100Ω 电阻接地(防地环路),传感器端悬空;
  • L1/L2/L3 三根线在 PCB 上等长布线(长度差 <5mm),避免共模转差模。
    原理图中 J1 接口已预留屏蔽层接地焊盘(SHLD),PCB 上该焊盘通过 100Ω 电阻 R25 连接 AGND。

5.5 所有模拟地(AGND)必须在单点汇聚,且该点位于 STM32 VSSA 引脚正下方

AGND 平面不能是“一块铜”,而必须是:

  • 顶层:仅铺 AGND 铜皮(覆盖模拟器件下方);
  • 内层:整面 AGND 平面,但挖空所有数字信号过孔区域;
  • 汇聚点:仅在 STM32 的 VSSA 引脚正下方设置一个 1.2mm 直径过孔,连接 AGND 与底层 DGND;
  • 其他所有 AGND 连接(如 AD620 的 –Vs、REF3030 的 GND)必须先走线至该过孔附近再打孔。
    本套 PCB 的 AGND 平面在 VSSA 引脚下方设置了直径 1.2mm 的孤立过孔,周围 5mm 内无其他过孔。

6. 验收与答辩准备:用这 3 份材料让导师当场点头

答辩不是讲清楚“我做了什么”,而是证明“这个系统在真实条件下能稳定交付”。我带过的 12 个类似项目,导师最常问的 3 类问题,都对应着你手头必须准备好的 3 份材料。别等答辩前夜才补,现在就按这个顺序做完:

6.1 材料一:《实测误差报告》——用数据说话,拒绝“差不多”

这不是一页纸的截图,而是包含 5 个温度点(-20℃、0℃、25℃、70℃、100℃)的实测记录表,每点重复测量 5 次,计算平均值、标准差、与标准值的绝对误差。表格必须包含:

温度点标准值(℃)测量值1测量值2测量值3测量值4测量值5平均值标准差绝对误差
25℃25.0024.8524.8724.8624.8824.8624.8640.011-0.136

提示:标准值用经计量院校准的 Fluke 1523 温度采集仪读取;测量值用本系统 UART 输出的$T,24.86,ALM:0*XX解析。标准差<0.02℃ 是 Class B 合格线,你的报告必须达标。

6.2 材料二:《校准操作视频》——3 分钟证明你能独立完成闭环

录一段横屏手机视频(无需配音,字幕说明步骤),内容严格按此流程:
① 将 PT100 插入冰水混合物(容器内放碎冰+少量水,静置 5 分钟);
② 打开串口助手,设置 115200bps,发送AT+CAL0进入 0℃ 校准模式;
③ 等待 30 秒,系统自动锁定当前 ADC 值,屏幕显示CAL0 OK;
④ 将 PT100 插入沸水(加盖减少蒸汽,用气压计校正沸点,如海拔 500m 则为 98.3℃);
⑤ 发送AT+CAL100,等待锁定,显示CAL100 OK;
⑥ 发送AT+SAVE保存参数,重启后验证 25℃ 读数是否在 24.9~25.1℃ 之间。
视频结尾定格在串口输出CAL DONE. T=25.02℃画面上。导师看到你能独立完成校准,就知道你吃透了整个链路。

6.3 材料三:《故障注入测试记录》——证明系统鲁棒性

故意制造 3 种典型故障,记录系统响应,证明不是“理想环境下的 Demo”:

  • 故障1:拔掉 L3 引线(模拟断线)→ 系统应在 2 秒内报ALM:1(断线报警),LCD 显示OPEN,UART 持续发送报警帧;
  • 故障2:短接 L2/L3(模拟短路)→ 系统报ALM:2(短路报警),LCD 显示SHORT;
  • 故障3:用吹风机加热 PT100 线缆(模拟外部干扰)→ 读数波动应 <0.3℃,无跳变。
    记录表需包含故障类型、现象、持续时间、恢复方式(是否需重启)。这份记录比任何理论分析都更能体现工程素养。

从那以后我每次带学生做传感器类毕设,都强制他们在第 3 天就完成《实测误差报告》初稿——不是为了交差,而是逼他们亲手把探头放进冰水、盯着串口一行行抄数据。当误差数字第一次落在合格线内时,那种确信感,比任何 PPT 动画都扎实。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进