ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

工业测温与HVAC方案:ADS122U04IPWR搭配STM32F756ZG实现高精度多点采集

工业测温与HVAC方案:ADS122U04IPWR搭配STM32F756ZG实现高精度多点采集

做工业测温和暖通空调(HVAC)项目这些年,我一直在找一种能平衡精度、成本和通信距离的测温方案。最近把 TI 的 ADS122U04IPWR 和 ST 的 STM32F756ZG 搭在一起,做了一块工业多点测温板,从传感器信号采集、模数转换到 STM32 端的数据处理整个链路都跑通了,效果比我预想的稳。这套组合主要解决工业现场和 HVAC 系统里常见的一类需求:温度传感器种类多、布线距离长、环境干扰大,同时还要求数据能稳定送到控制器或上位机做后续逻辑。想动手做温度采集、或者正在选型 ADC 和 MCU 的朋友,这篇内容应该能帮你省掉不少试错时间。

我不打算上来就贴一堆手册参数,先聊清楚这套方案是怎么选的,再逐步拆解硬件电路、固件实现和实测中踩过的坑。你会发现,ADS122U04IPWR 这个自带 UART 接口的 24 位 ΔΣ ADC,和 STM32F756ZG 配合起来,很多原本麻烦的工程问题被天然绕开了。

1. 方案选型:为什么这套芯片组合适合工业与 HVAC 测温

1.1 工业现场测温到底难在哪

工业环境和家里开空调完全是两个量级。工厂车间里的 HVAC 系统,要管的不只是舒适度,还有设备散热、工艺环境温度、风管和水管温度监控。这些场合温度变化慢,但对稳定性要求极高,传感器往往分布在几十米甚至上百米的范围内,而且旁边就是变频器、电机、大功率开关电源这类噪声源。

早期我做这类项目用过热电偶直接接运放、再用 STM32 内部 ADC 采样的方案,调试过程让人头疼。电噪声一进来,读数跳得跟心电图似的;传感器线稍微拉长一点,电压衰减和共模干扰就分不清了。后来换成带内部 PGA 的高分辨率 ΔΣ ADC,才算把稳定性和分辨率的问题解决了。ADS122U04IPWR 这种芯片,本质上就是给这种场景准备的。

HVAC 和工业测温对 ADC 的核心要求其实很一致:低漂移、高分辨率、抗工频干扰、能适配不同类型的传感器。ADS122U04IPWR 在这几点上都做得比较完整,而且它最大的特点——UART 接口,能在长距离传输和电气隔离的工程难题上帮大忙。

1.2 ADS122U04IPWR 的核心特性与选型理由

ADS122U04 是 TI 的一款 24 位 ΔΣ ADC,封装是 TSSOP-16,后缀 IPWR 代表工业温度范围版本。它集成了可编程增益放大器(PGA)、两个恒流源(IDAC)、内部温度传感器、4 通道模拟多路复用器,还直接支持 50Hz 和 60Hz 的工频干扰抑制。这些功能集成度已经很高了,但我选它还有一个更直接的原因:它用的是 UART 通信接口,不是常见的 SPI 或 I2C。

别小看这个 UART 接口。工业现场测温,传感器板子经常和主控板分开放,中间隔着挠性线缆或者双绞线。SPI 和 I2C 讲究时序同步,线一长、干扰一大,时钟抖动和信号反射就会出现,轻则通信失败,重则噪声耦合进测量数据。UART 本质是异步串行通信,只要波特率对得上,抗干扰性和传输距离都比同步接口有优势。更关键的是,UART 特别适合做数字隔离——隔离器件在串行链路上工作很可靠,成本可控。这对工业应用来说是实打实的加分项。

另一个让我放心的地方是内置 IDAC 恒流源。测 RTD 铂电阻时,恒流源激励是标准做法,外部还要配精密基准电阻做比例测量。ADS122U04 直接把电流源做进去了,温度漂移小,还能省掉外围恒流源电路。内部 PGA 支持 1 到 128 倍增益,热电偶这种微伏级信号也能直接放大到 ADC 的合适量程,不用再加仪表放大器。

1.3 STM32F756ZG 在方案里扮演的角色

STM32F756ZG 是 ST 的高性能 Cortex-M7 内核 MCU,主频能到 216MHz,带双精度 FPU、丰富的 UART 外设和 DMA 控制器。用它来做数据读取和处理,说实话性能是过剩的,但恰恰是这个“过剩”让整个系统很从容。

测温应用本身不用太高算力,但 STM32F756ZG 的价值在于外设资源和扩展能力。温度数据进来之后,通常还要做人机交互、协议转换、报警判断和联网上报。F7 系列有足够的 USART、I2C、SPI 和以太网 MAC,后续想接触摸屏、RS485、EtherNet/IP 都能直接扩展,不用重新换平台。它内置的硬件 FPU 做温度线性化计算和滤波算法时也快,即使同时处理多路传感器,CPU 占用率也不高。

我实际选型时还考虑过 STM32F103 这类成本更低的芯片,但考虑到后续要跑 FreeRTOS、要支持多路传感器、要留协议栈空间,最后还是定了 F756ZG。开发调试时不用抠那点资源,心里踏实。

2. 硬件设计:从传感器信号到稳定的24位数字码流

2.1 三种传感器接入方式与参数计算实例

在 HVAC 和工业测温里,最常见的传感器就是热电偶、PT100/PT1000 铂电阻,以及 NTC 热敏电阻。ADS122U04IPWR 的内部结构刚好能覆盖这三类,但接法完全不同,参数计算也有讲究。

先看 RTD 铂电阻。这是 HVAC 里测水管温度、风管温度最常用的传感器。我习惯用比例测量接法:让 IDAC1 恒流源同时流过 PT100 和一只精密基准电阻 RREF,然后将 PT100 的电压和 RREF 的电压分别送入 ADC 的两个通道。这样做的好处非常直接——IDAC 的电流漂移会同时影响两个电压,转换成数字量后电流项被约掉,精度只取决于 RREF 的漂移。选 RREF 时我用的是 0.1% 精度、25ppm/℃ 漂移的金属膜电阻。

参数选择上,我常用 1mA 激励电流。PT100 在 0℃ 时电阻是 100Ω,这时产生的电压就是 1mA × 100Ω = 0.1V。如果是 -40℃ 到 150℃ 的 HVAC 测温范围,PT100 的阻值大约在 84.27Ω 到 157.33Ω 之间,对应差分电压是 84.27mV 到 157.33mV。这个信号水平对 PGA 来说很舒服,我取 PGA 增益为 8,VREF 用 2.048V 内部基准,得到 ADC 理想输出码约为 84.27mV × 8 / 2.048V × 8388608 ≈ 276 万,分辨率远够用。需要注意的是,别把激励电流设到 5mA 甚至更大,否则 PT100 自热效应会明显抬高本地温度,读数会比真实值偏高。

热电偶的接法就完全不同了。热电偶输出的是微伏级的电压,T 型热电偶大约 40μV/℃,K 型大约 41μV/℃,所以 PGA 增益必须设到 128 倍。同时必须处理冷端补偿,也就是测量热电偶接线端子处的实际温度,再把这个温度换算成等价的电压补偿进去。我的做法是用 ADS122U04 的内部温度传感器作为冷端参考,配合 NTC 在端子旁做交叉校准。内部温度传感器精度一般够用,但如果要求很高,可以在端子上贴一颗 PT100 做冷端测量,余下的误差就是补偿基准自身的误差。

NTC 最简单。用 IDAC 恒流源加一只 NTC 和参考电阻,测出 NTC 上的电压再反算阻值。NTC 的 B 值偏差比较大,一般只能做到 0.5℃ 到 1℃ 的精度,适合不需要高精度的风管温度监视场景,不建议用在工艺控制回路上。

2.2 电源、基准与外围电路的关键配置

ADS122U04IPWR 对模拟供电比较敏感,我建议把 AVDD 和 DVDD 分开供电。在实际测量中,如果 AVDD 上的纹波超过 10mV,24 位 ADC 的末位码就会开始跳动。我在这块板上用了两个独立的 LDO,AVDD 用低噪声 LDO 输出 3.3V,DVDD 单独给一个 3.3V,中间用磁珠隔离。数字部分的地和模拟部分的地在 ADC 芯片下方单点连接,避免数字噪声通过地平面串进模拟通路。

基准电压我做过两版对比。内部基准 2.048V 使用方便,温漂大约在几十 ppm 量级,对多数 HVAC 场景足够。追求更高稳定性时,我换过外部基准芯片,比如 REF5025,噪声和温漂指标都更好,代价是多一个元件、多一路电源。测试下来,外部基准在 25℃ 环境下和内部基准差异不大,但温度变化大时外部基准的稳定性明显占优。如果你做的是 -40℃ 到 85℃ 的宽温产品,建议直接上外部基准。

输入滤波也不能省。传感器线缆从现场拉过来,相当于一根天线,会吸收各种射频和工频干扰。我在每个模拟输入引脚和地之间放了 RC 低通滤波,电阻选 100Ω,电容选 1nF,截止频率大约 1.6MHz,用来滤除高频噪声。需要注意的是,RC 滤波器的电容不能选太大,否则和 ADC 内部的采样电容交互,会引起建立时间问题,导致读数偏移。

2.3 PCB布局和接线:我踩过的精度坑

PCB 布局这块,我吃过一次亏。之前一版板子为了走线方便,把 ADS122U04 的模拟输入走线布到了数字接口旁边,结果数字通信信号一跳,模拟读数立马出现规律性尖刺。后来把模拟输入走线完全避开数字区,并且用地线包围起来,问题才消失。

还有一个非常容易被忽略的点:RTD 传感器如果用两线制接法,导线本身的电阻会直接叠加到测量结果里。2 米长的导线可能只有 0.1Ω,看起来不大,但对应 PT100 就是 0.25℃ 的误差。如果传感器线更长,误差就更明显。解决方法是使用三线制或四线制接法。三线制通过两个通道分别测量线路压降,四线制则彻底消除导线电阻影响。我现在的板子强制要求使用三线制 RTD,虽然多一根线,但精度提升非常值得。

PCB 走线时,模拟输入要避免直角拐弯,信号走线不要平行太长,差分输入的两根线要尽量等长并且挨在一起。接线端子我选的是弹簧式端子,比螺丝式端子更可靠,震动环境下不会因为螺丝松动导致接触电阻漂移。这一点在工业震动场合尤其重要。

3. 固件实现:从 UART 指令到温度数值的全链路代码设计

3.1 STM32 UART 初始化和 DMA 接收状态机

硬件跑通后,软件就是重头戏。ADS122U04 的 UART 通信协议本身不复杂,主机发命令字节,ADC 返回状态字节加数据字节,但在 STM32 端要做得稳,有几个关键点。

首先是用 DMA 接收。STM32F756ZG 的 UART 接收如果靠中断逐字节处理,数据一多 CPU 就被打断,而且没有 DLE 时容易漏字节。我的做法是配置 USART3 的 DMA 接收环形缓冲,再配合空闲中断判断一帧数据结束。波特率初始用 9600,这是最稳妥的起步配置,调通后再根据实际线缆长度决定是否提速。长线缆下我用 9600 实测很稳,短线或板内场景可以用 19200。

初始化时要特别留意 UART 的 FIFO 和过采样设置。我建议使能硬件 FIFO,同时把收发超时时间设置得宽松一些。ADC 返回数据的节奏是固定的,但偶尔会有系统调度延迟,超时设得太短会导致误判丢帧。另外一个容易踩的坑是发送命令后立刻读数据,ADC 芯片可能还没准备好。我实测在发送命令后加 200μs 到 500μs 的延时,再开始等待接收,稳定性会好很多。

3.2 数据解析、符号扩展与超时重发

ADS122U04 返回的数据是 24 位有符号数,采样值可能为正也可能为负。直接读三个字节拼成 32 位整数时,必须做符号扩展,否则负温度读数会变成一个巨大的正数。这个坑我在第一版代码里踩过,热电偶测量低温或者 RTD 测量零下温度时,数据完全是乱的,刚开始还以为是传感器接反了。

我写了一个固定格式的状态机,完整帧是命令字节加状态字节加 3 个数据字节,共 5 个字节。接收时按状态依次推进,任何字节对不上就丢弃并重置状态机。因为 UART 是异步的,通信起始时可能和 ADC 的发送时钟错位,所以我会在主机发送命令前先发一个唤醒序列,以同步帧边界。实测这个流程对长线缆通信特别有效,刚开始调试时经常出现第一个字节丢失,加上唤醒序列后就没再犯过。

超时重发机制也必须做。我的逻辑是 5ms 内没收到完整帧就重发命令,连续重发 3 次仍失败则直接标记通道故障,不再卡死主流程。这样即使现场出现瞬间干扰导致丢帧,系统也能自动恢复,不会影响其他通道的数据采集。

3.3 滤波、线性化与冷端补偿

数据解析出来后,第一步是软件滤波。虽然 ADC 本身对 50/60Hz 有抑制能力,但工业现场存在变频器产生的高频噪声和随机脉冲,单次采样值偶尔会有毛刺。我在代码里做了滑动窗口中值滤波加均值滤波的组合:先对 5 个采样值取中值,去掉明显离群点,再对 4 组中值取平均。实测下来,读数稳定性从 ±3 个码提升到 ±1 个码以内,响应延迟也只有几百毫秒,对测温应用完全可接受。

线性化这块,PT100 不是完全线性的,0℃ 到 100℃ 之间还会有一些弯曲。最简单有效的方法是用 ITS-90 分度表做查表加线性插值。我把 -40℃ 到 150℃ 范围内每 1℃ 对应的电阻值存成一张表,查表后做线性插值,计算量小,精度也能达到 0.1℃。STM32F756ZG 的浮点运算能力很强,如果你嫌查表麻烦,也可以直接用 Callendar-Van Dusen 公式计算,但需要注意公式在 0℃ 以上和以下的系数不同,千万别混用。

热电偶的冷端补偿我会单独强调一下。很多人把热电偶直接接到 ADC 输入,测出来的电压确实是热端的电压加冷端的电压差,但如果冷端温度不测量,整个系统就是错的。我在软件里先读内部温度传感器的读数,换算成冷端温度,再用查找表查冷端温度对应的热电势,加进测量电压里,统一做反向查表得到最终温度。每次上电时,我还用一个已知温度的恒温源校准冷端基准,确保补偿误差在可控范围内。

这里建议把滤波和线性化的代码模块化,不同传感器类型通过数组配置切换,方便后续扩展更多通道和更多传感器类型。

4. 实测问题与排查实录

4.1 读数跳动和噪声大的典型原因

我调试这套板子时,遇到读数跳动最严重的一次,末位码能跳几十个码,换算成温度接近 1℃。排查过程花了整整一天,最后定位到两个问题:一是 AVDD 的 LDO 输出电容选得太小,导致电源在高频段内阻变大;二是输入滤波电容用了 X7R 介质,信号在变化时电容值随电压偏移,引入了额外的非线性。换成低 ESR 钽电容和 C0G/NP0 介质电容后,噪声明显回落。

如果读数出现规律的、周期性的跳动,多半和数字串扰或电源相关。我习惯把 MCU 跑起来但不发 UART 命令,先观察 ADC 输出是否稳定。如果这时候就跳,说明硬件上模拟通路或电源有问题;如果 MCU 一通信就跳,说明数字串扰没隔离干净。这种二分法排查思路能大幅缩小范围。

另一个容易忽略的是 PCB 表面漏电。在湿度大或者有助焊剂残留的板子上,模拟输入引脚间的绝缘电阻会下降,形成额外的漏电流,等效于给传感器并联了一个大电阻。新板子必须用洗板水彻底清洗,然后涂三防漆。我实测下来,涂了三防漆的板子在湿度 90% 环境下,读数漂移比没涂的好了 3 倍以上。

RTD 自热也要排查。若激励电流设为 2mA,PT100 在 0℃ 时会自热约 0.4mW,这个功率在小体积的薄膜铂电阻上就可能引起 0.1℃ 的温升。如果发现读数随风速或安装方式变化,就要检查是不是自热在作祟。解决方法是减小激励电流到 500μA,或者在软件里做自热补偿系数校正。

4.2 UART 通信失败的几类场景

长线缆通信最容易出的问题是波特率偏移。STM32 的 UART 时钟来自 PLL,如果系统时钟配置不精确,或者线缆电容导致信号上升沿变缓,就可能出现高波特率下偶发错位。我遇到过一版代码在 115200 波特率下跑得很好,换成 19200 反而乱码——原因就是线缆电容量变小后,信号沿过冲触发接收端的误判,后来在终端加上下拉电阻和 100pF 电容吸收过冲才解决。

还有一种诡异情况:拔掉传感器线后,ADC 通信就正常;一接上传感器,UART 也会偶尔丢数据。定位发现是传感器线把外部共模干扰带进了系统,干扰沿地线串回 MCU 端,影响了 UART 接收的判定电平。解决方法是把传感器端的地和电源通过隔离电源和数字隔离器彻底分开,让模拟部分和数字部分不再共用电流回路。隔离方案上线后,长时间通电测试再没出现过通信异常。

如果你用的是杜邦线或者飞线调试,通信不稳定时优先检查公母头接触电阻和线序,不少“灵异问题”最后都是接线端子氧化或线序搞反导致的。

4.3 标定与精度验证流程

温度测量系统出厂前必须做标定,但标定不是简单地把零点和满度调一下就行。我现在的流程是“三点标定”:用干井炉或恒温槽提供 0℃、50℃、100℃ 三个标准温度点,每点稳定 15 分钟,读取系统计算出的温度,和标准温度计比对,然后拟合出一个一次或二次修正曲线,固化到 STM32 的 Flash 里。

标定时有几个细节。传感器探头必须和标准温度计放在同一深度、同一介质里,避免探头位置差异导致比对误差;连接线不能剧烈移动,否则导线电阻或接触电阻变化会干扰读数;标定完成后要保温至少 30 分钟,回到室温后再复测一次,确认真实环境中没有漂移。

验证精度时,我用一个高精度恒温槽从 0℃ 到 100℃ 以 10℃ 步进抬升,记录每个点的误差。实测下来,PT100 + 比例测量 + 三点标定后,整个量程内误差控制在 ±0.3℃ 以内,大多数点能做到 ±0.15℃。这个精度对 HVAC 和多数工业测温要求已经非常宽裕了。热电偶通道因为有冷端补偿误差,实测在 ±0.8℃ 到 ±1℃ 之间,虽说不如 RTD,但用在炉膛、烟道这种高温场合绰绰有余。

调试过程中最深的体会是,热工测量系统的问题往往不是单点造成的,而是电源、布线、传感器类型、软件滤波叠加的结果。ADS122U04IPWR 这种高集成度芯片确实简化了硬件,但真正决定精度的还是系统设计的每个环节。我在画下一版板子时,会把更多精力放在模拟前的滤波和隔离上,同时把标定系数做成可在线更新,方便产线批量校准时直接写入。这套方案目前稳定运行了几个项目,后续如果扩展多通道或者加入无线传输模块,我也会基于这套硬件平台继续迭代。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进