资讯详情

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

📅 2026/11/5 5:06:18 | 华诺云谱 👁 阅读
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 位 ADCADS122U04 则是它的 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 电流流过参考电阻和 RTDADC 的结果是两者电压之比这样激励电流的温漂和绝对精度就不会影响最终结果极大的简化了系统标定难度。我在实际项目中PT1000 一律用三线制PT100 远程测点用四线制NTC 用两线制就够了。2.2 激励电流、PGA 增益和满量程计算ADS122U04 的内部 IDAC 可以配置 4 个电流档50µA、100µA、250µA、500µA实际寄存器配置值根据型号手册为准需要确认哪些档位可设核心思路是选一个折中值。选多大激励电流要同时考虑两个矛盾电流太小传感器上的压降就小信噪比不足电流太大传感器自热效应明显铂电阻或热敏电阻自身的功耗会把温度“测高”。举例计算使用 PT1000选 250µA 激励电流0℃ 时电阻 1000Ω压降是 0.25V100℃ 时电阻约 1385Ω压降约 0.346V。自热功耗在 100℃ 时是 0.25mA × 0.346V ≈ 0.087mW对普通薄膜铂电阻来说这个量级引起的自热温升可以控制在 0.02℃ 以内可以接受。如果换成 PT100 且也用 250µA0℃ 时压降只有 25mV此时需要把 PGA 增益调高到 16 或 32 才能把信号放大到接近满量程但高增益也会放大噪声和失调因此 PT100 更适合用 500µA 或 1mAh 的配置若芯片只能支持到 500µA 就选 500µA。PGA 增益选择有个实用的判断标准让目标测量范围的最大信号电压经过 PGA 放大后占到 ADC 满量程的 50% 到 80% 左右既不会轻易饱和又能充分利用 24 位分辨率。以 PT1000、0150℃ 范围为例温度对应的电压摆幅约为 0.25V0.407V250µA 激励内部基准 2.048V若选 PGA2则最大输入信号对应约 0.4 满量程动态范围足够且 2 倍增益带来的噪声很小所以我通常就选 PGA1 或 2。ADS122U04 的 PGA 是差分放大器测量毫伏级热电偶信号时选 PGA128测量 NTC 分压信号时选 PGA1 就够。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 初始化波特率 96008-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 的测量端PGA2内部基准 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 通道没必要增加额外芯片。热电偶信号经过 PGA128 放大后仍然很微弱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.10.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 激励、PGA2、20SPS 数据速率在 0100℃ 恒温槽里对比标准温度计做了 5 个点测试线性误差基本在 ±0.05℃ 以内重复性优于 0.02℃。NTC 通道在 -20℃80℃ 查表插值后整体误差 ±0.3℃满足 HVAC 房间温度控制的 ±0.5℃ 要求。热电偶通道加上冷端补偿后在 100400℃ 区间误差约 ±1℃用于排烟温度监测完全没问题。这个方案后续可以扩展的方向不少。比如把多颗 ADS122U04 挂到同一条 UART 总线上做 16 通道甚至 32 通道温度采集适合冷水机组管排温度场监测再比如把 PIC18F96J94 的低功耗模式利用起来用电池给无线温度记录仪供电ADC 占空比采样一节 CR2032 撑一年不是问题。如果还想着顺便测湿度可以复用剩余 ADC 通道加一颗湿敏电阻或数字湿度传感器一套主控板同时管理温度和湿度信号。我个人这几年做温度采集项目最深的体会是高精度测量的瓶颈往往不在 ADC 芯片本身而在你的 PCB 布局、参考电阻选型和传感器安装方式。ADS122U04 把数字化门槛降低了不少但底层这些基本功一点都不能省。把供电、接地、滤波做扎实了这套方案才能发挥出 24 位 ADC 真正的实力也希望这篇记录能帮你少走几步弯路。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑