ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

ADS122U04IPWR+STM32F767BI高精度温度采集方案设计与实现

ADS122U04IPWR+STM32F767BI高精度温度采集方案设计与实现

常有人问我,给工业设备或者中央空调系统做温度采集,到底怎么选型才不踩坑。标题里这两颗料号我太熟了——ADS122U04IPWR 加 STM32F767BI,前前后后在我的工控板、冷水机组控制器、风管温湿度采集卡上用了好几轮。ADS122U04IPWR 是 TI 的一颗 24 位 ΔΣ ADC,内置 PGA 和激励电流源,专门处理 RTD、热电偶这类微小信号;STM32F767BI 是 ST 家的 Cortex-M7 主控,主频高、资源足,跑协议栈和浮点算法都绰绰有余。把这两颗放在一起做温度测量,不是性能过剩,而是能真正把稳定性和精度做出来。这篇就把完整链路拆开讲一遍,从为什么选型、信号链怎么算,到 PCB 布局、固件实现和现场排错,尽量按我实际干过的顺序写。

1. 选型逻辑:为什么偏偏是这两颗

1.1 真实场景里的温度测量要求

HVAC 和工业现场的温度测量,难点往往不是“能不能读到温度”,而是“读得稳不稳、准不准、久不久”。以中央空调的风管温度为例,控制逻辑经常要求 0.5°C 甚至 0.2°C 的精度死区,如果传感器信号链噪声太大,夏季冷负荷波动时阀门会来回抖动,机组频繁起停,能耗和舒适度一起崩。工业现场更麻烦,温度变化慢,但变频器、电机、继电器触点都会带来干扰,一个 50Hz 的工频串扰就能让显示值在 0.5°C 到 1°C 之间来回跳。

这种情况下,早期用 NTC 热敏电阻加运放和比较器方案也能工作,但批次标定麻烦、老化漂移大。后来我直接放弃“裸传感器+信号调理”的老路,改成高分辨率 ADC 加标准铂电阻,把线性化、补偿、滤波全部交给数字域处理。ADS122U04IPWR 就是在这个切换点上进入视野的。

1.2 ADS122U04IPWR 的定位与关键能力

这颗 ADC 不是普通 ADC,它内部把温度测量需要的模块几乎集成全了。24 位 ΔΣ 转换核心,4 通道输入多路复用,内部可编程增益放大器 PGA,可配置的双路电流源 IDAC,内部基准和温度传感器,还有 UART 接口方便和单片机直连。

这里最关键的是双电流源。PT100、PT1000 这类铂电阻的测量,本质上需要恒流激励,再用 ADC 测电阻上的压降。如果自己做恒流源,光是电流温漂和长期稳定度就够折腾。ADS122U04IPWR 内部 IDAC 和一个精密参考电阻配合,能做到比例式测量:用同一路电流驱动参考电阻和铂电阻,ADC 测量的是两个电压的比值,电流本身漂移会被抵消。

打个比方,用同一把尺子去量物体的长度和量零位,尺子本身热胀冷缩了,两个读数一起变,比例不变,结果依然准确。这个原理是整套方案的基础。

1.3 STM32F767BI 在这里扮演什么角色

有人说,测温度而已,为什么上 STM32F767BI 这种 Cortex-M7?选它不是为了炫技,是系统需求决定的。F767BI 主频 216MHz,带硬件浮点单元 FPU,2MB Flash、512KB RAM,跑温度解算和滤波算法完全没压力。更重要的是,一块控制器往往不只是测温度:可能还要跑 RS485 从站协议、Modbus TCP、CANOpen、人机界面刷新、本地存储,甚至 OTA 升级。这时候 F0 或 F3 可能就吃紧了。

F767BI 还有多个 UART 和 SPI,接到 ADC 只是其中一路,剩下资源可以分配给以太网或显示。所以我的经验里,它是“温度采集 + 系统主控”二合一的选择。如果项目只需要一个独立的数字温度探头,那确实没有必要用 F767,换成小封装低成本 MCU 更合适。

1.4 和集成温度传感器芯片对比

很多人会问,DS18B20、TMP117 这些现成温度传感器多省事,为什么要搭 ADC 加 MCU 的组合?我用过很多,简单应用确实好用,但要分场景。

方案精度长期稳定性抗干扰传感器兼容性成本构成
DS18B20±0.5°C 级别一般中等单一数字传感器很低,外围少
TMP117±0.1°C 级别较好中等单一数字传感器中
ADC + PT100取决于校准,可到 ±0.05°C好强PT100/PT1000/热电偶/NTC 通用高,但有弹性

我要做的是多种温度传感器的采集平台,不是只为某一种传感器定死方案。ADS122U04IPWR 的 4 通道 MUX 还允许同一块板卡混接 RTD 和热电偶,这在工业多测点场景里特别有用。

2. 信号链设计与关键计算

2.1 PT100/PT1000 激励与量程分配

先以 PT100 为例算一遍参数。PT100 在 0°C 时阻值 100Ω,500°C 时阻值约为 280.9Ω,温度系数大约 0.385Ω/°C。给传感器分配的激励电流,需要同时满足量程和自热功耗要求。

我一般用 1mA 的 IDAC。1mA 在 500°C 的 280.9Ω 上产生 280.9mV 的差分电压,在 0°C 的 100Ω 上产生 100mV。ADS122U04IPWR 的内部 PGA 增益取 4 时,满量程是内部基准 2.048V 除以 4,也就是 512mV,280.9mV 在量程内,又不至于用得太满,留了足够的余量。如果测量范围到 -50°C 以下,信号更小,同理也能算得过来。

用内部基准也不是不行,但更稳的是外部比例基准。ADS122U04IPWR 的 IDAC 电流经过一个精密参考电阻 RREF,产生基准电压作为 ADC 的测量基准。这个方案的妙处在于,激励电流变大变小时,RTD 上的电压和 RREF 上的电压同步变化,ADC 转换结果只跟电阻比有关。

具体公式可以简化成:

float r_rtd = code * rref / (8388608.0f * pga_gain);

其中code是 24 位 ADC 原始码值,rref是参考电阻值,pga_gain是 PGA 增益。以 RREF = 1800Ω、PGA = 4 为例,如果 ADC 读到的相对满量程比例是 0.25,对应电阻就是 0.25 乘以 1800 再除以 4,得到 112.5Ω,这个值再交给线性化算法换算出温度。注意实际使用时还要扣除 ADC 的偏移误差,后面校准章节会专门说。

2.2 热电偶信号与冷端补偿

热电偶和 RTD 有本质区别。RTD 是无源电阻,激励电流可以产生比例关系;热电偶输出的是毫伏级热电势,不能使用比例式测量,必须依靠稳定的电压基准。

K 型热电偶灵敏度大约 40μV/°C,在 0 到 1000°C 范围内信号最大也就四十多毫伏。ADS122U04IPWR 的 PGA 增益选 32 时,满量程是 2.048V 除以 32,等于 64mV,刚好适合 K 型热电偶。J 型或 T 型信号更小,可以选更大增益,但要注意过大的增益会把 ADC 自身的噪声也放大,要结合数据率一起权衡。

热电偶测量绕不开冷端补偿。测温的热电偶两根线,端子在控制板上是铜导线,铜和热电偶材料之间会产生额外的热电势。这个补偿值需要测量接线端子附近的实际温度,再换算成等效热电势加到信号上。ADS122U04IPWR 内部有温度传感器可以做粗略补偿,但我在板子上还是会额外放一颗高精度测温元件,紧贴接线端子,用软件做更精确的补偿。

2.3 噪声、数据率与有效分辨率

24 位 ADC 很容易让人误以为分辨率就是 1/2^24,实际上 ΔΣ ADC 的指标要看有效分辨率 ENOB。ADS122U04IPWR 在低数据率下噪声很小,但数据率提高到几千 SPS 时,有效位数会明显下降。温度测量是慢变量,我没有必要追求高采样率,通常把数据率设在 20SPS 附近。

20SPS 的好处有两个。第一,每个读数间隔 50ms,正好和工频周期对齐,内部数字滤波器对 50Hz 和 60Hz 干扰有很好的抑制能力。第二,噪声更低。按照数据手册典型噪声指标,在 PGA 增益不高、20SPS 条件下,折合到输入端的噪声在微伏级别。PT100 在 1mA 激励下,温度每变化 1°C 会产生 0.385mV 的信号,经过 PGA=4 放大到 1.54mV,几微伏的输入噪声对应到温度也就是千分之几摄氏度的波动。

这个计算也说明,系统能不能到 0.1°C 精度,主要取决于基准、参考电阻、传感器本身和校准,而不是单纯看 ADC 位数。

2.4 供电和电压基准的处理

ADS122U04IPWR 是模拟器件,供电质量直接影响转换结果。工业板卡上常见 24V 转 5V 再转 3.3V 的供电链路,如果直接用 DC-DC 给 ADC 供电,纹波会耦合进模拟输入。我一般用高 PSRR 的 LDO 单独给 ADC 的模拟电源供电,数字部分用另一路,之间用磁珠隔离。

RTD 测量因为走比例式,对电压基准绝对精度要求低,但参考电阻 RREF 的温漂必须小,要用低温度系数的精密电阻,比如 ±10ppm/°C 或更好。热电偶测量对内部基准的绝对精度更敏感,如果项目要求很高,我会外接独立基准芯片给 ADC 做参考电压,这样温度漂移指标会更可控。

3. 原理图与 PCB 布局要点

3.1 ADC 最小系统和外围滤波

ADS122U04IPWR 周围元件不多,但位置摆不好照样出问题。供电引脚旁边要有 10μF 钽电容加 100nF 陶瓷电容组合,REF 引脚上的滤波电容要根据 ADC 手册推荐值选,太小会引入转换噪声,太大会影响建立时间。

传感器输入到 ADC 之间,我习惯加 RC 低通滤波器。串联电阻选 1kΩ,差分电容选 1nF 或 10nF。这个 RC 的截止频率很低,可以滤掉高频噪声,同时还能和传感器引线分布参数配合,减少射频干扰。要注意的是,输入串联电阻和 ADC 内部 PGA 的输入偏置电流相互作用,会产生一定的偏移误差,校准阶段可以一并消除。

3.2 STM32F767BI 与 ADS122U04IPWR 的接口连接

ADS122U04IPWR 支持 UART 接口,和单片机之间就是两根线加一根状态线的连接方式。F767BI 的 UART 资源很多,我通常把它接在 USART3 上,同时将 ADC 的 DRDY 状态脚连到 F767BI 的一个 EXTI 外部中断引脚。

为什么要把 DRDY 接到中断而不是轮询?因为轮询会消耗主控时间,而且如果主循环刚好在跑协议栈或者显示刷新,容易漏掉转换完成事件。中断触发后,主控从 UART 读取转换结果,然后把数据放进一个环形缓冲区,由后台任务做滤波和计算。这样结构清晰,实时性也有保证。

如果买到的是 SPI 兼容版本,F767BI 的 SPI 主模式也完全够用,关键是先把时钟极性和相位配置成和 ADC 手册一致,否则数据会整体错位。

3.3 传感器输入保护和 ESD/EFT 设计

工业现场总有静电放电、浪涌和快速瞬变脉冲干扰。ADS122U04IPWR 输入通道我建议在连接器位置加 TVS 管,钳位到电源轨,保护 ADC 模拟输入。如果传感器线很长,还要考虑雷击浪涌,在连接器处加共模电感和气体放电管,但这会比较占空间,通常只在工业严酷场合加。

传感器电缆的屏蔽层也要接好。屏蔽层单端接地,避免形成地环路电流。很多现场测温值飘,根本原因是屏蔽层两端都接地,产生地环路,差分信号被破坏。

3.4 PCB 布局的关键原则

PCB 布局我踩过不少坑,总结下来几条铁律:

  • ADC 尽量靠近传感器连接器,模拟输入走线越短越好。
  • 模拟地和数字地在 ADC 下方单点连接,不要在整个板子上铺成一大片然后相互交叉。
  • F767BI 的数字信号线、SPI/UART 走线不要和模拟输入平行,更不要跨过 ADC 下方。
  • 电源 DC-DC、继电器、变压器要远离 ADC 和模拟输入区域。
  • 如果层数允许,给模拟输入信号用包地走线,并在两侧加地孔。

这些规则看起来老生常谈,但很多新板子测出来乱跳,最后用示波器一测都是布局惹的祸。

4. 固件实现详解

4.1 上电初始化流程

固件是这套方案的重头戏,因为硬件再扎实,算法不对也白搭。先看上电初始化流程。F767BI 上电后,先初始化 GPIO、UART 和 EXTI,然后对 ADS122U04IPWR 发送复位命令,等待复位完成,再写配置寄存器。

配置寄存器需要确定的参数包括:输入多路复用器选哪个通道、PGA 增益、IDAC 电流大小、IDAC 输出通道、内部或外部基准、数据率、转换模式。顺序很重要,先配基准和电流源,再配 PGA 和通道,最后启动转换。如果顺序反了,ADC 可能在基准未稳定时就工作,开始阶段会输出无效数据。

一个简化的初始化伪代码:

ads122u04_reset(); ads122u04_write_config(ADS122U04_MUX_PT100, ADS122U04_PGA_4, ADS122U04_IDAC_1000UA, ADS122U04_REF_EXTERNAL, ADS122U04_DATA_RATE_20SPS); ads122u04_start();

实际寄存器位名以数据手册为准,但思路就是“先基准后输入,先电流后转换”。

4.2 中断驱动读取与任务调度

初始化完成后,ADC 会按照设定数据率周期性地触发 DRDY。F767BI 的 EXTI 检测到下降沿,在中断服务函数里把数据从 UART 读取到缓冲区,然后置一个标志位。主循环看到标志位,取数据进行后续处理。

这里有个细节:不要在中断服务函数里做 RTD 线性化或浮点运算。中断里只做最轻量级的数据搬运,其他算法放到主循环或独立任务里。F767BI 虽然主频高,但中断里频繁浮点多,依然会影响其他实时任务。

如果一次读一帧数据较长,建议给通信帧加校验。UART 传输受电磁干扰后可能出现字节错位,校验可以挡住大部分坏数据。校验失败就丢弃当前帧,等下一帧,别拿残废数据去算温度。

4.3 滤波算法选择和实现

温度信号本身是慢变信号,现场的偶发干扰又是脉冲式的,所以我的滤波器组合是:先中值滤波剔除脉冲,再滑动平均平滑信号。

中值滤波窗口取 5 点,每来一个新数据,和最近 5 个数据排个序,取中间值。这样遇到个别跳变的学习不会有影响。然后对中值输出再做 4 次滑动平均。整体延迟大约在 200ms 左右,对 HVAC 和工业温度控制来说完全可以接受。

如果是需要快速响应的场景,比如电机绕组过热保护,就不能用太深的平均窗,否则保护来不及。这时我会改用一阶 IIR 低通滤波器,系数取 0.2 到 0.3,响应速度和抑制干扰之间做个取舍。

4.4 RTD 线性化与查表计算

PT100 的阻值和温度不是完全线性,需要按照 IEC 60751 标准做数学修正。0°C 以上可以用二次多项式:

R(t) = R0 × (1 + A×t + B×t²)

其中 R0 = 100Ω,A = 3.9083×10⁻³,B = -5.775×10⁻⁷。如果要在单片机里实时求解温度,可以解一元二次方程,也可以把标准表格做成数组,用二分查找加线性插值。

工程上我更喜欢查表加插值,因为表驱动的方式直观,更新也方便。比如 0°C 对应 100Ω,10°C 对应 103.9Ω,20°C 对应 107.79Ω,每隔 10°C 一个点。读到一个电阻值,先在表里找到上下两个点,然后按比例插值。只要能保证表的精度,插值误差可以远小于 0.01°C。

4.5 热电偶冷端补偿与标定细节

热电偶测量固件算法比 RTD 复杂一点。测量端口的原始电压对应的是“热端 + 冷端”的总热电势,要得到热端温度,先把冷端温度换算成等效热电势,加回去,再用总热电势反查温度。

流程是这样的:

  1. 读取冷端传感器温度 t_cold。
  2. 用 K 型热电偶分度表,反向查出 t_cold 对应的热电势 E_cold。
  3. 将 ADC 测到的热电势 E_measured 加上 E_cold,得到总热电势 E_total。
  4. 用 E_total 正向查分度表,得到热端温度 t_hot。

冷端传感器的位置比算法更关键。如果冷端传感器距离接线端子太远,或者中间经过强热源,测到的冷端温度和实际端子温度不一致,补偿就是错的。我在板卡设计时,会把冷端传感器放到端子焊盘 2mm 以内,并且让铜箔连接到端子的同一个热区块,让它们尽量处于同一等温面。

4.6 生产校准与系统精度标定

哪怕器件指标再好,PCB 焊接、参考电阻、PGA 增益偏差、输入偏置电流都会带来误差。生产阶段做两点校准很有必要。

校准方法:用一个精密电阻箱或高精度标准电阻替代传感器,先输入接近零点阻值,记录 ADC 原始码值,再输入接近满度的阻值,记录第二个码值。根据这两点算出偏移系数和增益系数,存到 Flash。

cal_offset = code_zero - adc_code_zero; cal_gain = (r_span) / ((adc_code_span - cal_offset) * rref / pga);

校准后,系统精度可以把零点和满度误差同时压下来。做好校准后,PT100 通道在 -50°C 到 300°C 范围内做到 ±0.1°C 级别误差不算难事。

5. 常见问题与排查技巧实录

5.1 数据稳定但整体偏大或偏小

这种情况通常不是噪声问题,而是系统误差。先检查 RTD 是否为两线制接法。两线制下,激励电流经过连接导线,导线电阻和传感器电阻串在一起,测量结果里混入了引线电阻。一根 0.5Ω 的导线,配合 PT100 的温度系数 0.385Ω/°C,就是大约 1.3°C 的误差。解决办法是改成三线制或四线制,或者软件里按线长估算补偿,但后者不推荐。

再检查参考电阻 RREF 的精度和温漂。1kΩ 的参考电阻如果偏了 1Ω,RTD 电阻计算值就会成比例地偏。工业级设计应该用 0.1% 精度、低温漂的精密电阻。

5.2 读数偶尔跳变一个较大的值

读数跳变的来源大多是脉冲干扰,比如继电器吸合、电机启动、通信收发瞬间。先用示波器在 ADC 输入端观察有没有毛刺,有的话加强前端 RC 滤波和 TVS。软件上,中值滤波是性价比最高的补丁,但别指望只靠算法解决所有问题。

还要检查 DRDY 中断服务函数是否被高优先级中断长期阻塞。如果通信协议栈中断长时间占用 CPU,ADC 数据读取不及时,可能读到错位字节,导致某个温度值异常大。给读取中断适当的优先级,并给数据帧加校验。

5.3 冷端补偿温度波动严重

冷端补偿值不稳定,不一定算法错,很可能是冷端传感器被风吹。HVAC 系统里,风机一旦启动,PCB 周围气流变化,冷端传感器温度迅速波动,热电偶读数就跟着跳。

我处理过一例,磁珠附近加冷端传感器,变频器散热气流正好吹过。后来把冷端传感器移到端子一侧,用灌封胶覆盖,并在软件里对冷端温度施加低通滤波,补偿值才稳定下来。记住,补偿传感器测的是端子温度,不是空气温度。

5.4 DC-DC 带来的模拟干扰

现场板卡为了效率,常用 DC-DC 给数字部分供电。DC-DC 开关纹波会通过地或走线耦合到 ADC。如果发现零输入时 ADC 码值随供电负载变化而波动,多半是电源干扰。

处理办法是给 ADC 模拟电源加二级 LC 滤波,让模拟电源远离数字开关节点,同时把 ADC 的地和 DC-DC 地分开,只在单点汇合。不要指望光靠 PCB 铺地就能解决,关键路径上的隔离要做好。

5.5 现场问题排查速查表

现象可能原因优先排查解决方向
读数稳定但整体偏差引线电阻、RREF 偏差检查接法与参考电阻三线制/四线制,精密 RREF
读数周期性跳变工频干扰或开关噪声示波器查输入加强滤波,降低数据率
偶发大跳变继电器/电机干扰查 DRDY 和数据校验中值滤波,TVS,屏蔽层接地
冷端波动冷端热梯度观察冷端传感器温度热均衡设计,低通滤波
上电前 1-2 秒数据无效基准未建立检查时序数据就绪后再启用

这五类问题覆盖了我遇到的大部分现场故障,基本思路都是先看硬件,再看固件,不要一开始就怀疑芯片坏。

如果只能留一条经验,我会说这套方案的关键不在 ADC 分辨率,也不在主控性能,而是把“比例测量、热均衡、滤波校准”这一整套做对。ADS122U04IPWR 提供了很好的信号链基础,STM32F767BI 给了充足的算力空间,但最后的稳定性还是靠设计细心和现场调试。我后来做新一代产品时,换 PT1000 或者改接 K 型热电偶,只改了 RREF、查表和校准参数,整体框架完全复用。这种可扩展性,比单纯凑合一个能用的测温方案要值钱得多。

RELATED READING

延伸阅读

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