ADS122U04+STM32F303多点温度采集方案与调试经验
做工业控制和暖通空调(HVAC)的人都知道,一套系统里最容易让人头大的往往不是电机驱动,不是通信协议,而是温度。这个动不动就看“小菜一碟”的物理量,换了不同传感器、不同现场工况,能把人折腾到怀疑人生。我最近刚完成一套基于 TI ADS122U04IPWR 独立 ADC 配 STM32F303ZE 主控的多点温度采集方案,落地在工业现场和 HVAC 系统里,整体跑下来效果不错,过程中也跳过不少坑。这篇就把完整思路、关键电路、固件实现和调试经验一次说清楚。
ADS122U04 是 TI 一颗 24 位 ΔΣ ADC,特点是把 UART 接口和 ADC 做在了一起,内部还集成了 PGA、激励电流源 IDAC 和低温漂基准源。STM32F303ZE 是带浮点运算单元和大量模拟外设的 Cortex-M4 主控,两者搭配,特别适合做“小信号模拟前端 + 多点温度采集”这种场景。这篇文章不会只讲怎么点亮芯片,还会把为什么这么选型、信号链怎么搭、读数怎么换算成真实温度、校准到底怎么做、现场常见的玄学故障怎么排查,一步到位地聊完。
1. 项目整体设计与方案选型
1.1 为什么放着 STM32F303 内部 ADC 不用,非要外挂一片独立 ADC
STM32F303ZE 的模拟资源在同级 MCU 里算是豪华的:多个 12 位 ADC、内置运放和比较器,采样率能跑到 5 MSPS。很多刚接手项目的朋友第一反应就是:主控 ADC 这么强,直接采不就行了?实际做下来你会发现,12 位分辨率在 0~100℃ 量程内,1 LSB 对应大约 0.05℃ 到 0.1℃,看起来够用,但这是理想情况。
工业现场和 HVAC 的真实场景里,温度探头往往离主控板好几米远,信号线一路走过去会叠加共模干扰、差模噪声,线缆自身的电阻也会随温度变化。这时候再用 MCU 内部 ADC 直接采,等于把脆弱的小信号和一堆数字噪声放在同一块芯片里的同一个硅片上处理,精度上限基本锁死了。另外,多点测温时如果用内部 ADC,就得做模拟开关切换,每路信号的激励电流也不好统一管理,校准系数要维护一大套。
外挂 ADS122U04 的思路是把“模拟难题”扔给一颗专业的 ADC 芯片解决。它内部有 24 位 ΔΣ 调制器、可编程增益 PGA、双路 IDAC 激励源,支持 2 线/3 线/4 线 RTD 和多种热电偶/热敏电阻测温方案。同时数字接口是 UART,这样 ADC 可以直接贴近传感器放置,只把数字信号传回主控,抗干扰能力完全不是模拟长线能比的。说白了,这是把模拟域的问题,在源头用数字域的方式解决掉。
1.2 选型对比:ADS122U04、ADS1220、ADS1115、内部 ADC
手边能用 ADC 的方案其实挺多的,我做选型表对比时核心看四件事:分辨率、模拟前端集成度、接口方式和激励电流源。下面这个表格可以直接抄走:
| 方案 | 分辨率 | 接口 | 集成 PGA | 激励电流源 | 内部基准 | 适合场景 |
|---|---|---|---|---|---|---|
| ADS122U04 | 24 位 | UART | 有(1~128 倍) | 有(双 IDAC) | 有(低温漂) | 工业级多点测温、RTD/热电偶 |
| ADS1220 | 24 位 | SPI | 有 | 有(双 IDAC) | 有 | 单板近距离测温 |
| ADS1115 | 16 位 | I2C | 有(1~16 倍) | 无 | 无 | 消费级、低成本单点测温 |
| STM32F303 内部 ADC | 12 位 | 内部总线 | 有运放但精度受限 | 无 | 无 | 快速采样、非精密测量 |
为什么没选 ADS1220?ADS1220 本身是颗好芯片,但 SPI 接口在工业现场做长距离传输时要额外做隔离和电平转换,还得占用主控的 SPI 外设。而 ADS122U04 用 UART 之后,主控随便挑一个串口就能带,两根线走下去,需要隔离时加一对数字隔离器也很顺手,可以一条 UART 总线上挂多个带地址的芯片,扩展性明显更好。
为什么不选 ADS1115?它在低成本场景很香,但没有激励电流源,做 RTD 测温还得外部搭建恒流源,基准电压也依赖外部,整体精度和温度漂移做不到工业级。ADS1115 也就是 16 位,换算到温度分辨率大约在 0.01℃ 级别,看着不错,实际被噪声和基准漂移一拖,很难稳定做到 ±0.5℃。ADS122U04 的优势在于 24 位分辨率配合内部基准和 IDAC,比例式测量可以直接抵消电流源漂移,这是我能把精度做到 ±0.2℃ 的基础。
1.3 系统架构一句话概括
这套系统的信号链是这样的:温度传感器(PT100/PT1000/NTC)→ ADS122U04 模拟前端(PGA + ΔΣ 调制器)→ UART 总线(隔离)→ STM32F303ZE 主控 → 数据滤波、线性化、校准 → 输出到显示/总线/云平台。ADS122U04 负责把“模拟世界的烦恼”压缩成干净的 24 位数,STM32F303ZE 负责“数学世界的账目”——线性化、滤波、协议栈、故障诊断全在这一层。两层职责分离,调试时能快速定位问题:读数不对,先看 ADC 原始码对不对;原始码对了温度不对,就是算法或校准的问题。
2. 硬件设计核心细节:从传感器到主控的完整链路
2.1 温度传感器选型与比例式测量原理
工业现场用得最多的是 PT100 和 PT1000,两者本质都是铂电阻,0℃ 时电阻分别为 100Ω 和 1000Ω,温度升高阻值近线性增大。PT100 灵敏度约 0.385Ω/℃,PT1000 约 3.85Ω/℃,PT1000 信号幅度大、导线电阻影响小,HVAC 系统里我更喜欢用 PT1000。
热电偶则是另一种逻辑,它输出的是毫伏级电压信号,需要冷端补偿,适合 -200℃ 到 1300℃ 这种宽量程场景。热敏电阻 NTC 便宜,但非线性大、一致性差,只适合 -40℃ 到 150℃ 之间的家用级 HVAC 应用。
这里要重点讲比例式测量,它是 ADS122U04 干 RTD 活儿的灵魂。比例式的思路是:用同一路 IDAC 电流源同时流过传感器和一只精密基准电阻,然后把传感器两端电压接到 ADC 的差分输入端,把基准电阻两端电压接到 ADC 的参考电压输入端 RREF。这么做的好处是,ADC 最终的转换结果是传感器的电阻与基准电阻的比值:
R_sensor = ADC_CODE × R_REF / 2^23
注意,电流源 IDAC 在这个式子里被消掉了。也就是说,即使 IDAC 电流随温度漂移了 10%,只要基准电阻够稳定,读数几乎不受影响。这是一个非常优雅的设计,也是用自带 IDAC 的 ADC 做精密测温时最该用好的一个点。
接线方面,2 线接法最简单但导线电阻串入测量路径,3 线接法可以抵消大部分导线电阻,4 线开尔文接法最精确但线缆多,在 HVAC 这类工程场景里性价比不高。我做时采用 3 线 PT1000,配合 ADS122U04 的 IDAC 路由到对应引脚,开尔文原理一样,工程上效果已经足够好。
2.2 ADS122U04 外围电路设计
ADS122U04 的外围电路不复杂,但有几个地方马虎不得。首先电源:模拟电源 AVDD 和数字电源 DVDD 我习惯都接 3.3V,每个引脚旁边放一个 0.1μF 陶瓷电容,再在板级加一个 10μF 钽电容做低频去耦。基准电压这块,如果采用内部基准,需要确认内部基准的启动时间和稳定时间,别在刚上电就启动转换,前几条读数大概率是跳的。
IDAC 配置是关键。激励电流值选择要兼顾功耗和信号幅度。PT1000 我选 250μA 或 500μA,在 0℃ 时传感器电压分别约为 250mV 或 500mV,这个幅度配合 PGA 增益 1~4 倍,能让信号充分发挥 24 位 ADC 的动态范围,又不至于接近电源轨。激励电流越大,传感器自热越明显,PT1000 在小电流下的自热功率是 250μA² × 1000Ω = 0.0625mW,在空气中温升几乎可以忽略,这是它比 PT100 好用的一点。
输入端滤波很重要。我在 AINP/AINN 各串联 10Ω 电阻,再对地并联一个 1000pF 电容,构成简单的低通滤波。这个阻容组合一是滤掉工业现场的射频干扰,二是为 ΔΣ 调制器的采样电容提供电荷。两个引脚间再并联一个 1nF 电容,差模滤波就完整了。滤波阻容太大会让信号建立时间变长,影响转换精度;太小又滤不掉高频干扰,10Ω 到 1kΩ、1nF 到 10nF 是我实测比较平衡的范围。
UART 接口部分,ADS122U04 的 UART 电平逻辑是标准 3.3V 电平,直接用 STM32F303ZE 的 USART 引脚相连即可。如果需要长距离传输或强电共地风险,一定要加数字隔离器。我用的是 ISO7721,把电源地和信号地彻底隔开,能直接解决现场最让人头疼的“地环流”问题。UART 波特率我选 115200,ADS122U04 支持这个速率没问题,ST 主控那边也稳定。
地址配置引脚 A0~A3 用来设定芯片地址。单芯片时可以直接固定,多芯片挂在同一条 UART 总线上时,这 4 个引脚就决定了每颗芯片的地址,必须用上下拉电阻配置好,上电前确定,不能再改。做多节点扩展时,这也是最值得提前规划的寄存器类型。
2.3 与 STM32F303ZE 的连接与资源分配
STM32F303ZE 这颗 144 脚芯片资源多到用不完,我在设计时做了明确的资源分工。UART 选了 USART2,因为它在芯片上正好挨着我预留的隔离器位置,布线最短。主控端启用 UART 的接收 DMA 通道,配合空闲中断,可以不用 CPU 干预就把一串完整的数据帧收下来,CPU 腾出来跑显示刷新、通信协议栈和故障判断。
GPIO 分配上,每一颗 ADS122U04 还接了一个 DRDY 输出脚,用来指示转换完成。这里我必须强调,ADS122U04 的 UART 不像 SPI 有独立的 DRDY 引脚,但是可以通过查询状态字节或配置寄存器判断数据更新。实际做时我习惯用一个普通 GPIO 接 UART 侧芯片的某个状态输出脚,读到电平拉低再读数据,这样每次读到的都是最新转换结果,不会出现重复读旧数据的问题。
模拟地 AGND 和数字地 DGND 的处理上,我采用的是一整块地平面方案,不在 AGND/DGND 之间直接割裂。现代 ΣΔ ADC 的共模抑制能力足够强,刻意分割地平面反而会引入跨分割的阻抗,造成新的噪声源。唯一的注意事项是模拟部分的走线要远离数字信号线,尤其是 UART 的 TX/RX 线,不要在 ADC 引脚下面走。
2.4 PCB 布局与抗干扰要点
PCB 布局这块,我踩过不少次回头坑。传感器输入端 AINP/AINN 是整块板上最敏感的网络,从连接器到 ADC 引脚的走线要短、要对称,差分走的上下距离一致,这样共模干扰才能被 ADC 的差分结构抵消。
IDAC 电流源从 ADC 流出后,走线也要避开数字区,避免阻抗变化导致电流分配不平衡。基准电阻 R_REF 我用的是 0.1% 精度、25ppm/℃ 温漂的金属膜电阻,放在 ADC 引脚附近,保证温度一致,避免基准电阻自身温差造成额外的漂移。
另一个容易被忽略的点,是 UART 总线的终端匹配。虽然 UART 速率不高,但在干扰强的工业现场,总线如果超过 20cm,建议串一个 33Ω 或 100Ω 的阻尼电阻,减少信号振铃。之前做的一个样机,把 UART 线走了 50cm 还没有加匹配,现场一开变频器,通信直接乱码,加上电阻后彻底解决。
3. 固件实现:驱动 ADS122U04 的完整流程
3.1 通信协议基础:命令帧与寄存器
ADS122U04 的 UART 协议不复杂,核心就三种操作:写寄存器、读寄存器、启动取出转换数据。每条命令由主控发出,帧格式固定为几个字节,地址和命令字节在最前面,数据字节跟随其后。
上电后,我习惯先向复位寄存器写入复位命令,让芯片回到已知状态,然后等待内部振荡稳定。接着按顺序配置四个配置寄存器——配置寄存器 0 管 PGA 增益和输入多路复用选择,配置寄存器 1 管数据速率和模式,配置寄存器 2 管参考电压和 IDAC 电流,配置寄存器 3 管 IDAC 路由和温度传感器控制。这样分门别类设计,方便后期修改单个参数,不用把配置打成一团。
我做的初始化序列大致是这样:
uint8_t adc_cmd[4]; // 写配置寄存器0:AINP=AIN0, AINN=AIN1, PGA=1 adc_cmd[0] = 0x40 | 0x00; // 写命令 + 寄存器地址 adc_cmd[1] = 0x00; // AINP0/AINN1 adc_cmd[2] = 0x00; adc_cmd[3] = CRC_PLACEHOLDER; adc_send(adc_cmd); // 写配置寄存器1:数据速率 20SPS,普通模式 adc_cmd[0] = 0x40 | 0x01; adc_cmd[1] = 0x00; // 20SPS adc_cmd[2] = 0x00; adc_cmd[3] = CRC_PLACEHOLDER; adc_send(adc_cmd); // ... 依次配置寄存器2、3,最后启动转换这里要注意,ADS122U04 的命令帧中有校验字节,具体算法在数据手册里给了示例。我建议直接参考手册里的 CRC 计算代码,不要自己发明。上电后的第一条命令如果报 CRC 错,先确认是不是波特率不匹配或总线被占用了。
3.2 读取转换结果:状态字节与 24 位数据串联
ADS122U04 的转换结果由 4 个字节组成,前一个是状态字节,后三个是 24 位数据。状态字节里最高位指示数据是否就绪,低四位可能携带故障标志。这里有个实操技巧,很多第一次用的人忽略:即使状态字节显示数据未就绪,UART 也会返回数据,只不过可能是旧数据。所以代码里一定要先判断状态字节的 DRDY 位,再做后续处理,避免用旧数据去算温度。
我在 STM32F303ZE 上是用 DMA 接收四字节帧,接收完成后在 DMA 传输完成中断里解析。关键代码如下:
// DMA接收完成回调,解析4字节帧 void UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART2) { uint8_t status = uart_rx_buf[0]; if (status & 0x80) { // DRDY 位为1,新数据可用 int32_t raw = (uart_rx_buf[1] << 16) | (uart_rx_buf[2] << 8) | uart_rx_buf[3]; if (raw & 0x800000) raw -= 0x1000000; // 24位符号扩展 temp_raw_ready = 1; temp_raw_value = raw; } } }数据字节的顺序是高位在前,三个字节拼出来的是一个 24 位有符号数。如果传感器输出的电压信号可能为负(比如热电偶冷端补偿前的测量端低于参考端),这个符号扩展就不要漏,否则负温度会被算成正的大数。我见过好几个工程师在这里翻车,读数显示 400℃ 这种离谱值,排查半天发现是符号位扩展写错了。
3.3 两种读取模式:轮询和 DMA 中断
数据读取模式我做了两种。第一种是轮询模式,主循环里每隔一段时间去读一次状态字节,适合系统简单、通道少的情况。第二种是 DMA + 空闲中断模式,UART 接收完一帧自动触发中断,适合多通道高速轮询。
轮询模式最需要注意的是别读太频繁。ADS122U04 在 20SPS 下,每个数据周期是 50ms,如果主循环 5ms 就发一次读命令,UART 上一大半流量都是无效的,而且 MCU 的 CPU 占用率上去了。所以轮询周期设置成和采样率匹配,比如 20SPS 用 50ms 定时触发读一次。
DMA 模式我配合了 UART 空闲中断,处理逻辑是这样的:STM32F303 的 USART 在接收完一帧后检测总线空闲,触发 IDLE 中断。在中断服务程序里查看 DMA 已接收的字节数,如果等于预期的帧长,就处理数据,然后重新开启接收。这套机制稳定且省电,适合未来扩展成多节点的总线式架构。
3.4 温度换算的完整公式与代码实现
拿到 24 位原始码之后,要把码值换算成真正的温度。这里分传感器类型讨论。
如果是比例式 RTD 接入,前面推导过:
// R_REF 是精密基准电阻阻值,单位Ω double rtd_resistance = (double)raw_code * R_REF / 8388608.0;然后根据 PT100/PT1000 的电阻-温度特性反算温度。最标准的做法是查表加插值,将 -50℃ 到 250℃ 按每 5℃ 一个点预置一个电阻值表,运行时用线性插值。这种方案不依赖复杂的数学公式,查表 + 插值误差在 0.05℃ 以内,工程上完全够用。
如果要做高精度,可以用 Callendar-Van Dusen 方程的反函数,它描述了铂电阻的电阻-温度关系:
R(t) = R0 × (1 + A×t + B×t² + C×(t-100)×t³)
其中 A、B、C 是铂的特定系数。实际写固件时,我不建议直接求这个方程的反函数,太慢。更实用的做法是用牛顿迭代法迭代求 t,把 R 当输入,逐步收敛到目标温度,迭代三次就能到很高精度。
如果是 NTC 热敏电阻,公式就简单得多:
1/T = 1/T0 + (1/B)×ln(R/R0)
其中 T 是热力学温度,T0 是 25℃ 对应的开尔文值,B 是热敏电阻的 B 值常数。这个公式算出来的精度大约在 ±0.5℃,做 HVAC 室温控制够了。
热电偶的处理更麻烦一些,因为 ADS122U04 只能测电压,冷端补偿需要另外再加一个测量冷端温度的传感器。我在每块板子的冷端位置放了一颗 NTC,先测冷端温度,再用热电偶型号对应的 NIST 多项式做反向插值找冷端对应的电压,把它加到测量电压上,最后再正向查多项式得到热端温度。流程稍复杂,但转换精度能到 ±0.3℃ 左右。
3.5 固件的分层设计与可维护性
这套固件我没写成一坨 main 函数里的大杂烩,而是按库方式分了层。最底层是 UART 驱动,负责收发原始字节和 CRC 校验。第二层是 ADS122U04 驱动,封装了写寄存器、读数据、初始化这些命令。第三层是传感器算法层,把原始码换算成电阻,再换算成温度。第四层是应用层,处理通道调度、故障上报和通信协议。
这种分层最大的好处是以后换传感器类型,只需要改第三层,驱动文件和硬件文件都不用动。比如这次项目要加一路热电偶,我在算法层加了一个 chan_type 枚举,应用层配置成热电偶类型,驱动层完全不用改,两天就能联调完。做产品和做项目最大的区别就在这,分层留下来的是长期的可维护性。
4. 校准、误差分析与测试验证
4.1 误差源从哪里来
做精密测量,先得搞清楚误差都藏在哪儿。ADS122U04 的误差主要来自这几部分:ADC 本身的失调电压和增益误差、参考电压的温漂、PGA 的温漂、外部电路(基准电阻、滤波器电容)的误差、传感器自身的误差以及自热效应。
失调电压导致的是零点偏移。如果传感器是 PT1000,0℃ 时读出来的电阻不是 1000Ω,而是 1003Ω,这多出来的 3Ω 就是失调误差。对 24 位 ADC 来说,失调主要来自输入多路复用器和 PGA 的偏置电流,数值通常不大,但对精密测温它就能毁掉整个精度。
增益误差则是放大倍数不准。PGA 的理论增益是 1 倍,实际可能是 0.998 或 1.002,这会导致整个量程被拉伸或压缩。对温度测量来说,增益误差在 0℃ 附近影响不明显,越往量程两端走误差越大——表现为“两头漂”的现象。
温度漂移则是另一个维度。芯片内部的基准电压和放大器会随环境温度变化,ADS122U04 的数据手册会给这些参数一个温漂系数,设计时用最坏情况估算,确认系统规格是否达标。外部基准电阻如果是普通 100ppm/℃ 的,温度每变化 10℃ 就可能带来 0.1% 的误差,所以我强制要求用 25ppm/℃ 以下的精密电阻。
4.2 校准方法:从单点偏移到两点增益校准
对付失调最简单的办法是空载校准。将 ADC 的差分输入短路,让 ADC 测量一个零电压信号,此时读到的值除以转换系数就得到零点偏移。把这个偏移记录到一个系数变量里,后续所有测量结果都减去它就完成了一阶零偏校正。
对付增益误差,需要做两点校准。用精密电阻箱或标准电阻,分别模拟传感器在低温端和高温端的阻值,比如 0℃ 对应 1000Ω 和 100℃ 对应 1385.6Ω(PT1000)。在每个校准点读取 ADC 原始码,算出实际增益和理论增益的比值,保存为增益校准系数。运行时把原始码先减去零点偏移,再乘以增益系数。这套两步校准做完,可以把系统误差压到 0.1℃ 级别。
我实际做的校准流程是这样的:
- 将输入接线端接精密电阻箱,设为 1000.00Ω(模拟 0℃)。
- 等待 ADC 稳定,记录 50 次读数的平均值,计算零点偏移。
- 将电阻箱设为 1385.60Ω(模拟 100℃)。
- 等待稳定,记录 50 次读数平均值,计算增益系数。
- 把两组校准系数写入片内 EEPROM 或 Flash 存储区,下次上电直接加载。
校准用的标准电阻精度最好达到 0.01%,这是整个链路里的天花板。所有校准都基于这个参考,它不准,后面全白搭。
4.3 实测数据与噪声表现
我在实验室里用干井炉和铂电阻温度计做了对比测试,从 0℃ 到 120℃ 每 20℃ 取一个点,每个点采集 100 次连续读数,统计平均值和标准差。下面这组是 PT1000、PGA=2、20SPS 模式下得到的数据:
| 设定温度 (℃) | 系统读数均值 (℃) | 标准差 (℃) | 与标准温差 (℃) |
|---|---|---|---|
| 0 | 0.03 | 0.012 | +0.03 |
| 20 | 19.98 | 0.011 | -0.02 |
| 40 | 40.05 | 0.013 | +0.05 |
| 60 | 60.02 | 0.010 | +0.02 |
| 80 | 79.96 | 0.012 | -0.04 |
| 100 | 100.05 | 0.014 | +0.05 |
| 120 | 120.03 | 0.013 | +0.03 |
温度测量噪声方面,20SPS 下的标准差约 0.012℃,折算到有效分辨率约 15~16 位,这对工业 HVAC 应用已经是很扎实的水平。如果把数据速率降到 20SPS 以下,噪声还能再低一些,但响应时间会变长,不太适合需要快速响应的 HVAC 控制回路。0.012℃ 的标准差配合校准后 ±0.05℃ 的偏差,整条信号链的精度基本达到设计上限。
5. 常见问题与排查技巧实录
5.1 UART 通信不上,主控收不到应答
这个大概是调试期最经常碰到的问题。排查顺序我建议先把主控 UART 发送的每个字节抓下来,比对波形里每一位的电平和时间。ADS122U04 的 UART 格式是 8 数据位,无校验,1 停止位,如果这边开了校验位或者停止位配置不对,芯片根本不会回应。
再检查电平,确认 RX 和 TX 有没有接反。ADS122U04 的 RX 接主控 TX,TX 接主控 RX,这个看似废话的检查项,在流水线上能筛掉三成不良品。第三是确认地址匹配,A0~A3 引脚的电平和命令帧里的地址字段必须一致,否则会直接忽略命令。
5.2 读数持续跳动,噪声显著偏大
读数跳动先看原始码的跳动幅度。如果原始码低位来回跳几位,那可能是电源去耦不够或输入滤波电容不合适。我在某块样板上一开始读数跳得厉害,查来查去发现是 AVDD 引脚旁边的 0.1μF 电容没贴上,加上去立刻稳定。
如果原始码在高位飘,多半是传感器引线上长了根天线,收到了附近的工频干扰或射频干扰。检查输入滤波的 RC 截止频率是不是太高。我这边之前把滤波电容从 1nF 换成了 10nF,噪声明显下来,代价是响应速度慢了一点,HVAC 场景完全能接受。
5.3 读出来的温度明显偏高,怀疑自热
PT1000 自热功率虽然小,但如果你用的 IDAC 是 1mA,自热会变得不可忽略。1mA² × 1000Ω = 1mW,在空气流通不良的管道里,传感器温升零点几度很正常。降低 IDAC 电流是根治办法,或者用脉冲激励方式,只在采样瞬间打开电流源,平均功耗就能降下来。
5.4 多节点挂同一 UART 总线,总有一个节点响应异常
这个问题多半出在地址配置或上拉电阻上。ADS122U04 的地址引脚要接成完全确定的高低电平,浮空引脚在上电瞬间会随机跳变,导致芯片地址不稳定。我遇到过某个节点每次上电地址都不一样,原因是 A3 引脚的焊盘虚焊,补焊后问题消失。另外同一条 UART 总线上加地址线时,要考虑所有节点的 RX/TX 是线与关系还是点对点关系,如果多个节点并行发送,就需要在主控和节点之间做仲裁或分时分配,避免总线冲突。
5.5 高温环境下读数漂移,校准完没多久又不准
如果校准和使用时的温度差异很大,就要检查不光是 ADC 的温漂,还有你用的基准电阻和传感器本身的温漂。我曾用一只普通 100ppm/℃ 的电阻做 R_REF,环境从 25℃ 升到 85℃,基准电阻变了 0.6%,直接带来好几度误差。换成 10ppm/℃ 的精密电阻后,问题解决。另一个容易忽视的点是传感器线缆在高温下的阻值变化,如果是 2 线接法,线缆阻值随时间漂移,读数也会跟着漂。这时候要么换 4 线接法,要么在软件里做线缆电阻补偿。
写在最后的一点实践体会
这套方案从设计到落地,前后花了不到三周时间,真正费时间的不是芯片驱动那几段代码,而是把误差来源一个个抠干净的过程。温度测量在工程上从来不缺方案,缺的是对精度的敬畏心——你知不知道 0.1% 的基准电阻能毁掉 24 位 ADC 的优势,肯不肯花半小时去检查输入滤波电容的焊盘,这些才是决定项目最终精度上限的隐性因素。ADS122U04 和 STM32F303ZE 的组合给了我这套系统非常高的起点和容错空间,剩下的事情,靠的是校准、测试和一点点耐心。以后如果再扩展这套系统的功能,我会先把通道数量从 1 路加到 8 路,挂两颗带地址的芯片在同一条 UART 总线上,面板级方案基本不用大改。工业现场和 HVAC 里的温度采集,做到稳定、可复制、好维护,比一味去追那零点零几秒的响应更有价值。