ARTICLE DETAIL

资讯详情

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

24位ADC加UART远传:ADS122U04与PIC32MZ的高精度温度采集方案

24位ADC加UART远传:ADS122U04与PIC32MZ的高精度温度采集方案

做工业采集和 HVAC 控制这一行的人,十有八九都跟温度测量较过劲。最近我重做了一块水温/风温测控板,把方案核心换成 ADS122U04IPWR 和 PIC32MZ2048EFM144:前者是带 UART 接口的 24 位 Δ-Σ ADC,后者是 200MHz、带 FPU 的 MIPS 架构 MCU。这套组合解决的是工业现场最头疼的问题——传感器离控制器远、模拟信号易衰减、温控精度要求高。下面的内容适合正在做温度采集模块、温控器或 HVAC 控制器的工程师,前后涉及选型、前端电路、UART 驱动、温度换算、校准和长期稳定性,算是一份可以少走弯路的实操记录。

先说结论:在需要多路温度采集、长距离传输且要过认证的 HVAC/工业系统里,把 24 位 ADC 放到传感器一侧,把计算和协议处理留给大 MCU,是一条成熟且省力的路线。ADS122U04 负责就近完成模数转换,PIC32MZ 负责读数、换算、控制和上报。接下来按我实际开发的顺序展开,包括一些踩过坑之后才明白的细节。

1. 为什么把 24 位 ADC 搬到 UART 上:这套组合的选型逻辑

1.1 温控精度的瓶颈不在 MCU,而在模拟前端

很多温控器项目一开始都用 MCU 内置 ADC。PIC32MZ2048EFM144 本身带一个 12 位 ADC,不是不能用,但放到工业和 HVAC 现场,问题往往出在信号链的起点:传感器探头到控制器之间往往隔着十几米甚至上百米线缆,模拟电压信号经过长线传输会出现衰减,还会把变频器、水泵电机和开关电源的干扰一并带进来。实测下来,用内置 12 位 ADC 直接采远端 PT100,常规布线下噪声经常对应 0.5℃ 以上的跳动,这个水平做舒适性空调的粗略控温还能忍,做合同能源管理、工艺冷却水控制就完全不够看了。

另一个限制来自参考电压。MCU 内置 ADC 的基准通常精度一般,温漂系数也不好看,温度一变,基准跟着漂,测出来的温度会整体偏移。想要达到 ±0.2℃ 级别的系统精度,靠 12 位内置 ADC 加软件滤波,基本要拼运气。这时候把模数转换从主控里挪出去,放到一个独立的、带高精度基准和内置放大器的 24 位 Δ-Σ ADC 上,就成了更合理的做法。

1.2 ADS122U04 的"四件套"正好覆盖 RTD 和热电偶

ADS122U04IPWR 是 TI 的 24 位低功耗 Δ-Σ ADC,TSSOP-16 封装,体积小,工业级温度范围。它最有价值的地方是一颗芯片里集成了一套完整的前端方案:4 通道多路复用器、可编程增益放大器 PGA、两个可编程激励电流源、一个低漂移 2.048V 基准源,还带内部温度传感器。对我这种不想在 PCB 上堆一堆分立运放和恒流源的人来说,这些东西集成在片内意味着设计难度和故障点同时下降。

更关键的是它选择了 UART 兼容接口作为数字输出,而不是传统的 SPI/I2C。工业场景下长线传输数字信号时,UART 只需要少数几根线,电气隔离也容易做,中间加一级数字隔离器就能把传感器侧和控制器侧的电位彻底分开。对 HVAC 这种传感器分散、控制柜往往在另一个房间的系统来说,这种拓扑非常对路。

1.3 PIC32MZ2048EFM144 真正接手的活儿

PIC32MZ2048EFM144 属于 Microchip 的 PIC32MZ EF 系列,MIPS M5150 内核,200MHz 主频,带硬件 FPU 和 DSP 扩展,2MB Flash、512KB RAM,144 脚 LQFP。最开始接触这颗料,图的是它接口多、存储大、算力足够跑浮点运算。后来发现它另一个优点更重要:多个 UART、CAN、USB、以太网外设可以同时用,主控不用在通信和采集之间反复切换。

我板子上除了 ADS122U04,还挂了 CAN 收发器和 RS485 接口,温度数据算完之后要通过网络上报给上位机,同时本机还要跑 PID 温控逻辑。如果 MCU 性能不够,数据采集、协议解析、控制算法挤在一起,时序会非常紧张。PIC32MZ 的 DMA 引擎和中断优先级机制让我可以把 UART 接收完全交给 DMA 处理,CPU 专心做换算和控制。选它的原因与其说是某个单一指标强,不如说是"接口裕量 + 浮点算力 + 大内存"整体更匹配这个项目。

2. 比例式前端设计:PT100 探头到 ADC 引脚的电路细节

2.1 四线制比例式测量:让导线电阻出局

温度探头选型上,HVAC 和工业现场我主要用 PT100/PT1000 铂电阻,少数通道留了 K 型热电偶接口。PT100 最经典的测量方式是比例式测量,ADS122U04 的两个可编程电流源让这种接法非常自然。我把同一路激励电流 I 先流过 PT100,再流过一只精密参考电阻 RREF,RREF 两端的电压接到 ADC 的参考输入端。这样 ADC 的参考电压也是由同一个电流源产生的,转换结果实际上只取决于 PT100 电阻与 RREF 的比值。

推导一下就很直观:

  • PT100 在 0℃ 时电阻约为 100Ω,激励电流选 1mA,传感器电压约为 100mV;
  • RREF 选 2.05kΩ,基准电压 VREF = 1mA × 2.05kΩ = 2.05V;
  • 若 PGA 设为 8 倍,ADC 码值比例 d ≈ (VRTD × PGA) / VREF = R(PT100) × PGA / RREF。

注意公式里电流 I 消掉了。温度变化导致激励电流漂移时,PT100 和 RREF 上的电压同步变化,比例关系不变。这正是比例式测量的精髓。我刚开始接触时总觉得要独立恒流源才"高级",后来才明白,靠同一个电流源做比率才是工业测温最实用的抗漂移手段。

四线制接法建议坚持用。两线制把探头线电阻直接算进 RTD,PT100 在 0℃ 时线阻多 0.4Ω,温度就偏约 1℃。三线制能补偿一部分,四线制则彻底把电流回路和电压采样回路分开,导线压降不再进入测量回路。工业现场如果探头线经常被更换,四线制是唯一不用重新校准的方案。

2.2 供电、PCB 与参考电阻的选择细节

ADS122U04 的模拟电源我用独立 LDO 供电,没有直接拿数字 3.3V 去供。工业板卡常从 24V 电源进来,经过 DC-DC 降到 5V 再经 LDO 到 3.3V,DC-DC 的开关噪声如果串进模拟电源,ADC 输出码值的底噪会明显变大。PCB 布局上我给模拟部分划了一个"岛":ADC 的 AVDD、基准、输入引脚相关走线集中在板边,模拟地单点连接到数字地,尽量避免开关电源的回流电流流过模拟地。

参考电阻 RREF 的选择很关键。我在量产板上用的是 0.1% 精度、10ppm/℃ 温漂的精密电阻,批量一致性明显优于普通 1% 电阻,而且长期稳定性好。比例式测量已经把激励电流温漂抵消了,但 RREF 本身的温漂会直接体现在结果里。如果 RREF 温漂 25ppm/℃,环境温度变化 40℃,等效电阻就偏 0.1%,算成温度偏差接近 0.25℃,这个量级在某些合同能源管理项目里已经不可接受了。

提示:PT100 通道的激励电流不建议超过 1mA。电流越大信号幅度越大,但电阻自热也越严重,探头插入管道内还好,装在静止空气中时自热效应会导致读数持续偏高。

2.3 UART 的电气隔离和长线远传

ADC 放在传感器探头附近之后,UART 线就是模拟信号与主控之间的唯一桥梁。板内距离短、共用电源域时,可以直接把 ADS122U04 的 DIN、DOUT/DRDY 接到 PIC32MZ 的 UART 引脚,注意电平都是 3.3V 就行。跨设备、跨箱体传输时我建议加数字隔离器,常用 ISO7721 这类双向数字隔离芯片,隔离电压高,时序延迟也不影响 100kbps 级别的波特率。

如果传输距离超过几十米,UART 电平就不够看了,需要转成 RS485 或 RS422 差分信号。我在几个室外机项目里就是在 ADC 侧加了一个 RS485 收发器,用一对双绞线把数据传回室内控制器。这里有个容易忽略的细节:DRDY 信号虽然跟数据就绪有关,但它不是标准 UART 帧的一部分,如果走长线,需要单独处理或通过特殊帧格式在数据里带出状态,否则对端会丢失数据同步参考。PCB 上 UART 走线尽量避免和电源线长距离平行,实测这种平行走线会在 DRDY 上感应出毛刺,导致主控误判数据准备好。

3. 打通 PIC32MZ 与 ADS122U04 的 UART 数据通路

3.1 初始化时序:寄存器配置和命令间隔

ADS122U04 的 UART 接口有自己的一套命令协议,主机通过 DIN 发送命令,从机通过 DOUT 返回数据。常用命令包括写配置寄存器、读配置寄存器、启动转换、读取数据等。上电后先要把通道选择、PGA 增益、滤波模式、激励电流和基准源逐项配好。我给 PT100 通道的典型配置是:差分输入、PGA=8、激励电流 1mA、外部参考、数据速率 20SPS。

配置命令之间必须留足间隔,这个点是我调试初期最大的困惑。刚开始我写完寄存器立即启动转换,偶尔出现配置丢失,温度读数乱跳。后来查资料才意识到,ADS122U04 内部的寄存器锁存和命令执行不是完全同步的,连续命令之间需要有短暂延时,否则后一个命令可能把前一个配置覆盖掉。加上延时之后问题彻底消失。批量生产中建议上电后做一个完整复位序列:等待上电稳定、发送复位命令、延时、写配置、再延时、启动转换,任何一步超时都重新走一遍。

3.2 用 DMA 读串口,不要在中断里浪费 CPU

PIC32MZ 的 UART 接收可以用 DMA 搬运。最简单的做法是收到一个字节中断一次,收到 3 个字节拼一帧。但这样每来一个字节都打断 CPU,数据速率一高,CPU 占用率就很难看,而且后续还要跑 PID 和通信协议。我用的是 DMA 方式:把 UART1 的接收事件映射到 DMA 通道,目标地址设为一个 4 字节缓冲区,DMA 每次收满 4 字节产生一次中断,主程序只在中断里做解析。

ADS122U04 的 24 位转换结果会拆成 3 字节通过 UART 发出,具体是高字节在前还是低字节在前,要按手册定义调整。我喜欢用一个联合体来避免手动移位:

typedef union { uint8_t raw[4]; struct { uint8_t status; int32_t code; // 实际只使用低 24 位 } field; } ads122u04_frame_t;

收完一帧之后,根据输入是差分还是单端,把 24 位结果转成有符号数,再代入温度换算公式。我见过不少项目把无符号原始值直接当有符号数用,测低温时数据突然跳变,这就是符号位没处理的典型现象。

3.3 单次转换加 DRDY 同步,还是连续转换加轮询

ADS122U04 支持单次转换和连续转换。HVAC 的温度采集实时性要求不高,但稳定性要求高,我建议用单次转换模式加定时器周期启动:比如每 200ms 由 PIC32MZ 定时器触发启动一次转换,转换完成后再读结果。这样每个采样周期干净利落,数据更新时刻可控,时序上不会出现"正在读一半,新数据又来了"的竞争问题。

如果非要用连续转换模式,DRDY 信号一定要接好。ADS122U04 在每次转换完成后会把 DOUT/DRDY 拉低,主机看到这个下降沿再去读数据。忽略 DRDY 直接按固定时间去读,很可能读到上一帧旧值,或者正好赶上字节边界导致帧解析错位。我在一个同事的板子上见过温度曲线偶尔跳一下,最后定位就是没用 DRDY,而是定时器到了就读,读到的帧偶尔错位,解析出来的温度自然就飞了。数据同步这件事,看似小,实际上决定了整个系统数据的可信度。

4. 从码值到摄氏度:RTD 与热电偶的换算和校准

4.1 从 ADC 码值换算 RTD 电阻的完整流程

拿到 24 位码值后,第一步是反算回电阻值。比例式测量下,RTD 电阻 R ≈ d_ratio × RREF / PGA,d_ratio 是 ADC 码值对应的满量程比例。PIC32MZ 带硬件 FPU,这一步计算直接浮点算就行,没必要做定点优化,代码可读性更重要。

换算到电阻后,再用 PT100 的温度特性求温度。工程上最常用的方案是查表加线性插值:把 IEC 60751 标准电阻-温度表按 0.1℃ 间隔存进 Flash,用二分法找到目标区间,再做线性插值。查表法的优点是稳定、占用内存小、响应快,误差完全可控在 0.02℃ 以内。PIC32MZ 有 2MB Flash,全温度范围表也只有几十 KB,完全放得下。

如果想更省事,也可以用 IEC 60751 的多项式直接算。0℃ 以上 Pt100 的电阻-温度关系近似为 Rt = R0 × (1 + A×t + B×t² + C×(t-100)×t³),A、B、C 是标准系数。我实测下来,在 0~200℃ 范围内,直接多项式计算与查表法相差不到 0.02℃,完全满足 HVAC 精度要求。有 FPU 的 MCU 的好处就在这里,随手就能上浮点。

4.2 热电偶冷端补偿的两种实现

系统中如果接了热电偶,冷端补偿躲不掉。热电偶本身只能测温差,必须知道冷端温度才能算出绝对温度。K 型热电偶约 41μV/℃,冷端温度误差 1℃ 就直接造成 1℃ 测量误差。我的板子用 ADS122U04 的内部温度传感器读芯片附近温度作为冷端参考,这是最省事的做法,适合精度要求不高的通道。

要求高的通道,我会在接线端子座上贴一颗高精度 NTC 或者本地温度传感器。因为热电偶的冷端在端子上,不在芯片上,端子座和芯片之间可能有几度温差。软件补偿流程是:先读冷端温度 Tc,查热电偶在 Tc 点对应的热电势,取反作为补偿值,再把它加上热端 ADC 测到的毫伏值,最后通过热电偶的电压-温度表反查热端温度。这个流程写起来琐碎,但逻辑不复杂,难的是要维护一张足够细的冷端-热电势表。

4.3 三点校准和全量程精度验证

ADS122U04 虽然分辨率高,但偏移和增益误差依然存在。我的做法是干体炉或恒温槽做三点校准:取 0℃、50℃、100℃ 三个温度点,记录 ADC 读数,用最小二乘拟合得到零偏和增益修正系数,然后存入 MCU 的 NVM,每次上电加载。校准系数跟 PGA 增益、激励电流和积分时间绑定,换一组参数就得重新校准。

下面是实测中一个 PT100 通道在校准后的对照数据,环境温度 25℃,PGA=8、1mA 激励、20SPS:

目标温度外部标准表读数ADC 换算结果偏差
0℃0.000℃0.003℃+0.003℃
50℃50.012℃50.020℃+0.008℃
100℃100.048℃100.030℃-0.018℃

可以看出校准后全量程偏差压到了 0.02℃ 以内,这对工业和 HVAC 都是很好的水平。批量生产时每块板的零偏不完全一样,跟芯片离散性、焊接和周边器件都有关系,所以不能只做一次设计校准就覆盖所有板子,装配工艺有改动也得重测。

5. 工业现场实测:干扰、通信与长期稳定性的应对

5.1 工频干扰与 20SPS 数据速率的关系

现场变频器一多,50Hz 干扰几乎不可避免。Δ-Σ ADC 对工频的抑制能力跟积分时间直接相关,我把默认数据速率设在 20SPS,因为对应的积分时间正好是 50ms,相当于对 50Hz 及其谐波做了一个梳状滤波,工频干扰抑制最强。如果采样速率设成几百甚至上千 SPS,积分时间短,工频干扰通过混叠进入带内,读数噪声会成倍上升。

如果噪声还是大,先查探头屏蔽层。屏蔽层最佳做法是传感器端单点接地,而不是两端都接。我遇到过数据毛刺多的问题,查到最后是屏蔽层两端接地形成地环路,把传感器端的屏蔽接地断开后,码值噪声立刻降了一半。硬件上的地环路问题靠软件滤波是压不干净的,这点要优先处理。

5.2 UART 错位、同步与异常恢复策略

ADS122U04 的 UART 帧本身不带强校验,应用层必须自己做保护。我的策略是在发配置命令前先发同步字节,并实现超时重同步机制:连续几次收不到合法帧就主动发送复位命令,让 ADC 重新同步。PIC32MZ 的 UART 有自动波特率检测功能,但 ADS122U04 的 UART 是基于外部时钟同步的,不适合做自动波特率检测,这个功能要关掉,否则上电阶段 UART 可能误判时隙,后续通信全乱。

另外一个隐蔽问题是保留命令。ADS122U04 有些命令字节是保留的,如果不小心发出去了,ADC 可能进入意外状态。我在程序入口加了完整的握手序列:上电等待、复位命令、延时、写配置、延时、启动转换,任何一步超时都重新走。调试时还特意写了一个错误计数器,任何超过 1 秒的通信无响应就判定为通道故障,切到备用通道并报警,系统不会因为单个 ADC 出问题而整体死机。

5.3 上电时序、看门狗与长期稳定性验证

ADC 和 MCU 上电速度不一致,是首帧数据异常的常见原因。PIC32MZ 启动快,固件可能几十毫秒就开始初始化 UART,而 ADS122U04 可能还在上电唤醒,此时发的命令会丢失。MCU 侧要加延时等待 ADC 就绪,同时周期尝试握手,而不是一次性配置完就认为万事大吉。

看门狗喂狗的位置也要注意。如果主循环在阻塞式读 UART 的过程中卡住了,看门狗没有机会被喂,整机就会复位。我把主循环改成了周期任务调度加非阻塞 UART 读取,任何通信失败都由错误计数器处理,喂狗照常进行。这样即使 ADC 侧真的坏了,控制器也不会反复复位,而是保持故障状态并报警。

长期稳定性方面,我做过一次比较完整的验证:板子放入温箱,-20℃ 到 70℃ 循环,同时在常温下连续跑 72 小时记录漂移。使用外部精密 RREF 时,常温 24 小时最大漂移小于 0.02℃;温箱全温度范围的漂移主要来自 RREF 温度系数,10ppm/℃ 的电阻可以把整机全温度范围误差控制在 0.1℃ 以内。如果项目对全温度范围精度有更苛刻要求,可以考虑更高精度的参考电阻,或者用 ADC 内部基准加软件校准。

最后再分享一个小技巧:批量生产的校准系数一定要按板卡单独保存,每块板的 ADC 零偏和 PGA 增益误差都不一样。我在产线上用的是一个简单的烧录脚本,读标准温度点、算系数、写进 Flash、打印结果,整个过程几十秒,但能让每一块板都有稳定的出厂精度。做温控系统,设计端的精度做到了,生产和维护端的校准流程没做到,同样会在现场露馅。

返回列表