news 2026/11/5 3:16:21

ADS122U04搭配PIC18F4455的高精度多通道温度测量方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADS122U04搭配PIC18F4455的高精度多通道温度测量方案

搞过暖通空调和工业现场温度采集的兄弟,大概都体会过同一种痛苦:传感器输出明明只有几毫伏到几十毫伏的变化,可只要压缩机一启停、变频器一加电,采集数据就跳舞。测温测不准,后面堆再漂亮的PID控制算法也白搭。我这次做的项目,就是用ADS122U04IPWR这颗带 UART 接口的 24 位 Σ-Δ ADC,搭配PIC18F4455单片机,做一套面向 HVAC 和工业现场的多通道温度测量方案。整套系统既能接 PT100/PT1000 这类热电阻,也能接 K 型热电偶,实测下来在全温段范围内稳定度很不错。

这篇文章我会把方案选型的理由、硬件接法、固件协议、温度换算公式,以及现场调试踩过的坑全部摊开讲一遍。内容不挑基础,如果只玩过单片机内置 ADC、正准备上独立采集芯片的朋友,也完全可以直接照着抄作业。

1. 方案选型与整体拆解

1.1 为什么不用单片机自带的 10 位 ADC

PIC18F4455 片上集成的是一个 10 位 ADC,对于显示个室温、做个粗略的档位判断是够用的,但工业温度采集根本不在这条起跑线上。10 位分辨率如果按 0~100°C 满量程来估,理论上一个码大概对应 0.1°C 左右,但这是理想情况。实际工程中还要叠加电源纹波、基准漂移、PCB 噪声、走线压降,最后能稳定分辨到 0.3~0.5°C 就已经不错了,更不要说 PT100 在 0°C 下信号只有几十毫伏,单片机 ADC 的参考电压一波动,温度数据直接跟着抖。

这就好比让你用一把塑料尺子去量一张 A4 纸的厚度,刻度太粗,手一抖误差就大。想稳定地把 0.1°C 的温度变化测出来,温度传感器在 0°C 附近对应的电阻变化大约是 0.0385Ω,配合 500µA 激励电流也只产生约 19µV 的电压变化。这个量级的信号,必须用独立的高分辨率 ADC 来干。24 位的 ADS122U04 理论最小量化电平在微伏级别,配合内部可编程增益放大器(PGA),才能把这么微弱的信号稳定捕捉到。

1.2 ADS122U04 这颗 ADC 的核心价值:UART 接口与比例测量

ADS122U04 属于 TI 的 ADS122 家族,四通道差分/单端输入,内置 PGA、2.048V 参考源、两个可编程激励电流源(IDAC)、内部温度传感器,还带 UART 接口。单看参数,市面上类似规格的 ADC 不少,但它赢在两点。

第一是UART 接口。SPI 接口虽然快,但在工业现场走线不能太长,而且需要占用 4 根信号线;I2C 需要地址配置,热插拔还容易挂死总线。UART 是异步串行,只要两根线,抗干扰和走线距离都更实用。HVAC 现场经常出现传感器板和控制板分离的情况,这两根线能轻松拉到几米甚至十几米,不用太担心时序问题。

第二是比例测量能力。ADS122U04 内置两个匹配的 IDAC 电流源,可以让同一个激励电流同时流过 RTD 和精密参考电阻。因为 ADC 的参考电压和传感器激励来自同一个电流源,电源波动、基准温漂等共模误差会被自动抵消,这就是经典的比率式(ratiometric)测量。说直白点:电源电压降了 1%,参考电压和传感器信号同时降 1%,最后比值不变,读数纹丝不动。

PIC18F4455 在这里的角色是主控和通信中枢:负责初始化 ADC、读取转换结果、做滤波和线性化,最后通过 USB 虚拟串口上报给上位机,同时还能输出继电器控制信号。8 位机算这些数据完全是杀鸡用牛刀,但对项目成本、开发周期和长期供货来说却很实在。

1.3 整体架构与数据流

这套系统的硬件链路是这样走的:

温度传感器(PT100 或热电偶)首先接入信号调理网络,把物理量变成 ADC 可测的差分电压;ADS122U04 通过 PGA 放大信号后做 24 位转换,由 DRDY 引脚通知 PIC18F4455 数据就绪;主控通过 UART 接口发出读数据命令,取回转换结果,经过软件滤波和传感器线性化算法,换算成温度值;最后温度值通过 USB CDC 虚拟串口发送到 PC 上位机,或通过 RS485 模块汇入现场总线。

这套架构看起来环节多,但每级都是解耦的。传感器和 ADC 是模拟部分,MCU 是数字部分,模拟和数字之间只有 UART 两根线,干扰耦合路径少,调试时也容易定位问题在哪一级。

2. 硬件设计的关键细节与接线方法

2.1 电源、基准和去耦:误差的第一来源

很多人在运放、ADC 上砸钱,却在电源上省钱,结果性能全部被电源吃掉。ADS122U04 对电源噪声其实还算宽容,因为比例测量结构能抵消掉一部分共模波动,但模拟电源 AVDD 的纹波仍然会直接影响输入信号的质量。

我的建议是:AVDD 和 DVDD 尽量分开走线,每个电源引脚旁边放一个 0.1µF 陶瓷电容,位置尽量靠近引脚,在 PCB 的电源入口再加一颗 10µF 钽电容或大容量陶瓷电容。陶瓷电容用 X7R 或 C0G 级别,别用 Y5V,那种电容在直流偏压下容量会大幅缩水。

基准部分是本项目的重头戏。ADS122U04 内部虽然带 2.048V 参考,但内置基准的初始精度和温漂对全温段高精度应用来说还是不够稳。我最后选了外部参考电阻方案:在 REFP 和 REFN 之间接一颗精密电阻 R_REF,让 IDAC 激励电流同时流过 R_REF 和 RTD。因为 ADC 的输出代码正比于 V_RTD / V_REF,而 V_RTD = I × R_RTD,V_REF = I × R_REF,两个电流同为一路,最终输出代码 = k × R_RTD / R_REF,R_REF 自身必须足够准。

这颗 R_REF 我选的是 1.8kΩ,精度 0.1%,温漂 25ppm/°C。为什么不是 1k 或者 2.05k?因为激励电流我设成 500µA,PT100 在 -40~200°C 范围内电阻大约 84.3~175.8Ω,对应电压 42~88mV。R_REF 取 1.8kΩ 时参考电压是 0.9V,PGA 增益 8 倍输出后约为 0.34~0.70V,低于 ADC 满量程,留有合理裕量。同时参考电阻上的功耗只有 0.45mW,自热可以忽略。

2.2 RTD 接线:两线、三线还是四线

这是热电阻测量里最经典的一问。PT100 引线本身有电阻,两线制时引线电阻会直接叠加到传感器电阻上,一根 0.5mm² 的铜线 10 米大约就有 0.35Ω,换算成温度接近 1°C,完全不可接受。

四线制又叫开尔文接法,两根线给 RTD 供激励电流,另两根线专门用来测量电压。因为测量回路里几乎没有电流流过,所以测量线上的压降为零,引线电阻对测量结果没有影响。这是精度最高的接法。我的项目里四线制用 AIN0 和 AIN1 作为差分测量输入,IDAC1 从 AIN0 灌入,电流从 RTD 出来后回到 AIN3,参考路径由 IDAC1 流过 R_REF 到 REFN,再接回公共地。

三线制是工业现场的折中方案,两条相同长度的引线接在传感器两端,用两个 IDAC 电流源分别驱动,其中一个 IDAC 同时流过参考电阻,通过比例关系把引线电阻的影响基本抵消掉。这要求两条引线电阻必须一致,所以现场接线时尽量用同规格、同长度的线。

二线制在这个项目里我直接放弃了。省两根线省下的钱远远不够补偿精度损失,而且 HVAC 现场线缆长度动不动就十几米,二线制根本无法满足 0.2°C 级别的重复性要求。

2.3 热电偶输入与冷端补偿

除了 RTD,这套系统还要接 K 型热电偶。热电偶的信号比 PT100 更小,K 型在 0~1000°C 的输出大约只有 0~41mV,而且它是一个差分电压信号,没有激励电流,输入回路阻抗很高。

热电偶测量最大的坑是冷端补偿。热电偶测出的是热端与冷端的温差电动势,如果接线端子处的温度不是 0°C,就必须把室温补偿进去。ADS122U04 内部有温度传感器,可以直接读出来做冷端补偿,但我个人建议接口端子处再贴一颗 NTC 或者 PT100 做外部冷端测量。芯片内部温度传感器测的是芯片附近温度,而冷端在端子排上,两者之间会有温差,特别是靠近散热片或外壳的位置,误差会放大到 1~2°C。

硬件上还有一点容易被忽略:热电偶输入两端必须对地提供直流通路。因为它的输出阻抗高,如果输入引脚悬空,PGA 的输入共模点会漂移,测量跳字。我在 AIN 引脚对模拟地各接一颗 1MΩ 电阻建立偏置,同时每个输入串一个 100Ω 电阻、对地并一个 1nF 电容,构成简单的 RFI 滤波。

如果你要用热电偶测温,PGA 增益不能开太大,一般 8~16 倍足够。因为热电偶的动态范围很大,从常温到上千度都有信号,用 128 倍增益很容易把大信号削顶。

2.4 MCU 接口与电平匹配

PIC18F4455 的 EUSART 接口接 ADS122U04 的 UART,原理图连线就三根:TX、RX、公共地,再加上一根 DRDY 信号用来查询转换状态。这里有个细节:ADS122U04 的供电范围为数字和模拟部分分开,如果系统统一用 3.3V 供电,PIC18F4455 也可以跑 3.3V,这样 UART 电平直接兼容,不需要电平转换芯片。

PIC18F4455 的 EUSART 是 RC6/TX 和 RC7/RX,注意这两个信号是交叉接的:MCU 的 TX 接 ADC 的 RX,MCU 的 RX 接 ADC 的 TX。另外,PIC18F4455 的 USB 模块需要 48MHz 时钟,可以从外部 4MHz 晶振经 PLL 倍频得到,同时这个时钟也供 EUSART 使用。USB 引脚的 D+/D- 走线要尽量短,保持差分阻抗,这个坑我后面还会再说。

3. 固件实现、协议解析与温度换算

3.1 先搞懂 UART 通信协议

ADS122U04 的 UART 通信是基于命令-响应模式的。主控先发一帧命令,ADC 处理后返回数据。命令帧的格式、寄存器地址和返回数据排列,都以 TI 官方数据手册为准,我这里把工作流程讲清楚。

上电之后不要急着发命令。ADC 内部有上电复位过程,我会先等大约 50ms,再发一个复位命令,然后延时 10~20ms,等内部晶振和基准稳定。之后写配置寄存器,把输入通道、PGA 增益、数据速率、IDAC 电流、参考源选择全部设好。配置完成后发启动转换命令,接着轮询 DRDY 引脚,检测到下降沿就说明转换完成,主控再发读数据命令,连续取回转换结果。

读回来的数据一般是一个 24 位的有符号数,占用三个字节,另外还有一个字节的状态或校验信息。具体怎么拼接、哪些位是符号位,不同的数据手册版本细节略有不同,所以代码里我会用宏定义把命令码全部集中起来,万一手册版本不同,只需要改宏,不用动主逻辑。

UART 参数我用 9600 8N1。9600 波特率虽然不高,但胜在稳定,工业现场长线传输时不容易出错。如果后面有高速采集需求,再往上调也不迟。

3.2 寄存器配置原则:每个位都要知道为什么

配置 ADS122U04 寄存器时,我始终坚持一条原则:不理解的位不要乱设。下面是这个项目最终采用的一组关键配置:

配置项本项目取值选择理由
输入 MUXAIN0 + AIN1 差分接四线 PT100 的测量端
PGA 增益8PT100 信号放大后约为 0.34~0.70V,落在合理区间
基准源外部 R_REF 两端比例测量,抵消电源和基准漂移
IDAC 电流500µAPT100 自热小,信号幅度足
数据速率20 SPS50Hz 工频干扰抑制效果好,噪声低
转换模式连续转换实时控制系统需要持续刷新
CRC/校验开启UART 长线传输时能快速发现丢帧和错帧

PGA 增益为什么用 8 而不是 1?因为信号太小时,ADC 自身的有效噪声会成为主要贡献,增益放大信号的同时虽然也放大噪声,但相对于 ADC 的固定噪声基底,信噪比还是提高了。数据速率为什么不用 1000 SPS?因为温度传感器本身响应慢,20 SPS 完全足够,慢速下 Σ-Δ ADC 的数字滤波更深,噪声更低,对工频的抑制也更好。

3.3 PIC18F4455 端的关键代码骨架

固件我用 MPLAB X IDE 加 XC8 编译器来写。初始化部分的寄存器细节用 MCC 或者手动查数据手册都行,重点看协议逻辑:

// 读一次 ADS122U04 转换结果,raw 为 24 位有符号原始码 uint8_t ADS122U04_ReadData(int32_t *raw) { uint8_t buf[4] = {0}; uint8_t i; // 等待 DRDY 变低,表示新数据已就绪 if (DRDY_GetValue() != 0) return 0xFF; // 还没准备好 // 发送读数据命令,命令码根据所选手册版本填写 UART1_Write(ADS122U04_CMD_RDATA); // 读取 3 个数据字节 + 1 个状态/校验字节 for (i = 0; i < 4; i++) { buf[i] = UART1_Read(); } // 校验帧头或 CRC,如果失败直接返回错误 // 将 buf[0], buf[1], buf[2] 拼成 24 位有符号数 *raw = (int32_t)(((uint32_t)buf[0] << 16) | ((uint32_t)buf[1] << 8) | (uint32_t)buf[2]); // 转成有符号数(按 24 位补码处理) if (*raw & 0x800000) *raw -= (1 << 24); return 0; }

这套代码逻辑没有任何花哨的地方,就是按协议一步步来:等 DRDY、发命令、收字节、拼数、补符号位。真正容易翻车的地方全在细节,比如说读数据命令发早了、DRDY 还没拉低就去读,拿到的是上一次的旧数据;又比如说读回来的字节顺序搞反了,高位和低位对调,温度曲线就会变成一条噪声带。

配置寄存器的写法同理,先组一个配置字节数组,再用写寄存器命令一次性或者分次下发。建议每写完一个寄存器就把读寄存器命令发出去,把 ADC 返回的值打印出来核对一遍,防止硬件接线错位导致寄存器写错位置。

3.4 温度换算:从原始码到摄氏度

拿到 24 位原始码之后,换算温度是最考验基本功的环节。以 PT100 为例,整个链路是这样的:

ADC 输出代码近似正比于 R_RTD / R_REF。由于 R_RTD = R0 × (1 + A·t + B·t²),我可以通过反推公式从电阻值解出温度。正向电阻计算公式是:

R(t) = 100 × (1 + 3.9083e-3 × t - 5.775e-7 × t²) (0°C 以上)

在 0°C 以下还要加一个三次项 C·(t-100)·t³,但我这个 HVAC 场景主要集中在 -40~150°C,0°C 以下的概率不高,所以 0°C 以上用一元二次方程反解就够了:

t = [-A + sqrt(A² - 4B(1 - R/R0))] / (2B)

这部分算法在 PIC18F4455 上跑完全没问题。为了省去浮点运算的时间,我用了查表加线性插值的方式:把 -40~200°C 的 PT100 电阻表按 1°C 间隔存成数组,拿到电阻值后先二分查表找到区间,再做线性插值。这样既保证了精度,又避免了单片机里反复算 sqrt 的开销,温度分辨率可以稳定在 0.01°C 级别。

热电偶那边的换算也类似,但多一步冷端补偿。先把冷端温度换算成对应的热电动势,再加到热端测量的电动势上,最后查热电偶分度表反推实际温度。ADS122U04 内部温度传感器读到的原始值同样需要标定,我实测下来内部传感器在 25°C 附近大约有 ±0.5°C 的偏差,做精度要求不高的场合够用,做精密补偿还是要外接标定过的 NTC。

4. 现场调试中的常见问题与排查记录

4.1 转换结果乱跳,先查电源再看激励

这是所有人都会遇到的头号问题。ADS122U04 的转换数据如果是规律的跳几个 LSB,那是正常噪声,20 SPS 速率下 PT100 通道跳动 1~2 个码对应温度不到 0.01°C,不用管。但如果跳动幅度达到几百个码,甚至温度曲线像锯齿一样,按这个顺序排查:

先拿示波器看 ADC 的 AVDD 引脚,纹波是不是超过 10mV 以上。HVAC 现场如果有变频器启动,电源线上经常会有几伏的尖峰,靠单纯去耦电容压不住。我遇到过开关电源纹波 80mV 的情况,后来在电源入口加了一级 π 型滤波,跳动立刻小了一个数量级。

再看 IDAC 激励电流是否稳定。如果 IDAC 输出线上混入了高频噪声,耦合到 RTD 上就会表现为随机跳动。这时把 PGA 增益降低,看跳动幅度是否同比例变化,能快速区分是输入信号的问题还是 ADC 自身的问题。

4.2 通信偶尔丢帧或收到全 FF

UART 通信丢帧,九成问题出在波特率误差和地电位差。PIC18F4455 内部振荡器默认精度一般,如果开了 USB,内部振荡器必须校准到 48MHz,但如果只是用外部晶振,EUSART 波特率就能卡得很准。我用的是外部 4MHz 晶振加 PLL,9600 波特率实测一整天不丢一帧。

如果距离拉长到十几米,建议把波特率降到 9600 以下,同时使用屏蔽双绞线,屏蔽层单端接地。最容易被忽略的坑是收发地线,ADC 板和 MCU 板相隔较远时,如果只接信号线不接公共地,两板之间地电位差会被 UART 接口当成信号毛刺,轻则误码,重则烧引脚。

另外,读回来的数据出现全 0xFF 或者全 0x00,通常不是协议问题,而是主机上电瞬间 GPIO 状态不确定,把 ADC 的 RX 拉到了高电平导致它误判命令。硬件上最好给 ADC 的 RX 引脚加一个下拉电阻,防止上电时乱进命令状态,软件上则要在 ADC 初始化前把主控的 TX 引脚驱动到确定电平。

4.3 冷端补偿总是偏低

用热电偶做测量时,如果显示温度总是比实际偏低 1~3°C,大概率是冷端温度采样点没放对。ADS122U04 内部温度传感器测的是芯片内部温度,芯片工作时自身轻微发热,读数会比端子排处的实际冷端温度高一点。我用外部 NTC 贴在端子排上之后,误差从 2°C 降到 0.3°C 以内。

还有一个细节:冷端温度传感器要和热电偶端子保持良好的热接触,但不能直接泡在热风里。如果端子排旁边有散热风扇或继电器,那个位置的温度一直在波动,冷端补偿就会跟着抖动,这时宁可把 NTC 放到相对热稳定的位置,再用软件做一次短时平均。

4.4 现场布局的避坑经验

PCB 布局和现场走线我最后再补三个经验。

第一,模拟输入走线尽量短而粗,RTD 的激励线和测量线分两侧走,不要平行长距离布线,避免互感耦合。热电偶的引线要走屏蔽线,屏蔽层在传感器端悬空、仪表端接地,这是最常规的做法。

第二,继电器和可控硅的驱动线绝不能和模拟信号走同一个线槽。我曾经遇到一个项目,温度信号线在桥架里和 220V 动力线捆在一起,压缩机一启动读数就掉 3°C。后来把信号线单独走管,并在 ADC 输入端加强 RC 滤波,问题才解决。

第三,USB 走线也别太随便。PIC18F4455 的 USB 全速信号虽然只有 12Mbps,不像高速 USB 那么敏感,但 D+ 和 D- 长距离并行走线仍然可能造成眼图变差。把 USB 接头尽量靠近单片机,D+/D- 差分走线,长度做到等长,数据线下面保持完整地平面,就能得到很稳定的上报链路。

我在实际项目里最深的体会是:工业测温方案能走多远,从来不由 ADC 的位数单独决定,而是由整个链条里最弱的一环决定。ADS122U04IPWR 和 PIC18F4455 这套组合本身不复杂,复杂的是把传感器接线、基准电阻、供电、布线和固件协议每一环都掐住。如果你的项目也是做 HVAC 或者工业设备测温,完全可以拿这套框架做底子,需要测其他类型的传感器时,改配置寄存器和线性化表就能扩展出去。我自己把 PT100 通道扩展到压差传感器和湿度传感器之后,整个硬件平台几乎不用动,这大概是这种分立方案最大的好处了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 3:16:19

工业温度测量:ADS122U04IPWR与STM32F765ZI高精度信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:15:05

基于ADS122U04与TM4C129XNCZAD的工业级高精度温度测量方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:14:11

ADS122U04IPWR工业温度测量信号链设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:12:38

ADS122U04+STM32L4高精度温度采集系统:兼容热电偶/PT100/NTC

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:12:38

基于ADS122U04与PIC18F46K42的高精度工业温度采集方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:10:09

跨境电商监控告警系统架构设计与实践

1. 项目背景与核心价值去年双十一期间&#xff0c;我们团队负责的跨境电商平台经历了多次突发性故障&#xff1a;凌晨3点商品价格同步异常导致损失37万美金、支付网关响应延迟触发大面积订单超时、物流接口超时引发用户投诉激增。这些事件直接促使我们启动了监控告警系统的专项…

作者头像 李华