温度测量这活儿,看着简单,实际坑不少。最近我基于ADS122U04IPWR这颗 24 位 Δ-Σ ADC 和STM32L152ZD超低功耗 MCU,做了一套面向工业和 HVAC 应用的多通道测温方案,覆盖 Pt100 热电阻、K 型热电偶和 NTC 热敏电阻三种常见传感器类型。这篇文章把我整个设计过程、代码思路和踩过的坑完整写下来,给正在做类似项目的同行一个参考。如果你也要在工控板或者暖通控制器上做高精度温度采集,这篇文章应该能帮你省下一两周的调试时间。
1. 方案选型:为什么是 ADS122U04IPWR + STM32L152ZD
1.1 带 UART 的 24 位 ADC,给测温省了多少事
做测温的第一关就是选 ADC。工业现场测温的传感器输出信号都非常微弱:Pt100 在 0℃ 时电阻是 100Ω,用 1mA 激励电流也就产生 0.1V 左右的电压;热电偶更是毫伏级信号。MCU 内置的 12 位 ADC 在这个量级面前完全不够用,量化噪声就足以吞掉 0.5℃ 以上的精度,更别说内部参考电压的温漂。所以外挂高分辨率 ADC 是工业测温方案里几乎绕不开的选择。
ADS122U04IPWR 是 TI 推出的 24 位 Δ-Σ ADC,TSSOP-16 封装,后缀 IPWR 里的 I 代表工业级温度范围(-40℃ 到 +125℃),PW 是 TSSOP 封装,R 是卷带包装。这颗芯片和经典的 ADS1220 是同一架构家族,但通信接口换成了 UART,这一点在工程上帮了大忙:三根线(TXD、RXD、GND)就能完成数据交互,直接和 STM32 的 USART 外设对接,不用额外占用 SPI 引脚,更不用自己写繁琐的位操作时序。在制冷机组控制器或者 HVAC 控制板上,主控往往已经挂了 LCD、按键、通讯模块,引脚资源很紧张,UART 接口的这种接法实实在在省了 GPIO 和 PCB 走线。
芯片内部集成的资源也让我省了不少外围电路。4 路模拟输入可以配成单端或者差分模式,可编程增益放大器(PGA)最高 128 倍,两个匹配的恒流源 IDAC,还有内部电压基准。这些加在一起,意味着 Pt100、热电偶、NTC 都不需要再外接仪表放大器或恒流源电路,模拟前端可以直接贴在 ADC 输入引脚上。对 HVAC 这种小体积控制器来说,减少分立器件就是减少故障点、降低装配成本。
1.2 STM32L152ZD 的定位:低功耗主控的工程逻辑
STM32L152ZD 是 ST 超低功耗 L1 系列里资源比较足的一颗料,Cortex-M3 内核,最高 32MHz,384KB Flash 加 48KB SRAM 的配置在 HVAC 控制器这种场景里非常够用。它自带 LCD 驱动器,能直接驱动段码液晶显示温度值,很多盘装仪表和温控器产品因此省掉一颗专门的 LCD 驱动芯片。当然 L1 系列最核心的价值还是功耗:低功耗运行模式、停止模式下的唤醒电流能做到微安级,非常适合常年通电的温控设备。做电池供电的无线传感器时,这颗料的表现也足够好。
选这颗芯片还有一个工程上的理由:UART 资源够用,而且支持 DMA。ADS122U04 的转换结果一帧也就几个字节,用中断接收也好、DMA 接收也好,都不怎么占 CPU 时间。测量周期内其余时间可以让 MCU 进入低功耗状态,等定时唤醒或者等 ADC 数据准备好再处理。整个系统的功耗模型很清晰:ADC 上电转换十几毫秒,MCU 同步醒来收发数据,然后双双睡回去。
可能有人会问,现在 STM32 新系列那么多,为什么还在用 L1?答案很简单:L1 在市场上验证了多年,参考设计多、供应链成熟。温度采样这个环节对 MCU 的要求并不高,只求稳定、低功耗、外设齐全。在工业产品里,"稳定"和"可买到"比"最新最旗舰"重要得多,这也是做产品选型时必须认清的现实。
1.3 为什么不用 MCU 内置 ADC 或专用温度芯片
这个必须单独说。MCU 内置 ADC 就算标称 12 位甚至 16 位,有效分辨率也难敌外部 Δ-Σ ADC。内部 ADC 的参考电压往往直接来自电源或者内部带隙,温漂和噪声都不适合做 0.1℃ 级别的测量。专用数字温度芯片倒是接起来方便,但测温范围窄、精度参差、响应慢,长线传输的抗干扰能力也很差,工业现场拉几米线数据就乱跳。
相比之下,ADS122U04 这种外置 ADC 是"通用模拟输入"路线,它不光能测温,接桥式传感器、称重变送器、4-20mA 采样电阻都行,一块板子可以覆盖多个产品型号。选型的本质逻辑是:用一颗稍微贵一点的 ADC,换取整个模拟采集子系统的统一性和可复用性。项目后期想加测点、换传感器类型,改改配置寄存器就行,硬件不用动。
2. 模拟前端设计:RTD、热电偶、NTC 的接入方式
2.1 Pt100 三线制接法与 IDAC 激励的搭配
工业温度测量里 Pt100 是绝对主力,中低温段线性好、重复性好、互换性好。ADS122U04 内部的两个 IDAC 恒流源就是为 RTD 专门准备的,它们能输出电流激励 Pt100,再通过比例法测电阻,可以大幅抑制激励电流波动带来的误差。
三线制接法是工业现场最常用的:RTD 传感器一端接一根线,另一端接两根线,目的是补偿引线电阻。接法上,IDAC1 输出接到 RTD 的一个激励端,从 RTD 另一端引出的两根线里,一根接 ADC 正输入端,另一根经参考电阻 RREF 到地;IDAC2 用来给另一条引线提供匹配电流,让引线电阻上的压降互相抵消。这种接法和 ADS1220 系列数据手册里的推荐图一致,强烈建议画板前先去手册里对照一遍,不要凭记忆接线。
计算思路很简单:ADC 测的是 RTD 电压与参考电阻电压的比值。同一个 IDAC 电流同时流过 RTD 和参考电阻,电流波动会同时影响分子分母,比例相除之后波动被抵消,这就是比例测量(ratiometric measurement)的核心。计算公式是:
R_RTD = (V_RTD / V_REF) × R_REF
实际操作中 RREF 要选低温漂精密电阻,常见 0.1% 精度、±10ppm/℃ 温漂的金属膜电阻,阻值选 1.5kΩ 到 2.1kΩ,配合 PGA 增益和满量程范围。我习惯用 1mA 激励电流,对 Pt100 来说自热效应小,同时信号幅度足够。值得注意的是,三线制补偿有一个前提:三根线阻值必须一致。现场如果自己用普通铜线延长,务必保证三根线等长、同截面,否则每 1Ω 的线阻失配大约会引入 2.5℃ 的温度误差,这个账必须算清楚。
2.2 热电偶的冷端补偿怎么做才准
热电偶适合高温测量,K 型热电偶量程可以到 -200℃ 到 +1300℃,工业炉管、压缩机排气温度、HVAC 里的冷凝器温度都能覆盖。热电偶输出毫伏级热电势,信号幅度小,所以 PGA 增益要开到 64 或 128。ADS122U04 在 PGA=128 时理论上能分辨到微伏级别,对 K 型热电偶 40μV/℃ 的灵敏度来说,分辨率能做到 0.01℃ 以下,当然实际还要看噪声和基准稳定性。
热电偶测量有个核心难点:冷端补偿(CJC)。热电偶测的是热端和冷端的温差,冷端(接线端子处)如果是室温 25℃,热端实际是 200℃,ADC 读到的电压其实对应 175℃ 的温差电压。要得到真实温度,必须测准冷端温度,再把冷端的等效热电势加上去。ADS122U04 内部集成温度传感器,可以直接读芯片温度作为冷端温度的近似值。但如果热电偶端子离芯片远,建议在端子旁边放一颗高精度 NTC 做冷端温度采集,把冷端测准。
很多刚接触热电偶的工程师都在这上面翻车。正确流程是:先把 ADC 读到的热电势换算成温度值 T1,再用 NTC 测到的实际冷端温度 T2 查分度表得到冷端热电势 E(T2),最后 E_total = E_measured + E(T2),再代入分度表得到最终温度。K 型热电偶的分度表数据量大,要么用查表加插值,要么用多项式拟合存进 MCU,我推荐后者,省 Flash 且运算快。这里的一个经验是:冷端温度传感器尽量靠近热电偶端子,不要靠近发热元件和 MCU,否则冷端补偿误差会直接叠加到最终温度上。
2.3 NTC 与多传感器复用时的切换细节
HVAC 场景里很多测点并不需要 Pt100 那么高的精度,比如回风温度、面板温度,用 NTC 热敏电阻就够了,成本低。ADS122U04 的输入多路复用器支持 4 路单端输入,同一颗 ADC 可以轮流采集 Pt100、热电偶和 NTC。不同传感器的差异主要在于 PGA 增益、IDAC 开关和输入通道选择。比如 NTC 通道通常关掉 IDAC,改用外部上拉电阻分压或者把 IDAC 电流降低到 50μA 以下,避免 NTC 自热。
混合输入时有一个必须注意的细节:切换通道之后,要留出足够的多路复用器稳定时间,然后再启动转换。尤其是从大信号通道切到小信号通道,模拟前端需要时间放电和稳定,如果没有延时,第一次转换结果经常是上一通道的残留电压叠加的异常值。我的一般策略是:每通道切换后丢弃前两次转换结果,取后面连续几次转换做平均。这个办法简单粗暴但非常有效,实测能避免大部分通道串扰导致的跳变。
另外,4 路模拟输入在同一条 UART 总线上扩展也很方便。如果测点超过 4 路,可以用第二颗 ADS122U04 挂在同一条串口总线上,通过地址配置区分设备。这样整个 HVAC 系统的温度采集点可以轻松扩展到几十路,主控代码写一套驱动,按设备地址分发命令就行。
3. UART 通信协议解析与 STM32 驱动实现
3.1 ADS122U04 的帧格式与常用命令
ADS122U04 和传统 SPI 版本相比,通信方式改成了 UART 帧。UART 的好处是接起来方便,代价是要处理帧同步和校验。帧结构大致是:一帧数据以特定的起始字节开头,随后是命令字节和数据域,最后带一个 CRC 校验字节。CRC 用的是常见的 CRC-8 多项式 x^8 + x^2 + x + 1。每一帧命令都有响应帧,主机可以据此判断命令是否被执行成功。
常用命令就那几个:写寄存器(WREG)、读寄存器(RREG)、启动转换(START)、读取数据(RDATA)、停止转换(STOP)。寄存器配置包括输入多路复用器选择、PGA 增益、数据速率、IDAC 配置、滤波器模式等。流程上和 SPI 版本一样:先配置寄存器,再启动转换,等待数据准备好后读取 24 位转换结果。因为 UART 版本没有独立的 DRDY 引脚,数据就绪状态需要靠读取状态寄存器或者主机主动发 RDATA 命令来判断。用 RDATA 轮询的方式最省事:MCU 周期性地发 RDATA,如果 ADC 没有新的转换结果,响应帧里会有一个状态位标识出来,主机直接丢弃旧数据即可。
波特率方面,ADS122U04 支持自动波特率检测,上电后会自动识别主机发送的波特率。我建议工程上固定用 115200,兼顾速度和抗干扰。需要注意的是,自动波特率检测依赖 UART 起始位的宽度,如果 MCU 端时钟误差偏大、超过 UART 容限,检测会失败,所以 STM32 的时钟树配置一定要先确认无误。
3.2 STM32L152ZD 的 UART 初始化与驱动框架
下面给一段我自己在工程里用的驱动代码框架,基于 ST 标准外设库写的。用 HAL 库或者 LL 库思路一样,只是硬件抽象层替换掉而已。
void ADS122U04_Init(void) { USART_InitTypeDef USART_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // PA2 = USART2_TX, PA3 = USART2_RX GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_RX | USART_Mode_TX; USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); }写寄存器命令的实现,核心是构造帧。比如 WREG 命令要带寄存器起始地址和数据,按数据手册定义拼装即可。发送完后等待 ADC 的响应帧,校验 CRC 通过后再认为命令执行成功。
uint8_t ADS122U04_WriteRegister(uint8_t regAddr, uint8_t regData) { uint8_t frame[4]; uint8_t resp[4]; frame[0] = 0x00; // 起始字节 frame[1] = ADS122U04_CMD_WREG | regAddr; // 写寄存器命令 frame[2] = regData; frame[3] = CalCRC8(frame + 1, 2); // CRC 覆盖命令和数据域 USART_SendArray(USART2, frame, 4); if (USART_ReceiveArray(USART2, resp, 4, 50)) { return (resp[1] == regData) ? 1 : 0; } return 0; }上面代码里的 USART_SendArray 和 USART_ReceiveArray 是封装好的超时收发函数。注意接收响应帧一定要有超时机制,否则 ADC 没响应时 MCU 会卡死在等待里,这是工业代码和教学代码最大的区别。一个实用的细节:USART_ReceiveArray 的超时参数用系统滴答计时,不要用死循环延时,这样即使通信故障也能快速恢复。
3.3 转换结果读取与电压换算
配置完成后启动转换,MCU 周期性发 RDATA 取数。转换结果是 24 位有符号数,存放在三字节里,需要自己拼成 int32_t。注意字节顺序是高字节在前,用 DMA 接收时也要按大端方式拼接。ADC 输出编码和输入电压的关系是线性的:
V_in = (ADC_Code / 2^23) × (V_REF / PGA)
这里 V_REF 是 ADC 的参考电压。如果用内部 2.048V 基准、PGA=128,那么最低位 LSB 对应的电压约为 2.048 / 128 / 2^23 ≈ 1.9nV,这个量级已经远超热电偶信号的典型噪声水平。所以实际系统的瓶颈不在 ADC 分辨率本身,而在前端噪声、基准源稳定性和 PCB 布局。很多朋友一看到数据跳动就怀疑 ADC 分辨率,实际往往是被噪声淹没,正常现象。
拼完原始编码后,先换算成电压,再根据传感器类型转温度。温度换算我习惯构造一张查找表,用线性插值处理,比运行多项式计算快很多,也方便换用不同分度的传感器。查找表按 1℃ 间隔建表即可,插值误差远小于传感器本身的精度。
4. 高精度测温的固件流程:滤波、校准与断线检测
4.1 采样率与数字滤波的选择
ADS122U04 的数据速率可编程,从 20SPS 到 2000SPS 分多挡可选。工业测温场景我在绝大多数项目里都用 20SPS,因为 Δ-Σ ADC 内置的数字滤波器在这个速率下对 50Hz 和 60Hz 工频干扰有很强的抑制能力。这个特性非常值钱:HVAC 设备旁边就是压缩机、风机、变频器,工频和开关噪声无处不在。把速率提到 100SPS 以上,工频抑制会下降,数据里就会看到明显的 50Hz 纹波。
如果你需要更快的响应,可以选更高数据速率,然后在 MCU 端做滑动平均或者一阶低通滤波。经验参数是:20SPS 采样率下做 8 次移动平均,等效响应时间约 0.4 秒,对温度这种缓变信号完全够用,而且能把噪声峰峰值压到原始值的 1/3 以下。如果做温控 PID,建议用中值滤波加滑动平均的组合:先取 3 个原始值取中值,丢掉粗大误差,再对中值序列做滑动平均。这样既滤掉了脉冲干扰,又不会明显增大滞后。
这里有一个取舍问题需要说清楚:温度对 PID 控制的滞后影响很大,滤波器太重会让温控系统反应迟钝甚至震荡,滤波器太轻又压不住噪声。判断标准很简单——用恒温水槽实测,看滤波后数据的峰峰值是否小于控制精度的 1/5。比如控制精度要求 ±0.5℃,滤波后的数据波动应该在 ±0.1℃ 以内。
4.2 校准方式与漂移抑制
再好的器件也有误差,校准必须做。我的常规做法是两件套:零点校准和增益校准。零点校准在输入端短接时读取偏移码;增益校准通过接入一个精密电阻代替传感器,读取增益误差。写入校准寄存器后,ADC 会在后续转换中自动修正偏移和增益误差。工程经验是每台设备出厂前做一次室温下的两点校准,配合 A 级 Pt100 探头,能把系统温度误差控制在 ±0.2℃ 以内。
比例测量对基准漂移有天然抑制,但前提是参考电阻 RREF 本身的温度系数足够低。之前提到选 0.1%、±10ppm/℃ 的电阻,换算一下:环境温度变化 50℃,参考电阻阻值变化 500ppm,也就是 0.05%,对应 Pt100 的温度误差约 0.13℃。如果用内部基准而不是外部参考电阻,内部基准的温漂参数更要仔细看,很多器件内部基准温漂在 ±10ppm/℃ 到 ±40ppm/℃ 之间。HVAC 室外机控制器经历冬夏温差可能超过 80℃,这个漂移必须提前算进误差预算里,不然冬天和夏天读数会差出近 1℃。
另外一个影响长期稳定性的因素是 PCB 表面污染和湿气。工业环境下 PCB 沾上盐雾、灰尘,绝缘电阻下降,会引入纳安级的漏电流,在 1mA 激励下造成零点漂移。板子清洗后涂三防漆,能显著改善长期稳定性。这个措施在工业 PCB 上几乎是必须的。
4.3 断线检测与故障安全
工业现场必须处理传感器断线,否则断线时 ADC 读到的是满量程或者随机值,温控系统可能把加热器开到最大,酿成事故。利用 IDAC 恒流源,断线检测很简单:正常情况下 IDAC 电流流过传感器会建立正常偏置电压;如果传感器断线,输入引脚电压会被拉高,ADC 编码会跑到满量程附近。固件里设定合理的上下限阈值,比如 Pt100 测量范围对应编码 0.5V 到 1.5V,超出范围就判定故障。
更可靠的做法是配合 ADS122U04 的输入开路检测功能,或者用专门的状态寄存器判断。我在项目里的实现是:每次转换完成后检查编码范围,连续 3 次超出合理范围就置故障标志,同时在状态机里切换成安全输出模式。别小看这个逻辑,很多温控系统安全事故的根源就是"传感器线松了但系统还在继续执行错误的控制量"。HVAC 里尤其要重视,风机盘管、冷媒系统一旦失去温度反馈,后果可能是冻结或者过热。
断线检测的阈值不要设得太紧,要留出温控范围余量,否则低温或者高温工况正常数据也会误报故障。一般按传感器量程上下各放宽 2%~5% 来设定即可。
5. 常见问题与排查技巧实录
5.1 数据跳动过大:先查供电和地线
这是被问得最多的一个问题。现象是读到的温度在真实值附近大幅跳动,峰峰值超过 1℃。我的排查顺序是:先看电源。Δ-Σ ADC 对电源噪声敏感,模拟电源必须干净,ADS122U04 的 AVDD 和 DVDD 引脚附近要放 10μF 和 0.1μF 的去耦电容,电容要尽量靠近芯片引脚。然后是基准源。如果用了外部参考电阻,RREF 两端不能有高频电流流过,PCB 走线要短,周围避开开关节点。
地线处理上,模拟地和数字地最好单点连接。MCU 的数字噪声会通过地线窜进 ADC,导致转换码跳动。如果 PCB 空间允许,把 ADC 放在板子边缘,远离 MCU 晶振和开关电源,这个布局细节比很多花哨的滤波算法都有用。我见过一块板子无论怎么调滤波参数数据都在跳,最后把 ADC 从电源电感旁边挪开 1 厘米就彻底好了,这种物理层面的问题代码解决不了。
| 故障现象 | 优先排查项 | 常见原因 | 处理措施 |
|---|---|---|---|
| 数据大幅跳动 | 供电、去耦电容 | 电源噪声耦合 | 靠近引脚加 10μF+0.1μF 去耦 |
| 读数偏高且有自热 | IDAC 电流配置 | 激励电流过大引起自热 | 降低 IDAC 电流到 50μA~1mA |
| 通道切换后首个数据异常 | 切换时序 | 模拟前端未稳定 | 丢弃前两次转换结果 |
| 长时间后漂移 | 参考电阻、PCB 污染 | 电阻温漂或漏电 | 换低温漂电阻、涂三防漆 |
| 断线时控制量异常 | 故障检测逻辑 | 未做编码范围判断 | 增加阈值判断与安全输出 |
5.2 UART 误码:时序、隔离与布线
另一个高频问题:通信偶尔出错,温度数据偶尔跳一次大值。排查下来往往是 UART 信号质量问题。STM32 的 UART 输出到 ADS122U04 的 RXD 走线太长,或中间经过接插件,导致信号边沿变缓。解决方法是发送端串一个 100Ω 电阻降低振铃,接收端加一个小电容到地做滤波。波特率误差也要检查:STM32 的 UART 波特率由外设时钟分频而来,如果时钟配置不对,误差超过 UART 容限就会丢帧。
在工业环境,特别推荐在 UART 线路上加数字隔离器。ADS122U04 和传感器如果与被测对象存在电位差,共模电压可能直接烧毁芯片。隔离器的选型上,常见的容隔芯片就能满足需求,但要留足波特率余量,因为隔离器本身的传输延迟如果太大,在高波特率下会直接导致采样错误。115200 波特率下,延迟小于 1 个位周期即可,市面上多数容隔芯片都没问题。
还有一个容易忽略的:UART 发送端空闲时要保持高电平。如果 MCU 上电瞬间 TX 引脚被拉低,ADC 可能误判为起始位,进入错误状态。解决办法是在 TX 引脚加一个上拉电阻,确保复位期间处于确定电平。这种问题不遇到一次很难想到,但遇到后你会记住一辈子。
5.3 长期漂移与传感器自热
有客户反馈设备用了半年后温度显示偏高 0.5℃。这类问题一是探头老化,工业环境下 Pt100 探头可能氧化或污染;二是参考电阻和电路板上的元件老化;三是 ADC 自身长期工作后有轻微基准漂移。解决思路:固件里增加周期性自校准,利用 ADC 的自校准命令在每次上电时校准一次;设备上预留"现场校准"菜单,让维护人员用标准温度源重新标定。
还有一个特别隐蔽的自热误差:IDAC 电流太大,比如 1mA 流过小体积 NTC,传感器自身发热会让读数偏高。NTC 的阻值往往几十千欧到几百千欧,1mA 电流在上面会产生几十毫瓦功耗,足以让 NTC 自热 0.5℃ 以上。所以 NTC 测量时 IDAC 电流要降到 50μA 甚至更低,或者干脆用外部上拉电阻分压,让传感器上的功率消耗控制在微瓦级。这个问题的典型特征是:读数随测量频率升高而缓慢上升,停一会儿又降回来,这就是典型的自热现象。
同理,Pt100 薄膜探头在风机管道内走 1mA 电流没有明显问题,但如果探头是极小体积的玻璃封装,在高风速和低风速下读数也会有几毫开的差异。虽然这个差异很小,但做高精度系统时值得留意。
6. HVAC 与工业场景的工程化落地实践
6.1 HVAC 典型测点与通道分配示例
HVAC 温控系统里,一颗 ADS122U04 的 4 路模拟输入加上合理的优先级分配,可以覆盖最关键的测点。下面是一个实际项目的通道分配参考:
| 通道 | 传感器类型 | 测点用途 | 关键参数配置 |
|---|---|---|---|
| AIN0 | Pt1000 三线制 | 风管送风温度 | IDAC 500μA,PGA=8,参考电阻 5.6kΩ |
| AIN1 | NTC 10k | 回风温度 | 外部上拉分压,PGA=1 |
| AIN2 | Pt100 三线制 | 冷水供水温度 | IDAC 1mA,PGA=8,参考电阻 2.1kΩ |
| AIN3 | K 型热电偶 | 压缩机排气温度 | PGA=128,内部基准,冷端 NTC 补偿 |
这个配置的逻辑很清楚:送风和回风温度用于房间温控,供回水温差用于判断冷负荷和节能优化,压缩机排气温度用于过热保护。如果测点超过 4 路,第二颗 ADS122U04 挂在同一条 UART 总线上,驱动代码只需要按地址复制一套实例。HVAC 现场环境虽然比工业过程好一些,但也有自己的坑:变频器干扰、潮湿结露、长距离布线。风管里的传感器线往往要走 5 米以上,一定要用屏蔽线,屏蔽层单端接地。NTC 传感器在潮湿环境绝缘电阻下降会导致测量偏低,选探头时要注意 IP 防护等级。
6.2 工业长线传输与端口保护
工业测温场景和 HVAC 的最大区别在于线缆更长,50 米以上很常见,环境也更恶劣:电磁干扰、大共模电压、雷击浪涌。这种情况下,板上 ADC 直接接传感器不一定是最优方案。更常见的做法是:传感器先接变送器,转成 4-20mA 信号拉到控制柜,柜内用精密采样电阻测量电流。如果你在控制柜里用 ADS122U04 测量采样电阻电压,注意别给 ADC 输入加太高的共模电压,采样电阻两端电压通常控制在 1V 以内,配合输入滤波效果很好。
如果传感器信号确实要直接接入板载 ADC,比如铠装热电阻直接连到控制板,那么输入通道必须加保护器件:TVS 管或齐纳二极管做浪涌钳位、串联电阻限流、必要时加共模电感。UART 通信线上同样建议加隔离和浪涌保护。工业现场的故障模式是 TTL 电平芯片最容易损坏的场景,保护电路的性价比极高,千万不要省。我见过不少故障板,ADR 输入引脚被打穿,原因就是外部线缆遭雷击感应,防护器件没焊。
另外,工业现场的温差和温度变化率往往比想象中大,线缆接口处的密封和防水处理也不能马虎。冷凝水沿着线缆渗进接插件,会导致传感器线间绝缘下降,测量值出现间歇性偏移,这种问题排查起来非常耗时间。
6.3 低功耗采集策略与系统级经验
STM32L152ZD 的低功耗能力加上 ADS122U04 的低功耗设计,可以做电池供电的无线温度采集器。这类设备的功耗预算很苛刻:电池按 1000mAh 算,要工作一年以上,平均电流必须压到 100μA 以下。测量策略是:STM32 大部分时间处于停止模式,定时器周期性唤醒,唤醒后给 ADC 上电、启动单次转换、读取数据、无线发送,然后重新进入停止模式。ADS122U04 在单次转换模式下自动上电、转换、断电,平均功耗几乎可以忽略。
这种应用里有一个经验值:如果测量周期是 1 分钟,数据速率选 20SPS,整个唤醒到重新睡眠的过程控制在 100 毫秒以内,平均电流可以做到 50μA 以下。批量做无线温湿度采集器的话,一节 CR2032 电池跑一年半不成问题。低功耗设计的关键不是某个外设有多省电,而是整体时序的协调:该睡的时候必须睡透,该醒的时候动作要快,测量的时间窗要尽可能压缩。
最后再分享一个项目中的小技巧:量产时每块板子在 ICT 测试环节顺便做一次 ADC 偏移校准,把校准值写进 Flash,这样设备出厂后的初始误差会小很多。这个动作几乎不增加成本,但对最终验收时的精度报告帮助巨大。温度测量这个领域,方案的架构和细节同样重要,前期的选型、布局、保护设计做扎实了,后面的调试和售后会省心非常多。