搞工业测量和楼宇自控的朋友,应该都遇到过这种局面:老板要你在 HVAC 和产线上做温度采集,精度要求还不低,传感器又是 RTD 又是热电偶,主控那边还得留足 Flash 跑协议栈。我用过一段时间ADS122U04IPWR和PIC32MX795F512L这套组合,把多路温度测量做得比较省心,这里把方案思路、信号链设计、固件实现和踩过的坑完整捋一遍,希望能帮打算这么做的人少走弯路。
先说结论:ADS122U04IPWR是 TI 的 24 位 Δ-Σ ADC,自带 UART 数字接口和双路可编程电流源,非常适合直接接 PT100/PT1000、热电偶这类传感器;PIC32MX795F512L是 Microchip 的 MIPS 内核 32 位 MCU,512KB Flash、128KB RAM、6 个 UART,资源足够跑楼宇自控常用的 MODBUS 协议和本地控制逻辑。这俩配在一起,等于把“模拟前端”和“应用处理器”之间的信号链拉得很干净,软件上只需要处理 UART 帧,不用碰 SPI 时序和 GPIO 模拟,整体项目风险低很多。这篇东西适合正在选型或者已经上手这两颗料、想把温度测量真正做出精度的工程师参考。
1. 方案架构:这两颗芯片为什么能搭到一块
1.1 应用场景:工业与 HVAC 温度测量的真实需求
HVAC 和工业现场的测温,表面上都是“测温度”,但拆开看差别不小。HVAC 机组里最常见的被测对象是冷冻水供回水温度、送风回风温度、冷凝器管壁温度,量程一般不会太极端,大概从 -10°C 到 120°C,精度要求通常在 ±0.2°C 到 ±0.5°C 这个级别。工业现场更杂一点,可能碰到 -40°C 的冷库、150°C 以上的工艺流体,甚至要用热电偶测几百上千度的烟道温度。共同点是:传感器信号都很微弱,PT100 在 0°C 时只有 100Ω,温度变化 1°C 阻值才变 0.385Ω;K 型热电偶的灵敏度也就 40µV/°C 左右。这么小的信号,没有高分辨率 ADC 和高共模抑制能力的模拟前端,根本没法聊精度。
另一个现实约束是安装位置和控制器位置常常分开。HVAC 项目里,温度传感器在风管里、水管上,控制器在配电柜里,两者距离经常超过十几米甚至几十米。如果直接用模拟信号线,长线引入的共模噪声、接地压差和干扰会让读数很难看。ADS122U04 把 24 位 ADC 和 UART 封装在一起,数字化之后传输,抗干扰能力明显好于传统的模拟传输方案。再加上它自带激励电流源,可以直接给 RTD 供电,不需要额外设计恒流源电路,这对产品小型化和 BOM 成本都是实打实的帮助。
1.2 选型逻辑:ADS122U04IPWR 的三个加分项
我最初看上 ADS122U04,完全不是因为它参数堆得有多猛,而是它解决了几个工程上最实际的问题。
第一是 UART 接口。熟悉 ADC 的人都知道,传统高精度 ADC 基本都是 SPI 或 I2C 接口,SPI 在长距离传输上很别扭,I2C 地址扩展又麻烦。ADS122U04 直接用 UART,等于把 ADC 当成一个串行外设挂在 MCU 的 UART 上,硬件上只需要两根线,通信距离几十米内完全没问题,而且很多现成的隔离方案、无线透传模块都是基于 UART 的,将来做产品升级也方便。对习惯用 RS-485 组网的工程师来说,UART 接口的亲和力要高得多。
第二是内置双路 IDAC 电流源。做 PT100 测量,大家都知道要用恒流源激励,然后测 RTD 两端电压。以前要么用外部恒流源芯片,要么用运放搭恒流电路,占板子、调精度、还要处理温漂。ADS122U04 内部集成了两个可编程电流源,电流可以从 50µA 到 1500µA 分档设置,精度和温度系数都能满足 RTD 比例测量需求。用一颗 ADC 就解决了激励和采集两个环节,这是方案能简化的核心原因。
第三是 IPWR 后缀里藏着的细节。I 代表工业级温度范围,-40°C 到 +125°C 的支持让这颗料在 HVAC 室外机、冷库、锅炉房这些恶劣环境下都能用;PW 是 TSSOP-16 封装,好焊接、好布局;R 是卷带包装,方便 SMT 量产。选型的时候别只看功能,温度等级和封装形式直接影响产品的环境适应性测试能不能过,这个我后边还会细说。
1.3 PIC32MX795F512L 在此方案中的角色
PIC32MX795F512L 属于 Microchip 的 PIC32MX 系列,100 引脚 TQFP 封装,MIPS M4K 内核,主频最高 80MHz。在整套系统里,它负责三件事:一是通过 UART 和 ADS122U04 通信,下发配置命令、接收转换结果;二是做温度换算和线性化,把 ADC 原始码值转成工程单位;三是跑应用层逻辑,比如 PID 控制、MODBUS 协议栈、HMI 通信。
选这颗 MCU 而不是更便宜的 8 位机,是因为 24 位 ADC 的转换结果做浮点运算时需要足够的算力和 Flash 空间。温度线性化、查表插值、滤波算法、MODBUS RTU 帧解析,这些功能堆在一起,8 位 MCU 会觉得很吃力。PIC32MX795F512L 的 512KB Flash 和 128KB RAM 非常宽裕,哪怕以后要加蓝牙透传或者 Ethernet 网关,资源也不至于捉襟见肘。实际用下来,这颗 MCU 的 UART 模块带硬件 FIFO,支持 DMA,接收高速连续数据流时丢字节的概率比普通 8 位机的软件查询方式低得多。
2. 信号链与传感器:从 RTD 到数字量
2.1 电阻式温度传感器(RTD)比例测量法
PT100/PT1000 温度传感器本质上是一个随温度变化的电阻,做高精度测量时最忌讳的是“激励电流不稳定导致电压误差”。传统方法是给传感器供一个精密的恒流源,然后用 ADC 测传感器两端电压,但这样测量的绝对值会同时受到恒流源精度和 ADC 基准电压精度的影响,两边都有误差。
ADS122U04 支持典型的比例测量接线:让 IDAC 电流先流过 RTD,再流过一颗精密参考电阻 R_REF,然后把 RTD 电压接到 ADC 的测量输入端,把 R_REF 两端电压接到 ADC 的基准输入端。因为 ADC 的转换结果等于“输入电压 / 基准电压”,而输入电压和基准电压都是同一个电流产生的,电流项的误差在比值里抵消掉了。这时候 RTD 阻值只取决于转换码值和 R_REF 的精度,R_REF 选低温漂精密电阻(比如 TCR 小于 10ppm/°C),整个测量的长期稳定性就非常理想。这个原理我一直跟同事强调:比例测量不是省事,是把自己从“做高精度恒流源”这个坑里解放出来。
具体的接线可以这样理解:IDAC 电流从 AIN0 输出,流经 RTD 后到 AIN1 节点,再经过 R_REF 到地。R_REF 两端并联到 REFP/REFN 基准引脚,RTD 两端电压则接到 AIN2/AIN3 差分输入。三线制 RTD 可以把第二个 IDAC 接到 RTD 的第三条引线上,用于抵消引线电阻,ADS122U04 的四个模拟输入和双 IDAC 设计刚好能支持这种接法。PCB 上布线的关键是让 RTD 输入回路和 R_REF 基准回路尽量短、尽量靠近 ADC 引脚,并用开尔文连接避免走线电阻串入测量路径。
2.2 热电偶测量与冷端补偿
HVAC 系统里偶尔会用到热电偶,比如检测燃烧器排烟温度、热泵压缩机排气管温度,工作温度超过 RTD 能舒适覆盖的范围。K 型热电偶热电动势很小,0°C 到 1000°C 差不多 41mV,平均每度约 0.04mV,这么小的幅值必须靠高增益、低噪声的 ADC 才能采好。ADS122U04 内置 PGA,增益最高可以到 128 倍,对热电偶来说是足够的。
热电偶测量的难点在于冷端补偿。热电动势反映的是热端和冷端的温度差,要得到真实热端温度,必须知道冷端温度。ADS122U04 内部集成了一个温度传感器,可以直接读出芯片温度,工程上可以拿这个温度当作冷端温度。不过芯片温度和热电偶接头处的实际冷端温度之间会有热阻,如果要求很高,还是应该在接插件附近放一个独立的 PT100 或 NTC 测冷端,再通过软件换算。我的做法是用内部温度传感器做粗略补偿,同时在校准流程里对冷端偏移做了修正,两段式处理,精度能稳定在 ±1°C 以内,对于 HVAC 里非关键路径的温度监测完全够用。
2.3 4-20mA 变送器信号采样
现场还有相当多的传感器输出 4-20mA 标准信号,比如带变送器的水温探头、湿度传感器、压力传感器。对这种信号,ADS122U04 也能直接处理。做法是在输入端并联一个高精度采样电阻,比如 100Ω 或者 250Ω,让 4-20mA 电流在上面形成电压,然后送入 ADC 测量。250Ω 电阻对应 1-5V 电压,100Ω 电阻对应 0.4-2V,具体看 ADC 的满量程范围。
这里有一个很实际的注意点:如果系统供电和变送器供电共地,采样电阻两端的共模电压可能很高。ADS122U04 的绝对输入范围以电源电压为限,如果有 24V 共模电压,千万不能直接把电流变压器信号引到引脚上,需要先做电平转移或者用外部电阻分压。做 4-20mA 采集时我习惯在前端串一个共模电感再加 TVS 管,防止现场电磁干扰把 ADC 输入端打坏。
2.4 硬件连接与参考设计要点
ADS122U04 和 PIC32 的 UART 连接非常直接:ADS122U04 的 TX 接 PIC32 的 RX,ADS122U04 的 RX 接 PIC32 的 TX,两者都用 3.3V 供电,电平兼容,不需要转换芯片。需要注意 ADC 的 TX/RX 引脚是开漏还是推挽,严格按数据手册接上拉电阻,否则通信会间歇性失败。
模拟输入侧的设计,我总结了几个经验:
- AVDD 和 DVDD 之间用电感或磁珠隔离,模拟地和数字地单点连接,避免数字噪声耦合进模拟采样。
- REFP/REFN 之间放 1µF + 0.1µF 陶瓷电容,靠近引脚;RTD 差分输入对也用 1nF 到 10nF 的电容做低通滤波,防止射频干扰。
- IDAC 电流建议先在输出端串一个小磁珠再进传感器,抑制脉冲干扰。
- 采样时钟或转换速率禁止设置得过高,硬件滤波和数字滤波要配合,不然 24 位分辨率只体现在广告参数里,实际上根本发挥不出来。
3. 固件落地:寄存器配置、UART 协议与温度换算
3.1 UART 通信帧格式
ADS122U04 的通信基于 UART 帧,主机发送命令,ADC 返回响应。帧格式核心是“命令字节 + 数据”,响应则包含状态字节、转换数据和校验字节。开始写固件之前,必须先把数据手册里的通信时序和寄存器地址表打印出来放在手边,因为所有命令都是建立在寄存器读写基础上的。
我实际使用的流程是这样:
- 主机发送唤醒命令,把 ADC 从睡眠模式拉起来。
- 连续写 CONFIG0、CONFIG1、CONFIG2、CONFIG3 四个寄存器,设置输入通道、PGA 增益、数据速率、IDAC 电流和基准电压源。
- 发启动转换命令,等待 DRDY 状态位或直接轮询响应帧。
- 读取转换结果,通常以 24 位补码形式返回,解析后做温度换算。
需要注意,ADS122U04 的命令响应里带 CRC 校验字节,我第一次调试时忽略了它,导致偶尔读到错帧却不自知。建议固件里务必解析 CRC,CRC 不过的帧直接丢弃,不要参与后续计算,这是设备长期稳定运行的底线。
3.2 配置寄存器详解
配置寄存器是整个测量的灵魂。四组寄存器分别控制不同维度:配置寄存器 0 里最重要的字段是输入多路复用器选择,决定哪几个引脚作为差分输入;配置寄存器 1 控制 PGA 增益和转换速率;配置寄存器 2 控制基准电压源、IDAC 电流大小、以及内部温度传感器使能;配置寄存器 3 控制 IDAC 输出引脚分配和电源模式。
一个典型的 RTD 配置参考值如下:
- 输入选择:AIN2/AIN3 作为差分输入,接 RTD 电压。
- PGA 增益:16 倍。PT100 在 0°C 时激励电流产生的电压约 100Ω 乘以电流,例如 500µA 就是 50mV,16 倍后变成 800mV,接近且不超过满量程,能最大化分辨率;不要盲目选 128 倍,因为 PGA 增益大了之后失调电压和噪声也会放大,很多时候 16 倍才是信噪比最优值。
- 基准源:外部 REFP/REFN,接 R_REF 两端;不使用内部基准,因为比例测量要求基准和输入同源。
- IDAC 电流:推荐使用 250µA 到 1000µA,电流大则测量信号强,但过大会导致 RTD 自热误差。PT100 自热系数约为 0.04°C/mW,电流 500µA 时在 100Ω 上功耗才 0.025mW,基本可以忽略;如果传感器很小或者风管内风速很低,把电流降到 250µA 更稳妥。
- 数据速率:工业控制一般选 50SPS 或 60SPS,和工频 50Hz/60Hz 干扰形成整倍数关系,能天然抑制工频噪声。高速率适合快速变化的过程控制,但噪声增加,做温度这种缓变量时没有必要。
3.3 PIC32 侧驱动代码示例
PIC32 的 UART 配置很简单。假设外设时钟 40MHz,目标波特率 19200,初始化代码大致如下:
void UART1_Init(void) { // 假设 PB 时钟 40MHz,期望波特率 19200 U1BRG = (40000000 / (16 * 19200)) - 1; // 计算结果 129,落在合理误差范围内 U1MODE = 0x8008; // UARTEN 使能 + 8 位数据、无校验、1 停止位 U1STA = 0x1400; // 使能发送和接收 }发送命令给 ADC 时,可以用简单的查询方式,把一帧数据逐个写到发送寄存器;接收端我建议用中断方式,在中断里把收到的字节存进环形缓冲区,主循环再从缓冲区里取帧解析。这么做的原因是 UART 接收如果不及时处理,硬件 FIFO 溢出后丢帧很难查,用中断加环形缓冲可以把数据完整主线化,跟主循环里做任何耗时操作都不冲突。
volatile uint8_t uart1_rx_buf[128]; volatile uint16_t uart1_rx_head = 0; volatile uint16_t uart1_rx_tail = 0; void __ISR(_UART1_RX_VECTOR, ipl2) UART1_RX_ISR(void) { while (U1STA & 0x0001) { uint8_t data = U1RXREG; uint16_t next = (uart1_rx_head + 1) % 128; if (next != uart1_rx_tail) { uart1_rx_buf[uart1_rx_head] = data; uart1_rx_head = next; } else { // 缓冲区满,丢弃最旧数据或做错误计数 uart1_rx_tail = (uart1_rx_tail + 1) % 128; uart1_rx_buf[uart1_rx_head] = data; uart1_rx_head = next; } } }主循环里发一次启动转换命令后,等待接收完整响应帧,然后提取 24 位数据:
int32_t adc_raw_value; adc_raw_value = (int32_t)response[0] << 16; adc_raw_value |= (int32_t)response[1] << 8; adc_raw_value |= (int32_t)response[2]; if (adc_raw_value & 0x800000) { adc_raw_value |= 0xFF000000; // 24 位补码扩展成 32 位有符号数 }这一步很多人会漏掉符号扩展,导致负温度下读出很大的正数,排查半天最后发现是补码没处理好。转换结果出来以后,剩下的工作就是把它换算成电阻,再换算成温度。
3.4 温度换算与线性化算法
RTD 的比例测量换算公式很简洁。设 ADC 满量程码值为 FS(24 位,二进制补码,约为 0x7FFFFF 表示正满量程,但实际操作中按比例计算即可),转换码值为 CODE,RTD 电阻可以表示为:
R_RTD = (CODE / FS) * R_REF注意这里因为基准和输入同源,激励电流的影响被完全消除了。得到 R_RTD 之后,用 Callendar-Van Dusen 方程反解温度。0°C 以上时公式简化为:
R(T) = R0 * (1 + A*T + B*T^2)其中 PT100 的典型系数 A = 3.9083e-3,B = -5.775e-7,R0 = 100Ω。反解时可以先用线性近似求初值:
T_estimate = (R_RTD / R0 - 1) / A然后做两次牛顿迭代就能得到高精度结果。代码实现不复杂,但要注意系数不要抄错,B 是负值且数量级很小,肉眼看起来容易漏掉负号。
热电偶的换算则建议用 NIST 多项式查表法。先把 ADC 原始码值换算成热电动势 µV,再叠加上冷端补偿对应的电动势,最后查 NIST 反算表得到热端温度。ADS122U04 的内部温度传感器读数出来的是芯片温度,也是用查表方式换算的,精度在 ±0.5°C 到 ±1°C 水平,对冷端补偿来说基本够用。
从工程角度,我强烈建议固件里保留一组“原始 ADC 码值 + 换算后的温度值”输出,调试时通过串口工具直接观察码值变化,能快速区分是传感器问题还是算法问题。
4. 校准与验证:精度是怎么抠出来的
4.1 零点与增益校准
ADS122U04 本身偏移和增益误差虽然已经比较小,但整个信号链还包括 R_REF 精度、PGA 失调、传感器引线电阻、PCB 走线电阻等环节,系统级的零点误差和增益误差必须靠校准来消除。我的做法是在固件里维护两个校准系数:offset 和 gain。
零点校准很简单,把 ADC 输入端短路(或者接入一个 0Ω 电阻),记录输出码值作为 offset。增益校准则需要一个标准电阻,比如直接用 0.01% 精度的精密电阻箱代替 RTD,设置几个标准温度点对应的阻值,记录读数和理论值的比值,得到 gain 系数。校完之后,把换算公式修正为:
R_corrected = (CODE - offset) * gain * R_REF / FS校准系数建议存储在 MCU 的 Flash 或 EEPROM 里,出厂前写入,现场维护时也可以通过串口命令重新校准。合理设计校准流程后,PT100 通道精度可以做到 ±0.1°C 量级,至少不会让 ADC 的硬件能力被系统误差白白浪费。
4.2 多点标定与系统精度评估
在 HVAC 项目里,客户不一定关心电阻值,更关心最终的显示温度和回差。因此我用干井炉或恒温槽对整机做多点标定,通常选择 0°C、25°C、50°C、75°C、100°C 五个点,记录每个标准温度下系统显示的温度值,再做分段线性插值修正。这种“黑盒标定”方式可以把传感器、ADC、基准、引线、换算算法所有误差统一修正掉,比单纯校准电阻值更直接。
标定过程中我踩过的一个坑是:干井炉的探头插入深度不够,导致传感器实际温度没到标准值就开始读数,标出来的曲线全是假的。正确做法是等炉温稳定至少 10 到 15 分钟,并且把传感器插到炉体底部,确保感温元件完全浸在恒温区。多点标定之后,整机精度能明显提升,特别是 25°C 附近的滞回误差和不线性误差会被插值修正掉。
4.3 EMC 与长线缆布线经验
现场最花时间的其实是测试,不是开发。工业现场的变频器、压缩机电机会产生很强的电磁干扰,HVAC 机房里大功率设备启停更是频繁,温度信号线稍有不慎就会把干扰耦合进来。
对付长线缆干扰,我的经验按优先级排序是:
- 信号线必须用屏蔽双绞线,屏蔽层单端接地,接在控制器端。
- ADC 的 UART 线尽量短,如果必须拉长,建议降到 9600 波特率并加光电隔离。
- 模拟输入端的 RC 滤波电容不要省,RTD 差分输入之间的滤波电容直接影响差模干扰抑制。
- 系统电源最好用隔离 DC-DC,或者至少保证 ADC 的模拟电源 LDO 单独供电,避免和继电器、阀门驱动共用电源。
- 做 EMC 测试时,重点观察 50Hz/60Hz 工频干扰和谐波,比如把数据速率设在 50SPS,利用 Δ-Σ ADC 的工频抑制特性过滤掉大部分干扰。
我遇到过一种很隐蔽的现象:设备单独运行一切正常,但压缩机一启动,温度读数就周期性跳动几个 LSB。排查到最后发现是压缩机的启动电流导致控制板地电位瞬时被抬高,而传感器屏蔽层没有接地,共模电流在 RTD 内部流过,形成差模干扰。把屏蔽层接好、加上滤波电容后,问题彻底消失。
5. 实战问题排查:通信异常、数据跳变与温漂
5.1 UART 通信无响应或乱码
最常见的是引脚接反、波特率漂移或者共地问题。ADS122U04 的 TX 要接 MCU 的 RX,反过来 TX/RX 接反的话,示波器能看到数据但程序就是收不到。另外,两个芯片必须共地,浮地通信时 UART 很容易收到乱码。
波特率偏差也是高频问题。PIC32 的 UART 波特率由外设时钟决定,如果时钟源配置错了,实际波特率可能偏差超过 2%,ADC 端就会频繁检测到帧错误。建议先接一个 USB-UART 模块直接连 ADC,用 PC 串口工具验证 ADC 能正常回帧,再排查 MCU 侧的配置,这样能把问题快速切分到哪一半。
5.2 读数跳变和噪声偏大
读数跳变,先区分是单片噪声还是系统性波动。用 ADC 原始码值做判断,如果 raw value 呈白噪声分布但有界,说明是模拟前端噪声主导;如果码值在几个固定值之间跳,大概率是数字串扰或接地问题。
处理步骤:
- 检查电源。用示波器看 AVDD 上有没有开关噪声,没有做好去耦的话,ADC 的基准或者参考电压微小的纹波都会直接变成测量误差。
- 降低 PGA 增益。增益过高会把前端运放的失调噪声跟着放大,24 位 ADC 的分辨率足够,很多时候不需要过分依赖高增益。
- 增加数字滤波。ADS122U04 数据速率降到 20SPS 之后噪声明显下降,或者可以在 MCU 里对连续几次采样结果做移动平均。
- 检查传感器本身。RTD 探头引线虚接、接插件氧化、热电偶碰到屏蔽层,都会造成间歇性跳变,现场问题里这种情况反而占多数。
5.3 温度读数缓慢漂移
如果读数不是跳变,而是长时间缓慢漂移,重点怀疑三个地方:一是 R_REF 电阻的温度系数,这在比例测量里是决定长期稳定性的关键,用 25ppm 的普通电阻和 5ppm 的精密电阻,在环境温度变化 50°C 时,误差可以差出好几倍;二是传感器本身的绝缘电阻退化,高温高湿环境下 RTD 引线与外壳之间漏电,等效于并联了一个小电阻;三是 MCU 附近的发热源,比如电源芯片、通信模块,如果离 ADC 太近,ADC 内部温度变化会影响内部温度传感器和 PGA 失调,但对比例测量的 RTD 通道影响相对小,对热电偶通道影响很明显。
对于热电偶通道,漂移往往来自冷端温度变化。冷端温度传感器和热电偶接线端子之间存在热阻,加上外壳通风不均匀,冷端补偿的“冷端”和实际冷端温度不对称,读数就会随着机箱温度变化而漂移。解法是把冷端传感器紧贴热电偶接线端子,并做好隔热,必要时在软件里加一阶热模型补偿。
5.4 实战避坑清单
把这些年调这套方案攒下的坑整理成一份清单,可能比前面所有内容都值钱:
- 焊完板子先量 ADC 电源和基准引脚电压,避免贴片电容短路导致上电后电流异常。
- 第一版固件里先实现 CRC 解析和错误帧计数,有了这个“心电图”,后续通信问题都能快速定位。
- 比例测量时,基准电阻和 RTD 必须走同一激励电流回路,否则误差抵消就失效了。
- 不要在 RTD 激励回路里串接其他负载(比如继电器触点),接触电阻的不稳定会被直接算进测量结果。
- PIC32 的 UART 中断优先级要设得合理,如果被高优先级中断挤掉,RX FIFO 溢出后整个通信链路会卡死。
- 固件里温度换算的浮点运算放在主循环里还是够用的,但如果要同时处理十几个通道,建议用单精度浮点并避免在中断里做大量计算。
- 出厂校准数据写入 Flash 时要加校验和,防止单片机重新编程时把校准参数冲掉。
6. 从样板到产品:还可以扩展什么
6.1 多通道和多传感器扩展
ADS122U04 一片支持四个模拟输入,但对于 HVAC 系统往往不够,一台空调机组可能要采集十来个温度点。扩展方案有两种:一是用多片 ADS122U04,每片通过独立 UART 或 UART 并联分时选通接到 PIC32,PIC32MX795F512L 有 6 个 UART,挂三四片完全没问题;二是增加外部多路复用开关,把多个传感器分时接入 ADC,逻辑简单但切换后要等稳定时间,速度会慢。
从工程角度看,我更推荐多片 ADC 方案。多路复用开关会引入导通电阻和漏电流,在高精度测量里都是误差源,而多片 ADC 各测各的,互不干扰,故障隔离也方便,硬件成本稍高但调试时间省下来远不止这些。
6.2 低功耗与远程监控
如果做电池供电的无线温度记录仪,ADS122U04 的低功耗模式就很有用。它支持空闲模式和掉电模式,配合 PIC32MX795F512L 的低功耗休眠,可以做到“定时醒来测一次温度、发一帧数据、继续睡”的工作循环。每次测量的平均功耗可以压得很低,适合冷链运输、仓储监测这类场景。
远程监控方面,PIC32MX795F512L 的资源足以支撑 MODBUS RTU 协议,通过外接 RS-485 芯片就可以把多台设备组网,楼宇自控的 DDC 或者上位机可以直接读取温度数据。这套方案的信号链本身已经是数字化的,做远程监控时不需要额外加模拟变送器,系统架构更简化,可维护性也更好。
6.3 固件自检与故障诊断
产品化过程中,客户一定会问“传感器坏了你们设备能不能报故障”。用这套方案做故障诊断非常顺手。ADS122U04 的内部温度传感器可以用来做 ADC 自检,如果读出的芯片温度和实际环境明显不符,说明芯片可能出了问题;RTD 开路时输入电压会直接拉到电源轨,ADC 码值会接近满量程,通过软件判断码值上下限就能识别传感器断线。
我通常加三档诊断逻辑:通道超量程判断断线、转换结果长时间不变判断传感器卡死、CRC 错误计数判断通信链路劣化。把这些状态通过 MODBUS 寄存器上报给上位机,运维人员不用到现场也能知道哪路传感器出了问题,这在 HVAC 运维场景里非常受欢迎。
这套组合的后续扩展空间还很大。我在实际项目中体会最深的一点是,ADS122U04 和 PIC32 的组合最大优势不是某一个参数特别亮眼,而是把“高精度模拟采集”和“复杂应用逻辑”之间的衔接做得足够简单可靠。如果你手头正在做类似的温度采集项目,不妨从一颗小模块开始验证信号链,先把 RTD 的比例测量跑通,再逐步扩展通道和通信协议。只要模拟前端的地和基准设计不出大问题,后面的工作基本就是水到渠成。