ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

UART接口24位ADC与PIC24FJ组合,破解工业温度采集与HVAC控制难题

UART接口24位ADC与PIC24FJ组合,破解工业温度采集与HVAC控制难题

做工业控制器和 HVAC 现场设备的人,多半都经历过这种两难:测温精度要求越来越高,但板子空间、成本、抗干扰指标又卡得死死的。MCU 内置 ADC 大多在 10 到 12 位,配合模拟前端一路放大滤波,麻烦不说,低温漂和一致性也很难保证;换外置 ADC,SPI 虽然快,但时钟线、片选线、数据线一堆,到了有变频器、接触器和电动阀的现场,毛刺和地电位差能把时序搅得一团糟。ADS122U04IPWR 和 PIC24FJ256GA110 这套组合,走的是一条更省心的路子——前级用一颗自带 PGA、基准、恒流源和 24 位 Δ-Σ 核心的 ADC,后级用一颗串口资源丰富、工业级规格的 16 位 MCU,中间只通过两根 UART 线通信。这篇文章把选型逻辑、硬件设计、固件算法和现场调试讲清楚,适合正在做工业温度采集、HVAC 控制器、楼宇自控网关的嵌入式工程师参考。

1. 方案选型:为什么是 ADS122U04 和 PIC24FJ256GA110 的组合

1.1 先解决接口问题:SPI/I²C 在工业现场的局限

很多工程师第一反应是选 SPI 接口的 ADC,比如 ADS1220、ADS1247 这些经典型号。SPI 接口速度确实快,但在真正的工业现场,它有不少让人头疼的地方。首先是连线多,哪怕只接一颗 ADC,SCLK、DIN、DOUT、CS 至少四根线,如果还要做隔离或者延长线,成本立刻上去。其次是时序敏感,SPI 依赖主设备提供的时钟沿,线路一长、分布电容一大,沿就容易变缓,再加上电机启停、继电器切换带来的共模干扰,偶尔丢一个字节、错一个沿,数据就全乱了。排查这种问题非常痛苦,示波器抓半天,可能只是某根线离功率线太近。

I²C 也好不到哪儿去。它虽然只有两根线,却是开漏加上拉,速度本身就不高,而且地址有限、多设备仲裁麻烦。更关键的是 I²C 同样是同步时钟协议,看门狗性质的死锁问题一旦出现,主设备很容易被一个拉低的 SDA 卡住整个总线。

ADS122U04 不一样,它把通信接口做成了标准 UART。UART 是异步串行,不需要额外的时钟线,主从之间只有两根线:一根进、一根出。这意味着连接距离可以拉得更远,布线灵活,而且光耦隔离只需要两个光耦。对于 HVAC 这类传感器分散在风管、水管、机房各个角落的场景,这个优势是实实在在的。

1.2 ADS122U04 的关键能力与选型理由

ADS122U04IPWR 是 TI 推出的 24 位 Δ-Σ ADC,封装是 TSSOP-16,型号里的“PW”对应 TSSOP,“R”表示卷带包装。它最核心的卖点不是 24 位分辨率,而是把传感器测量的外围电路几乎全集成进去了。

  • 四通道输入:AIN0 到 AIN3,可以组成两个差分对,也可以做四路单端,灵活性足够覆盖多路温度传感器。
  • 内置 PGA:增益从 1 到 128 可编程,热电偶这种毫伏级信号可以直接接,不用额外加仪表放大器。
  • 内置基准:支持内部 2.048V 或 4.096V 基准,也可以使用外部基准做比例式测量。
  • 双 IDAC 恒流源:用于驱动 RTD 铂电阻和热敏电阻,电流值可配置,省掉外部恒流源电路。
  • 内部温度传感器:可以测量芯片自身温度,热电偶冷端补偿直接用它。
  • 数据速率可选:从 20 SPS 到 2000 SPS,低速率下滤波效果更好,适合温度这种缓变量。

把这几个条件列出来,ADS122U04 几乎就是为工业测温和 HVAC 测控量身定做的。24 位分辨率配合 PGA,PT100 在 0 到 100 摄氏度量程内可以轻松做到 0.1 摄氏度的分辨率;内置 IDAC 让 RTD 前端从“一堆分立元件”简化成“一颗芯片加几个电阻”。UART 接口减少连线,降低现场干扰概率,也简化了隔离设计。

1.3 PIC24FJ256GA110 作为主控的考量

PIC24FJ256GA110 是 Microchip 的 16 位单片机,100 引脚 TQFP 封装,256 KB 程序闪存、16 KB SRAM,主频可配置到 32 MHz。选择它有几个很实际的理由。

第一,串口资源足够。PIC24FJ256GA110 上有多达 5 个 UART 模块,ADS122U04 通过 UART 通信,主控可以轻松挂多颗 ADC,每一路独立采集不同位置的温度传感器。这个特性在做多通道 HVAC 数据采集时特别有价值,不用担心 UART 数量不够。第二,16 位架构做 24 位数据处理更顺手,乘除法和浮点运算比 8 位 MCU 快得多。温度线性化要算查找表、插值或者多项式,CPU 性能富余可以减少很多麻烦。第三,工业级规格,工作温度范围宽,3.3 V 供电可以和 ADS122U04 的 3.3 V 电源统一,省掉电平转换。第四,PIC24F 系列的外设库和代码例程很成熟,UART 驱动、中断处理都有现成参考,开发周期短。

相比用 STM32 或者更高性能的平台,PIC24F 的定位就是“够用、可靠、省心”。它没有复杂的 Cache 和内存管理,裸机开发逻辑清晰,特别适合温控类产品。

对比项MCU 内置 ADC外置 SPI 接口 ADCADS122U04 UART 方案
分辨率10~12 位16~24 位24 位
通信线数无需外接至少 4 根2 根(RX/TX)
可编程增益通常没有部分支持内置 1~128 倍
RTD 恒流源无需要外部搭建内置双 IDAC
冷端补偿无需要外部温度传感器内置温度传感器
抗干扰/长线能力一般同步时钟易受干扰异步串口更稳

2. 硬件设计:从传感器到 ADC 再到 MCU 的完整链路

2.1 RTD 比例式测量:PT100/PT1000 的接法与电流配置

工业测温用得最多的还是 PT100 和 PT1000 铂电阻。铂电阻的阻值随温度近似线性变化,但变化量很小,PT100 在 0 摄氏度时正好 100 欧姆,到 100 摄氏度时约 138.5 欧姆,温差 100 摄氏度才变了 38.5 欧姆。如果直接用分压电阻测量,电源电压的波动会直接变成温度误差。

所以 RTD 测量推荐用比例式接法。思路很简单:用同一个恒流源同时激励 RTD 和参考电阻,把参考电阻两端的电压当作 ADC 的基准电压。这样不管电流源怎么漂移,ADC 输出只和两个电阻的比值成正比,电源噪声和电流源温漂都被抵消掉了。

以二线制 PT100 为例,典型接法是:IDAC1 从 AIN0 引脚输出恒流,电流流过 PT100 后再流过参考电阻 RREF 回到地;参考电阻两端分别接 REFP0 和 REFN0,作为 ADC 的外部基准。AIN0 和 AIN1 组成差分输入,测量 PT100 两端的电压。需要注意的是,二线制没法抵消导线电阻,如果传感器离主板比较远,50 米的两根铜线可能带来好几欧姆误差。这种情况下优先用三线制:用 IDAC1 从 AIN0 输出电流到 RTD 一端,RTD 另一端接 AIN1,再通过第三根线回到地;IDAC2 从 AIN2 输出同样的电流,经过另一根导线形成补偿。三线制的关键思想是让两根供电导线上的压降都落在差分测量范围之外,只保留 RTD 本身的电压。四线制最准,但现场布线成本高,一般只在计量级设备里用。

参考电阻 RREF 的选择要兼顾量程和分辨率。假设用 PT100 测量 0 到 200 摄氏度,对应阻值约 100 到 175.8 欧姆。如果 PGA 增益设为 8,外部基准 RREF 取 680 欧姆,那么满量程对应的差分电压为 VREF / 增益 = (I × 680) / 8。ADC 数字输出 code 和 RTD 电阻的关系是:

Rt = (code / 8388607.0) × (RREF / 增益)

这里的 8388607 是 24 位 ADC 的正向满量程码值。这个公式只需要乘除,不需要关心电流源的绝对大小,这也是比例式测量的精髓。实际使用时,把 RREF 选在 RTD 变化范围上限附近,可以让 ADC 的动态范围利用得更充分。

IDAC 电流一般选 250 µA 或 500 µA。电流太大,PT100 上产生额外的焦耳热,会带来自热误差;电流太小,信号幅度低,分辨率又会下降。我的经验是:PT100 用 500 µA,PT1000 用 250 µA。PT1000 本身阻值大,同样的电流下信号电压高,抗噪性更好,所以可以适当降低电流以减少自热。

2.2 热电偶测量与冷端补偿:利用片内温度传感器

热电偶的测温范围宽,适合工业窑炉、排烟管道这类高温场景,但信号非常微弱,K 型热电偶大约只有 41 µV/摄氏度。同时热电偶测量的是两个接头的温差,必须做冷端补偿,否则读出来的温度永远是相对值,不是真实温度。

ADS122U04 内部集成温度传感器,可以直接读取芯片附近的环境温度。硬件设计时把热电偶的冷端连接器尽量靠近 ADC 芯片,这样内部温度传感器的读数和冷端实际温度差别就小。测量流程分两步:第一步用 PGA 增益把热电偶的毫伏信号放大,采集热端相对冷端的电压;第二步读内部温度传感器,计算出冷端绝对温度;第三步用热电偶分度表或者多项式把电压换算成温度,再加上冷端温度,得到真实热端温度。

热电偶接线极性很容易搞错,现场调试时第一步就是确认正负极。红色引线一般是正极,接 AIN 差分输入的正端。输入引脚前加一个 RC 低通滤波器,既能抑制高频噪声,也能提供一定的静电保护。对于工业现场,建议在输入端并一个 TVS 管,防止雷击浪涌损坏 ADC。

冷端补偿的精度直接决定整个测量精度。ADC 内部温度传感器离冷端端子越近越好,PCB 布局时不要在两者之间铺大面积的铜皮或放发热器件。如果热电偶端子离芯片比较远,更稳妥的做法是在端子上贴一个外置 NTC 或二极管做冷端温度采集,把冷端电压和冷端温度分成两路独立测量。

2.3 电源、去耦与 PCB 布局的关键细节

ADS122U04 对模拟电源的噪声比较敏感,尤其是 Δ-Σ ADC 的基准电压。虽然 PSRR 性能不错,但别指望它替你扛住一个噪声很大的 DC-DC 输出。我的建议是一家三口电源方案:24 V 现场供电进来,先过 DC-DC 降到 5 V,再用低噪声 LDO 降到 3.3 V 给模拟部分和 MCU 供电。如果空间允许,ADC 的 AVDD 和 DVDD 各加一级 LC 滤波,电感和电容的组合可以很好地抑制高频纹波。

去耦电容尽量靠近电源引脚,用 1 µF 和 0.1 µF 并联,小电容靠近引脚端。数字部分和模拟部分的地,在 PCB 上用单点连接,避免数字地噪声通过地平面串进模拟地。很多初学者习惯把模拟地和数字地彻底隔离,结果反而造成回流路径不完整,EMC 更差。ADC 芯片下方要保证完整的模拟地平面,不要有走线穿过。

UART 通信线虽然抗干扰能力比 SPI 强,但仍建议在 MCU 侧加一个小电阻串在 RX 线上,比如 100 欧姆,配合引脚寄生电容形成滤波,可以吸收一部分反射。如果传感器板和主控板距离超过几米,UART 线上建议用 3.3 V 转 RS-485 或者加光耦隔离。光耦隔离的好处是彻底断开地环路,防止现场不同设备之间的地电位差把通信口打坏。光耦只是换个思路,这里也可以用磁隔离芯片,效果类似,但光耦成本更低。

3. 固件实现:UART 协议、寄存器配置与温度算法

3.1 ADS122U04 的 UART 协议与命令交互方式

ADS122U04 的 UART 接口是标准 8N1 格式,也就是 8 个数据位、无校验、1 个停止位。上电后可以通过配置引脚选择初始波特率,也可以在寄存器里修改。实际开发中我一般固定使用 9600 或者 19200,温度数据本身量小速率不快,没必要追求 115200,低波特率在长线上误码率更低。

芯片的命令交互是主从模式,PIC24 作为主机主动发命令,ADC 作为从机响应。常用命令包括复位、启动转换、读数据、读寄存器、写寄存器等。主机发完命令后,根据命令类型等待 ADC 返回数据。读数据时通常返回 3 个字节,对应 24 位转换结果。

由于 UART 是字节流,没有片选信号来指示一帧的开始和结束,第一次上电或者通信异常后双方容易“对不上时间轴”。解决方法是让 ADC 支持同步机制:主机在初始化时发送一个同步序列,让 ADC 重新对齐字节边界。这个步骤在正式通信前必须做,相当于手动给通信“握手”。很多工程师第一次调不通 UART 接口 ADC,八成都是忽略了上电同步。

实际调试时还有一个很实用的技巧:把 ADC 的 TX 和 RX 短暂短接,让 ADC 收到的数据原样返回,验证 UART 物理链路是否正常。如果自发自收能通,说明问题出在命令内容或者同步上;如果不通,检查波特率、电平和接线。

3.2 针对 PT100 的寄存器配置示例

ADS122U04 内部有一组配置寄存器,用来控制增益、输入通道、基准、IDAC 电流、数据速率和转换模式。给 PT100 做配置时,几个关键点分别是:输入多路复用器选 AIN0/AIN1 差分对,PGA 增益设为 8,基准选择外部参考电阻,IDAC 使能并接到特定引脚,电流设为 500 µA,数据速率根据现场滤波需求选 45 或 90 SPS。

下面这段代码是示意写法,重点展示 WREG 写寄存器和 START 启动转换的思路。具体命令字节请以手头的芯片数据手册指令表为准,不同批次和型号的定义可能有差异。

uint8_t cfg[4]; uint8_t dummy; // 上电后先执行同步,让 ADC 对齐字节边界 adc_sync(); // 读原始配置 adc_send_command(0xXX); // RREG 命令,示意值,以手册为准 for (int i = 0; i < 4; i++) cfg[i] = adc_read_byte(); // 逐位修改:增益8、差分AIN0/AIN1、外部基准、IDAC 500uA、90SPS cfg[0] = (cfg[0] & ~0xE0) | (0x03 << 5); // 011 -> 增益8 cfg[1] = (cfg[1] & ~0x07) | 0x05; // IDAC 500uA,示意 cfg[2] = (cfg[2] & ~0x07) | 0x03; // 90SPS,示意 // 写回寄存器 adc_send_command(0xXX); // WREG 命令,示意值 for (int i = 0; i < 4; i++) adc_write_byte(cfg[i]); // 启动转换 adc_send_command(0xXX); // START 命令,示意值

如果你不想用外部基准做一个额外的同步采集,也可以直接用内部基准。但比例式测量对参考电阻和恒流源的依赖更低,长期漂移小,所以我强烈推荐外部基准方案。所谓外部基准,并不是让你买一个昂贵的基准芯片,而是用一颗精密电阻 RREF 跨接在 REFP/REFN 上,本身就是 RTD 测量的一部分,精度好又便宜。

3.3 数据读取与温度计算:从原始码到摄氏度

ADC 返回的 24 位结果是二进制补码格式。正温度对应正码值,负温度对应负码值。要把它换算成温度,第一步是扩展符号位,把 24 位值转换成 32 位有符号整数。

然后,如果是比例式外部基准,RTD 阻值计算只需要三个数:原始码值 code、满量程码值 8388607、参考电阻 RREF 和增益 G。

int32_t raw = (rx[0] << 16) | (rx[1] << 8) | rx[2]; if (raw & 0x800000) raw |= 0xFF000000; // 24位转32位有符号 float ratio = (float)raw / 8388607.0f; float rt = ratio * RREF / GAIN;

算出 RTD 阻值后,下一步是把阻值换算成温度。PT100 和 PT1000 的阻温关系不是绝对直线,但可以用分段线性插值来逼近。做法是建一个查找表,把 0、10、20……每 10 摄氏度对应的标准阻值写进去,然后对任意阻值做线性插值。步长取 10 摄氏度时,插值误差在零点几摄氏度以内,HVAC 和一般工业控制完全够用。如果想更精确,可以用 Callendar-Van Dusen 公式,但公式里有三次项和分情况讨论,代码量会大一些,实测精度提升也不明显,我不建议在 MCU 上跑完整公式。

如果是 NTC 热敏电阻,比如 HVAC 里最常见的 10K NTC,阻值随温度呈指数变化,这时用 Steinhart-Hart 方程最方便:

float r_ntc = RREF / ratio; // 如果NTC接在分压上 float logr = logf(r_ntc); float kelvin = 1.0f / (A + B * logr + C * logr * logr * logr); float temp_c = kelvin - 273.15f;

系数 A、B、C 需要根据热敏电阻的 B 值自己标定,或者找传感器厂家要。没有厂家数据时,用 B 值简化公式也能把误差控制在 1 摄氏度以内。NTC 测量本身是低成本方案,拿 24 位 ADC 去测它有点“杀鸡用牛刀”,但好处是系统通用,前端电路不用为传感器类型做大的改动。

3.4 PIC24 端的 UART 驱动与状态机实现

PIC24FJ256GA110 的 UART 驱动不复杂,关键是波特率寄存器的计算要准确。Fcy 是外设时钟频率,UART 波特率计算公式是:

void uart_init(UART_MODULE uart, uint32_t baud, uint32_t fcy) { UART_ENABLE(uart) = 0; UART_BRGH(uart) = 0; // 标准16倍过采样 UART_BRG(uart) = (fcy / (16 * baud)) - 1; UART_ENABLE(uart) = 1; }

初始化完成后,主机侧只需要一个简单的状态机,就能把 ADC 的交互流程管起来。由于温度采集不是高速过程,我用的是“状态机+轮询超时”的写法,没有上 RTOS。状态大致分成空闲、发送命令、等待响应、解析结果、错误处理五个状态。每调用一次状态机函数,做一步操作,UART 中断里只负责往环形缓冲区放数据,主循环负责解析和判断超时。

这样做的好处是逻辑清晰,后续想改成中断驱动或者加上多路 ADC 轮询,只需要在状态机里加几个状态就行,不用把通信逻辑打散得到处都是。ADS122U04 的转换结果读取响应时间要留足,数据速率 90 SPS 时单次转换大约 11 毫秒,状态机里的超时阈值建议设成 50 毫秒以上,避免临界误判。

4. 工业与 HVAC 应用中的落地细节

4.1 典型测点与传感器选型

HVAC 系统里,温度测点的类型很杂。空调箱的送风温度、回风温度常用 NTC 或 PT1000,因为量程在 -20 到 80 摄氏度之间,NTC 灵敏度高,成本低;冷冻水供水、回水温度,则需要更高精度和稳定性,我一般选 PT1000 或 PT100,配合三线制接线;热泵系统的压缩机排气温度、冷凝温度,要覆盖到 100 摄氏度以上,用 K 型热电偶更合适;锅炉系统的烟气温度,动辄 200 到 400 摄氏度,也只能用热电偶。

ADS122U04 的四通道配上 PGA,可以说一套硬件同时覆盖了这些场景。不同通道接不同类型的传感器,只需要在配置寄存器里切换增益、基准和 IDAC 设置即可。比如通道 0 接 PT1000,增益设 8、IDAC 设 250 µA;通道 1 接 NTC10K,增益设 1、IDAC 设 500 µA;通道 2 接 K 型热电偶,增益设 32,用内部温度传感器做冷端补偿。这种多传感器混接能力在 HVAC 控制柜里非常实用,以前可能需要三块不同的信号调理板,现在一颗 ADC 全部搞定。

工业场景则更看重长线传输和故障诊断。很多设备安装在几十米外的管道上,传感器信号线走桥架、穿线管,环境温度可能到 70 摄氏度以上,这时候接插件和线缆的可靠性往往比 ADC 本身更影响系统寿命。接线端子推荐用弹簧式或螺丝锁紧式,并且在 PCB 上留出测试焊盘,方便现场万用表排查。

4.2 现场抗干扰与长线布线经验

HVAC 控制柜里通常有接触器、变频器、电动调节阀,这些东西一动作,空间电磁环境立刻变差。传感器信号线必须和动力线分开走线,至少在同一个桥架里保持 30 厘米以上间距。信号线用双绞屏蔽线,屏蔽层单端接地,即靠近主控板那一端接地,另一端悬空,防止形成地环路。我看到很多现场把屏蔽层在传感器端和主控端都接到大地,结果地环路反而引入 50 Hz 工频干扰。

长线传输还有一个容易被忽略的问题:传感器线的分布电容和 ADC 输入端的 RC 滤波器会形成低通效应,但这是针对高频信号的,对直流温度信号影响不大。真正需要担心的是线缆上的差模浪涌,比如雷击感应,所以在 ADC 输入端并联 TVS 管比加多大电容都管用。TVS 管选结电容小的型号,否则会拖慢输入建立时间。

UART 通信线如果也要长距离传输,比如 100 米以上,建议不要直接传 3.3 V TTL 电平,而是转成 RS-485 或者差分信号。ADC 板放在传感器附近,主控板放在控制柜里,两者之间用 RS-485 通信,这样信号线即使穿过强电区域也不容易损坏。

4.3 断线检测与数据有效性判断

温度传感器的断线检测,是做工业控制绕不开的功能。PT100 断线时,恒流源没有回路,AIN 输入引脚会被下拉或上拉,ADC 读数通常会直接偏向满量程或者负满量程。我们可以利用这个特征,在固件里加入范围检查:如果实测阻值明显超过传感器量程上限,比如 PT100 测出 300 欧姆以上,基本可以判断为开路或者接触不良。

NTC 热敏电阻的断线行为正好相反,温度读数会显示一个极低温度,因为 NTC 断线后分压点的电压被拉到了一个极端值。所以固件里要做双向超限判断,既判断过高,也判断过低,然后输出一个故障码,而不是一个看似合理但完全错误的温度。

ADS122U04 的数据输出还带 CRC 校验选项,虽然是 UART 通信,但打开 CRC 可以防止偶尔的字节错位导致数据被判为有效。温度数据多花两个字节的校验时间,完全值得。我在实际项目里是强制打开 CRC 的,一旦 CRC 错误跳过一次采集周期,数据不更新但保持上一次有效值,同时错误计数加一,超过连续三次错误再上报故障。

5. 实战中遇到的坑与排查方法

5.1 UART 不同步,读回来的数据永远不对

这个问题我第一次调 ADS122U04 时也遇到了。上电后发命令、读寄存器,返回的数据全是乱码,逻辑分析仪抓出来看着波形也正常,但就是解析不对。后来才反应过来,UART 没有片选线,芯片不知道从哪个字节边界开始算一帧。主机上电后不能直接发命令,必须先发一个足够长的同步序列,让 ADC 内部字节同步器重新对齐。

处理办法是把同步动作封装成独立的函数,每次 ADC 复位后都调用一次。如果 DA 后还是不对,可以检查时钟源。ADS122U04 如果配置成外部时钟输入,主机的波特率必须和外部晶振匹配;如果用内部振荡器,注意它的精度一般只有 ±1%,长时间运行或者温度变化后,双方的波特率误差会累积。解决方法是定期重新同步,比如每 10 秒发一次同步命令,避免长期漂移导致通信断掉。

5.2 读数噪声大,数字一直跳

24 位 ADC 对噪声非常敏感,如果测出来的温度末位两位数乱跳,先别怀疑芯片,大概率是硬件布局或者数据速率设置的问题。温度信号本身是缓变的,没人需要 2000 SPS 的采样率,把数据速率降到 45 SPS 或 90 SPS,内部数字滤波器会把大部分高频噪声滤掉。如果应用对响应速度要求不高,甚至可以加一个软件平均值滤波,滑动窗口取 16 次平均,实测效果立竿见影。

还有一个小细节,IDAC 恒流源是给传感器供电的,电流源本身也有建立时间。如果 WREG 修改了 IDAC 配置后立刻启动转换,读出来的第一组数据往往会偏一点。最好在改寄存器后延时 10 到 20 毫秒,等电流稳定了再开始采集。如果传感器引线很长,RTD 线上的分布电容也会让 IDAC 建立时间变长,这时候数据速率就不要再往高里选了。

5.3 自热效应导致测量值偏高的处理

自热现象很多新手容易忽略。IDAC 电流流过 PT100 时,会像一个小加热器一样给铂电阻加热,导致它测到的温度比真实环境高。PT100 在 500 µA 时的功耗只有 0.025 毫瓦,PT1000 在 250 µA 时的功耗是 0.0625 毫瓦,看起来都不大,但在不流动的介质里,热阻很大,温度照样可能偏高零点几摄氏度。

处理自热有几个办法。一是降低 IDAC 电流,代价是信号幅度变小,对 PGA 的噪声要求更高,一般 PT1000 用 250 µA、PT100 用 500 µA 是平衡点。二是减少传感器和被测介质之间的热阻,比如在热电阻外面涂导热硅脂,或者把探头插入深度做到足够。三是做比例式测量后用软件校准,把固定自热偏差在标定时扣掉。这个方法最省事,因为自热导致的偏差在稳定工况下基本是固定的。

还有一个容易和自热混淆的问题是 PT100 引线电阻造成的“假升温”。尤其在二线制接法下,两根导线从控制柜一直拉到管道上,铜缆电阻会直接叠加到 RTD 阻值上。假设来回 20 米、线径 1.0 平方毫米,电阻大约 0.35 欧姆,在 PT100 上相当于近 1 摄氏度的误差。解决方法是优先用三线制,或者现场把线阻测量出来,在固件里做固定补偿。

5.4 冷端补偿不准,热电偶读出温度明显偏低

热电偶测温时,如果热端温度正常但读出温度比实际低,多半是冷端补偿出了问题。最常见的错误是热电偶端子离 ADC 芯片太远,内部温度传感器读到的是 PCB 局部温度,和冷端实际温度差了四五摄氏度。

更隐蔽的问题是 UART 通信或者电源发热影响了内部温度传感器的读数。ADC 芯片本身工作时有功耗,芯片温度会比环境温度高,冷端补偿就会偏高。如果系统对精度要求很高,建议不要迷信内部温度传感器,在冷端端子附近放一个外部 NTC 或二极管,用同一颗 ADC 的另一个通道去采集冷端温度。外部冷端传感器用 PT1000 的也有,成本稍微高一点,但精度和稳定性明显更好。冷端传感器和热电偶端子尽量保持热接触,比如贴在端子排的铝条上,这样温度梯度最小。

最后再分享一点我的实际体会

这套 ADS122U04 + PIC24FJ256GA110 方案,我实际用了两个项目,一个做 8 路空调箱温湿度采集,一个做工业冷冻站温度监测。真正常驻现场的坑,往往不是在实验室里调出来的,而是到了电磁环境复杂的控制柜里才暴露的。比如 UART 线从板子拉到面板接头,经过了一段靠近变频器输出的走线,刚开始 115200 波特率会偶发误码,后来改成 9600 再也没出过问题。温度采集这种低速应用,真的没必要追求高速串口,稳定压倒一切。另外在 PCB 设计上,我给 AMS1117 这类 LDO 的输入输出端都预留了 0805 封装的电阻位置,方便后期按需调整滤波,实测对抑制变频器传导噪声很有效。

如果你正在规划类似的温度采集板,建议先定好传感器类型和线制,再决定 IDAC 电流和增益,最后才是画原理图。ADS122U04 的寄存器配置看起来复杂,但只要抓住“比例式测量、差分输入、低数据速率、开 CRC”这四个原则,整个系统基本不会跑偏。后续如果想扩展更多通道,PIC24FJ256GA110 上还富裕着好几个 UART,多加几颗 ADS122U04 也不是问题,主控只需要按通道轮询就行。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进