
做工业采集和 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 位低功耗 Δ-Σ ADCTSSOP-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 RAM144 脚 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再流过一只精密参考电阻 RREFRREF 两端的电压接到 ADC 的参考输入端。这样 ADC 的参考电压也是由同一个电流源产生的转换结果实际上只取决于 PT100 电阻与 RREF 的比值。推导一下就很直观PT100 在 0℃ 时电阻约为 100Ω激励电流选 1mA传感器电压约为 100mVRREF 选 2.05kΩ基准电压 VREF 1mA × 2.05kΩ 2.05V若 PGA 设为 8 倍ADC 码值比例 d ≈ (VRTD × PGA) / VREF R(PT100) × PGA / RREF。注意公式里电流 I 消掉了。温度变化导致激励电流漂移时PT100 和 RREF 上的电压同步变化比例关系不变。这正是比例式测量的精髓。我刚开始接触时总觉得要独立恒流源才高级后来才明白靠同一个电流源做比率才是工业测温最实用的抗漂移手段。四线制接法建议坚持用。两线制把探头线电阻直接算进 RTDPT100 在 0℃ 时线阻多 0.4Ω温度就偏约 1℃。三线制能补偿一部分四线制则彻底把电流回路和电压采样回路分开导线压降不再进入测量回路。工业现场如果探头线经常被更换四线制是唯一不用重新校准的方案。2.2 供电、PCB 与参考电阻的选择细节ADS122U04 的模拟电源我用独立 LDO 供电没有直接拿数字 3.3V 去供。工业板卡常从 24V 电源进来经过 DC-DC 降到 5V 再经 LDO 到 3.3VDC-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 通道的典型配置是差分输入、PGA8、激励电流 1mA、外部参考、数据速率 20SPS。配置命令之间必须留足间隔这个点是我调试初期最大的困惑。刚开始我写完寄存器立即启动转换偶尔出现配置丢失温度读数乱跳。后来查资料才意识到ADS122U04 内部的寄存器锁存和命令执行不是完全同步的连续命令之间需要有短暂延时否则后一个命令可能把前一个配置覆盖掉。加上延时之后问题彻底消失。批量生产中建议上电后做一个完整复位序列等待上电稳定、发送复位命令、延时、写配置、再延时、启动转换任何一步超时都重新走一遍。3.2 用 DMA 读串口不要在中断里浪费 CPUPIC32MZ 的 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 / PGAd_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℃PGA8、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、打印结果整个过程几十秒但能让每一块板都有稳定的出厂精度。做温控系统设计端的精度做到了生产和维护端的校准流程没做到同样会在现场露馅。