ADS122U04与PIC32驱动的工业及HVAC高精度温度测量方案

发布时间:2026/11/4 11:02:35
ADS122U04与PIC32驱动的工业及HVAC高精度温度测量方案

做 HVAC 和工业温度测控这些年,我踩过最深的坑就是低估了“温度”两个字的分量。室温下看着挺准的一路测温,到了 85℃ 的机房风道、零下 20℃ 的冷库,或者电机轴承旁边,分分钟差出两三度。测温从来不是“读个 ADC 算下电压”那么简单,它是一条完整的信号链:传感器、激励、放大、转换、传输、换算、校准,哪一环偷懒都会在最终数值上找回来。

我这次要分享的,是拿 ADS122U04IPWR 这颗 UART 接口的 24 位 Δ-Σ ADC 搭配 PIC32MX795F512L,搭建工业与 HVAC 温度测量通道的完整方案。ADS122U04IPWR 负责把 Pt100、热电偶这些传感器信号干净地转成数字量,PIC32MX795F512L 负责通信、换算和上层控制。文章会从选型逻辑、硬件连线、固件协议、温度换算校准一路写到现场排错,适合正在做温度采集、环境监控、暖通控制项目的朋友参考。

1. 为什么温度信号链要绕开 MCU 内置 ADC

1.1 12 位 ADC 在 Pt100 测温上的物理瓶颈

PIC32MX795F512L 是一颗很能打的片子:MIPS M4K 内核跑到 80MHz,512KB Flash、128KB RAM,6 路 UART、USB、CAN、以太网全都有,TQFP-100 封装下 IO 资源也够铺张。做逻辑控制、人机交互、协议转换,它绰绰有余。但你要是直接用它的内置 ADC 去做 Pt100 高精度测温,很快就会后悔。

问题出在物理分辨率上。PIC32MX795F512L 的内置 ADC 是 12 位,假设参考电压取 5V,一个 LSB 就是 5V / 4096 ≈ 1.22mV。Pt100 的温度系数大概是 0.385Ω/℃,如果用 1mA 恒流激励,温度每变化 1℃ 对应的电压变化只有 0.385mV。换句话说,12 位 ADC 在 5V 参考下,一个码就抵得上 3℃ 多一点。就算你把参考电压降到 2.048V,一个 LSB 也还有 0.5mV,依然对应 1.3℃ 左右。

有人会说:那我把 Pt100 接成电桥,再用运放放大几十倍,进 MCU 内置 ADC 不就行了?理论上可以,但工程上很难受。内置 ADC 的 INL、DNL、温漂和噪声指标摆在那里,你放大倍数越高,前端运放的失调和漂移也会被一起放大。结果就是:零点漂移、增益误差、温度漂移混在一起,出厂校准做完,过了半年又偏回去。工业现场和 HVAC 系统要的是长期稳定,不是实验室里调通那一刻的漂亮读数。

我给一个更直观的账。用 1mA 激励 Pt100,0℃ 时信号是 100mV,100℃ 时是 138.5mV,整个量程只有 38.5mV。12 位 ADC 在整个量程上也就 31 个码,每个码对应 3.2℃ 以上。就算做 16 倍过采样,有效位数最多提升到 14 位左右,依然不够覆盖 -40℃ 到 150℃ 这类常见工业范围。所以结论很简单:想把温度做到 0.1℃ 级别的分辨率和长期稳定性,老老实实在外面挂一颗高分辨率 ADC。

1.2 ADS122U04IPWR 是为传感器测量专门设计的

ADS122U04IPWR 是 TI 一颗定位非常明确的片子——它就是给 RTD、热电偶、热敏电阻这类传感器做前端采集的。24 位 Δ-Σ 架构,无失码;内部集成可编程增益放大器(PGA),增益 1 到 128 倍;内部有两个可配置电流源 IDAC,专门用来给 RTD 提供激励;内部基准 2.048V;甚至还集成了一路内部温度传感器,热电偶冷端补偿可以直接用它。

这颗芯片最特别的地方是接口。它不是 SPI,也不是 I2C,而是 UART 兼容的两线半双工串口。这个设计在工业现场非常实用:SPI 需要时钟线、数据线、片选线,走线距离一长就出问题;UART 只需要一根发送一根接收,电气上更容易做长距离传输和隔离。你可以把 ADS122U04 做成一个小传感器模块,放在风管旁边、管道附近,用两根线拉回主机,PIC32MX795F512L 通过 UART 读数据,物理边界清清楚楚。

为什么选 ADS122U04 而不是 ADS1220(SPI 版本)?我当时的需求是:测温节点要跟控制主板分开放,距离大概 10 到 20 米,中间还要过接线端子。SPI 的时钟线在这种距离上很容易被干扰,而且线多了成本也高。UART 接口天然适合这种分布式结构,PIC32MX795F512L 上有 6 个 UART,我甚至可以在一个主板上挂多个 ADS122U04 节点,每个节点通过命令帧里的设备地址区分。

ADS122U04 的另一个好处是内部集成了完整的测量链路。以前用分立方案做一个 Pt100 前端,至少需要:精密恒流源、仪表放大器、二阶低通滤波、16 位以上 ADC、基准源。这一堆东西的温漂、噪声、PCB 布局都是坑。现在一颗芯片全包了,外部只需要加去耦电容和输入滤波电阻,硬件设计工作量直接少掉一大半。对于 HVAC 这种成本敏感、维护困难的场景,元器件越少,长期可靠性越高。

2. 硬件连接设计:从传感器到 UART 引脚

2.1 三线制 Pt100 的激励与采样结构

工业现场测温,Pt100 最常见的接法是三线制。为什么不用两线制?因为导线本身有电阻,铜线在百米距离下能有几欧姆,而 Pt100 整个量程(0℃ 到 100℃)才变化 38.5Ω,几欧姆的线阻会带来非常大的误差。四线制精度最高,但很多现有工程的电缆只有三芯,所以三线制是工程上的最优解。

ADS122U04 的两个 IDAC 电流源正好用来做三线制补偿。基本思路是这样:让两个相同大小的电流分别流过两条导线,其中一路经过 Pt100,另一路只经过导线,然后通过差分测量把导线压降抵消掉。具体接法上,把 IDAC1 配置到 AIN0 引脚,电流经 Pt100 到 AIN1;把 IDAC2 配置到 AIN2,电流经第三条导线直接回流。这样 AIN0 相对于 AIN1 的差分电压里,导线电阻造成的压降被 IDAC2 路径上的对称压降抵消了。

这里有个关键点:两个 IDAC 的电流匹配精度必须足够好。ADS122U04 的 IDAC 匹配特性在数据手册里有明确指标,正常工作时两个电流源的失配很小,残余误差基本可以忽略。我在实际项目里测过,三线制接法在 10 米电缆下,误差能控制在 0.05℃ 以内,这个水平对 HVAC 和工业应用完全够用。

还有一个容易忽略的小设计:低侧开关(Low-Side Switch)。ADS122U04 内部有一个开关可以串在 IDAC 回流路径上,在不测量的时候把激励电流关断。这样做有两个好处,一是省电,二是防止 RTD 长期通过电流产生自热。Pt100 的自热效应虽然不像热敏电阻那么严重,但在测量精度要求高的场合,1mA 电流长期流过传感器还是会让读数偏高一丁点。我通常把测量周期设计成:开激励 → 稳定 → 采样 → 关激励,占空比 10% 左右,自热误差几乎可以忽略。

2.2 热电偶接入与冷端补偿

HVAC 系统里除了 Pt100,还经常遇到热电偶,尤其是测冷冻机组排气温度、锅炉烟气温度这些高温场合,K 型热电偶便宜耐用,量程又宽。热电偶的输出是热端和冷端之间的温差电势,所以必须做冷端补偿。

ADS122U04 内部温度传感器在这里就有大用处。做法是:热电偶的正负极接在 ADC 的差分输入上(比如 AIN3 和 AIN2),同时周期性读内部温度传感器的值,把它当作冷端温度。K 型热电偶的灵敏度大约 40μV/℃,而 ADS122U04 在 PGA 增益 16 倍、24 位分辨率下,理想 LSB 远小于 1μV,即使考虑实际噪声,也足够分辨 0.1℃ 级别的电势变化。当然,内部温度传感器的绝对精度有限,比不上一颗外置的精密 NTC 或数字温度传感器,但作为冷端补偿的参考已经算合格。如果项目对精度要求更苛刻,可以在接线端子旁边放一颗 PT100 专门测冷端,用 ADC 的另一个通道读它。

冷端补偿的软件逻辑不复杂但容易写错:先用内部温度传感器测出冷端温度,再查热电偶分度表得到对应的补偿电势,加到测量电势上,最后反查分度表得到真实温度。这里最容易犯的错是忘记补偿电势是有符号的,冷端温度高于 0℃ 时补偿电势为正,低于 0℃ 时为负。我第一次写 K 型热电偶程序时就吃了这个亏,冬天冷端在零下,补偿符号搞反,温度读数差了十几度。

ADS122U04 对热电偶还有一个贴心功能:偏置电阻(bias resistor)。热电偶开路的时候,ADC 输入端悬空,读数会乱飘。开启内部偏置电阻后,输入端被拉到参考电位附近,开路时能明显检测到异常值。我在程序里专门做了判断:如果测量值超出量程上限,直接报传感器断路故障,而不只是给一个错误温度。这个功能在 HVAC 现场非常有价值,实际项目里热电偶断线是最高发的故障之一。

2.3 供电、去耦与 PCB 布局

ADS122U04 的供电范围是 2.3V 到 5.5V,我习惯直接给它供 3.3V,跟 PIC32MX795F512L 的 IO 电平一致,省掉电平转换。电源质量对 Δ-Σ ADC 的影响非常大,因为转换过程本质是对电荷的精确比较,电源上的纹波会直接耦合进模拟前端。

我常用的去耦方案是 10μF 钽电容加 0.1μF 陶瓷电容并联,放在 AVDD 引脚附近,DVDD 同样处理。模拟地和数字地建议单点连接,在 PCB 上表现为模拟区域的地铜皮和数字区域的地铜皮在一个点汇合。这个点在工程上有个约定俗成的说法:星型接地。别小看这个细节,HVAC 现场到处都是变频器、接触器,地平面如果处理不好,你会在读数里看到几百度的大跳变。

ADS122U04 的模拟输入在进入芯片之前,我习惯加一组 RC 滤波:串联 10Ω 电阻,并联 0.1μF 电容到地。这组 RC 有两个作用,一是构成低通滤波器,抑制从传感器线缆耦合进来的高频干扰;二是给 ADC 内部的采样电容提供一个低阻抗的电荷源。阻容值的选择有讲究:阻值太大,传感器信号在电阻上产生压降,引入误差;阻值太小,滤波效果不够。10Ω 加上 0.1μF,截止频率大概 160kHz,既不伤低频信号,又能滤掉大部分开关噪声。

PCB 布局上有一条铁律:模拟输入走线要尽量短,远离数字信号线,尤其要避开 UART 的 TX 线。我第一版板子把温度采样通道和 UART 走线平行了 3 厘米,结果 UART 发送命令时,温度读数就会出现固定的毛刺。后来把走线分开、中间加地线隔离,问题马上消失。这个经验值得记下来,模拟电路的很多故障不是器件问题,而是布局问题。

3. 固件里的 UART 协议与寄存器配置

3.1 通信帧格式与读写流程

ADS122U04 的 UART 协议是典型的半双工主从模式:PIC32 是主机,ADC 是从机,所有通信由主机发起。帧格式兼容标准 UART:1 个起始位、8 个数据位、无校验、1 个停止位。波特率方面,可以由芯片内部振荡器决定,也可以使用外部主时钟灵活配置。我一般选 9600 或者 19200,原因后面讲长距离布线时再说。

通信命令分为几类:读寄存器的 RREG、写寄存器的 WREG、读转换结果的 RDATA。每条命令都是一个字节的命令码,后面跟参数。具体的命令码数值我建议直接查数据手册里的命令定义表,这里不抄表格了,因为不同批次固件版本可能有差异,以手册为准。写寄存器时,命令字节后面先跟寄存器数量,再跟实际数据字节;读寄存器时,命令发出后主机等待从机回传数据。

上电后的标准流程是:先等待一小段时间让 ADC 完成内部初始化,然后连续写配置寄存器,写完后逐一回读校验,确认配置真的写进去了,最后才进入周期读数据的循环。这个回读校验的习惯帮我避免了很多诡异问题,后面第 5 章会详细讲一个相关案例。

PIC32MX795F512L 侧我用 UART2 和 ADC 通信。初始化时要特别注意波特率发生器的计算:UxBRG = (外设总线时钟 / (16 × 波特率)) - 1。外设时钟 80MHz 时,9600 波特率对应 UxBRG ≈ 520。如果算错,通信会时好时坏,而且这种问题很难通过示波器以外的手段快速定位。

void uart2_init(unsigned int baud) { unsigned int pbclk = 80000000; U2BRG = (pbclk / (16 * baud)) - 1; U2MODE = 0x8000; /* UART ON, 8N1 */ U2STA = 0x1400; /* 使能发送和接收 */ }

3.2 配置寄存器逐项拆解

ADS122U04 的寄存器组和 ADS1220 系列其他成员类似,核心配置集中在几个寄存器里。我按照实际项目里的典型配置顺序逐项说明,具体位定义以数据手册为准。

第一是输入多路选择(MUX)。这一项决定哪个输入引脚接到 ADC 内部。Pt100 三线制接法选 AIN0/AIN1 差分对,热电偶选 AIN3/AIN2 差分对,内部温度传感器则是单独使能。如果你用 ADS122U04 的 4 个输入通道同时测多路温度,就要在每次转换前切换 MUX。切换有一个注意点:通道切换后,输入前端需要时间稳定,ADC 的第一个转换结果通常要丢弃。

第二是 PGA 增益。这个值要根据传感器信号幅度来定。Pt100 在 1mA 激励下,0℃ 对应 100mV,150℃ 对应 157.3mV,我通常选 PGA = 8,这样信号被放大到 0.8V 到 1.26V 范围,正好充分利用 2.048V 内部基准的动态范围。热电偶信号幅度小,K 型在 900℃ 时也才 37mV 左右,需要选 PGA = 32 或 64。PGA 增益选大了会压缩可测范围,选小了浪费分辨率,原则是让最大期望信号放大后不超过基准电压的 90%。

第三是数据速率。ADS122U04 提供从每秒几十次到上千次的转换速率,数据速率越低,噪声越小,分辨率越高。PA 型 HVAC 应用不追求速度,我固定用 20SPS。这个速率还有一个额外好处:Δ-Σ ADC 内部的数字滤波器在 20SPS 时对 50Hz 工频干扰有很好的抑制效果,等于白送了一个陷波器。如果现场有变频器干扰,这个速率下的读数稳定度明显好于 100SPS 以上。

第四是 IDAC 电流源配置。Pt100 激励电流选 1mA,这是比较折中的值:电流太小信号幅度不足,电流太大自热明显。热敏电阻(NTC)需要的电流更小,一般 100μA 到 250μA。IDAC 还要配置路由,也就是确定电流从哪个引脚输出、从哪里回流。

各项典型参数我整理成一张表,方便直接抄:

配置项Pt100 三线制K 型热电偶说明
输入 MUXAIN0/AIN1 差分AIN3/AIN2 差分按实际接线调整
PGA 增益832 或 64让满量程信号接近基准
数据速率20 SPS20 SPS兼顾噪声与 50Hz 抑制
IDAC 电流1 mA关闭热电偶不需要激励
内部温度传感器可选必须开启用于冷端补偿
基准内部 2.048V内部 2.048V比率测量可改外部

3.3 PIC32 侧驱动代码骨架

驱动层我做了一个小模块,接口很简单:上电初始化、写寄存器、读寄存器、读转换结果。核心就是按照 UART 半双工时序,把命令字节和参数塞进发送 FIFO,然后等接收。

static void uart2_send_byte(uint8_t b) { while (U2STA & 0x200); /* 等待发送缓冲空 */ U2TXREG = b; } static uint8_t uart2_recv_byte(void) { while (!(U2STA & 0x1)); /* 等待接收数据 */ return U2RXREG; } void ads122u04_write_reg(uint8_t reg, uint8_t val) { /* 命令码与格式以数据手册为准,这里给出结构示意 */ uint8_t cmd = ADS_CMD_WREG | (reg << 1); uart2_send_byte(cmd); uart2_send_byte(0); /* 写 1 个寄存器 */ uart2_send_byte(val); /* 等待命令执行完成 */ delay_ms(2); }

读取转换结果时,我给 ADS122U04 的 DRDY(数据就绪)信号单独接了一个 PIC32 的 IO 口,用下降沿中断通知主程序来读。这样比轮询高效,也能保证每次读到的都是新数据。没有 DRDY 引脚或者引脚不够时,也可以直接发 RDATA 命令,但要小心读到重复的旧数据。

uint32_t ads122u04_read_data(void) { uint8_t buf[4]; /* 发送读数据命令,然后接收 3 字节转换结果 + 1 字节状态 */ uart2_send_byte(ADS_CMD_RDATA); for (int i = 0; i < 4; i++) buf[i] = uart2_recv_byte(); return ((uint32_t)buf[0] << 16) | ((uint32_t)buf[1] << 8) | buf[2]; }

主循环里的大致逻辑是:等待 DRDY 中断置标志 → 读转换结果 → 根据当前通道类型换算成温度 → 更新显示或上报。ADC 配置只在初始化时写一次,运行时基本不动寄存器,除非要做通道切换。

4. 从 AD 码到温度:线性化与校准实操

4.1 由 ADC Code 反推传感器物理量

拿到 24 位转换结果之后,第一步是把它还原成电压或者电阻。ADS122U04 是双极性 Δ-Σ ADC,输出码是二进制补码形式。用内部基准 2.048V、PGA 增益 G 时,输入电压和码值的关系是:

V_in = Code × VREF / (G × 2^23)

这个公式里 2^23 是因为 24 位数据去掉符号位后有效量程对应 23 位。举个例子:Pt100 在 0℃ 时压降 100mV,PGA = 8,那么 Code = 0.1 × 8 × 8388608 / 2.048 = 327680。在 100℃ 时压降 138.5mV,Code = 453836。两个码值相差 126156,对应 100℃ 温差,每个码大约对应 0.00079℃,分辨率相当充裕。

如果是 RTD 比率测量,也就是激励电流同时流过 RTD 和一个精密参考电阻,参考电阻上的压降作为 ADC 的基准,那公式更简单:R_rtd = Code × R_ref / 满量程码值。这种比率测量方式的好处是,激励电流的绝对值漂移被自动抵消了,因为电流变化同时影响信号和基准。ADS122U04 支持这种接法,在超精密应用里值得用。

4.2 Pt100 非线性补偿

Pt100 的电阻和温度不是严格线性关系。0℃ 到 100℃ 区间,非线性误差大约 0.4℃,对于 HVAC 应用有时候勉强能忍,但工业应用通常不能忍。IEC 60751 标准给出了 Callendar-Van Dusen 方程:

R(t) = R0 × [1 + A×t + B×t² + C×(t-100)×t³]

其中 R0 = 100Ω,A = 3.9083×10⁻³,B = -5.775×10⁻⁷。当温度在 0℃ 以上时,C 项为零,方程退化为二次多项式。0℃ 以下才需要 C 项,C = -4.183×10⁻¹²。我在实际工程里把大于 0℃ 和小于 0℃ 两种情况都实现了,用温度符号判断选哪组系数。

方程是正运算(电阻 → 温度),但实际采集到的是电阻,需要反解。工程上一般有两种做法:一是用迭代法,先猜一个初始温度算出电阻,再根据偏差修正,两三次迭代就收敛;二是查表加线性插值,把 -50℃ 到 200℃ 每隔 1℃ 的电阻值做成表,查表找到相邻两个点,线性插值出温度。我两个方案都写过:迭代法代码简洁省 Flash,查表法速度快但需要更多存储空间。PIC32MX795F512L 有 512KB Flash,随便用,我最终选了查表插值。

查表插值的精度取决于表密度。1℃ 间隔的表格,线性插值在 Pt100 这种近似线性的传感器上,残余误差只有 0.01℃ 级别,完全够用。热电偶就不同了,K 型热电偶在低温段和非线性区斜率变化大,我用 NIST 多项式直接计算,牺牲一点时间换精度,反正数据速率只有 20SPS,MCU 算力绰绰有余。

4.3 校准:零点和增益的工程做法

固件算法做得再好,也替代不了硬件校准。温度测量的误差来源包括:ADC 失调、PGA 增益偏差、基准电压精度、IDAC 电流值偏差、引线电阻残余、连接器接触电阻。这些误差靠数据手册的指标估算,不如直接做一次校准来得干净。

我最常用的校准方法是两点校准:用精密电阻箱分别模拟 Pt100 在 0℃ 和 100℃ 的电阻值,也就是 100.00Ω 和 138.51Ω,接在 ADC 输入端,记录下对应的原始码值。然后计算两个修正系数:增益系数 k = (138.51 - 100.00) / (Code_100 - Code_0),偏移量 b = 100.00 - k × Code_100。之后每次测量,R = k × Code + b。

下面是一次典型校准的实测记录(数据为示意):

标准电阻(Ω)对应温度(℃)校准前换算电阻(Ω)校准后换算电阻(Ω)校准后误差(℃)
100.000.00100.1399.99-0.01
119.4050.00119.55119.41+0.01
138.51100.00138.70138.53+0.02
157.32150.00157.53157.35+0.03

两点校准做完,0℃ 到 150℃ 区间内误差基本能控制在 0.03℃ 以内。如果还想更好,可以做三点校准,引入二次修正项,适合测量范围特别宽或者传感器线性度比较差的场合。但 HVAC 领域绝大多数场景两点校准已经绰绰有余。

校准数据要存到非易失存储器里。PIC32MX795F512L 内部有 Flash,可以直接用一块区域存放校准参数。注意写 Flash 有擦写寿命限制,一般校准参数只在产线写入一次,平时运行只读。我见过一个项目把校准参数频繁写 Flash,结果设备用了半年 Flash 损坏,整机只能返修。校准参数必须在掉电保存的机制里设计成:修改后延迟写入 + 掉电检测触发写入,避免频繁擦写。

5. 工业现场实测与排错笔记

5.1 变频器启动时读数跳动的完整排查

项目接到一个暖通空调机房的温度监控,测冷冻水供回水温度,Pt100 三线制,传感器挂在 15 米外的水管上。系统刚开始调试一切正常,读数稳定在 0.01℃ 以内跳动。结果甲方一开变频器(驱动冷冻水泵),温度读数开始跳,幅度最高到 ±1.5℃。

我的排查链路可以复现给大家参考。第一步,用示波器看 ADS122U04 的 AVDD 引脚,发现变频器启动瞬间电源上有大约 300mV 的毛刺,频率和变频器开关频率有关。这说明干扰已经进到模拟域了。第二步,看 UART 波形,通信帧本身没有明显错误,排除数字通信被破坏。第三步,把现场采集的数据拉出来分析,发现跳变有规律,集中在变频器 PWM 开关频率附近。

处理措施做了三处。第一,在 ADS122U04 的电源入口加了一级 LC 滤波,电感 10μH,电容 10μF,把电源毛刺压到 50mV 以下。第二,给传感器线缆换成屏蔽双绞线,屏蔽层单端接地,避免屏蔽层两端接地形成地环路。第三,在软件里对温度值做中值滤波加滑动平均:先取 5 个原始值排序取中值,再对最近 3 个中值做平均。这三板斧下去,读数跳动从 ±1.5℃ 压到了 ±0.05℃ 以内,24 小时连续测试没有再复发。

这个案例值得说的不是处理措施本身,而是排查顺序。很多新手一看到读数跳就怀疑 ADC 坏了或者软件滤波不够,其实先看电源、再看输入、最后看软件,顺序不能乱。干扰问题 80% 出在电源和输入路径上,软件滤波只是最后的兜底。

5.2 上电时序导致的 ADS122U04 配置丢失

另一个让我记忆深刻的故障:设备上电后,温度读数偶尔是零下几十度的乱值,复位一下又正常。一开始我以为是接触不良,后来复现多了才发现规律——故障只在断电后立即上电时出现,断电时间超过 5 秒就正常。

最终定位是上电时序问题。PIC32MX795F512L 的上电复位速度比 ADS122U04 快,MCU 已经跑起来开始发配置命令了,ADC 还在内部初始化,结果命令全部无效。更麻烦的是,ADS122U04 初始化完成后,寄存器处于默认状态,默认的 MUX 和 PGA 配置可能不是我需要的,所以读出来是乱值。

解决方法是加一个就绪握手:PIC32 上电后先延时 200ms,等 ADC 稳定,再写配置,写完后逐字节回读校验,校验失败就重试三次。这个改动看起来简单,但回读校验这个习惯帮我挡掉了后面好几个潜在问题。现在我的所有传感器初始化代码都带"写后回读"这一条,成本几乎为零,收益是少一堆莫名其妙的上电偶发故障。

5.3 长距离 UART 布线与多节点扩展

ADS122U04 用 UART 接口的一个实际优势就在长距离场景。但 UART 要做到 15 米以上的可靠传输,有一些细节要注意。第一,波特率别贪高。我实测过,同样 15 米线缆,9600 波特率波形完整,115200 波特率已经变形严重。第二,电平转换很关键。TTL 电平在长线上衰减明显,我把 ADS122U04 模块侧的 UART 通过 MAX3485 转成 RS-485 差分信号,再到主机端接回 TTL,这样 100 米都没问题。第三,两端要加终端电阻,RS-485 的 120Ω 匹配电阻不能省,否则高速边沿反射会直接造成误码。

如果要挂多个测温节点,每个 ADS122U04 可以通过命令帧里的设备地址来区分,所有节点共用一条 UART 总线。我做过一个冷库项目,一台 PIC32MX795F512L 挂了 8 个测温节点,每个节点一根 RS-485 总线,主机轮询各节点。轮询周期和 ADC 数据速率要匹配:20SPS 意味着 50ms 出一个新数据,8 个节点轮询一轮至少 400ms,这个采样周期对温度监控完全够用。

多节点方案里有个实际经验:给每个节点加一个硬件拨码开关设置地址,而不是在固件里硬编码。现场调试时没有下载器也能改地址,省事很多。另外,轮询超时要设置,某个节点故障时不能卡死整个总线,超时后跳过该节点继续轮询,同时上报故障状态。这套机制上线后,冷库项目运行两年没有因为通信问题丢过数据。

关于上电顺序,我现在做这类项目会默认遵守几条规矩:传感器模块先上电,主机延时再初始化;所有配置写完后必须回读校验;每个节点设置通信超时;温度数据先过软件滤波再上报。这些规矩都不是数据手册写的,但每一条都是从现场故障里换回来的。做工业测量,把简单的规矩坚持执行,比追求复杂算法更靠谱。