1. 热电偶测温的痛点为什么非做冷端补偿不可做工业仪表或者精密测温的工程师对热电偶应该都不陌生。K型热电偶便宜、耐温范围宽-200℃到1300℃探头形式多样从贴片式到铠装式都有很多现场测温方案首选就是它。但热电偶有个天然缺陷它的输出是差分电动势只有两个不同金属接点的温度不一致时才会产生电压也就是说我们测量到的热电势本身就是测量端温度 减去 参考端温度的差值。如果你把热电偶直接接到仪表端子上仪表端子的温度也就是冷端也在变化读出来的温度就会跟着漂。举个例子你用K型热电偶测一个恒温炉炉温稳定在500℃但配电箱里的环境温度从25℃升到了35℃这时候显示值就会漂掉大约4℃。原因很简单K型热电偶典型灵敏度约40μV/℃冷端变化10℃就会产生400μV的误差电压而测量系统会把这种变化直接当成热端温度变化来处理。所以冷端补偿不是精度优化项而是必须项。既然要做冷端补偿就绕不开一个问题冷端温度用什么传感器来测工业上常见的两种选择是NTC热敏电阻和Pt100铂电阻。NTC便宜、响应快但线性度差、一致性一般全温度范围内精度很难做好Pt100线性度好、互换性强、长期稳定性出色0℃时电阻值100Ω灵敏度约0.385Ω/℃虽然单价贵一点但作为冷端基准传感器是值得的。我这次要分享的方案就是用STM32做主控 AD7124做前端采集 K型热电偶做高温测量 Pt100做冷端补偿源码里同时包含了Pt100和NTC两套冷端处理逻辑方便不同成本预算的场合切换使用。这套方案实测下来常温环境下整体测温精度做到±0.5℃以内没有压力如果校准得好还能更稳。2. AD7124的前端设计模拟链路、激励电流和比例式测量2.1 AD7124凭什么适合热电偶方案AD7124是ADI推出的24位Σ-Δ型ADC集成了PGA可编程放大器、激励电流源、内部基准、参考检测、热电偶断线检测等功能几乎就是为传感器测量场景量身定做的。它内部有多个通道可配置支持差分输入最关键的是它的激励电流源IEXC可以软件配置大小50μA到1mA多档这给Pt100测量提供了极大的便利。用AD7124做热电偶采集时典型链路是这样热电偶差分信号进入AIN0、AIN1通道PGA增益设成128倍把40μV/℃的微弱信号放大到可观的幅度Pt100用比例式接法一路激励电流流过Pt100产生压降另一路流过精密基准电阻RREF产生参考电压内部基准或者外部基准电阻为ADC提供基准源这样激励电流的温漂和噪声会同时出现在信号通路和基准通路上相互抵消。这套设计的关键在于比例式测量。激励电流IEXC的温度系数哪怕达到50ppm/℃如果测量端和基准端用的是同一路电流电流变化导致的电压变化会在ADC转换结果里形成共模最终被除法运算抵消掉。我第一次搭比例式电阻测量时没理解这个原理还用独立基准源去测Pt100结果电流温漂全部变成了测量误差后来改回比例式长时间稳定性立刻提升一个量级。2.2 Pt100的接线方式两线、三线还是四线Pt100接线对精度影响很大。两线制最简单但导线电阻直接串入测量回路以铜导线0.5Ω/m估算10米线就会带来约1.3℃的误差热电偶冷端补偿这种应用场合绝对不能这么省。三线制是工业界最常用的折中方案一根线走激励电流两根线走电压采样利用运放的高输入阻抗特性把导线压降的影响减掉。不过三线制要求两根采样线的阻抗严格相等实际施工时最好用同规格同长度的导线。四线制最精准激励和采样完全分离导线电阻影响理论上为零。AD7124的差分通道数量充足冷端补偿只占一个通道完全可以给Pt100接成四线制。我的做法是PCB板上的冷端温度传感器就近焊接用四线制而且把Pt100贴在接线端子的金属片上尽量让它感知到热电偶冷端所在位置的温度而不是PCB板的温度。这个细节很值得注意很多方案翻车就翻在传感器测的温度根本不是冷端温度。2.3 AD7124关键寄存器配置速览AD7124的初始化主要就是配置若干个20位寄存器这里列一下热电偶Pt100方案里我必须改的几项配置0用于热电偶通道PG 128差分输入使能内部参考BURNOUT检测增益设置后先等建立时间。配置1用于Pt100通道PGA 16差分输入IEXC0启动激励电流50μA或100μA根据Rt/RREF比值选。选100μA的原因是100μA流过350Ω左右的Pt100对应约650℃冷端极限压降35mV对16倍PGA来说不会饱和信噪比也比50μA高一倍。滤波器寄存器我选择sinc4滤波256 SPS输出速率对应50Hz/60Hz工频抑制能力足够噪声低至约0.5μV RMS折合温度分辨率约0.02℃。ADC控制寄存器连续转换模式关键是要把转换完成中断引到STM32的EXTI线上用中断读取数据避免轮询错失采样点。AD7124的SPI时序很简单但要注意两个坑一是寄存器写入前必须先清零对应位否则配置会留在上一次的默认值里二是读数据之前最好先读状态寄存器确认RDY位为0否则可能读到上一次转换的旧数据。3. 软件算法核心Pt100电阻解温度和热电偶线性化的完整链路3.1 Pt100电阻值到温度的两种算法路线Pt100在-200℃到850℃范围内电阻值与温度的关系可以用Callendar-Van Dusen方程来描述0℃以上Rt R0 × (1 A×t B×t²)0℃以下Rt R0 × (1 A×t B×t² C×(t-100)×t³)其中R0100ΩA3.9083e-3B-5.775e-7C-4.183e-12。这个方程直接求解t需要进行多项式求逆对单片机来说计算量不小更常用的做法是查表线性插值。我的工程里采用的是第二种方式把IEC 60751标准的Pt100分度表以1℃为步长做成常量数组温度范围-50℃到200℃覆盖冷端补偿实际需要的温度区间总共251个索引点。收到ADC转换结果后先换算成电阻值然后二分查表找到相邻两个温度点做线性插值。1℃步长的线性插值引入的最大理论误差在0.1℃以内因为Pt100在这个区间内非线性度并不夸张。插值计算量小Cortex-M4内核一条除法指令就能搞定实测整个查表插值过程耗时才几十微秒对采样率毫无影响。如果想进一步提升精度可以把表加密到0.5℃步长Flash多占约1KB非常划算。3.2 AD7124原始码值到电阻值的折算这里有一个比例式测量的核心公式。如果参考电阻RREF是精确的3.9kΩ0.1%精度Pt100通道的ADC码值为CODE_ADC那么被测电阻值Rt满足Rt (CODE_ADC / 2^23) × RREF × (PGA_RATIO)不过这只是理想情况实际计算要结合ADC的偏移校准OFFSET和增益校准GAIN寄存器。AD7124支持系统校准模式我的处理流程是系统上电后先做一次内部零标校准把偏移误差记入OFFSET寄存器用高精度电阻箱或标准电阻替代Pt100接入给一个已知电阻值执行内部增益校准之后每次转换结果做一次数字化校准计算。公式建议写成浮点Rt (CODE_ADC - 0x800000) / 2^23 × RREF_NOM × (1 校准系数)。用float计算完全够用STM32F4系列带FPU浮点运算不是瓶颈不必为了省时间去做定点化那是自找麻烦。3.3 K型热电偶的线性化查表与系数多项式热电偶热电势与温度的关系是非线性很强的曲线世界上通用的标定表是NIST ITS-90多项式。K型热电偶在0到1300℃范围内热电势E(t)可以用一个9次多项式逼近E a0 a1×t a2×t² ... a9×t⁹但反过来从热电势求温度t(E)又是一个反向多项式。单片机直接算9次幂还是比较吃力的尤其是中断里做更是浪费。工程里的做法是把分度表以5℃为步长做成查找表覆盖-50℃到1350℃存入常量区。每次拿到热电偶热电势减去冷端补偿对应的热电势值得到校正后的热电势然后查表插值得到热端温度。5℃步长的线性插值对于K型热电偶来说最大误差大约0.3℃左右。如果你追求更高精度可以局部加密或者在100℃以内区间单独用小步长表高温区曲线相对平直大步长没问题。3.4 冷端补偿的准确公式与误区很多人以为冷端补偿就是显示温度 热电偶热电势对应温度 冷端温度这个做法在精度要求不高的时候能凑合但在精密测温时是不对的。热电偶的热电势曲线并非线性简单的代数相加和真实物理过程有偏差。正确的做法是校正后热电势E_corrected E_measured E_cold_end_temperature也就是说先要把Pt100测到的冷端温度t_cold通过分度表转换成对应的热电势E_cold然后加到热电偶的直接测量热电势E_measured上再用这个校正后的总热电势去查热端温度分度表得到t_hot。举个例子冷端温度25℃热电偶输出热电势8.5mV。如果直接把8.5mV查表得到温度约208℃再直接加上25℃结果是233℃。但正确流程是先查冷端25℃对应的热电势0.998mV相加得到9.498mV再查表得到约232℃的精确值。两者差了1℃左右这就是简单代数相加引入的误差。这个环节是整个软件算法里最容易出错的地方我也是在某次对比冰点槽校准结果时发现的。用冰水混合物做0℃冷端时E_cold为0看不出问题换成室温冷端后误差立刻暴露出来。大家改代码时务必按热电势相加、温度查表这个顺序处理。4. 工程源码结构Pt100、NTC、热电偶三套逻辑怎么组织4.1 代码目录与模块划分源码组织上我按驱动层级做了清晰划分方便移植到其他型号的STM32或者换MCU时只改底层接口ad7124_driver.c/h——AD7124寄存器读写、初始化、校准、单次转换触发、中断处理temp_sensor_linear.c/h——Pt100/NTC/K型热电偶的分度表与查表插值接口cold_junction.c/h——冷端温度采集与补偿运算逻辑内部同时支持Pt100和NTC两种传感器通过宏定义切换filter.c/h——滑动平均和IIR一阶低通滤波app_display.c/h——最终温度值的换算、量程判断、断线报警标志处理。这个分层设计的思路是驱动层不关心传感器是谁只提供给我一个通道数据的接口线性化层不关心数据从哪里来只负责码值到物理量的换算应用层把几块拼起来。这样以后想换成S型热电偶只需要增加一张分度表冷端部分完全不用动。4.2 切换Pt100和NTC的宏配置源码里在cold_junction_config.h中有一个开关#define COLD_JUNCTION_TYPE_PT100 (1) #define COLD_JUNCTION_TYPE_NTC (0) #if COLD_JUNCTION_TYPE_PT100 #define COLD_JUNCTION_ADC_GAIN 16 #define COLD_JUNCTION_IEXC_UA 100 #elif COLD_JUNCTION_TYPE_NTC #define COLD_JUNCTION_ADC_GAIN 8 #define COLD_JUNCTION_IEXC_UA 50 #endifNTC方案用50μA激励配合10kΩ B3435的NTC在25℃下压降约0.5V8倍PGA下电压量程合理。由于NTC的电阻-温度曲线非线性明显查表区间我做了0℃到100℃覆盖步长0.5℃插值后误差能控制在±0.2℃以内勉强追得上Pt100的低成本替代。不过要提醒一下NTC的互换性不如Pt100即使是B值±1%的A级NTC批量使用时不同个体的25℃阻值偏差也会换算成零点几度的冷端误差。如果是做产品而非单台样机冷端传感器建议优先Pt100。4.3 断线检测与报警逻辑热电偶探头老化或者接线松动在工业现场是经常发生的事。AD7124内置了**燃烧检测burnout detect**功能内部有一个上拉电流源连接到AIN输入端如果热电偶断开输入引脚会被拉到参考电压ADC读数直接超出正常量程。我在初始化热电偶通道时开启了BURNOUT检测检测电流选2μA档位。软件里做两层判断硬件层ADC返回的原始码值如果等于满幅或接近满幅立即置断线标志软件层连续5次转换结果超过温度量程上限比如K型上限1300℃再加余量才确认报警防止单次毛刺误报。这里有一件事值得说开启burnout检测后建议关闭PGA的输入偏置电流补偿否则检测电流和偏置电流叠加会导致低量程测量出现额外误差。我当时没注意到这个结果探头在室温下读数老是偏高了0.7℃排查了很久才发现是配置组合互相影响。5. 实测校准与可靠性验证从零点漂移到长期稳定性5.1 冷冻基准法和比较法校准流程整套系统搭好后精度验证是重头戏。我采用了两步走第一步冷端通道单独校准。把Pt100和精密温度计A级出厂校准同时放进恒温槽分别在0℃、25℃、50℃、75℃四个点记录AD7124的码值和参考温度计的读数。如果恒温槽的温度稳定度可以达到±0.05℃这些数据点可以建立Pt100通道的偏移修正表。我就是用这批数据算出了校准系数把软件插值前的码值修正到理想曲线附近。第二步端到端整机验证。用干体炉或者管式炉在100℃、300℃、500℃、800℃几个温度点输出标准温度把热电偶探头插进去同时记录系统显示值。重点关注两个地方的误差满量程误差和中间点的非线性误差。K型热电偶本身精度有限标准级约±0.4%所以我的目标是系统总误差控制在±0.5℃以内这个指标在500℃时相当于0.1%FS对这套方案来说是可以做到的。5.2 上电漂移问题与预热策略我第一个版本的程序在实验室里测试一切正常结果焊好样品后第二天早上刚开机时读出的温度比实际低了0.8℃左右放半个小时后慢慢恢复正常。排查了很久才明白这是电源和基准电路的热漂移在作怪板子上电后LDO从冷状态到热稳定输出电压有微小的漂移这个漂移通过参考电阻影响到测量链路的增益。解决办法不是换更贵的LDO那样治标不治本实际上我做了两方面调整软件上上电后先执行一次内部校准然后在第0分钟、第1分钟、第3分钟做三次自动校准并丢弃前几次数据确保首屏显示的值不吓人硬件上把基准电阻从电源芯片旁边挪开避开热源GND走线加宽降低热电势效应。实测下来预热漂移从0.8℃降到了0.1℃以内。虽然不能完全消除因为整个链路总有温漂但数据已经干净很多。5.3 长时间测试工频干扰、风速与EMC的影响为了验证长期可靠性我把系统放在车间里连续跑了整整一周同时在旁边用高精度表做参考比对。这一周里发现几个有意思的现象白天光照直射到壳体和线缆时读数有规律的小幅波动约±0.15℃这是环境热扰动导致的机械应力变化和连接点温差车间里有大电机启停时偶尔会出现一个异常跳点约0.3℃持续一两秒恢复。这个跳点是工频磁场的瞬态干扰。sinc4滤波器虽然对50Hz有很好的抑制但瞬态干扰还是会穿过来所以我加了软件上的中值均值复合滤波线缆本身在空中摆动时读数也有轻微抖动。热电偶线本质上是两根金属线摆动会在不连续的接点处产生微小的接触热电势波动这个波动是热电偶测量固有的物理噪声很难完全消除。复合滤波的思路是这样的每收集5个样本先取中值去除毛刺再用剩余样本做滑动平均。中值滤波对孤立脉冲特别有效滑动平均对随机噪声有效两者组合后系统输出的最大跳动从0.5℃降到0.1℃以内。代价是响应时间变慢了大约200ms测温场景完全能接受。5.4 排查实录一个让人挠头的ADC读数跳变最后分享一个真实的排查过程也许能帮你省下半天时间。某次调试时Pt100通道读数在正常和偏高2.3℃之间周期性跳变周期约3秒。一开始我怀疑是固件逻辑问题反复看了几次查表程序没找到毛病。后来用示波器抓住模拟前端波形发现AIN6引脚的电压存在2.3mV的方波抖动周期恰好3秒。仔细追踪后问题出在参考电阻的接地点设计。我用的是PCB板上一个普通的GND过孔这个过孔同时也是STM32主控的某个LED驱动的回流路径。LED以3秒为周期被点亮和熄灭LED电流在GND网络上产生了周期性的电压抬升这个抬升通过参考电阻的地端耦合进了测量链路。解决方案是我把参考电阻的GND单独引了一条星型接地线直接回到电源端子的GND处断开了与数字噪声的共享路径。改完后波形干净了读数也稳了。这件事给我的教训是模拟前端的地线布局一定要单独走不要和数字IO或者电源切换电路混用回流路径。看似毫伏级的GND噪声经过128倍PGA放大后就是几十毫伏级别的干扰完全足以毁掉ADC的精度。6. 后续扩展思路与一些实用经验这套方案跑起来之后我在它基础上做了几个扩展供参考多路热电偶扩展。AD7124有多个模拟输入通道可以配置成多路差分输入分时切换采集不同位置的热电偶。每路只需要一个外部RC滤波冷端补偿复用同一个Pt100只要各路冷端温度差异不大即可数据记录和曲线显示。STM32把温度值和诊断状态通过串口接口发出去上位机软件直接绘制实时曲线采用24位ADC后原始信号的噪声底线已经非常低真正限制精度的往往是传感器本身的性能而非ADC。所以校准传感器时最好用A等级的探头很多精度上不去的问题其实出在探头等级不匹配。说到最后有一个被我反复验证的经验热电偶数据采集中接地永远是第一优先级。无论是电源地、模拟地、数字地还是线缆屏蔽层的处理只要这个概念有一丝马虎后面所有软件上的滤波和校准都可能是在一味填补漏洞。把工艺细节做扎实这套方案才能长时间稳定运行也才能让你把真正精力花在系统功能上而不是整天和莫名其妙的漂移纠缠。如果你正在做类似的测温方案我最想提醒的就是先花时间把冷端补偿的物理过程理解透再动代码。搞懂了热电势相加、温度查表这个逻辑顺序整个方案的精度就成功了一半。剩下的那一半就是你在现场调试中遇到并解决各种细节问题慢慢打磨出来的功力了。
阅读完成 · 觉得有帮助?