☰
ADS122U04与PIC18F86J15的RTD温度采集信号链设计实战
2026/11/5 1:04:02 网站建设 项目流程

这两颗芯片的组合,是我在实际项目里从“能用”抠到“够用”之后才定下来的。如果只看参数页,ADS122U04IPWR 和 PIC18F86J15 都属于不温不火的库存料,但把它们放到工业温控和 HVAC 控制器的信号链里,优势就很明显了:一颗 24 位 ADC 承担前端采集和激励电流,一颗老牌 8 位 MCU 只管逻辑和通信,没有蓝牙、没有以太网、没有多余外设,反而把系统做得非常干净。这篇文章不是产品发布会,也不打算复述数据手册,我会把从选型、原理图设计、PCB 布局到固件调试过程中真正影响测量结果的节点,按我实际踩过的顺序写出来,希望能给正在做温度采集、RTD 信号调理或者 HVAC 控制板的同行一些能直接落地的参考。

1. 为什么是 ADS122U04 加 PIC18F86J15,而不是一体化温度芯片

很多 HVAC 项目图省事,直接上数字温度传感器,比如常见的一线总线或 I2C 接口的集成芯片,板子小、电路简单、代码也短。但在工业现场,这种方案有几个绕不过去的短板:传感器和控制器之间距离稍远,压降和线缆阻抗就会影响读数;供电波动时,集成传感器内部基准也跟着飘,精度做不到长期稳定;更麻烦的是,现场电磁干扰会让数字总线上的数据直接错乱,轻则跳几度,重则整条总线被拉死。

ADS122U04IPWR 这类 24 位 ΔΣ ADC 的价值就在于把模拟前端独立出来。它自带可编程电流源,也就是 IDAC,可以直接给 PT100、PT1000 或者 NTC 提供恒流激励,然后对传感器上的电压做高分辨率采样。这样传感器和 ADC 之间走的是模拟信号,只要线缆屏蔽和滤波做好,干扰问题就从原理上被削掉一大截。另一个优点是它对温漂的处理:ADC 自身有内部温度传感器,配合外部基准或者比例测量,可以在固件里做温漂补偿,这对长期运行的控制柜非常关键。

PIC18F86J15 在这里扮演的角色不是通用单片机,而是时序协调者。它不需要跑操作系统,也不涉及复杂协议栈,只要把 SPI 通信、定时轮询、掉电保护和现场总线协议(比如 Modbus RTU)管理好就够。8 位核心处理一个 24 位 ADC 的数据完全没有压力,反而因为外设简单,代码容易做到确定性延时,这对 ADC 采样时序来说比高性能 MCU 更可控。

这两颗芯片搭配起来,整条链路是:PT100 传感器 → IDAC 恒流激励 → ADS122U04 采样并转换 → SPI 输出数字量 → PIC18F86J15 做滤波、线性化、查表修正 → 输出给上位机或执行器。每一段都职责明确,排查问题时能清晰地切分开,这是集成式传感器很难给到的好处。

2. 信号链设计第一步:把 RTD 接线方式和 IDAC 电流源匹配好

很多人以为 RTD 测温就是把传感器两根线接上 ADC 通道,然后读寄存器出结果,实际上 0.1% 的精度差别就藏在接线方式和电流配置里。ADS122U04 支持两线、三线和四线 RTD 接法,选择的本质是在“线阻消除能力”和“引脚占用”之间做取舍。

四线制最准,因为是开尔文接法:两根线走激励电流,另外两根线单独测电压,电压采样回路里几乎没有电流,所以线阻不会引起压降误差。三线制是工业现场的折中方案,适合传感器和 ADC 距离几十米的场合,只要两根激励线的线阻对称,测量结果也能做到比较理想。两线制最省事,但线缆电阻会直接叠加到传感器电阻上,只能做短距离粗测。

我一般这样定配置:控制柜内部或者同一块 PCB 上用四线制;现场仪表和传感器之间走三线制;对精度要求不高的风管温度点用两线制。然后画一张简单的配置表放进项目文档里,避免生产阶段接线错误。

接法线缆要求适用场景需要补偿的误差
两线制2 芯板上测温、短距离粗测线阻串入 Rtd
三线制3 芯现场传感器、常规 HVAC 点位需两线阻值对称
四线制4 芯高精度关键点、计量级检测线阻影响可忽略

选好接法后,就要确定 IDAC 电流值。ADS122U04 的 IDAC 通常有几个可编程档位,比如 50µA、100µA、250µA、500µA、1000µA。这个选择需要同时看两个约束:

第一是传感器自热。PT100 在 1mA 电流下功率也就 0.1mW 级别,基本不会发热,但如果用 5mA、10mA 这种大电流,传感器自身发热会造成读数偏高,而且风速大小时散热条件不一样,偏差还不固定。所以对于典型 HVAC 的 PT100/PT1000,我建议 250µA 到 500µA。PT1000 因为阻值大,1500µA 以下问题不大,也常用 500µA。第二是 ADC 输入范围。IDAC 电流流过 RTD 产生的电压要落在 PGA 增益对应的满量程范围内,不能削顶,也不能小到浪费分辨率。计算方式是:最大目标温度对应的 RTD 阻值乘以激励电流,得出最大输入电压,再乘以 PGA 增益,需要低于参考电压。

举个例子,PT100 测到 200°C 时阻值约 175.86Ω,用 500µA 电流,电压是 87.93mV。PGA 设为 8 倍,ADC 输入约为 703mV,如果内部参考电压设在 2.048V,信号只占三分之一量程,偏小;如果把 PGA 提到 16 倍,就是 1.407V,占到三分之二量程,明显更合理。所以下面的配置就要按这个思路去调,而不是随便选一个增益就算完。

3. 比例测量和参考电压的取舍:不要让 LDO 的噪声决定你的精度

这块是最容易被忽略的,也是我早期实测数据飘的原因。刚开始做板子时,我图省事直接用一颗 3.3V LDO 给 ADC 供电,再将同一个 LDO 的输出作为参考电压。结果每块板的读数差异很大,同一块板在不同温度环境下零漂也明显,后来意识到问题不在于 LDO 本身标称精度,而在于系统里用的是绝对参考,不是比例参考。

比例测量的核心思想是:ADC 输出的数字量是输入信号和参考电压的比值。如果参考电压和激励电流来自同一个来源,那么参考电压的波动会被同时体现在分子和分母上,最终测量结果不受电源缓慢漂移的影响。ADS122U04 可以用 IDAC 电流流过一个精密参考电阻来生成 VREF,然后把 RTD 上的电压和这个 VREF 送入同一个 ADC 做比例换算。这样 LDO 就算从 3.3V 掉到 3.2V,电流源和参考电压同比例变化,测量结果依然稳定。

我实际采用的参考网络是这样的:用一颗低温漂、高精度电阻(比如 0.1% 精度、温漂 ±10ppm/°C)串接到 IDAC 输出回路上,IDAC 电流在该电阻上产生的压降作为 REF。RTD 两端的电压经由 PGA 放大后与 REF 比较,输出的是比值。这样做的直接好处是,外部电源噪声进入 ADC 共同模路径的部分会被抵消,真正影响的只是参考电阻本身的温漂,而不是整条电源轨的精度。这里有个关键点:参考电阻要选用功率稍大的贴片,比如 0805 或 1206,避免自身温升影响阻值。

具体到 ADS122U04 配置里,我会在配置寄存器中把 IDAC 输出分配到某个通道,同时把参考电压选择为外部参考输入。启动顺序必须先让 IDAC 建立稳定电流,再触发转换,尤其在多通道切换时,要等待足够长的稳定时间。否则前几次采样值会偏大或偏小,因为它们是在电容充电过程中被采下来的。

4. PIC18F86J15 驱动 ADS122U04:SPI 时序和寄存器分配的实操细节

选好了模拟参数,接下来就是 PIC18F86J15 和 ADS122U04 之间怎么把数据读回来。ADS122U04 是标准 SPI 从设备,PIC18 做主机。这里有一个经常让人忽略的细节:SPI 通信的相位和极性必须和 ADC 的时序图完全对上,差一个边沿,读回来的数据全部是乱的,而且这种乱非常有迷惑性,有时只有最低位错,有时整个通道串位。

我建议把 SPI 配置弄成 Mode 1 或根据数据手册确认 CPOL=0、CPHA=1 之类的组合。如果你的 MCU 库里直接有模式枚举,就用模式 1;如果自己写位操作,就把时钟空闲电平设为低、在第二个边沿采样。实际测试时,最好先用逻辑分析仪抓一次完整通信波形,确认每个命令字节和数据字节之间的间隔,特别是最后的几个时钟周期,因为有些 ADC 要求 CS 拉高前所有时钟必须完整。

PIC18F86J15 的硬件 SPI 模块可以处理基本的字节收发,但要注意一个操作习惯:读取 24 位数据时,SPI 通常是 8 位为一次收发,所以连续三次调用 SPI 读写函数后拼接。我的做法是:

  1. 拉低 CS。
  2. 发送命令字节,表示要读取转换结果。
  3. 连续读取 3 个字节,先收到的是最高有效位。
  4. 拉高 CS。
  5. 把 3 个字节拼成一个 32 位整数并右移 8 位,得到 24 位有效数据。

在代码层面,大概是这样的风格:

uint32_t ads122_read_data(void) { uint8_t b2, b1, b0; ADS_CS_LOW(); spi_write(ADS_CMD_RDATA); // 0x10 之类,以手册为准 b2 = spi_read(); b1 = spi_read(); b0 = spi_read(); ADS_CS_HIGH(); return ((uint32_t)b2 << 16) | ((uint16_t)b1 << 8) | b0; }

这里有个容易踩的坑:有些 ADC 在读取数据后会自动清除 DRDY 标志,如果主机读取速度太慢,新的转换结果标志还没准备好,你却去读老数据,拿到的是同一份重复值。解决方式是直接用一根 GPIO 连接 ADCs 的 DRDY 引脚,用下降沿中断或轮询来触发读取,而不是单纯按固定延时报数据。HVAC 系统里温度变化相对慢,固定轮询也能工作,但中断方式会让整体时序干净很多,后续扩展其它通道也更灵活。

配置寄存器的写入同样需要 SPI 命令。我一般在系统初始化时先给 ADC 写入一组完整配置,包括 PGA 增益、数据速率、IDAC 电流档位、通道选择、参考源选择。不要在运行过程中频繁改写配置寄存器,因为每次写寄存器都可能使 ADC 内部状态机复位,连带丢掉一次转换结果。如果需要切换通道,最好按通道配置预置好几组配置缓存,切换时一次写完所有相关字节,然后做一次空读取或丢弃下一次结果。

5. 固件里比 ADC 本身更影响精度的部分:滤波、线性化和校准

很多初学者以为 24 位 ADC 读回来的数字再除以分辨率就是温度,这忽略了两个事实:第一,RTD 的电阻-温度曲线是非线性的;第二,ADC 的输入失调和增益误差不可能为零。在 HVAC 这种温度范围通常在 -20°C 到 150°C 的应用里,不做线性化和校准时,读数和真实温度的偏差有时能达到 ±1°C,这对控制来说往往不够。

滤波方面,我会先用低通滤波处理原始码值,再做线性化。选用滑动平均或一阶 IIR 都行。HVAC 环境温度变化慢,噪声主要是电网 50Hz 或现场变频器耦合进来的高频干扰。ADS122U04 的 ΔΣ 转换器本身有数字滤波器,数据速率越低,抑制工频干扰的效果越好,比如 20SPS 时对 50Hz 和 60Hz 都有不错的陷波,所以我会尽量选择低数据速率。

线性化时,PT100 的标准公式可以用 Callendar-Van Dusen 方程,或者直接采用 IEC 60751 的分段查表。查表方法对 MCU 更友好:把 -50°C 到 300°C 每 1°C 对应的阻值做成数组,运行时用二分查找加线性插值。以 PIC18F86J15 的 Flash 容量来说,这类表完全放得下。查表线性插值的精度在 0.1°C 级别,足够 HVAC 使用了,而且代码逻辑很直观,方便现场工程师理解。

校准相比更有意思,也更考经验。一块新板子焊接完,首次通电时先不要接传感器,让 ADC 输入通道对地短路,读取原始码值,这就是失调误差。然后用精密电阻箱分别接入几个标准阻值,读取对应码值,计算实际增益。我通常至少校四个点:低温点、室温点、高温点、以及接近满量程的点。每个点用精度高于 0.01% 的电阻箱,或者直接送入恒温槽里的标准铂电阻温度计作为参照。

校准系数不能写死在固件里,要存在 MCU 的 Flash 数据区或者外部 EEPROM 中。生产时每块板跑一遍自动校准,把失调和增益系数存起来,运行时读出来对每个采样值做修正。这一步在大批量生产中看起来费时间,但能显著降低换传感器、换批次 PCB 引起的系统性偏差,尤其当传感器线缆长度不一致时,这个修正尤其有效。

6. 校准数据的保存和现场更换传感器时的处理

校准做完只是开始,真正的问题是现场运行后传感器坏了,换一支新的后读数偏了。这时如果固件里只有一组固定的校准系数,所有历史校准都等于白做。我在项目里采用的方案是:把校准系数和传感器类型编码绑定,每一次校准后生成一个结构体存入非易失存储区,结构体里至少包含传感器类型、校准日期、失调系数、增益系数、线缆长度对应的补偿值。

更换传感器时,现场人员如果直接换硬件但不改写校准参数,读数肯定不对。所以我在固件里加了一个自动识别机制:通过对比常温状态的实测阻值,判断是 PT100 还是 PT1000,并把这个信息作为校准参数选择的关键字段。这样一来,换同样型号的传感器时,只需要重新做一次短接失调校准,增益系数可以沿用,误差也能控制在可接受范围内。如果换的传感器类型变了,固件会提醒重新执行完整校准流程。

存储方面要注意,PIC18F86J15 内的数据 EEPROM 写入寿命虽然够用,但不要没事就写。只在参数变更时写一次,运行时全部放在 RAM 缓存里。写 EEPROM 时如果突然掉电,数据可能写到一半,所以我的做法是保存两个备份区,启动时校验校验和,主备份坏了就用备用区。这个设计成本很低,但现场救回来的不止一次。

7. PCB 布局和布线顺序:ADC 性能是布出来的,不是焊出来的

再好的芯片和固件,PCB 布局一塌糊涂,读数照样飘。ADS122U04 属于高精度模拟器件,布局的核心就一条:不要让数字噪声和电源噪声经过模拟信号的地回路。

我画板子时,会把 PCB 分成三个区域:模拟采样区、数字控制区、电源区。ADS122U04 所在位置靠近传感器接口,PIC18F86J15 和 SPI 走线靠近板子另一边,让两者之间只有 SPI 信号跨越,而不是把 ADC 夹在开关电源和 MCU 之间。

具体做法是:

  • ADS122U04 的模拟电源和数字电源分别用磁珠或小电阻隔离,各放 10µF 钽电容和 100nF 陶瓷电容组合去耦。
  • 参考电压引脚旁边放高质量电容,这是整个 ADC 基准,电容质量直接影响转换精度。
  • RTD 信号线从接口进入后先过一组 RC 滤波,再进 ADC 输入引脚,RC 的截止频率要按数据速率来算,不能随便放个 100Ω 和 1uF 就去测高速率。
  • SPI 时钟线不要和模拟输入线平行走太远,中间用地线隔离。
  • 如果传感器线缆从现场进来,接口处加 TVS 管和共模电感。冷库、室外机、锅炉房这类场景,雷击浪涌虽然概率不高,但一旦发生,损坏的不是几个芯片的问题。

地线处理上,模拟地和数字地最终在 ADC 底部的焊盘处单点连接,或者干脆用完整的统一地平面,只在布局上把敏感信号和高噪声信号拉开距离。现在很多高速混合信号板子提倡统一地平面,而不是切开地,这对经验不足的工程师来说反而是更好的起点。切忌为了“隔离”在 MCU 和 ADC 之间把地平面切成两半,然后又让数字信号跨过裂缝,那样回路面积大增,干扰更严重。

我早期吃过这个亏:做了模拟地分割,SPI 时钟线横跨分割区,结果采样值在继电器吸合瞬间剧烈跳动。后来把分割去掉,所有地连成整片,继电器驱动远离 ADC,问题就消失了。所以,完整地平面 + 分区布局,比盲目切割地的效果靠谱。

8. 保守设计还是激进滤波?现场出现的几个典型问题排查

做完板子和固件,实验室测试一切正常,一上现场就会出现各种奇怪现象。这里挑几个我实际遇到过的,以及对应的排查思路。

第一个是读数在 0.1°C 到 0.3°C 之间周期性波动,跟压缩机的启停完全同步。频谱一看,波动频率等于压缩机的开关频率及其倍频。原因是传感器线缆和动力线在同一个线槽里,感应到了共模干扰。整改方式是给传感器接口加共模电感,在两个信号输入端各接一个对地电容,同时在 ADC 设置中选择更低的输出速率,利用内部数字滤波进一步抑制。

第二个是读数偶尔跳变到满量程或零,持续一两个采样周期后又恢复。这是典型的偶发脉冲干扰,有可能是继电器弹跳、接触器拉弧,或者有人碰了线缆。排查时用示波器长时抓取信号波形,往往能看到一个尖峰。处理方式是固件加中值滤波,连续取五个值丢掉最大最小取平均,基本能把这尖峰抹掉。如果尖峰频繁,再检查传感器接线端子是不是氧化或松动。

第三个是读数和便携式测温仪对比,整体偏正 0.2°C。这未必是 ADC 的问题。便携测温仪探头可能插得更深,或者传感器本身的自热不一致。我会用恒温槽对比验证,只信恒温槽标准值,不信手持表。如果恒温槽下确实偏正,就要查是不是 IDAC 电流设置过大导致自热,把电流从 1mA 降到 250µA,往往就恢复正常。

第四个是 SPI 偶尔读回全 FFFFFFFF。这个要先怀疑线缆长度和时序,不要立刻怀疑芯片坏了。SCK 频率太高、线缆太长、上升沿过缓都会导致采样瞬间数据错位。我碰到过一次是 MCU 库函数 SPI 时钟配置写成 8MHz,而 ADS122U04 的 SPI 时钟上限远低于这个值,后来把 SPI 降到 1MHz 以下,问题消失。经验是:高精度 ADC 的 SPI 频率不需要高,1MHz 足够完成所有温度采样,重点是稳定。

9. HVAC 场景常见配置速查和我个人的选型建议

HVAC 控制器不像实验室仪表,它要求的是长期稳定、价格可控、支持现场快速维护。基于片内资源做一些看门狗功能,比如周期性自检。综合这些环境约束,下面是一组我个人认为比较稳妥的配置方向,可以直接作为新项目的起点,而不是从零开始摸索。

参数或模块推荐方向说明
传感器PT1000 为主,关键点用 PT100PT1000 自热小、线阻影响相对小
接法三线制为主,板内用四线制平衡成本与精度
IDAC 电流250µA 到 500µA依据传感器阻值和 PGA 范围调整
PGA 增益8 到 16 倍保证信号占满量程的 50% 以上
数据速率20SPS 左右有效抑制工频干扰
SPI 时钟1MHz 以下保证通信稳定
校准出厂多点校准,系数存EEPROM保证批次一致性

实际项目里,我最后强调一下 MCU 的任务调度。PIC18F86J15 虽然外设不复杂,但 HVAC 控制器往往同时处理多路模拟量、开关量、通信协议和定时控制。建议把温度采集部分做成独立模块,用定时中断触发 ADC 读取,读到的原始数据放入环形缓冲区,主循环只消费处理后的温度值。别让通信协议栈或者显示刷新代码直接阻塞 ADC 的数据读取,否则任何一处占用 SPI 总线超过一个转换周期,通道之间的采样间隔就会被拉长,多通道的同步性就没了。这个设计细节,我在实际项目里比调整滤波器参数时遇到的问题更多,也更值得提前安排。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询