测量温度这件事,工业现场和 HVAC 系统里永远绕不开。最近做了一个基于 ADS122U04IPWR 和 STM32L073RZ 的温度测量方案,覆盖从 HVAC 风管温湿度监控到工业设备多点温度采集的典型场景。核心思路是用 24 位 UART 接口的低功耗 ADC 配合 Cortex-M0+ 级别的 MCU,把 RTD、热电偶、热敏电阻等常见传感器信号统一处理后送入上位机或控制总线。这篇文章把选型逻辑、电路细节、协议实现和调试踩坑完整梳理一遍,适合正在做传感器采集、变送器、楼宇自控或工业仪表的朋友参考。
1. 项目定位与整体思路
1.1 这到底是个什么系统
从标题就能看出来,这不是单纯的“单片机读个 AD 值”的玩具项目。它实际上是一个多通道、可变传感器类型的高精度温度采集模块:ADS122U04IPWR 负责将传感器侧的微小模拟信号转换成 24 位数字量,再通过 UART 串行总线送给 STM32L073RZ 进行数据处理、单位换算、冷端补偿和通信转发。STM32 这边可以挂载 Modbus、RS485、现场总线或者以太网模块,把测量结果送到 DDC 控制器或者工业 PLC。
这个配置最大的价值在于,一是把“模拟前端”和“数字处理”彻底分开了,ADC 可以贴近传感器,MCU 可以远离现场,甚至通过隔离型 UART 连接;二是 24 位分辨率让微小信号测量变得从容,温度分辨率和稳定性都容易做上去。HVAC 场景里的风管温度、回水温度、房间温湿度,工业场景里的电机绕组、轴承温度、工艺管道流体温度,本质上都需要这类采集单元。
如果你只接触过 STM32 内置的 12 位 ADC,那么第一次用 24 位 ADC 时一定要调整思维。内置 ADC 适合电池电压、电流采样这类动态范围不大的场景,温度传感器却常常输出毫伏级别甚至微伏级别的信号。比如 K 型热电偶在常温附近只有约 40 μV/°C 的变化,想要分辨 0.1°C,理论上至少要 4 μV 的分辨率。普通 12 位 ADC 配合 3.3V 参考时 LSB 接近 0.8 mV,完全不够看。这就是这套系统存在的第一个理由。
1.2 为什么把 UART 型 ADC 和超低功耗 MCU 搭在一起
先说 UART 接口的 ADC。ADS122U04IPWR 属于带 UART 接口的 24 位 Δ-Σ ADC 系列,引脚上直接提供 RXD/TXD,不需要额外的 SPI 或 I2C。这一设计非常贴近工业变送器的习惯,因为串口是最容易做隔离的接口,两片数字隔离器就能把模拟区和逻辑区彻底分开。现场电源噪声和接地环路是温度测量的大敌,UART 隔离方案能把模拟地、数字地、远程参考点都处理得干净利落。
STM32L073RZ 属于超低功耗 MCU,Cortex-M0+ 内核,最大 32 MHz,但这不是选它的核心原因。核心原因是它的 USART 数量多,至少能拉出一路给 ADS122U04,另一路给外部通信,还能留一路做调试打印。另外它有独立的 12 位 ADC 和比较器,可以顺便检测供电电压、板卡温度或者做传感器开路诊断。要跑 Modbus 从机、PID 控制或者简单的显示任务,Cortex-M0+ 的算力虽然不高,但在这个系统里完全够用,功耗却比 M3/M4 低不少。
在方案权衡上,我并没有选择 STM32 内置 ADC 直接采集。原因很简单:内置 ADC 的噪声性能、通道数和抗混叠能力都有限,而且 12 位分辨率对 Pt1000 这类温敏电阻来说,在中温区间可能只有 0.2°C 到 0.5°C 的分辨率,遇到测量要求 ±0.1°C 的项目就吃力了。外挂 24 位 ADC 看似多花了一点物料成本,换来的是数倍的分辨率余量和调试便利性,项目开发周期反而缩短了。
这里顺便解释一下为什么 ADC 与 MCU 之间用 UART 而不是 SPI。SPI 需要时钟线、片选线和数据线,信号同步要求高,在长距离和隔离场景下要多走好几路穿过隔离栅,成本和故障点都增加。UART 只需要两根线,隔离器件也好选,时序上只要波特率一致就行,对时钟抖动容忍度更高。ADS122U04 正是瞄准了“智能变送器”这个市场,把数据接口做成串口,主控侧软件反而更简单。
1.3 应用场景地图:HVAC 和工业现场
先列几个典型场景,后面所有电路和软件都围绕它们展开。
- HVAC 空调箱送风温度:通常用 NTC 10k 或 Pt1000,信号引线较短,环境干扰相对可控,测量范围 -40°C 到 +80°C。
- 水系统供回水温度:暖通冷水机组和锅炉侧,常用 Pt100 或 Pt1000,可能距离 DDC 控制器几十米,走线经过强电桥架,需要抗干扰。
- 工业管道和反应釜:温度范围宽的用 K 型热电偶,最高可到上千度,必须做冷端补偿,同时要考虑传感器开路和短路诊断。
- 电动调节阀和风门执行器反馈:有时会顺带采集阀体温度做超温保护,数据量不大但可靠性要求高。
- 压缩机、风机轴承温度:往往需要多点布测,ADS122U04 的四路输入正好可以多个传感器轮询,MCU 侧做趋势判断和报警。
这些场景对测量的共同要求是“长期稳定、一致性高、易维护”。这不是堆高分辨率就能解决的,还需要合理的传感器激励、正确的接线方式、滤波网络和校零校满流程。如果只看分辨率这一个参数,很多所谓的“24 位温度表”实测表现可能还不如一片精心调试的 16 位 ADC,原因就在外围设计上。接下来的器件选型部分,我把关键点先讲透。
2. 核心器件选型解析
2.1 ADS122U04IPWR:内部到底有哪些东西
ADS122U04IPWR 是 TI 推出的 4 通道、24 位 Δ-Σ ADC,内置可编程增益放大器(PGA)、双通道电流激励源、2.048V 或 4.096V 内置基准、温度传感器以及 UART 通信接口。这里逐项分析它和普通 ADC 的差别。
首先是 24 位 Δ-Σ 调制器。分辨率优势我之前已经强调过,真正好用的一点是数字滤波器可配置,数据速率从 5 SPS 到 2000 SPS 可调,用户需要在噪声和速度之间权衡。RTD 测温使用 20 SPS 左右就能获得很干净的读数;如果是快速温度巡检,可以提高到 100 SPS 以上。实际项目中我还习惯在转换结果后端再做软件平均,那样等效分辨率还能再往上走。
其次是 PGA,可编程增益分为 1/2/4/8/16/32/64/128 等档位,信号很小的时候直接放大几百倍,让满量程匹配到传感器的常用输出区间。这个功能对热电偶尤其重要,因为常温下输出只有几毫伏。注意 PGA 的增益越大,输入等效噪声会略有变化,但总体来说 24 位底噪仍然足够应对温度传感器。不要一味追求最高增益,增益到了 128 之后,传感器引线电阻和开关电容的微小差异会被一起放大,反而不利于一致性。
然后是双通道可配置电流源。这是整个 ADS122U04 在 RTD 测量中最核心的武器。它能输出 0.5 mA 到 4 mA 的激励电流,给 Pt100/Pt1000 提供恒流激励。更重要的是,内部电流源配置成“激励源和测量通道联动”的方式后,ADC 的转换结果几乎不受激励电流漂移和电源波动影响,这就是典型的比例式测量。后面第 4 部分我会用具体公式展开,你会发现参考电阻的精度直接决定了系统精度,而不是激励电流本身。
内置温度传感器也很有用。它可以监测芯片温度,用它来做热电偶冷端补偿虽不算最理想,但在很多应用中精度足够。如果你对冷端精度要求高,可以在端子附近放一个外部 NTC,把冷端温度读回来做软件补偿。内置基准电压源默认作为转换基准,简化外围电路。但要注意,内置基准的温漂通常优于几十 ppm/°C,对一般 HVAC 场景够用。如果追求极高精度或者环境温度波动剧烈,用外部精密基准如 REF5025,再加高精度电阻分压会更安心。
2.2 STM32L073RZ:为什么是它
STM32L073RZ 的核心参数:STM32 超低功耗系列,Cortex-M0+ 内核,主频 32 MHz,片上 192 KB Flash 和 20 KB SRAM,拥有多个 USART/UART、SPI、I2C,以及 12 位 ADC、DAC、比较器、运算放大器和 LCD 驱动控制器。
在温度测量系统里,它扮演的角色是“数据汇聚和处理大脑”:接收 ADS122U04 通过 UART 发来的原始数字码,解析并换算成摄氏度,再做滤波、报警判断、记录或者对外通信。Cortex-M0+ 的指令效率和功耗都相当好,2.0V 到 3.6V 的宽工作电压,让它可以由 ADC 模块侧的系统电源直接供电,不需要额外的电平转换。
选它的另一个理由是 STM32L0 系列提供独立的 EEPROM 仿真,对校准参数、设备地址、采样间隔这类小数据的掉电保存很方便。在 HVAC 控制器里,每个通道往往要保存零点偏移、满量程增益等校准系数,EEPROM 功能省了一颗外挂存储器芯片。如果你手头的项目不需要这么多功能,也可以选封装更小、Flash 更少的同系列型号,电路和代码都可以平移。
很多人会问,用 STM32F103 行不行?当然也行,但超低功耗系列在异常复位后的不稳态更少,内部 LSI/HSI 的温漂也要小一些,对长时间温漂敏感的应用会更合适。况且 HVAC 控制器经常要满足绿色建筑认证的能耗要求,MCU 待机电流越低,整机在标准测试里的表现越好。我实测过 L073 在 STOP 模式下的电流可以低于 1 μA,这对电池供电的无线温度传感器意义重大。
2.3 传感器前端怎么匹配(RTD、热电偶、NTC、4-20mA)
不同传感器在 ADS122U04 上的接入方式区别很大,这也是整个方案里最容易出错的部分。
RTD(Pt100/Pt1000)适合采用三线或四线制。三线制需要两个电流源分别激励,抵消引线电阻影响;四线制最精确,但现场布线成本高。ADS122U04 内置的电流源可以直接支持这个拓扑。关键点是:测量结果不再依赖激励电流绝对值,而只依赖 ADC 内部基准与测量电阻的比值,这是实现高精度的基础。激励电流一般选择 1 mA,因为太大的电流会让 RTD 自热,把读数推高;Pt100 在 1 mA 下自热造成的误差可能在 0.1°C 量级,需要根据传感器厂家规格评估。
热电偶(K 型为例)输出直流毫伏信号,需要用 PGA 增益放大,通常选增益 32 或 64。因为热电偶测量是相对的,必须测量冷端温度,再用标准多项式或查找表做补偿。内置温度传感器只能当作粗略参考,工业现场如果环境温度变化超过 ±5°C,最好用外置 NTC 贴在接线端子附近。热电偶是高阻抗源,ADC 输入端需要加高阻抗路径,且不能有较大的直流偏置电流,否则会引入显著误差。
NTC 热敏电阻常用于 HVAC,便宜且响应快,但阻值随温度的曲线是非线性的。做法是用固定电阻分压,把变化转换成电压,或者直接用 ADS122U04 的电流源激励。NTC 的自热问题更突出,激励电流尽量选小,比如 0.25 mA,还要分时采样减少升温。软件里用查表加插值就能得到不错的线性度,没必要非要用高次多项式硬拟合。
4-20mA 变送器输出的是电流信号,不能直接接电压 ADC。一般在输入端并联一个精密采样电阻,比如 250Ω,转成 1-5V 电压,再接到 ADC。ADS122U04 的 PGA 和基准电压配置需要把输入范围覆盖到 1-5V。此时 LSB 对应的温度分辨率和采样电阻的温漂直接相关,所以采样电阻要选低温度系数的金属膜电阻或绕线电阻,至少 0.1% 精度,25 ppm/°C 以内。
3. 硬件电路设计与实操要点
3.1 供电与参考电压设计
先画一个很方便的电源架构:系统供电 24V(HVAC 现场常用)经 DC-DC 降到 5V,再通过 LDO 得到 3.3V 模拟电源和 3.3V 数字电源。ADC 的 AVDD/DVDD 宁可接同一路 3.3V,也不建议模拟数字各接一个 LDO,因为两个 LDO 的压差会变成共模干扰源。更稳妥的做法是在靠近 ADC 的位置并联 10μF 和 0.1μF 陶瓷电容,形成低频和高频双重退耦。
参考电压方面,ADS122U04 内置基准使用起来很方便,但注意参考电压引脚的滤波电容不要选错材质。C0G/NP0 材质的电容比 X7R 更稳定,在温度测量项目中能减少基准漂移。如果选用外部基准,例如 REF5025,需要在输出端加 RC 低通滤波,尽量减小宽带噪声对转换结果的干扰。
供电和基准的关系可以用一个很简单的经验总结:ADC 的电源纹波和基准噪声最终会折算到数字码上,温度测量想要 0.05°C 的重复性,AVDD 纹波要控制在毫伏级以下,基准噪声越低越好。这也是为什么很多仪表级设计会把模拟电源和数字电源用磁珠或电感分割,虽然严格的测试条件下有人吐槽这种分割没有实测意义,但它确实能避免高频噪声沿地平面窜入模拟区。我自己习惯的做法是:先在电源入口做一个 π 型滤波器,再用 LDO 稳压,最后在 ADC 附近放一个 2.2Ω 电阻和 10μF 电容组成的二级滤波,效果比单纯铺铜分割好得多。
3.2 模拟输入与滤波保护电路
传感器信号进入 ADC 之前,必须经过无源滤波和过压保护。RC 滤波是最常见的做法,数值要根据传感器输出阻抗和 ADC 采样开关频率计算。例如,热电偶信号输出阻抗约几十欧到几百欧,串联 1kΩ 电阻和并联 0.1μF 电容,构成约 1.6 kHz 低通截止频率,配合 Δ-Σ 调制器的过采样特性效果不错。RTD 的比例测量则需要在激励通路和测量通路都加滤波,避免开关电容抽取电流造成误差。
保护电路方面,输入端串联电阻本身就是限流保护,对 ESD 和浪涌有一定抑制。如果现场浪涌严重,可以在输入端并联双向 TVS 管,或者用一对背对背的二极管把电压钳位到电源轨。注意,TVS 电容会引入额外容性负载,高频噪声抑制能力下降,所以需要在保护等级和信号带宽之间做取舍。对 HVAC 这种室内环境,往往一级 RC 加一个串联电阻就足够;户外或工业大功率场景才需要上更强的保护。
PCB 布局时要让模拟输入端引脚远离数字信号线和 DC-DC 开关节点。ADS122U04 的四个通道在 PCB 上最好按“输入 → 滤波电容 → 芯片引脚”的顺序走线,每个输入引脚附近放一个 100nF 电容,直接回接到模拟地。不要只依赖芯片 datasheet 的参考布局,要根据自己的接线端子和传感器类型调整。比如热敏电阻距离 ADC 很近时,滤波电容可以小一点,减少响应延迟;热电偶距离远时,则要加大电容滤除长线耦合的工频干扰。
3.3 UART 通信链路与电平适配
ADS122U04 的 UART 逻辑电平通常与 AVDD 一致,如果 AVDD 是 3.3V,STM32L073RZ 的引脚也是 3.3V 容忍,就可以直接互联。但工业现场往往需要长距离传输和隔离,此时在中间加数字隔离器,例如 ISO7721 或 ISO7720,就能将 ADC 与 MCU 的地隔离。
隔离型 UART 还需要关注波特率一致性和帧格式。ADS122U04 的 UART 默认波特率可配置到最高 2.5 Mbps,但长距离隔离后的通信建议降低波特率,例如 9600 或 19200,以提高抗扰度。STM32 侧通过 USART 的 DMA 和空闲中断接收不定长数据,效率更高,也避免在阻塞等待中损失 CPU 时间。
另外,ADS122U04 的 RX/TX 引脚如果接反,现象是“配置命令回不来但又能收到噪声”,排查时第一反应最好先量 UART 波形,并确认有没有接错设备地址或帧校验字节。还有一个容易踩的坑是隔离器两侧的地如果没有良好回流路径,高速翻转的 UART 信号会在隔离栅上形成共模噪声,严重时甚至反过来干扰 ADC 读取。隔离器两侧各放一个 100nF 电源电容,MCU 侧的地尽量短粗地接到端子,能显著改善这个问题。
3.4 PCB 布局经验(接地、铺铜、走线)
温度采集系统中,地平面设计永远是最容易把人绕晕的环节。我的建议是:不要搞本地大面积无参考的“模拟地孤岛”,而是采用单点连接或者分区域铺铜。将 DC-DC、继电器、通信隔离器放在板子的另一侧或远端,并用一个磁珠或 0Ω 电阻把模拟地网络与数字地网络在 ADC 的 AGND 引脚附近连接。这里的原则就是:让高频噪声的返回路径尽量远离模拟输入路径。
在分层上,尽量让所有模拟信号和参考电压走在同一层,避免跨越分割。ADC 的 IN 引脚走线最好短而直,过孔少。如果必须跨层,在信号旁边补充地过孔,减小电流环路面积。对于 24 位 ADC,即使只是轻微的底噪声也可能造成最后 2-3 位的跳变,而这些跳变很多不是来自芯片本身,而是来自 PCB 布局不当带来的寄生耦合。
我还遇到过因为参考电容离引脚过远导致参考电压受干扰的案例。把基准电容尽量靠近 REFP/REFN 引脚,而不是纠结于“好看”的布局。这块电路往往比较“精”,动手打样前建议先做一块最小系统板验证,避免一次画完整个功能板后才发现布局问题。如果你手里的项目允许,把模拟输入端子放在板边一侧,数字通信端子放在另一侧,中间用一条完整的地带隔开,是最好的结构。
4. 软件驱动与协议实现
4.1 UART 通信协议与命令帧
ADS122U04 的 UART 协议本质上是一条串行指令总线,主机发送命令字,ADC 返回响应数据。完整的协议包括初始化序列、寄存器写操作、寄存器读操作、启动转换命令、读取转换结果等。命令帧一般由命令字节、地址或数据字节组成,并且在末尾可能带有 CRC。
以典型的一次转换流程为例:
- 主机向 ADC 发送复位命令,等待 IRDY 引脚变高表明复位完成。
- 配置 CR0 寄存器,决定输入选择、增益、数据速率和转换模式。
- 配置 CR1 寄存器,决定基准源、电流源方向和大小。
- 发送启动转换命令。
- 轮询 IRDY 或等待固定延时,读取转换结果寄存器。
- 解析 24 位二进制补码,换算成实际电压。
STM32 端建议把所有命令封装成一个小函数库,结构大致如下:
typedef struct { uint8_t cr0; uint8_t cr1; uint8_t cr2; } ads122u04_config_t; int8_t ads122u04_write_cfg(uint8_t reg_addr, uint8_t *data, uint8_t len); int8_t ads122u04_read_data(uint8_t *buf, uint8_t len); int8_t ads122u04_start_conv(void);注意,UART 接收时必须以字节为单位严格按照时序处理,两个字节之间如果有过长延时,命令可能被 ADC 判定为超时错误,导致后续状态机错乱。STM32 的 HAL 库在中断里接收,建议把接收缓冲区和状态机放在同一个结构体里,避免在中断服务函数中做长运算。协议上还可以加入设备地址字段,这样将来多个 ADC 挂在同一条总线上时,每个设备都能根据地址识别属于自己的命令,这也是工业总线设计里常见的做法。
4.2 ADC 寄存器配置与启动流程
这里给出一套具体的寄存器配置示例,适合 Pt100 三线制接法,20 SPS,内置基准,电流源 1mA:
- CR0:输入选择差分通道 AIN0/AIN1,PGA = 32,数据速率 = 20 SPS,单次转换模式。
- CR1:基准选择内置基准,IDAC1 连接到通道 AIN2(激励正),IDAC2 连接到通道 AIN3(激励负)。
- CR2:开启热电偶开路检测,或者根据传感器类型配置。
写入顺序上,建议先写 CR2,再写 CR1,最后写 CR0,因为 CR0 中的一些位涉及转换模式,在设置完其他参数后再改变转换模式可以避免状态机混乱。执行完寄存器写入后,等待约几个毫秒让内部初始化稳定。
完整启动序列可以用伪代码表示:
ads122u04_reset(); delay_ms(10); ads122u04_write_reg(2, cr2_data, 1); ads122u04_write_reg(1, cr1_data, 1); ads122u04_write_reg(0, cr0_data, 1); ads122u04_start_single_conv(); ads122u04_poll_rdy(); ads122u04_read_data(adc_bytes, 3);有些工程师习惯把命令包成“一条长 UART 帧”发送,虽然可行,但对波特率敏感。我在调试时更倾向于每条命令之间留出 200μs 到 1ms 的间隔,特别是第一次初始化时,宁可慢一点也要保证时序可靠。ADS122U04 的 IRDY 引脚可以用来判断转换完成,也可以直接等待一个固定的延时,但轮询 IRDY 是最可靠的方式,因为它不受数据速率配置影响。
4.3 数据解析与温度换算
ADS122U04 返回的是 24 位有符号数。它本质上是“参考电压相对于 PGA 放大倍数”的数字表示。假设参考电压为 VREF,PGA 增益为 G,那么输入电压可以由公式算出:
[ V_{IN} = \frac{code \times V_{REF}}{G \times 2^{23}} ]
例如,code 取 0x400000(2097152),VREF = 4.096V,G = 32,则输入电压约为 62.5 mV。如果使用 RTD 比例测量,真实电阻值还可以进一步简化计算:
[ R_{RTD} = \frac{code}{2^{23}} \times R_{ref} ]
其中 Rref 是参考电阻。这就是比例测量的优势,VREF 和驱动电流被约掉了。只要参考电阻的温漂足够小,测量结果就能保持稳定。软件里我建议直接保留原生 code,在计算显示温度时才转为浮点数,避免中间环节丢失位数。
在软件实现中,不建议频繁使用浮点运算占 CPU,而是用定点数或查表法。比如建立一个 Pt100 转温度的分段线性表,每隔 10°C 一个节点,中间用线性插值。这样执行速度快,精度也能控制在 0.1°C 以内。如果是热电偶,需要查 ITS-90 标准的热电势对照表,并在每个温度区间做二次插值,运算量稍大,但 STM32L073RZ 处理起来仍然轻松。
采样周期和滤波策略也很关键。20 SPS 的原始数据如果直接展示,会出现 1-2 个 LSB 的抖动。推荐的做法是:每 5 次原始读数取一次中值滤波,再用一阶低通平滑,例如取新的换算结果占 20%,旧值占 80%。这样可以有效抑制电磁干扰造成的尖峰,又不会让响应变得迟钝。用一句话总结,中间值滤波抗尖峰,一阶低通抗抖,两者配合使用最稳。
4.4 冷端补偿与校准算法
热电偶的冷端补偿是绕不开的难点。ADS122U04 内置温度传感器可以读芯片温度,但芯片离热电偶端子往往还有一段距离,真实的冷端在端子上。实操中的做法是在接线端子附近贴一个 NTC 或 LM75,MCU 定期读冷端温度 T_cold,然后根据热电偶类型查表得到冷端热电势 E_cold,再将当前热端测量值 E_hot 加上 E_cold,最终由总热电势查出热端温度。
这个流程听起来简单,但有几个容易忽略的点。
- NTC 本身有非线性,建议用史蒂哈特方程(Steinhart-Hart)拟合,或者至少用三阶多项式标定。
- 冷端温度采样和热端电压采样不能相差太久,否则冷端温度波动会直接成为测量误差。
- 接线端子的温度梯度不能太大,端子金属体本身要尽量散热均匀。如果周围有风扇强吹,温度稳定时间会很长。
- 如果冷端在端子排上,但 NTC 贴在 PCB 板上,中间存在 1-2°C 的系统偏差,此时必须做一次偏移标定。
校准方面,工业温度仪表常采用“零点 + 满度”两点校准。零点用精密电阻箱模拟 0°C 时的传感器阻值,满度用对应 100°C 或 500°C 的标准信号。校准系数存入 STM32 的 EEPROM 仿真区。我在项目中还会额外做一次“通道间一致性校验”,因为四路模拟输入虽然用的是同一个 ADC,但不同通道的输入通路不经过同一个电容,可能存在零点偏差。把四个通道短接同一电压后,每个通道记录一个补偿偏移,应用时减去即可。
校准算法写完以后,要看重复性而不是单次精度。把传感器放到恒温槽里,设定 50°C,每 10 秒记录一次读数,连续跑 30 分钟,看看极差是多少。如果读数在 ±0.05°C 以内波动,说明系统噪声和滤波策略是健康的。不要只盯着某个时刻的数据好不好看,温度测量的价值就在于长期可信。
5. 常见问题与排查技巧实录
5.1 通信不上/数据错乱
UART 通信问题在初调时最常见,症状通常是 MCU 收不到 ADC 的任何响应,或者返回数据全是 0xFF、0x00。排查顺序是:
- 用示波器或逻辑分析仪看 ADC 的 TX 引脚有没有正确输出,重点观察波特率是否匹配。有些用户把内部采样波特率和 UART 波特率混为一谈,ADC 实际输出的帧率可能远小于预期。
- 检查帧格式。ADS122U04 默认带 CRC 或校验位,如果 MCU 配置成无校验模式,收到的数据就会排列错位。
- 检查复位引脚和 IRDY。复位后 ADC 会进入一段静默期,这段时间发命令无效。
- 检查命令地址。ADS122U04 的设备地址或命令字如果与实际版本不符,也会静默失败。
我遇到过一次很隐蔽的问题:MCU 的串口时钟源配置错,导致实际波特率比理论值偏了 2.4%,命令偶尔能通,偶尔不能通。此类故障在 115200 以上波特率时尤其明显,建议先用 9600 验证通路,再逐步提速。如果板上同时有外部晶振和内部 RC,确认 STM32 的 USART 是用哪一个时钟源,必要时校准内部 RC。
5.2 噪声过高/读数漂移
如果读数跳变超过预期,优先检查电源和地。用差分探头看 ADC AVDD 上的纹波,很多情况下干扰是 DC-DC 的开关频率耦合进来的。对策是加大储能电容,或者把 DC-DC 的开关频率尽量移出 ADC 数字滤波器的通带。如果我测到 DC-DC 开关频率是 400 kHz 左右,而 ADC 数字滤波器带宽也在这个范围,就很麻烦,因为数字滤波器拦不住带内噪声。
如果只是某一路输入噪声高,而其他路正常,多半是那一通道的滤波电容损坏或布局太差。也可能是传感器引线形成了环路,感应到了工频磁场。把传感器的两根线双绞起来,噪音往往立刻下降。另外,高阻抗传感器非常怕潮湿,PCB 板上的漏电流会以 pA 级影响数据。采用三防漆涂覆或者防潮处理能显著减小长期漂移。
读数漂移则更可能与温度有关。如果基准电压是内置的,而芯片周围有风机或空调气流,基准温度每变化 10°C,就可能引起数 ppm 的漂移。对要求高的场景,把基准改为外置,同时让芯片远离热源。还有一个常被忽略的点是,RTD 的引线电阻会随环境温度变化,如果三线制的两根激励线长度不一致,漂移会更明显。现场布线时尽量让激励线和测量线等长、同路径敷设。
5.3 传感器开路/短路检测
工业应用中不能只测温度,还要能识别故障。热电偶开路时,ADC 输入悬空,读数可能接近满幅或随机跳动。ADS122U04 内置的开路检测功能就是为此设计的,在配置寄存器里使能检测电流源后,如果没有传感器回路,ADC 会被拉到固定电压区间,MCU 据此上报故障。
RTD 短路和开路也要区分。三线制 RTD 如果激励线和测量线短路,读数会变成接近 0Ω;开路时读数会接近参考电阻对应的满量程。可以在软件里做阈值判断:温度超出量程两端各 5% 就报故障。4-20mA 回路断开,采样电阻上电压归零,对应输入码也归零,这本身就说明了断线状态。
故障诊断最重要的一点是“不要只读一次就断定”,要连续读几次并确认状态一致,避免偶发干扰引起误报。另外,每路通道都要有独立的故障状态位,方便远程维护。我通常还会把每个通道最近 10 次有效采样值的平均值和方差保存在 RAM 中,一旦方差突然扩大,即使没有超过量程,也可以给出“异常波动”警告,这种预警在处理风机启动、继电器动作等瞬态干扰时很有效。
5.4 经验速查表
| 现象 | 可能原因 | 快速检查方法 |
|---|---|---|
| UART 无响应 | 波特率/帧格式不匹配 | 逻辑分析仪抓 TX,对比字节时序 |
| 数据全 0xFF | RX/TX 接反或命令字不对 | 检查接线、设备地址 |
| 噪声偏高 | 电源纹波、输入端滤波不足 | 示波器看 AVDD,调整 RC 位置 |
| 读数缓慢漂移 | 热敏元件温度变化、基准漂移 | 记录环境温度曲线,对比漂移趋势 |
| 传感器开路误报 | 使能了开路检测但电流源没配置 | 确认 IDAC 配置和检测回路 |
| 自热偏差 | 激励电流过大 | 减小 IDAC 到 0.5mA 或 0.25mA |
| 通道间读数不一致 | PCB 漏电或电容老化 | 短接四个输入端做一致性测试 |
6. 从方案到产品:影响范围与可扩展性
6.1 从开发板到量产固件的迁移
很多人拿到 ADS122U04 的 EVM 跑通以后,就直接把 demo 代码搬到自己的产品里,这是有风险的做法。开发板上有优秀的电源设计、稳定的参考电压和标准的数字接口,而你的产品主板可能塞进了继电器、开关电源、蓝牙模块,噪声环境完全不一样。我正在用的这套配置之所以在 HVAC 和工业现场都稳定,是因为我把硬件设计规范和软件滤波策略一起做到了最小系统里,而不是只在实验台上调通。
量产固件还需要处理看门狗、掉电保存和出厂校准。STM32L073RZ 的独立看门狗可以防止 ADC 通信异常导致系统卡死,建议在每次 UART 通信超时后喂狗,但不要在主循环里裸奔喂狗。掉电保存要做到写入 EEPROM 前先做 CRC 校验,避免写了一半掉电造成参数损坏。出厂校准时,可以把校准系数和固件版本、硬件版本一起打包成一个信息块,这样现场升级固件后不会被覆盖,保证测量数据连续性。
6.2 直接扩展为多设备总线系统
ADS122U04 是 UART 型 ADC,天然适合组合成多点测量网络。一种做法是每个温度采集点都用一个 ADS122U04 加一个便宜的 MCU,采集点之间用 RS485 总线连到网关;另一种做法是若干个 ADC 共享一条 UART 总线,通过地址帧区分设备。第二种方案更省 MCU,但需要协议上支持。很多变送器产品就是第二种方案的实例,只不过 ADC 藏在变送器内部,对外用 HART 或 Modbus 通信。
如果要在多设备总线系统中保持高精度,一个容易被忽略的问题是“参考地电位差”。现场节点距离几百米时,各个设备的地电位可能有 1-2V 的差异,RS485 收发器可以容忍一部分共模电压,但 ADC 的模拟地如果直接与远端传感器地相连,就会引入非常大的工频干扰。正确处理方法是:传感器和 ADC 的模拟地局部连接,通信链路使用隔离式 RS485 接口,让数字地成为系统之间的唯一连接点。
6.3 现场数据分析和远程运维
这套方案运行稳定之后,更大的价值在于数据分析。比如将送风温度、回水温度、室外温度放在同一个时间轴上,可以做出空调箱的效率曲线,发现水系统供回水温差过小等问题。工业现场则可以把多个轴承温度的历史趋势放在一起,通过温升速率提前预警设备故障。STM32L073RZ 可以保存最近 1000 条带时间戳的记录,配合远程通信模块,就能实现轻量级的预测性维护。
最后再说一点个人的体会。这套是 ADS122U04IPWR 与 STM32L073RZ 的搭配方案,从原理图到固件已经在好几类项目里复用,最大的心得是:不要为了省一颗电阻或电容牺牲测量底噪,也不要为了让 ADC 跑在最高速率而丢掉稳定性。温度测量系统表面上看是硬件的问题,实际上大部分坑都出在软件时序和系统集成上。真到了现场调不通的时候,把采样速率降到 20 SPS,把波特率降到 9600,先排除最基本的通信和干扰因素,再逐步优化,会比抱着侥幸心理改参数有效得多。