ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ADS122U04+PIC18F96J94:24位ADC工业测温方案解析

ADS122U04+PIC18F96J94:24位ADC工业测温方案解析

ADS122U04IPWR 这颗 24 位 ADC 和 PIC18F96J94 的组合,我最早是给一个机房空调监控项目选型时盯上的。当时要做 8 路 PT1000 温度采集,传感器到主控板的线缆最长拉到 15 米,用传统模拟前端加 MCU 内置 ADC 的方案,信号衰减和工频干扰能把人逼疯。后来换成“传感器端数字化 + 串口传输”的思路,也就是让 ADS122U04 在现场完成模数转换,再用 UART 把数据送给 PIC18F96J94 做处理和上报,问题一下子简单了很多。这篇文章就围绕这套组合,把从硬件设计到固件实现、再到调试标定的完整过程捋一遍,给同样在做工业温度采集或 HVAC 控制器的朋友做个参考。

这方案最大的价值在于:ADS122U04 本身就是为高精度、低功耗测量设计的,内部集成了 PGA、电压基准和温度传感器激励电流源,而 UART 数字输出又天然适合远距离传输;PIC18F96J94 则提供了足够多的串口资源、定时器和 IO 口,跑一套多通道轮询采集和通信协议毫不费力。搭配起来能覆盖 RTD、热电偶、NTC 三大类温度传感器,非常适合空调箱、冷冻站、洁净室、冷水机组这类场景。

1. 整体方案设计与关键器件选型思路

1.1 工业温控场景对测量链路的核心诉求

先说工业现场和 HVAC 设备里温度测量的真实现状。很多人都以为“测个温度有什么难的”,但一旦进入实际工况,问题就接踵而至:传感器离控制器几米甚至几十米,模拟毫伏信号在线缆上走一圈,被变频器、接触器、压缩机启动电流干扰得面目全非;温度变化缓慢,但又要求分辨率到 0.01℃ 级别的趋势观察;现场 50Hz / 60Hz 工频干扰通过空间耦合进测量回路,普通 ADC 根本压不住。

所以工业级温度测量链路,核心诉求其实就三条:第一,分辨率要够高,微弱信号变化不能被量化噪声淹没;第二,抗干扰能力要强,尤其是共模干扰和工频干扰;第三,链路要简单可靠,尽量把模拟信号数字化这件事放到离传感器最近的地方去做。ADS122U04 这种自带数字输出的 Δ-Σ ADC,就是为这个诉求设计的,它把最容易受干扰的模拟环节压缩在传感器端的一小块电路里,之后全部走数字信号,从根上规避了长线模拟传输的衰减和串扰问题。

1.2 为什么是 ADS122U04 而不是 ADS1220 或普通仪表放大器方案

ADS1220 是很多硬件工程师熟悉的 SPI 接口 24 位 ADC,ADS122U04 则是它的 UART 版本,核心架构一脉相承:24 位 Δ-Σ 转换器、内部可编程增益放大器(PGA,增益 1 到 128)、内部 2.048V 基准、两个可编程激励电流源(IDAC),还多了 50Hz / 60Hz 工频抑制数字滤波器选项。与 ADS1220 相比,UART 接口最大的好处是只用两根线就能通信(DIN 和 DOUT/DRDY),而且支持多器件地址寻址,一条总线上可以挂多个 ADC。

对比传统“精密仪表放大器 + 外部基准 + 独立 24 位 SPI ADC”的方案,ADS122U04 把关键模拟器件都集成进去了,布线面积和物料成本都能省下一大块。它的 UART 速率最高可配置到 1Mbps,数据输出速率在 20SPS 时对 50Hz 工频有极好的抑制能力,用于 HVAC 这种温度变化缓慢的场景绰绰有余。最关键是这颗芯片的输入偏置电流很小,可以直接配合高阻传感器(比如 10kΩ NTC、PT1000)而不额外引入明显误差。

1.3 PIC18F96J94 在系统里扮演的角色

PIC18F96J94 是 Microchip 的 16 位内核?不,它是 8 位 PIC18 增强型内核,但外设相当丰富:96 引脚封装下集成了多个 EUSART 串口、SPI、I²C、12 位 ADC、多路 PWM、USB 和 LCD 驱动模块,工作电压 2.0V 到 3.6V,很适合做楼宇自控和 HVAC 控制器的主控芯片。

在这套方案里,PIC18F96J94 干的事情包括:通过 UART 下发配置命令给 ADS122U04,轮询或接收中断方式读取转换结果,对数据进行滤波、线性化换算,然后通过另一路串口或 RS-485 总线把温度值上报给上层控制器(比如 DDC 或 PLC)。选择它而不是更低端的 PIC16,是看中了内置硬件乘法器和丰富的 Flash 空间,处理 RTD、NTC 的非线性查表和多路平均滤波时,代码写起来更从容,也方便以后扩展压力、湿度传感器通道。

1.4 方案整体架构与信号流向

整个系统可以拆成三个环节来看。传感器接入环节:PT1000、NTC 或热电偶通过端子排接入信号调理板,由 ADS122U04 的 IDAC 提供激励电流,内部 PGA 完成放大和差分转换。数字化环节:ADS122U04 连续转换,得到 24 位二进制补码格式数据,按设定帧格式通过 UART 发送。处理上报环节:PIC18F96J94 接收数据帧,解析原始码,根据传感器类型调用对应的线性化和滤波函数,最终得出真实的温度值,再通过 RS-485 或以太网模块转给上位机。

这套架构的关键就在于,模拟信号路径被压缩到极短的长度,ADS122U04 和传感器之间的走线在 PCB 上尽量做到差分对等长,之后所有长距离传输都是数字信号,干扰容限天然就高。后面我会详细展开每一部分的电路参数选择和固件实现,方便你直接照搬。

2. 硬件电路设计的核心细节与参数计算

2.1 传感器类型与接线方式选择

不同应用场景,传感器类型选型完全不一样。

  • 精密测量(比如冷水机组进出水温差)优先用 PT100 / PT1000,铂电阻线性度好、长期稳定性极佳。
  • HVAC 风管温度、房间温度这类对精度要求不是极致严苛、但成本敏感的场景,用 NTC 热敏电阻最常见,10kΩ 3950 体系用的最多。
  • 高温工况(排气温度、锅炉烟温)则选择 K 型或 T 型热电偶,测量范围广,但信号非常微弱且需要冷端补偿。

接线方式也很有讲究。PT100 两线制最简单,但导线电阻会直接叠加到测量结果里,10 米长 0.5mm² 铜线光往返电阻就有约 0.7Ω,偏偏 PT100 在 0℃ 时不过 100Ω,折合误差接近 1.8℃,这是完全不可接受的。三线制可以抵消大部分导线电阻,因为一根线走激励电流、另一根线走电压采样,前提是两根线阻值一致;四线制是消除导线电阻最彻底的方式,激励和采样完全分离。

ADS122U04 内置两个 IDAC 电流源,配合差分输入,非常适合做三线制或四线制 RTD 的比率测量。所谓比率测量,就是让同一个 IDAC 电流流过参考电阻和 RTD,ADC 的结果是两者电压之比,这样激励电流的温漂和绝对精度就不会影响最终结果,极大的简化了系统标定难度。我在实际项目中,PT1000 一律用三线制,PT100 远程测点用四线制,NTC 用两线制就够了。

2.2 激励电流、PGA 增益和满量程计算

ADS122U04 的内部 IDAC 可以配置 4 个电流档:50µA、100µA、250µA、500µA(实际寄存器配置值根据型号手册为准,需要确认哪些档位可设,核心思路是选一个折中值)。选多大激励电流,要同时考虑两个矛盾:电流太小,传感器上的压降就小,信噪比不足;电流太大,传感器自热效应明显,铂电阻或热敏电阻自身的功耗会把温度“测高”。

举例计算:使用 PT1000,选 250µA 激励电流,0℃ 时电阻 1000Ω,压降是 0.25V;100℃ 时电阻约 1385Ω,压降约 0.346V。自热功耗在 100℃ 时是 0.25mA × 0.346V ≈ 0.087mW,对普通薄膜铂电阻来说这个量级引起的自热温升可以控制在 0.02℃ 以内,可以接受。如果换成 PT100 且也用 250µA,0℃ 时压降只有 25mV,此时需要把 PGA 增益调高到 16 或 32 才能把信号放大到接近满量程,但高增益也会放大噪声和失调,因此 PT100 更适合用 500µA 或 1mAh 的配置,若芯片只能支持到 500µA 就选 500µA。

PGA 增益选择有个实用的判断标准:让目标测量范围的最大信号电压,经过 PGA 放大后,占到 ADC 满量程的 50% 到 80% 左右,既不会轻易饱和,又能充分利用 24 位分辨率。以 PT1000、0~150℃ 范围为例,温度对应的电压摆幅约为 0.25V~0.407V(250µA 激励),内部基准 2.048V,若选 PGA=2,则最大输入信号对应约 0.4 满量程,动态范围足够,且 2 倍增益带来的噪声很小,所以我通常就选 PGA=1 或 2。ADS122U04 的 PGA 是差分放大器,测量毫伏级热电偶信号时选 PGA=128,测量 NTC 分压信号时选 PGA=1 就够。

2.3 前端滤波、ESD 保护和基准去耦

很多工程师画 ADC 电路时只放一个 0.1µF 退耦电容就完事,放到工业现场十有八九要出问题。ADS122U04 的输入端前,我建议加一组差模 RC 低通滤波器,比如每个输入引脚串联 4.7kΩ 电阻、对地并联 1nF 电容,截止频率约 34kHz,主要目的是抑制射频干扰和开关电源的毛刺。注意积分电容和串联电阻不能太大,否则会影响建立时间,特别是传感器本身内阻很高时更要注意输入阻抗匹配。

输入保护方面,靠近端子排的位置并联一个双向 TVS 管(比如 SMAJ5.0A 或 6.8V 型号)和一个 10Ω 的串联限流电阻。别小看这两个元件,HVAC 现场经常有工人拿万用表笔乱捅端子,静电放电或者误接 24V 电源,没有保护电路的 ADC 一颗接一颗烧。TVS 管会把过压钳位在安全范围,限流电阻则限制了进入芯片内部 PIN 二极管的电流。

参考电压去耦也不能马虎。ADS122U04 内部基准虽然精度不错,但噪声性能直接取决于 VREF 引脚的滤波。我在 REF 引脚上放了 1µF 陶瓷电容并联 0.1µF 高频电容,走线尽量短粗直接到引脚根部。如果系统中用的是外部基准,那就必须选用低温漂精密基准如 REF5025 级别的器件,并把基准芯片的供电和数字电路供电完全分开。

2.4 电源设计与地平面处理

ADC 这种混合信号器件,电源和地处理是决定实测精度的分水岭。ADS122U04 的模拟电源(AVDD)和数字电源(DVDD)我是分开供电的,用两个低噪声 LDO 输出 3.3V,中间通过磁珠(600Ω @ 100MHz)隔离。这样数字部分通过 UART 引脚开关产生的电流尖峰不会污染模拟电源。

地的处理上,工业产品可靠性优先,我没有做那种“一刀切”的模拟地/数字地分割,而是采用完整地平面,只在 ADC 下方把模拟地和数字地分成两个区域,最后在芯片底下用一颗 0Ω 电阻或直接铜皮连接。这样做的好处是避免分割地平面产生回流绕行和大环路天线效应。PIC18F96J94 的 IO 翻转噪声如果比较厉害,可以在其电源引脚对地多加 100nF 和 10µF 陶瓷电容,并且把连接到 ADC 的 UART 信号线安排在地平面旁边,尽量缩短走线长度。

3. 固件实现与数据处理流程

3.1 UART 通信链路与寄存器配置

先看硬件连接。ADS122U04 的 DIN、DOUT/DRDY 引脚分别接 PIC18F96J94 的 UART TX 和 RX,芯片的 MODE 引脚通过外部电阻设置通信速率。ADS122U04 支持多地址模式,如果一条总线上挂多颗 ADC,需要通过 ADDR 引脚区分地址。我这边单颗 ADC 直接采用标准三字节命令帧格式:第一字节写命令集,第二字节写数据,第三字节写 CRC 校验(可禁用)。如果只是近距离板载连接,禁用 CRC 能减少无谓的软件开销,但用于长线 RS-485 连接时建议打开。

初始化代码片段看起来像这样:

// PIC18F96J94 UART1 初始化,波特率 9600,8-N-1 void UART1_Init(void) { U1BRG = 64; // 根据 Fosc 计算得到的波特率寄存器值 U1MODEbits.UARTEN = 1; // 使能 UART U1STAbits.UTXEN = 1; // 使能发送 } // 向 ADS122U04 写入配置寄存器 void ADS122U04_WriteReg(uint8_t reg, uint8_t value) { uint8_t cmd[3]; cmd[0] = 0x40 | (reg << 2); // 写寄存器命令 cmd[1] = value; cmd[2] = 0x00; // 禁用 CRC UART1_SendBytes(cmd, 3); }

配置寄存器时最关键的是 MUX、PGA 和 IDAC 三部分。我常用的工作配置是:MUX 选择差分输入 AIN0/AIN1(对应三线制 PT1000 的测量端),PGA=2,内部基准 2.048V,数据速率 20SPS 并开启 50Hz 工频抑制,IDAC 电流 250µA 输出到激励引脚。写完配置寄存器后最好回读一遍,确认芯片已按预期工作,防止上电瞬间 IO 引脚状态不对导致芯片进入测试模式这种诡异问题。

3.2 触发转换并读取 24 位结果

ADS122U04 支持连续转换模式和单次触发模式。连续模式下芯片以固定速率不断转换,数据准备好后 DOUT/DRDY 引脚拉低,通知 MCU 读取;单次模式下需要发命令触发一次转换,适合多通道环境中按需采集或者为了省电做占空比采样。

我在实际代码里用的是连续模式加外部中断方式读取:

void __interrupt() DRDY_ISR(void) { if (INT0IF) { ADS122U04_ReadData(&adc_raw); // 读取 24 位转换结果 INT0IF = 0; } }

这里有一个很容易踩的坑:如果 MCU 读取数据的频率低于 ADC 的数据输出速率,新数据会覆盖旧数据,读到的值会跳动。所以在读取代码里,必须先判断 DRDY 引脚状态,确保它处于低电平(即 有 新数据),然后一次性读完 3 个字节,顺序不能错,否则会把高低字节读反。ADS122U04 输出的 24 位数据是二进制补码格式,高字节在前,需要自己拼成有符号 32 位整数,再除以 2^23 得到满量程比例值。

3.3 线性化算法:RTD 的 Callendar-Van Dusen 方程与 NTC 查表

拿到 ADC 原始码之后,换算温度是这次编程里最容易出乱子的部分。先明确一点,ADS122U04 内部是 Δ-Σ 调制器,它输出的不是直接的电阻值,而是输入电压与参考电压的比值数字。如果是比率测量(IDAC 电流同时激励 RTD 和参考电阻),那么:

[ R_{RTD} = \frac{V_{RTD}}{V_{REF}} \times R_{REF} ]

这里的 ( V_{REF} ) 实际是由参考电阻两端电压决定的,因为芯片用的是同一个激励电流,比值计算时电流项被约掉了,所以对电流源的绝对精度完全不敏感,这就是比率测量的精髓。写代码时先计算:

float ratio = (float)adc_raw / 8388608.0f; // 除以 2^23 float r_rtd = ratio * R_REF / PGA_GAIN;

PT100 / PT1000 的电阻-温度特性用 Callendar-Van Dusen 方程描述,0℃ 以上基本是线性加一个二次修正项,0℃ 以下多一个四次项。PLC 里面常用查表法,但嵌入式里我更推荐直接用迭代或近似公式计算。简单做法是:

  • 先根据电阻值判断大致温度段,用线性插值粗算。
  • 再用牛顿迭代法执行两次迭代,代到 Callendar-Van Dusen 方程里反解温度。

对于 HVAC 里的 PT1000,误差控制在 0.1℃ 以内完全够用。NTC 就简单多了,普遍用 B 值公式:

[ T = \frac{1}{\frac{1}{298.15} + \frac{\ln(R_{NTC}/R_{25})}{B}} - 273.15 ]

不过 B 值公式在中低温区偏差会变大,要求高的时候用 Steinhart-Hart 方程或者做一张-20℃~80℃ 的 1℃ 分度查表加线性插值,我通常用查表法,速度最快且无浮点算力压力,一张 101 个点的表只有几百字节。

3.4 冷端补偿与低通滤波

接热电偶时,ADC 测量的是热端电势,还要知道冷端温度才能算出热端真实温度。冷端补偿有两种实现方式:一种用板上 NTC 测端子温度,查热电偶分度表得到冷端毫伏值,叠加到 ADC 读到的毫伏值上;另一种用专用冷端补偿芯片如 MAX31855 等,但 ADC 方案本身可以复用 NTC 通道,没必要增加额外芯片。

热电偶信号经过 PGA=128 放大后仍然很微弱,K 型热电偶 10℃ 温升才对应约 0.4mV,量化噪声和系统噪声都会叠加进去。所以滤波策略特别重要。我在固件里做了两级处理:第一级是对 ADC 原始码做滑动平均,取 4 到 8 个点平均;第二级是对换算后的温度值做一阶低通滤波:

float filtered_temp; #define ALPHA 0.2f filtered_temp = ALPHA * raw_temp + (1.0f - ALPHA) * filtered_temp;

α 取 0.2 时响应时间大约几秒钟,适合空调水温这种慢变化量。如果你要响应快,α 可以调到 0.5 以上,但会引入更大的噪声波动,两者得权衡。

4. 常见问题与排查技巧实录

4.1 实测数据跳字严重,问题出在 PCB 布局和地弹

我第一次打样回来,用 PT1000 接在 ADS122U04 上,25℃ 环境下读数每秒钟跳 ±0.05℃,远远高于规格书上写的那样。我排查了电源纹波、参考电压、PGA 增益都没找到问题,后来用示波器测 SCLK(原为 UART 信号)引脚发现翻转噪声叠加在模拟输入上。最终把 UART 信号线从 ADC 输入引脚底下走了,并且把输入电容从 1nF 改到 10nF,跳字立刻缩小了一个数量级。这个教训让我后来画板子时,对模拟输入引脚周边 5mm 内的走线都会做严格避让,尤其是数字信号不能和模拟差分线平行走线。

4.2 UART 接收乱码:波特率误差和电平不匹配

用 PIC18F96J94 的 UART 和 ADS122U04 通信,最典型的故障是能发送但收不到正确数据。第一原因往往是波特率偏差。PIC18 的 UART 波特率发生器是基于系统时钟分频的,HVPLL 配置不同会带来几十 ppm 到几百分之一的偏差,当通信距离变长、线电容变大时,边沿变缓,这点偏差就导致采样错位。解决方法是查一下数据手册上的“波特率误差表格”,确保 U1BRG 值计算完全正确,或者干脆把通信速率降到 9600bps,读取温度这种数据量极小,9600 完全够用。

还有一种情况:ADS122U04 的 DOUT 引脚是开漏输出,它需要外部上拉电阻才能拉高电平。我自己就犯过这个错,忘记接上拉电阻,导致 DOUT 永远读不到高电平,整个通信卡死。上拉电阻选 4.7kΩ 到 10kΩ 都可以,接在 3.3V 电源上。

4.3 RTD 读数整体偏高:自热效应和导线电阻叠加

有次在现场发现一组 PT1000 测出来的温度比其他同位置传感器高了 0.2℃,我一开始怀疑是传感器质量问题,后来一算才发现是激励电流设成了 500µA 导致的。PT1000 在 500µA 下自热功耗约 0.25mW,在散热条件差的套管里面温升 0.1~0.2℃ 非常正常。所以做高精度水温测量时,激励电流能选 250µA 就绝不选 500µA,并且传感器要尽量插入到介质中,避免暴露在空气中散热不良。对于四线制 PT100 则可以选 500µA,因为铂电阻本身阻值低,自热小且信号幅度需要。

4.4 问题速查表

现象常见原因处理办法
读数乱跳、±0.1℃以上抖动数字干扰耦合进模拟输入加大输入滤波电容,UART走线避让,检查地平面完整性
通信完全不通DOUT未加上拉电阻 / 波特率设置错误加4.7kΩ上拉,重新计算U1BRG,降低波特率验证
读数整体偏高激励电流过大导致自热降低IDAC电流档位,改善传感器散热条件
读数偏低或为负MUX极性接反 / 传感器线序错检查AIN+ AIN-接线,校准配置文件
50Hz工频干扰明显数据速率未开启工频抑制启用50Hz/60Hz抑制数字滤波器,或数据速率选20SPS
长时间漂移参考电阻温漂过大换用0.1%精度、25ppm温漂或更好的金属箔电阻
RTD读数非线性误差大未做Callendar-Van Dusen修正用公式反解温度而不是简单线性比例

5. 实测结果与个人经验总结

样机跑下来,用四线制 PT1000、250µA 激励、PGA=2、20SPS 数据速率,在 0~100℃ 恒温槽里对比标准温度计做了 5 个点测试,线性误差基本在 ±0.05℃ 以内,重复性优于 0.02℃。NTC 通道在 -20℃~80℃ 查表插值后,整体误差 ±0.3℃,满足 HVAC 房间温度控制的 ±0.5℃ 要求。热电偶通道加上冷端补偿后,在 100~400℃ 区间误差约 ±1℃,用于排烟温度监测完全没问题。

这个方案后续可以扩展的方向不少。比如把多颗 ADS122U04 挂到同一条 UART 总线上做 16 通道甚至 32 通道温度采集,适合冷水机组管排温度场监测;再比如把 PIC18F96J94 的低功耗模式利用起来,用电池给无线温度记录仪供电,ADC 占空比采样,一节 CR2032 撑一年不是问题。如果还想着顺便测湿度,可以复用剩余 ADC 通道,加一颗湿敏电阻或数字湿度传感器,一套主控板同时管理温度和湿度信号。

我个人这几年做温度采集项目最深的体会是:高精度测量的瓶颈往往不在 ADC 芯片本身,而在你的 PCB 布局、参考电阻选型和传感器安装方式。ADS122U04 把数字化门槛降低了不少,但底层这些基本功一点都不能省。把供电、接地、滤波做扎实了,这套方案才能发挥出 24 位 ADC 真正的实力,也希望这篇记录能帮你少走几步弯路。

返回列表