工业现场和HVAC系统里做温度采集,折腾过的人都知道那种痛:变频器一启动,主控ADC读回来的数就开始跳舞;传感器线拉个三五米,显示的温度和万用表量出来的能差出两度去;热电偶的小信号本来就微伏级,稍微有点共模干扰,冷端补偿再没做好,整个温控回路就是在瞎忙活。
我最近完成的一套方案,主控用的 TI 的TM4C1299NCZAD,前端采集用的ADS122U04IPWR,专门针对工业制程和暖通空调场景里的温度测量。这套组合解决的几个核心问题很实在:24 位精度的 Δ-Σ ADC 把分辨率做上去了,UART 接口在长线传输和抗干扰上比 SPI 省心得多,而 TM4C1299NCZAD 这颗带浮点单元的 M4F 主控,跑温度换算和校准算法绰绰有余。下面把选型逻辑、硬件接法、固件流程和踩过的坑完整捋一遍,给做同类项目的朋友一个可以直接参考的工程样板。
1. 为什么是"UART 接口 ADC + 以太网级 M4":工业温度采集的选型逻辑
1.1 工业和 HVAC 的温度测量到底难在哪
先说工业侧。化工厂罐体温度、热力管网的回水温度、冷冻站、洁净室送风温度,这类场景的共同点是:传感器离主控板物理距离远,现场电磁环境脏,温控精度要求高。HVAC 系统看起来温和,其实藏着一堆高压变频器、大功率风机盘管,这些设备产生的共模噪声和辐射干扰一点都不比工业环境小。
精度要求也要先厘清。普通的温控显示柜,±0.5°C 就够用;但涉及到计量结算、工艺控制的场合,比如楼宇分户热计量、冷站能效监测,传感器通道往往要做到 ±0.1°C 甚至更高。MCU 自带的 ADC 大都是 12 位,配上外部基准源勉强能到 ±1°C 的等级,再往上就力不从心了。这还不是分辨率的问题,MCU 内置 ADC 的参考电压通常直接来自电源轨,温漂和纹波在这里会被放大成不可控的测量误差。
传感器侧也有讲究。PT100、PT1000 这类热电阻,信号量在零点时才 100Ω/1000Ω,每摄氏度变化不到 0.4Ω;K 型热电偶的输出能力更是只有约 41μV/°C,这种级别的微弱信号,没有合适的前端放大和精密电流激励,是根本没法做出高性能测量的。
1.2 ADS122U04IPWR 这颗芯片的差异化价值
ADS122U04IPWR 是 TI 的 24 位 Δ-Σ ADC,四通道输入,内部自带可编程增益放大器(PGA,增益 1 到 128)和两个可编程激励电流源(IDAC)。初次看到这颗料,很多人的第一反应是"为什么选 UART 接口的 ADC"——比起 SPI 接口,UART 的时钟和数据是用独立线分开发送的,没有同步时钟信号在长线传输时的信号完整性问题。
工业现场有一个很现实的情况:SPI 的时钟线在 1 米以上线缆里容易变成天线,尤其旁边有变频器动力线时,时钟边沿上的噪声会导致主控读到错误的数据。UART 是异步通信,线对数量更少,用 9600、19200 这样的低速波特率时,在 3 到 5 米的普通屏蔽双绞线上通信可靠性相当好。
还有一个容易被忽略的点:这颗 ADC 集成了内部温度传感器,做热电偶冷端补偿时可以省掉外部的热敏电阻或 IC 温度传感器。虽然内部传感器精度有限(后面细说),但作为冷端温度的粗略参考,已经能让冷端补偿的实现难度大幅下降。
1.3 TM4C1299NCZAD 在系统里的角色
TM4C1299NCZAD 是 TI 的 Cortex-M4F 内核主控,120MHz 主频,1MB Flash、256KB RAM,最关键的是带硬件浮点单元和 12 位内置 ADC。很多朋友问我:24 位 ADC 都用了,主控是不是随便一个 STM32 就够了?话是没错,但 TM4C1299 在这个项目里的价值在于它的扩展能力——芯片自带以太网 MAC 和 PHY 集成方案、USB、多条 UART/SPI/I2C 总线,意味着一个主控既做多路温度采集,又能直接承担楼宇自控网关、数据记录、甚至 Modbus/以太网协议转换的功能。
从成本角度看,一颗 TM4C1299NCZAD 做网关兼采集器的成本,可能比"普通 MCU + 单独以太网 PHY + 数据记录芯片"还要低。而且 M4F 浮点单元在跑热电偶 ITS-90 多项式、RTD 的 Callendar-Van Dusen 方程时,速度明显比纯整数模拟快,这一点在工程代码里很实用。
2. RTD、热电偶、NTC 三种传感器的接法与模拟前端设计
2.1 PT100/PT1000 三线制接法细节
热电阻测量最常用的接法有三种:两线制、三线制、四线制。两线制虽然只用到两根导线,但导线电阻直接串联进测量回路,100 米的 0.5mm² 铜线电阻大概 3.5Ω 左右,折算成 PT100 的温度就是将近 10°C 的误差,这在精度敏感场合是完全不能接受的。四线制当然最好,但是工业现场拉四根线到传感器,施工成本和线缆成本都不低。三线制是精度和成本的折中方案。
ADS122U04 内部有两个可编程 IDAC 电流源,三线制的经典接法是这样:IDAC1 和 IDAC0 设置为同一电流值,分别接到 RTD 的激励端和一条独立的引线端,测量通道用差分方式接 RTD 两端。
原理不复杂:假设三条导线电阻相等(工业布线条件下这个假设是合理的),两条导线上的电压降相等,差分测量自然就把导线电阻误差抵消掉了。流经 RTD 的电流和流经参考电阻 R_REF 的电流是同一个回路,所以采用比例式测量,基准电压的变化会被自动消除,这就是 Δ-Σ ADC 做阻性传感器测量的最大优势——对参考源长期稳定性的要求可以放宽不少。
PT100 一般选 1mA 激励电流,PT1000 选 0.5mA。电流太大,RTD 自热效应会把温升抬上去;电流太小,信噪比会下降。我自己实测过:1mA 激励下的 PT100 自热温升控制在 0.05°C 以内是可以做到的,前提是 RTD 封装散热要达标。
2.2 热电偶的小信号处理和冷端补偿
热电偶的信号极小,K 型在整个量程内平均灵敏度约 41μV/°C,到了 0°C 附近甚至只有约 39μV/°C。要让 ADC 在这么小的信号下做出 0.1°C 分辨力,PGA 增益至少要开到 64 或 128。注意一点:增益开得越高,有效分辨率反而会受 PGA 噪声地板限制,所以热电偶测量的真实精度往往卡在放大器噪声,而不是 ADC 的分辨位数。
冷端补偿是热电偶设计里最容易被低估的环节。热电偶测到的是热端和冷端的温差电动势,不是绝对温度。要获得真实温度,必须知道冷端(也就是热电偶接入 PCB 的实际节点)的温度。ADS122U04 内置温度传感器的用处就在这里——它测量的是芯片封装内部的温度,基本等于 PCB 冷端节点的温度,把它的值作为冷端,再用标准 NIST 查找表或反多项式做补偿即可。实操中我会在冷端节点附近再放一枚独立的温度传感器(比如精度较高的 NTC 或数字传感器),和内置温度传感器交叉校验。因为 PCB 上若有电源芯片或功率器件,芯片封装温度可能比实际冷端接线点高不少。
2.3 NTC 和 IC 温度传感器能覆盖的低要求通道
不是每条温度通道都需要 24 位精度。比如冷却水温、回风温度这类只是做趋势判断的通道,用 NTC 热敏电阻加简单的分压电路就很合适。ADS122U04 的差分通道接 NTC 时,可以把 NTC 放在其中一个输入和参考之间,用 IDAC 激励,另一路接精密参考电阻,形成类似的比率式测量。这样做的好处是省一路分压网络,精度也比 MCU 内置 ADC 做的好。
对 HVAC 这个场景我特别提醒一点:很多楼宇里面的温度传感器是 4-20mA 变送器输出的,这种信号不能直接进 ADC,要在输入前端放一个 250Ω 精度电阻(直接把电流变成 1-5V 电压),再用 ADC 的差分通道测量。做接口板时把这路预留好,现场调试会少很多麻烦。
2.4 模拟前端保护电路不能偷懒
ADS122U04 输入引脚不可以直接往工业变送器或远距离传感器上接。合理的输入保护电路至少要有三件套:串联限流电阻、瞬态抑制二极管 TVS、输入到地的 RC 滤波电容。RC 滤波的截止频率我一般选在 2kHz 左右,既能滤掉变频器 PWM 的高频谐波,又不至于把传感器信号衰减太厉害。TVS 要选结电容小的型号,结电容太大等于额外挂电容在多路复用开关上,会影响建立时间。
这里给出一个我验证过的模拟前端模板(单通道示例):
传感器信号端 ── R1 (10kΩ) ──┬── TVS (双向, 5V) ── GND │ └── C1 (10nF) ──┬── ADC_IN+ (A0) │ 传感器参考端 ── R2 (10kΩ) ──┬── TVS (双向, 5V) ── GND │ └── C2 (10nF) ──┬── ADC_IN- (A1) │ ADS122U04 输入引脚R1、R2 除了限流,还有一个作用:在 TVS 钳位时提供压降上的缓冲,避免冲击电流直接灌进 ADC。C1、C2 的取值要在采集稳定时间上做平衡,10nF 是我在当前 20SPS 采样率下的选择;如果采样率提高,电容要相应减小。
3. 固件侧 UART 数据流:从寄存器配置到温度工程的换算
3.1 ADS122U04 的通信协议和配置流程
ADS122U04 走 UART 协议,通信帧有固定的起始、地址和校验机制。上电以后第一步一定是复位命令,等芯片完成内部初始化再开始配置寄存器。初始化顺序我总结如下:
- 发送复位命令,等待至少 5ms;
- 配置 PGA 增益和数据速率寄存器,决定增益、采样率、转换模式;
- 配置 IDAC 电流源:设电流值、选择电流输出引脚;
- 配置输入多路选择器,选定采集通道;
- 根据需求设置温度传感器使能位(热电偶冷端补偿用);
- 启动连续转换或发送单次触发命令。
注意一个容易出错的地方:ADS122U04 的增益和数据速率寄存器整合在同一个配置字节中,需要同时确定 PGA 和采样率,改增益时必须重新完整写入该寄存器,不能只改其中几位后还把旧值留在原位。
3.2 连续转换还是单次触发
两种模式各有用途。连续转换适合系统每秒上报一次所有通道温度、且数据量大的场景,固件只要每收到一个数据帧就取出、换算、存入缓存。单次触发适合对功耗敏感或 CPU 占用率有严格要求的场景,需要哪路就触发哪路,读完就停。
工业现场我偏向连续转换加中值滤波的组合。因为连续转换模式下 ADC 内部滤波器是持续工作的,数据平稳性比单次触发好;单次触发会有启动建立时间的影响,每一次读到的值会受前一次通道残留电荷的干扰,尤其在多通道分时复用时。
3.3 原始码到工程温度的完整计算链路
ADS122U04 是 24 位 Δ-Σ 结构输出带符号二进制补码。把原始码换算成电压的标准公式是:
V = Code × VREF / (Gain × 2^23)例如:基准电压 2.048V,PGA=128,读到的原始码为 4210,则输入电压大约:
V = 4210 × 2.048 / (128 × 8388608) ≈ 8.03μV这恰好是 K 型热电偶大约 0.2°C 的电平,说明增益和分辨率在这个量级上是够用的。
电压到温度,RTD 和热电偶要用不同的换算路径。RTD 我建议直接用 Callendar-Van Dusen 方程,实测精度够、代码也不复杂。对 PT100:
T = (RT / R0 - 1) / 0.00385 (在0°C以上,近似线性区使用)0°C 以下用完整方程,要加二次项和三次项校正。如果产品只做 0-200°C 范围,上面的简化公式已经能在全量程内做到 ±0.2°C 左右。
热电偶就必须查表或多项式计算了。我实际用的是 NIST 发布的反向多项式系数,K 型热电偶是 10 阶多项式,M4F 的浮点单元跑这个计算大概只需要几微秒,完全可以实时完成。查表法虽然也行,但需要存储大量的温度-电压对应表,Flash 占用多,而且查表插值的分段误差控制很麻烦,不如多项式干净。
这里给一段固件内部温度估算程序的核心逻辑(伪代码形式):
float adc122xx_to_voltage(int32_t raw_code) { // VREF_UV = 2048000 microvolt // PGA_GAIN = 128 return (float)raw_code * VREF_UV / (float)(1 << 23) / PGA_GAIN; } float adc122xx_read_rtd(uint8_t channel) { int32_t code = adc122xx_read_raw_code(channel); float v_rtd = adc122xx_to_voltage(code); float r_rtd = v_rtd * R_REF / (IDAC_CURRENT * R_REF - v_rtd); // 注意这里必须按实际电路计算 r_rtd,取决于接入方式 return cvd_pt100_convert(r_rtd); }关于 RTD 阻值的换算,补充一句:上面公式里的分母这么写,是把参考电阻上的压降也考虑进去的严格推导,比很多人直接套用的V_rtd / I更接近实际。具体哪个接法用哪个公式,要对照自己板子的电流注入路径。
4. 把精度从"标称"做到"实测":校准流程和误差来源分析
4.1 到底要校准哪些东西
很多工程师以为 24 位 ADC 的标称精度就是最终系统的精度,这是最容易踩的认知误区。整套测量链路的误差源包括:
| 误差来源 | 典型量级 | 影响通道 |
|---|---|---|
| ADC 内部失调 | 具体看数据手册 | 所有通道 |
| PGA 增益误差 | ±0.02% 左右 | 所有通道,随增益变大 |
| 基准电压初始误差 | ±0.05% 到 ±0.2% | 所有通道 |
| 精密参考电阻 R_REF | ±0.1% 或 ±0.01% | RTD 通道(比例式测量有效抵消,老化和温漂除外) |
| 导线电阻残留 | 三线制只能部分抵消 | RTD,长线场景明显 |
| 冷端补偿点温度偏差 | 1-3°C | 热电偶通道 |
所以量产环节必须做校准。最实用的校准方法是两点校准:用精密电阻箱模拟标准 RTD 阻值(或接标准源),记录 ADC 输出的原始码,算出偏移和增益系数,写入 MCU 的 Flash。校准方程是简单线性式:
T_cal = (T_raw - off) × gain其中 off 和 gain 分别由 0°C(对应 100Ω 处)和 100°C(对应 138.51Ω 处)两个校准点解出。这种校准做一次大概几秒钟,产线效率可以接受。
4.2 冷端补偿到底怎么做才靠谱
热电偶冷端补偿误差,往往是整个系统精度上限的决定因素。如果冷端温度测偏差 1°C,最终温度就偏差约 1°C。我实测过 ADS122U04 内置温度传感器在窄温环境下(25°C 附近,PCB 均温)能到 ±0.5°C 的性能;但一旦板上有局部发热,比如 LDO 紧挨着芯片,它的读数就会偏高 1-2°C。
我的做法是:在热电偶接线端子附近(冷端接点处)放置一枚精度 ±0.1°C 的数字温度传感器,通过 I2C 或单总线挂在主控上。固件冷端补偿的优先级:优先读外部传感器,外部通信异常才回退到 ADC 内置传感器。这个回退设计在工业现场非常重要,因为工业环境里传感器断线、接插件氧化都常见,固件必须给出一个降级方案。
冷端补偿在固件里的合成分两步:
第1步:把冷端温度 Tcold 查表或多项式得到冷端对应的毫伏电动势 E_cold 第2步:最终温度 = 逆运算(E_measured + E_cold)这一步不能省。直接把冷端温度加到热端电压换算出来的温度上,很多初学者的做法是错的,会造成零点偏移。
4.3 我实测的一组精度数据
拿我的一块评估板做参照:室温 23°C,用精密电阻箱模拟 PT100 各温度点,采样率 20SPS,PGA 1,IDAC 1mA,两点校准后记录的结果:
| 设定温度(℃) | 实测显示(℃) | 误差(℃) |
|---|---|---|
| 0 | 0.02 | +0.02 |
| 25 | 25.01 | +0.01 |
| 50 | 50.03 | +0.03 |
| 100 | 99.97 | -0.03 |
| 150 | 150.05 | +0.05 |
在 0°C 到 150°C 范围内,分辨率稳定在 ±0.05°C 级别。而同样的板子不校准,直接依靠标称增益,误差会扩大到 ±0.3°C 以上。这就是两点校准的实际价值。
热电偶通道我用的 K 型,冷端用外部传感器补偿,PGA=128,实测在 0°C 到 400°C 区间全范围误差约 ±0.3°C,这在暖通和工业过程监测里已经是相当拿得出手的数据了。
5. 我这块板子踩过的坑:PCB、电源和通信异常排查
5.1 模拟地和数字地的处理原则
ADS122U04 这类 Δ-Σ ADC 对地平面的处理非常敏感。我第一版板子图省事,模拟地和数字地直接大面积相连,结果 24 位数据的低三四个位一直在跳。
后来改成单点接地:模拟电源域所有的地汇到 AVSS 引脚处,再通过 0Ω 电阻连接到数字地,并且把 MCU 的开关活动区域远离模拟输入走线。这个问题解决后,数据噪声立刻下降了一个数量级。要注意 0Ω 电阻要靠近 ADC 放置,中间不能有数字信号走线穿过。
差分输入走线也是关键。A0/A1 这对差分线在 PCB 上要等长平行走,周围包地,尽量避免跨分割。工业现场的强干扰主要通过空间耦合进模拟输入,所以走线越短越好,输入滤波电容要离 ADC 引脚越近越好。
5.2 参考电压和电源噪声的坑
ADS122U04 内部虽然有基准,但比例式测量用外部分压参考电阻时,这个基准的纹波会直接进入测量结果。我实测过:给 ADC 供电的 LDO 输出纹波从 1mV 降到 0.2mV,ADC 噪声性能就有明显改善。所以模拟电源建议用专门的低噪声 LDO,或者在 LDO 后面加一级 LC 滤波再进 AVDD。
如果用了 DC-DC 给系统供电,DC-DC 的开关频率一定要避开 ADC 的采样频率及其谐波成分。我遇到过一块板子,用 400kHz 的 buck 电源,ADC 数据速率设在 20SPS,结果有用信号上叠加了一个约 0.35μV 的周期性纹波,换算成温度就是同步的 0.1°C 抖动。后来把 ADC 的数据速率调开,纹波的影响就不再同步了。
5.3 UART 通信偶发异常的排查思路
工业现场 UART 通信最容易忽略的问题是两块板卡之间的地电位差。传感器或者采集板离主控远的时候,地回路上流过的电流会在导线上产生电压差,超过 UART 接收端门的输入阈值范围,就会偶尔出现字节错误。
排查案例:一套系统在实验室跑几天没问题,到现场一小时就报一两次通信错误。用示波器抓传输线,发现数据线上的共模电压叠加了一个低频的 0.4V 左右的偏移。解决办法是把两端的电源地重新做了可靠的等电位连接,同时在 UART 接收端加了开漏转接和简单的电平钳位。如果传输距离超过 10 米,最稳的方案是换成 RS-485 物理层,UART 信号先经收发器转换,再用双绞线传输。
固件侧也要做容错。我建议所有发送给 ADS122U04 的命令都带校验字段,读回数据时同样校验;连续错三次就自动发重新同步的脉冲序列,而不是死等。这套容错逻辑让通信故障的恢复时间从分钟级降到秒级。
5.4 传感器线缆的屏蔽与布线
在 HVAC 现场,温度传感器线缆往往是和 220V 动力线走同一个线槽的。屏蔽层要单端接地,一般接在主控端的地。接两头反而可能形成地环路,让屏蔽层变成噪声注入的路径。屏蔽层接错了,往往比不接还糟糕。
6. 从原型到量产,长期稳定性还要做什么
6.1 温漂、老化和定期校准计划
校准不是一劳永逸的。精密电阻的阻值会老化,基准源的电压会缓慢漂移,传感器本身也会在经历高温大温差循环后出现小幅度偏移。对工业设备和楼宇系统,我通常建议一年做一次整机复校,关键计量通道半年复校一次。
高端方案可以在板上保留一个预留的精密电阻通道,量产的校准工具通过这个通道自动校准,不用拆机、不用接温度源就能跑自校流程。这个设计初版多花几十块钱,后期维护省下的时间远不止这些。
6.2 ESD 和 EMC 设计不能等出了问题再补救
工业现场的环境噪声来源很多:继电器触点拉弧、变频器的 PWM 边沿、变频水泵启停瞬间的浪涌。这些干扰的频谱集中在几 kHz 到几十 MHz,如果前面模拟保护电路和 PCB 布局没有做足功课,系统检测到高低温告警,结果只是强电磁脉冲打出的伪读数,这种故障在现场排查起来极其痛苦。
我现在的设计固定会在电源入口加 TVS 管和共模电感,在传感器接口的每根线上都放 TVS 和滤波电容,UART 线在板内预留了串联电阻做噪声抑制。这些保护看似增加了一点 BOM 成本,但和现场一次误报引起的停机损失相比,完全不值一提。
6.3 固件里的看门狗和数据质量标记
最后再分享一个安全管理上的细节:固件里要定义数据质量状态,不要只把温度值传出去。当 ADC 通信异常、校准系数没写、读数超量程这些情况发生时,给温度数据打上异常标记,上位机收到后能主动报警,而不是拿一个错误温度去驱动执行器。这套系统在暖通控制里的价值尤其大——空调机房误报超温导致机组停机,维修人员赶过去才发现是传感器线断了,这种事情一次就够让人长记性。
我在这套方案里最终落地的固件结构是:主循环保持简单,只做任务调度;ADC 采样和协议处理用中断驱动;温度换算和滤波放到低优先级任务里。这套架构跑了三个多月,一直是稳定的。如果大家按照上面的硬件和软件思路做,遇到问题的概率会小很多。真到了现场出怪问题时,先查电源,再查地,然后查通信波形——这个顺序能省下大半天的排障时间。