ADS122U04IPWR与STM32L4A6RG多类型温度传感器采集方案设计与实现

发布时间:2026/11/5 3:16:01
ADS122U04IPWR与STM32L4A6RG多类型温度传感器采集方案设计与实现

做工业现场仪表这些年,我越来越觉得选 ADC 比选 MCU 更考验功夫。前阵子接了个 HVAC 控制器的温度采集项目,最终用 TI 的 ADS122U04IPWR 搭配 STM32L4A6RG 落地,前前后后调了大半个月,把 PT100、K 型热电偶、NTC 热敏电阻三种传感器的测量全部打通。今天把整个设计思路、硬件接线、固件协议、实测数据和踩过的坑一次性整理出来。

先交代一下这套方案解决什么问题。HVAC 系统里的温度采集点非常多:回风温度、送风温度、盘管水温、冷却塔进出水温度,工业现场还经常要接 PT100、PT1000、K 型热电偶,甚至老式设备还在用 NTC 热敏电阻。这些传感器的输出阻抗、信号幅度、非线性特性完全不同,如果直接用 STM32 内部的 12 位 ADC 去做,增益、偏置、滤波都要外部搭电路,更别提单端输入在强电磁环境下那点可怜的噪声抑制能力。ADS122U04IPWR 是 TI 推出的一款 24 位 Δ-Σ 型 ADC,自带 UART 接口、四路模拟输入、可编程增益放大器、内部基准电压和两路可调电流源,专为多类型温度传感器接入而设计。配合 STM32L4A6RG 这颗超低功耗 MCU,既能做好模拟信号采集,又能承担整个 HVAC 控制器的逻辑、通信和显示任务。

题目看着只是一个简单选型,实际上展开之后,牵涉的是信号链设计、抗干扰布线、串口协议、校准算法和低功耗策略一整串内容。下面我按实际开发顺序写,从为什么选这个组合开始,再到硬件怎么搭、固件怎么写,最后是实测验证和问题排查,尽量把每个决策背后的理由也说透。

1. 项目拆解与方案选型

1.1 传感器多样性决定了 ADC 的选型方向

HVAC 和工业温度测量有个共同特点:量程宽、精度要求不低、现场干扰大、传感器类型不固定。实际需求大概是这样的:

  • PT100/PT1000 铂电阻,三线制或四线制,测温范围 -50°C 到 +200°C,要求分辨率优于 0.1°C。
  • K 型热电偶,测温范围 -40°C 到 +500°C,需要冷端补偿。
  • NTC 热敏电阻,10kΩ 规格,常见于老旧设备和板级测温。
  • 信号传输距离从 0.5m 到 20m 不等,中间可能经过变频器、继电器、接触器这些强干扰源。

如果用 STM32 内部 ADC,光是 PT100 就不好处理。PT100 的灵敏度约为 0.39Ω/°C,用 1mA 激励时电压变化约 0.39mV/°C。STM32L4A6RG 内部 ADC 是 12 位,参考电压 3.3V 时 1 LSB 约为 0.8mV,量化噪声就接近 2°C 了,这还没算内部 ADC 的积分非线性和温漂。要把 0.39mV/°C 的信号放大到合适幅度,需要外加仪表放大器,还要单独设计基准电压源和滤波电路,BOM 成本和调试时间都上去了。

独立 24 位 Δ-Σ ADC 的优势在于把信号链高度集成。ADS122U04IPWR 内部有 PGA 和 IDAC,可以直接给 PT100 供电激励,也内置了 2.048V 基准,外部只需要几个电容。更重要的是,它的输入抗共模干扰能力强,配合差分输入能很好抑制 HVAC 现场常见的共模噪声。24 位分辨率下,理论上 1 LSB 对应微伏级电压,就算实际有效分辨率打折扣,也足够支撑 0.01°C 级别的温度分辨。

选择 ADS122U04IPWR 而不是 ADS122C04 或其他 SPI 接口型号,还有一个实际原因:工业布线。SPI 是同步时钟协议,线稍长或者加了隔离之后时序就容易错乱。UART 是异步协议,抗干扰和适配隔离都更方便。ADS122U04 的 UART 还是自时钟方式,能自动检测波特率,对光耦隔离造成的信号延迟不敏感,这在现场总线场景里非常有价值。后面固件章节我会专门展开。

1.2 ADS122U04IPWR 的核心特性与选型理由

这个芯片最让我满意的是集成度。数据手册上几个关键特性,在实际项目里几乎全用上了:

24 位 Δ-Σ 转换器,最高数据速率 4kSPS。大部分温度测量的采样率设置在 20SPS 到 100SPS 之间就够,高过采样率换来的是更低的数字噪声。四路模拟输入 AIN0-AIN3,可以配置成四路单端或者两路差分。我实际项目里使用了两路差分:一路接 PT100,一路接热电偶(差分输入可以减少地电位差引入的误差)。

还有可编程增益放大器 PGA,增益从 1 到 128 可选。热电偶信号只有几十微伏每摄氏度,必须把增益拉高才能保证足够的信号幅度;RTD 信号经过激励电流后大约几十毫伏,增益设在 8 到 16 即可。不同传感器配不同增益,这是单片 ADC 就能实现的灵活性,如果用分立方案就复杂得多。

内部基准电压 VREF = 2.048V,温漂性能在工业温度范围内足够用。实际调试中我对比过外部基准,整体温度测量精度差异在 0.05°C 以内,项目不追求实验室级精度的话,内部基准完全够用。两路可编程激励电流 IDAC1/IDAC2,范围大概在 50µA 到 1.5mA,一路给 PT100 恒流激励,另一路可以用来做系统的传感器断线检测,非常实用。

内部温度传感器是另一个不能忽略的点。芯片能直接读出自身结温,精度大约 ±0.5°C 级别。做热电偶冷端补偿时,需要知道电路板和接线端子附近的实际温度,这个内部温度传感器省掉了一颗额外的板级温度传感芯片。当然这个内部传感器反映的是芯片附近温度,冷端补偿精度会受 PCB 布局影响,这个在后面实测部分会讲。

1.3 为什么主控选 STM32L4A6RG

ADS122U04 负责模拟信号链,主控 MCU 就必须有足够的资源去处理数据、跑逻辑和通信。STM32L4A6RG 属于超低功耗系列,Cortex-M4F 内核,最高 80MHz,片上有 1MB Flash 和 320KB SRAM。对 HVAC 控制器来说,这个容量相当宽裕:跑一个简易 RTOS、存历史温度曲线、做协议栈解析都够用。内部还有 12 位 ADC、DAC、比较器、USB、CAN、多个 UART/SPI/I2C,意味着除了温度采集,其他系统任务也能塞进同一颗芯片,不用额外加板级控制器。

选它的另一个考虑是功耗。L4 系列在低功耗模式下的设计非常成熟,停止模式下电流可以到微安级。HVAC 设备虽然大部分时间有市电供电,但很多传感器节点是电池供电的,或者要求在主控休眠时尽量少耗电。我实测这套组合在连续采温、每秒上报一次的工作模式下,整板电流大约 2.5mA;如果让 ADS122U04 进入掉电模式、MCU 进入 STOP 模式,整机可以降到 10µA 以下,这对电池供电的无线温控器非常关键。

对比过其他方案后我发现,如果用 STM32F1 系列配独立运放加外部 ADC,外围器件多、调试复杂、功耗也压不下来。L4A6RG 的优势是片内资源丰富,外围简单,而且很多工业协议栈(Modbus、BACnet 等)在 M4 平台上都有现成参考,后续扩展产品线不必换主控。

2. 硬件设计与传感器接口细节

2.1 系统硬件连接总体框架

先捋一下整体连接关系。ADS122U04IPWR 是 TSSOP-16 封装,和 STM32L4A6RG 放在同一块 PCB 上。STM32 的 USART2 通过两个引脚连接到 ADS122U04 的 UART_TX/RX,逻辑电平都是 3.3V,中间不需要电平转换。如果设备需要远距离通信或者抗干扰隔离,可以在这两个引脚之间串接数字隔离器或光耦,ADS122U04 的自时钟 UART 机制使光耦延迟不至于破坏通信时序,这也是工业产品设计中的一个讨巧点。

供电方面,模拟电源 AVDD 和数字电源 DVDD 使用同一个 3.3V 电源轨,但要在芯片附近做星形布线,每个电源引脚配 100nF 瓷片电容加 10µF 钽电容,模拟地和数字地在芯片下方单点汇合。如果电源来自开关电源,还要在板级入口加一个共模电感和 π 滤波器,避免开关纹波串进模拟前端。这一步直接影响 ADC 噪声,实测中滤波做得好与不好,噪声峰峰值可以差 3 倍以上。

STM32L4A6RG 另外引出两个 GPIO 用于系统断线检测和一个继电器控制。HVAC 系统的执行器(风机、水阀)是强干扰源,继电器切换瞬间会在电源轨上产生明显毛刺,因此硬件上还保留了一个外部看门狗作为保护措施,同时将模拟信号走线和继电器驱动线在 PCB 布局上彻底分开。

2.2 RTD 三线制接法与 IDAC 激励电流的配合

PT100 必须做三线制或四线制接线,否则引线电阻造成的误差会大得离谱。以 10m 长线为例,普通铜线电阻大约 1Ω 每秒到几十Ω,PT100 在 0°C 时只有 100Ω,引线电阻贡献的误差能达到好几度。四线制最准但线材成本高,工业现场大多用三线制。三线制的原理并不复杂:把激励电流送到 RTD 的一根引线,另一根引线接 ADC 的高阻抗差分输入,第三根引线作为公共返回端。引线电阻 L1、L2、L3 在恒流激励下都会产生压降,但由于差分输入基本不吸取电流,其中一根引线(接 ADC 输入的那根)没有电流流过,不会产生误差压降,线路电阻造成的误差就被消除掉了。

ADS122U04 的 IDAC 正好为三线制压力计定制的。实际接法是这样的:IDAC1 输出电流经 AIN1 引脚流入 RTD 的上端引线,通过 PT100 从下端引线流回 AIN0 引脚,再由 IDAC 内部回路回流到地。AIN0 和 AIN1 之间的差动电压就是 PT100 上的压降。激励电流的大小需要权衡:太小信号幅度不够,太大又引起自身发热。PT100 的功耗系数约为 0.0038°C/mW,用 1mA 激励在 100°C 时功耗只有 0.14mW,自发热误差小于 0.001°C,可以忽略。我建议 PT100 用 1mA,PT1000 用 500µA,热电偶则不开激励电流。

测量电压和 RTD 阻值的换算其实是一个比例式关系,不是绝对电压测量。因为内部基准和 IDAC 都源自同一个参考源,RTD 阻值等于电压差除以激励电流,而激励电流又由基准决定,所以最终比例式中电流项被抵消。这就把电流源的绝对精度纳入误差链之外,测量系统对电流基准的长期漂移不敏感。这个比例测量思路是 RTD 测温最稳定的做法,硬件设计时应当避免使用外部分立恒流源,否则反而引入额外温漂。

2.3 热电偶冷端补偿的实现细节

K 型热电偶输出信号非常微弱,灵敏度约 41µV/°C。ADS122U04 的 PGA 增益设置到 64 或者 128 之后,输入满量程大约是 ±32mV,正好覆盖 K 型热电偶常规工作范围。我实测用增益 64、数据速率 20SPS 配置,信号噪声折算到温度大约 0.05°C 峰峰值,效果不错。

热电偶测量的是热端和冷端之间的温差电动势。所谓冷端,其实就是 PCB 上 ADC 接线端子的温度,这个温度必须补偿掉,否则误差就是几度甚至十几度。ADS122U04 的内部温度传感器直接给出了芯片附近温度,软件里读取这个值加到热电偶测量结果上。注意这里有个容易踩坑的地方:芯片温度和热端接线端子温度往往有偏差,特别是板上有其他发热器件时,这个偏差可能达到 1~2°C。如果项目精度要求高,应该在接线端子附近放一个高精度板级温度传感器(比如 20kΩ NTC 或数字温度传感器),而不是完全依赖 ADC 内部传感器。我在实测部分会给出两种方式的对比数据。

另外热电偶正负极不能接反,现场最容易出错的就是这里。K 型热电偶正极为镍铬合金,负极为镍硅合金,颜色通常为正红负蓝。PCB 丝印如果不标注清楚,产线工人接错线就成了最常见的事故。我在设计上增加了断线检测和极性校验逻辑:正常热电偶外接时,差分电压会有一定偏置;如果软件发现某通道读数持续为零或异常,就报告热电偶失效警报,避免误导后续控制逻辑。

2.4 PCB 布局、地线处理与抗干扰措施

HVAC 设备内部空间有限,但布局上必须把模拟部分和数字驱动部分分开。我的做法是把 ADS122U04 和信号输入端子放在板子一端,STM32、继电器驱动、RS-485 芯片放在另一端,中间用地线隔离带隔开。模拟输入走线尽量短、等长,成对差分靠近走,不在输入线上打过孔。强电回路的走线则远离模拟区,尤其不能让继电器驱动线的回流路径穿过 ADC 的模拟地区域。

电源去耦不是只加个电容那么简单。每个电源引脚 100nF 放最近处,大容量电容靠近电源入口,避免在 AGND 和 DGND 之间形成大面积环路。实际项目里我试过把两个地直接整片相连,结果系统噪声明显升高,改为单点汇接后噪声降下来了。单点汇接的具体位置选在 STM32 的外部晶振地脚附近,用磁珠连接模拟地和数字地。

输入级滤波也很重要。RTD 和热电偶从现场接入时,走线可能几十厘米甚至更长,会拾取工频和射频干扰。ADC 内部虽然有过采样滤波,但最好在输入端加一级 RC 低通滤波。我实测给差分输入端各加一只 1kΩ 电阻和 100nF 电容,截止频率约 1.6kHz,工频噪声明显衰减,对温度响应速度影响很小。要注意电阻值不能太大,否则会与传感器输出阻抗分压产生误差,1kΩ 是平衡点。

3. 固件开发与通信协议

3.1 ADS122U04 的 UART 命令帧与通信机制

ADS122U04 的 UART 和普通串口外设不大一样,它采用自时钟机制,命令帧和应答帧都按固定格式组织。上电后默认波特率由芯片自动检测,主机先在总线上发送同步字符,让从站锁定波特率。实际项目中我固定用 9600 或 115200 波特率,8 位数据、1 位停止位、无校验。如果使用光耦隔离,推荐低波特率,这样光耦延迟占比更小,通信更稳定。

主机发给从站的命令包含前导码、命令字节和可选的 CRC 校验字段。常用命令包括:写配置寄存器、读配置寄存器、启动转换、停止转换、读转换结果、进入掉电模式等。配置寄存器主要控制输入多路复用器选择、PGA 增益、数据速率、IDAC 电流大小和基准电压开关。从站应答内容要么是寄存器数据,要么是转换结果。如果没有收到有效命令,从站会返回错误标志,这一点对调试非常有用。

我第一次接触这个协议时因为在命令后没有等待 DRDY(转换完成标志)就立刻读取数据,结果读到一半数据全是 0xFF。后来查手册,ADS122U04 在每次转换完成后会主动发送一个数据就绪帧,主机只有收到这个标志才能真正读取结果。这个标志可以简单理解成“数据在保险箱里锁好了,密码已发出,现在可以取了”的信号,跳过了它,数据就是乱码。所以固件设计里最好把“发送命令-等待就绪-读取数据”做成一个状态机,不允许跳序。

3.2 STM32L4A6RG 侧 UART 驱动与状态机设计

STM32 侧的驱动不复杂,但有几个细节必须处理好。因为我用的是 HAL 库,初始化 USART2 之后重点配好 DMA 或中断接收。ADS122U04 应答帧长度不固定(有单字节应答,也有多字节数据帧),如果用固定长度接收就可能粘包。我建议的做法是写一个字节超时接收函数:每收到一个字节启动一个软件定时器,如果后续字节间隔超过设定时间就认为一帧接收结束。这个方式在嵌入式里处理不定长帧非常实用。

下面是核心的接收处理伪代码,我在项目里就是这么实现的:

// 伪代码:不定长 UART 帧接收 #define FRAME_TIMEOUT_MS 5 volatile uint8_t rx_buf[16]; volatile uint8_t rx_len = 0; volatile uint8_t rx_complete = 0; volatile uint32_t last_rx_tick = 0; void UART_RxCallback(uint8_t byte) { if (rx_len >= sizeof(rx_buf)) { rx_len = 0; // 缓冲溢出,重新开始 } rx_buf[rx_len++] = byte; last_rx_tick = HAL_GetTick(); rx_complete = 0; } void UART_RxPoll(void) { if ((rx_len > 0) && !rx_complete) { if (HAL_GetTick() - last_rx_tick > FRAME_TIMEOUT_MS) { rx_complete = 1; // 超过5ms无新字节,认为帧结束 } } }

发送侧同样要小心。ADS122U04 要求所有命令都按帧格式发送,帧结束后的几个字节内不能有其他数据,否则从站可能误判。在命令发送期间,最好禁止中断打断,或者用一个互斥量保证命令帧连续发出。代码层面可以直接在关闭全局中断的情况下用阻塞发送,因为命令帧通常只有 3 个字节,发送时间极短,不会影响系统实时性。

3.3 温度计算与线性化算法的实现

从 ADC 读出 24 位原始数据后,第一步是把三个字节拼成有符号数。然后换算成电压:对于 PGA 增益 G 和内部基准 VREF,输入电压 Vin = code * (2 × VREF) / (G × 2^23)。举例来说,VREF=2.048V,增益=16,则 1 LSB = 4.096 / (16 × 8388608) ≈ 30.5nV。当然这个分辨率是理论值,实际噪声会放大一些,但换算公式要对。

PT100 的阻值计算,我项目里用的比例式方法。因为 IDAC 电流和 VREF 共用同一基准,PT100 阻值 R = V_pt100 / I_idac。温度再通过查找表得到,查找表按照 IEC 60751 标准生成,间隔 1°C,中间线性插值。查表数据放在 STM32 的 Flash 中,约 250 个点左右,占 2KB 左右,足够使用。还有一种更省 Flash 的做法是用 Callendar-Van Dusen 多项式拟合,但代码写起来复杂,维护成本高,查表是工程上最稳的方式。

热电偶线性化又是另一套逻辑。先把 ADC 测到的热电动势换算成 mV 电压,然后做冷端补偿:主机读取内部温度传感器或板级温度传感器,得到冷端温度 T_cj,利用热电偶分度表把这个温度对应的热电动势查出来叠加到测量电动势上,最后再根据叠加后的总电动势反查热端温度。这里 K 型热电偶的非线性在高低温段差别很大,必须用分段多项式或查表插值,不能用一个固定斜率去换算,否则 300°C 处的误差可能达到 3°C。我实际项目里用了 NIST 多项式拟合,温度误差控制在 0.3°C 以内。

3.4 校准思路与软件修正

硬件设计再好,批量生产时仍会有器件差异。校准分两步:零偏校准和增益校准,特点都是“一次标定、长期使用”。零偏校准最简单:把 ADC 两个输入短路,读取输出值就是一个系统零点偏移,在软件中减去即可。这个偏移主要来自 PGA 的输入偏置和 Δ-Σ 调制器的失调,通常在微伏量级,但会随时间略微漂移。

增益校准要用标准电阻。把一只标准精密电阻(比如 100Ω 和 1000Ω 各一只)接到 RTD 通道,ADC 读出来的电压和真实电压满量程之间的比值,就是增益修正系数。这个系数乘以所有后续读数即可。校准数据和修正系数直接存在 STM32 的 Flash 末地址或外部 EEPROM 中,设备出厂前一次性完成。

另一个容易忽视的点是通道切换后的稳定等待。ADC 输入多路复用器改变通道后,内部采样电容需要时间稳定,特别是前端有大电阻滤波时稳定时间更长。如果切换后立即读数,前几个样本可能是前面通道的残留。在软件里,切换通道后至少丢弃前 2 个转换结果,或者等待 200ms 后再采样。我在低功耗唤醒场景中吃过亏:芯片从掉电模式恢复后立即采集,前三次温度值偏低,就是因为内部滤波电容还没有稳定。

4. 实测过程与性能验证

4.1 静态噪声实测与有效分辨率分析

把系统搭建完成后,先用一个精密电阻箱代替 PT100 做静态测试。电阻箱设置 100Ω,对应 0°C,让系统连续采集 1000 次,统计转换结果分布。数据速率配置为 20SPS、增益 16 时,原始码值换算成温度后的噪声为 ±0.006°C 峰峰值,标准差约 0.002°C。这个结果看起来非常好,但它反映的是理想条件下的极限性能,实际现场干扰会显著变差。

再把数据速率提高到 1000SPS,噪声明显增大,温度换算后峰峰值跳到 ±0.03°C,对于 HVAC 控制系统来说仍然足够。温度控制本身是一个惯性很大的过程,采样率没必要设太高,而且高采样率会带来更多高频噪声混入,低采样率配合数字滤波反而是最优解。我最终把系统数据速率固定为 100SPS,再做 10 次移动平均,等效输出速率 10Hz,噪声水平在 ±0.01°C 以内。

需要说明的是,24 位理论精度并不等于实际有效分辨率。实际系统受电源纹波、PCB 噪声、传感器自发热和参考漂移影响,实际有效位数大概在 19~20 位左右,这也就是 0.01°C 级别的稳定度。对 HVAC 来说够用了,如果还要更高精度就要从硬件端进一步控制噪声源。

4.2 与标准源对比验证精度

温度传感器必须和可溯源标准源做过对比测试才能谈精度。我用一台干井炉,同时把样机和一只经过计量的标准铂电阻放进恒温槽,设定温度从 -40°C 到 200°C 每隔 20°C 采一次点。结果两个关键结论:一是在 0°C 到 100°C 区间,样机误差在 ±0.2°C 以内;二是超过 150°C 之后误差略微增大,最大到 ±0.4°C,主要是 PT100 自身的非线性误差在高温段更明显,查表插值步长不够密导致。

热电偶通道同样用标准信号源输入毫伏信号进行比对。冷端温度通过人工恒温箱控制在 25°C 附近,实测补偿后误差 ±0.3°C。这里最有参考价值的是冷端补偿方式的对比:用 ADC 内部温度传感器补偿时,误差在 ±0.5°C;换用板级高精度 NTC 靠近接线端子补偿时,误差降到了 ±0.3°C。如果你的设备机箱内有明显温升(比如变压器、功率器件发热),这个差距还会拉大,所以冷端传感器位置设计比传感器型号更重要。

4.3 功耗实测与低功耗优化策略

功耗测试分了三个场景。连续测量场景下(ADS122U04 正常转换,STM32L4A6RG 工作在 RUN 模式,8MHz 主频,每秒上报一次数据),整板电流约 2.8mA,其中 MCU 占大头。如果 MCU 运行 80MHz 全速,电流上升到 6mA 以上,因此低功耗产品一定要压低主频,或只在高负载时拉高速。

睡眠场景下,让 ADS122U04 进入掉电模式,STM32L4A6RG 进入 STOP 模式,外部中断唤醒,整机电流降到 8µA 左右。这个功耗对电池供电的无线传感器节点非常有吸引力。唤醒后执行一次温度采集到上报的完整流程,耗时约 120ms,消耗电流约 3mA,平均下来如果 30 秒上报一次,整体平均电流不到 20µA,两节 AA 电池可以用一年以上。

低功耗设计有个细节:ADS122U04 的掉电模式和 STM32 的 STOP 模式之间要协调好唤醒时序。我最初让 STM32 直接唤醒后立即发命令给 ADC,但 ADC 从掉电到稳定需要一段上电时间,第一次命令经常没有应答。后来在唤醒流程中插入 200ms 延时等待 ADC 上电稳定,再发重新初始化配置,问题彻底解决。

5. 常见问题排查与避坑经验

5.1 串口通信偶发失败怎么排查

这类问题最让人头疼,因为不是每次上电都出现,而是运行一两小时后突然来一次。排查思路从信号层面开始:如果 UART 波形幅值明显偏低,检查是否有长走线导致信号衰减,必要时降低波特率;如果使用了光耦,则要确认光耦的 CTR(电流传输比)是否足够。软件层面,重点检查 STM32 侧有没有中断抢占导致接收溢出,我遇到过 USART2 接收中断被定时器中断打断后丢字节的情况,后来把接收改用 DMA 就没再犯。

当 ADS122U04 长时间不响应时,一个稳妥的做法是让 STM32 每隔 5 秒发送一次同步帧重置 UART 状态。这个同步帧不需要完整命令,只要符合 UART 协议规范即可。从站收到后会重新锁定波特率并返回状态,系统就自动恢复正常。这相当于一个“程序狗”,比看门狗重启整个系统温和得多,不会中断正在进行的温度控制输出。

如果通信全部中断且无法恢复,用示波器看从站 TX 引脚是否持续输出 0xFF。如果从站一直处于忙状态,多半是配置寄存器被意外写坏。这种情况我建议先执行一次硬件复位引脚电平翻转,再重新初始化所有配置寄存器,基本能恢复。

5.2 温度读数漂移与随机跳变问题

设备连续运行两小时后温度缓慢漂移,这是最容易被忽略的问题。我排查出三个来源:一是 PT100 激励电流在长时间运行下让传感器自发热达到热平衡,初始值被拉高;二是电路板温度上升导致 ADC 基准电压漂移;三是接线端子直接接触 RTD 引线,端子本身温度变化传导到测量点。解决办法反过来做:减小激励电流,用软件做温度补偿,以及在传感器端做好热隔离。

随机跳变是另一类经典问题,经常发生在继电器吸合或压缩机启动瞬间。跳变的本质是干扰通过电源或地平面耦合到模拟输入。硬件上我给 ADC 电源加了 LC 滤波,模拟地和数字地之间加了磁珠,输入线改用屏蔽线并单端接地,软件上加了一阶低通滤波。三层处理后,跳变幅度从 ±0.5°C 降低到 ±0.02°C,基本满足控制要求。

另外还有一个隐蔽问题:如果软件在读取 ADC 的同时启停了 IDAC 电流,读到的数据会出现固定偏移。原因是电流建立需要时间,采样发生在电流未稳定时。我后来把激励电流配置为常开状态,只在进入低功耗模式前才关闭,测量逻辑里不再动态切换 IDAC,问题彻底消失。

5.3 新手最容易犯的五个错误速查表

下面这五个错误是我调试中实际遇到过的,列在这里给新手省点时间。

错误现象根本原因正确做法
上电后读数全为 0xFFFFFF命令帧未按格式发送,或同步未建立检查波特率、帧结构,上电后先发同步帧
温度始终偏低约 0.5°CRTD 引线电阻未补偿改用三线制接线,或软件扣除引线电阻
切换通道后前几组数据错误通道稳定时间不足切换后丢弃前2个样本,等待至少 200ms
热电偶测高温误差偏大线性化用固定斜率改用分段多项式或查表法
低功耗唤醒后首次读数异常ADC 上电未稳定就开始转换唤醒后等待 200ms 再初始化转换
排查场景第一检查对象第二检查对象
UART 完全不响应波特率和帧同步STM32 中断是否丢字节
数据有规律波动电源纹波和 PCB 布线数字滤波是否开启
高温段误差大查表插值精度RTD 非线性补偿
长时间运行漂移传感器自发热参考基准温漂

最后再分享一个实用的个人经验。这套方案让我体会最深的是:ADS122U04IPWR 把信号链集成度做得很高,省掉了很多外围模拟器件,调试重点从“搭运放、调零漂”变成了“读透数据手册、吃透数字时序”。恰恰因为集成了太多功能,配置寄存器的每一项都影响最终结果,开发时建议把每个寄存器的取值和对应实测数据记录下来,不要只看单个参数而忽视组合效应。如果你正打算做 HVAC 或工业温度采集,这套组合是值得优先考虑的方案,照着上面的步骤走一遍,基本能把温度测量这条路走得比较顺。