☰
ADS122U04与STM32F722VE高精度温度采集方案设计详解
2026/11/5 6:27:24 网站建设 项目流程

ADS122U04IPWR 和 STM32F722VE 放在一起,不少朋友第一反应是:这不是拿大炮打蚊子吗?24 位 ADC 配一颗 M7 内核的 MCU,做测温是不是有点浪费。但真把一个同时要管 HVAC 冷冻水温度、又要管工业电机绕组温度的项目跑起来之后,我才确认这套组合的合理性。ADS122U04IPWR 负责把微伏级传感器信号变成稳定的数字量,STM32F722VE 负责跑滤波、线性化、标定和现场通信,分工干净利落。这篇文章就把这套测温链路的选型原因、传感器接法、电路布局、固件处理和现场校验收尾全部拆开讲一遍,给正在做温度变送器、采集模块或者设备改造的工程师一个可以直接参考的完整方案。

先说明一下这串后缀的含义。ADS122U04 是 TI 的 24 位 ΔΣ ADC,IPWR 里的 I 代表工业级温度范围,PW 是 TSSOP 封装,R 表示卷带包装。所以 ADS122U04IPWR 就是那款带 UART 接口的 4 通道 24 位 ADC。它最大的特点就是把常规 ADC 的 SPI/I2C 接口换成了 UART 从机接口,MCU 不用盯着时序图一点点抠协议,只需要组帧、发送、读取,这在模拟前端和主控之间有一定距离的工程场景里省了非常多的事情。

1. 系统拆解:这两颗芯片各自干了什么

1.1 为什么高端温度测量必须把 ADC 从 MCU 里搬出来

大多数 MCU 内置 ADC 还是 12 位的,这对温度测量来说是硬伤。PT100 的灵敏度大约是 0.385Ω/℃,若激励电流为 1mA,温度每变化 1℃ 对应的电压变化只有 0.385mV。12 位 ADC 在 3.3V 基准电压下,一个 LSB 大约是 0.8mV,简单除一下就知道:量化误差本身就对应差不多 2℃。这还没算参考电压漂移、电源纹波和引脚串扰。

有些朋友说:那我用 MCU 内置的 PGA 或者过采样不就行了?先不说内置 PGA 增益和噪声指标远不如独立 ADC,过采样确实能提高有效分辨率,但无法解决参考电压不稳定的问题,更无法处理热电偶这种微伏级信号。于是工程上做高精度测温,几乎无一例外要外挂高分辨率 ADC。ADS122U04IPWR 这一类芯片存在的意义,就是把“信号调理 + 模数转换 + 数据输出”整套脏活累活包下来,MCU 只负责结果加工。

1.2 ADS122U04IPWR 的核心能力拆解

这颗 ADC 最值得说的有三块。第一是前端模拟链路:4 个输入通道可配置成差分或单端,内部集成可编程增益放大器 PGA,增益从 1 到 128 可调。这个 PGA 对热电偶测量是决定性的,因为 K 型热电偶的灵敏度只有约 41μV/℃,若不放大,再好的 ADC 也白搭。

第二是内部集成了两个可编程激励电流源 IDAC,输出从微安级到毫安级可调。做 RTD 测量时,不再需要外部搭恒流源电路,直接用 IDAC 给传感器供电,再配合精密电阻做比例式测量。第三才是它最特殊的地方:通信接口直接暴露为 UART 从机,主机按帧格式发命令、收数据,而且支持较高的波特率,实时性完全够用。芯片本身工作电流在微安级别,非常契合 HVAC 这类长期带电运行的设备。

别忘了它内部还有一个温度传感器,可以用来做热电偶冷端补偿参考,或者做系统自检。后面我会说到,实际工程里我更倾向于外接 NTC 做冷端测量,原因到时候细讲。

1.3 STM32F722VE 在这个项目里的定位

STM32F722VE 是 STM32F7 系列中的一颗中等规模芯片,Cortex-M7 内核,最高主频 216MHz,带单精度硬浮点 FPU。温度换算、滤波、查表插值这些算法里全是浮点运算,M7 的 FPU 能把计算耗时压到微秒级,这对需要同时跑多通道采集、显示刷新和通信协议的设备来说非常关键。

选它还有几个次要但实际的理由。LQFP100 封装下外设资源充裕,多个 UART 可以分配给 ADC、RS485 和调试口;512KB Flash 不仅能装下完整的通信协议栈,还能存多组标定参数和线性化查表数据。项目后期如果要把数据上传到楼宇自控系统,这颗芯片还带以太网 MAC,扩展空间也留出来了。

1.4 同场竞技:为什么不选其他方案

为了说明选型逻辑,我整理了一张对比表,都是实际项目里被反复比较过的方案:

方案优势劣势适用场景
MCU 内置 12 位 ADC成本最低,电路最简单精度差,参考电压不稳精度要求 ±2℃ 以上的粗略监测
ADS1115(16 位 I2C)便宜,I2C 时序简单无内置 PGA 配合热电偶吃力,增益误差偏大0.5℃ 精度要求的低成本场合
ADS1220 / ADS1232(SPI)性能稳定,资料多需要 MCU 做 SPI 时序和通信调度已有成熟 SPI 驱动代码的团队
ADS122U04IPWR + STM32F722VEUART 通信省心,PGA/IDAC 齐全芯片单价略高,需要理解其专属命令帧多传感器、RTD/热电偶混合、工业现场
MAX31865 等专用 RTD 芯片集成度极高,上电即测只能测 RTD,无法扩展热电偶只用 PT100/PT1000 的固定场景

综合看下来,ADS122U04IPWR 的优势在于一芯多用,RTD 能测、热电偶能测、NTC 也能测,配合 STM32F722VE 的算力,一套硬件平台就把工业现场和 HVAC 的常见温度传感器类型全部覆盖了。

2. 传感器链路设计:从探头到 ADC 引脚的完整路径

2.1 RTD 接法:三线制是工业基础,四线制是精度上限

PT100 这类电阻式温度传感器的接线方式,直接影响最终精度。两线制最简单,但引线电阻全部叠进测量结果里。算个账:现场走 20 米 0.5mm² 的铜导线,来回 40 米,电阻少说也有 1.5Ω 到 2Ω,而 PT100 从 0℃ 到 100℃ 总共才变化 38.5Ω。2Ω 的引线电阻等效出来的温度误差大约是 5℃,这在任何控制系统里都是不能接受的,所以两线制基本只适合短距离且精度要求很低的场合。

三线制是工业现场的主流做法。原理上,两个 IDAC 分别从传感器两端供电,ADC 测量 RTD 两端的差分电压和参考电阻上的电压,通过两次测量做差,就能把等长引线的电阻抵消掉。工程上要求传感器到 ADC 的引线尽量等长、同材质、同线径,这样共模的引线电阻才能被完美对消。我用三线制在现场实测,20 米线缆下依然能保持 0.1℃ 级别的稳定度。

四线制又叫开尔文接法,理论上可以把引线影响降到接近零,但代价是线缆成本翻倍。我的建议很直接:现场布线能用三线制就用三线制,只有实验室计量、或者对精度有极致要求的特殊工位才值得上四线。

激励电流的选择同样有讲究。PT100 在 1mA 的激励下,0℃ 时功耗约 0.1mW,对常见封装的传感器来说自热温升大约在 0.02℃ 到 0.05℃,基本可以忽略。如果把电流加到 5mA,功耗变成 2.5mW,自热可能拉到 0.5℃ 甚至更高,这就是不可接受的误差了。所以我在这套系统里默认把 IDAC 设在 0.5mA 到 1mA,宁可让信号小一点,也要把自热压住。

2.2 热电偶测量:放大和冷端补偿两个致命细节

热电偶本质上是一个电压源,K 型热电偶在 0℃ 到 100℃ 范围内输出电压大约 0 到 4.1mV,就算测到 1000℃,也只有约 41mV。这个信号不经过 PGA 放大,根本无法让 24 位 ADC 发挥出应有的分辨率。ADS122U04IPWR 的 PGA 增益设置到 32 或 64,配合内部基准,可以把热电偶的全量程信号映射到最佳输入范围内,实测下来峰峰值噪声能控制在很小的水平。

冷端补偿是另一个绕不过去的话题。热电偶测出来的是测量端和冷端(接线端子处)的温差电势,如果不测冷端温度,端子处温度变化 1℃,整个测量结果就偏 1℃。工程里常见的错误是:把冷端传感器贴在 PCB 上,但端子通过长导线连到远处,导热路径太长,冷端传感器测到的温度和实际端子温度完全对不上。

我的做法是:在端子排下面垫一块铜排或铝排做等温块,把冷端 NTC 紧贴在端子根部,让热电阻和热电偶端子尽量处于同一温度场。ADS122U04IPWR 内部虽然也有温度传感器,但它测的是芯片自身管芯温度,离接线端子物理距离太远,中间还有铜箔散热路径,误差不好控制。所以冷端补偿我坚持用外接 NTC,在固件里做电压查表换算,用实测数据做多项式拟合,冷端测量精度能做到 ±0.2℃。

2.3 HVAC 场景里的 NTC 与 PT1000 取舍

HVAC 行业对成本极其敏感,水系统和风系统里大量使用的是 NTC 热敏电阻和 PT1000。NTC 10kΩ B=3950 是绝对的主流,价格便宜、响应快、灵敏度高,在 25℃ 附近每变化 1℃ 阻值大约变化 4%,对 ADC 的挑战反而比 PT100 小得多。缺点是非线性严重,但有了 STM32F722VE 的算力,查表和线性插值完全不是问题。

PT1000 则出现在对精度要求更高的风管温湿度传感器和冷冻水回水温度测点上。它的基础电阻是 1000Ω,引线电阻占比更小,两线制也能凑合用,配合 24 位 ADC 做出来的系统长期稳定度很可观。

另外提一句,HVAC 的深度控制经常要算露点,也就是干球温度加相对湿度推露点温度,用 Magnus 近似公式就能算。这里多嘴说明一点:露点计算的输入温度若来自 NTC,那么 NTC 的线性化精度就直接决定了露点结果的可信度,所以 HVACS 现场通道的测温链路同样值得认真对待。

3. 电路设计与 PCB 布局:24 位精度的生死线

3.1 电源和基准:干净,干净,还是干净

24 位 ADC 对电源的敏感程度远超一般人的直觉。工业现场如果直接拿 24V 开关电源的输出给模拟部分供电,那读数上的跳动幅度会让你怀疑芯片是坏的。我的做法是:24V 先过一级 DC-DC 降到 5V,再用低噪声 LDO 降到 3.3V 给模拟部分供电。选 LDO 时看电源抑制比和输出噪声,像 LP5907 这类超低噪声器件就很合适。

ADS122U04IPWR 的内部基准虽然是集成的,但基准引脚旁边的去耦电容必须按手册参数紧贴引脚放置。我见过不少板子把电容放远了半厘米,结果噪声明显劣化。如果做比例式测量,也就是用外部精密电阻做参考,那么基准路径上任何一根走线杂散电感或者地弹噪声都会直接进入测量结果,这部分布局优先级是最高的。

3.2 输入滤波和保护:先让信号活下来,再谈精度

温度传感器探头的线缆在工业现场很容易耦合各种干扰。RTD 和热电偶的输入前端我做了三件事:一是进 ADC 之前加 RC 低通滤波,用 100Ω 配 100nF 是最常用的组合,截止频率大约 16kHz,既能滤掉大部分高频干扰,又不会对几十 Hz 的温度信号造成影响;二是在传感器线入口处并联 TVS 管,防静电和浪涌;三是针对室外长距离走线,加了共模电感。

这里有个容易踩的坑:RC 滤波电阻不能选太大。24 位 ADC 的输入漏电流虽然很小,但若电阻用到 10kΩ 级别,漏电流在电阻上产生的压降会造成不可忽略的偏置误差,而且这个误差还随温度变化。所以滤波电阻我一般控制在 1kΩ 以内,和滤波电容搭配后既有效又不会引入新的系统误差。

3.3 布局布线:模拟地与数字地的实际处理

很多人一说到 ADC 布线就要求模拟地数字地彻底分开,但真正单点接地怎么接,手册里往往含糊。我的实践经验是:在 ADC 芯片下方把模拟地平面和数字地平面用一个窄桥连起来,所有模拟信号的参考回路都回到这一侧的 AGND,所有数字信号回 DGND。STM32F722VE 的数字部分和 ADC 的数字接口尽量远离模拟输入引脚。

输入走线还有一条军规:绝对不要和 PWM、开关节点、通信线平行走长距离。我原版布线时把一路传感器线从电机驱动板的 PWM 线旁边过,读数跳动超过 ±20 个 LSB,重新布板拉开距离后噪声立刻降到 ±2 个 LSB。温度信号本身就是缓变信号,抗干扰能力天然弱,布局上的一点点讲究换来的是长期稳定的读数,非常值得。

4. 固件实现:从原始码到工程温度值的换算链

4.1 UART 命令链路:先把通信打通

ADS122U04IPWR 是 UART 从机,主机必须主动发命令它才会响应。具体命令字节我不在这里逐个列,数据手册写得很清楚,重点是理解它的通信模型:主机发命令帧、ADC 返回数据帧,帧结构包含起始位、数据位、停止位,可以配校验和。实际项目中我强烈建议把波特率固定在 460800 或更高,不要为了省事用 9600,因为多通道连续采样时,低速波特率会拖慢数据刷新率。

STM32F722VE 侧我用的是 DMA + 空闲中断接收。ADC 返回数据是定长的,但主机无法精确预知每个字节到达的时刻,空闲中断可以在数据帧结束后自动触发,配合 DMA 直接搬运到内存缓冲区,CPU 占用几乎为零。还要在协议层加超时重试机制,如果发送命令后超过规定时间没收到完整帧,就要重新发起通信,防止偶发干扰导致的数据失步。

4.2 原始码到电阻值:比例式测量的妙处

RTD 测量如果用内部基准直接测电压,等于默认内部基准是绝对准确的,但实际上基准电压会随温度和供电漂移。比例式测量的思路是:让同一个 IDAC 电流既流过 RTD,也流过一颗精密参考电阻,ADC 以参考电阻两端的电压为基准,分别测量 RTD 电压和参考电阻电压的比值。这样得到的 RTD 电阻值为:

R_RTD = R_REF × (Code_RTD / Code_REF)

电流源的绝对值被完全消掉了,基准电压的漂移也被约掉了,只剩参考电阻本身的温漂影响。这个测量方案在精密测温里的地位怎么强调都不过分。选参考电阻时用低温漂、高精度的金属箔电阻,比如 6.8kΩ 0.1% 25ppm/℃,这样整个系统的稳定性骨架就立住了。

4.3 电阻到温度:查表插值和多项式计算的取舍

拿到电阻值之后,PT100 转温度有两个常见路线:直接解 Callendar-Van Dusen 方程,或者查表加线性插值。CVD 方程在 0℃ 到 850℃ 范围用简化式:

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

其中 R0=100Ω,A=3.9083e-3,B=-5.775e-7。反解这个二次方程可以写进固件里:

float pt100_res_to_temp(float r) { const float R0 = 100.0f; const float A = 3.9083e-3f; const float B = -5.775e-7f; float c = 1.0f - r / R0; float t = (-A + sqrtf(A * A - 4.0f * B * c)) / (2.0f * B); return t; }

这个公式在 0℃ 以上精度非常高,0℃ 以下因为 CVD 方程有 C 项,需要做迭代或直接查表。我实际项目里是查表为主,把 -50℃ 到 200℃ 每隔 5℃ 用一个电阻值建表,再在相邻两点之间做线性插值。STM32F722VE 有 FPU 和很强的 Flash 访问能力,每次换算耗时可忽略,而且查表法天然覆盖低温区的非线性问题。

4.4 滤波策略:针对温度信号的三种处理

温度信号本质上是缓变信号,基本能量都集中在低频段,但现场会叠加高频干扰脉冲。我在这套系统里用了三级处理:先做滑动平均,再做中值滤波,最后加一阶低通滤波平滑输出。滑动平均窗口选 16 点,在 20SPS 的数据速率下大约需要 0.8 秒稳定时间,HVAC 水系统完全接受;如果用在工业报警场景,可以把数据速率提到 1000SPS 以上。

关于工频干扰,ΔΣ ADC 内置的数字滤波器在数据速率的整数倍处有陷波点,选择 50Hz 整数倍的数据速率可以天然压制工频。如果现场混有变频器的高频噪声,我还会在软件里加一个 20Hz 的低通滤波,让最终输出曲线保持平滑。这些滤波参数最好做成可配置项,HVAC 和工业现场的响应速度要求完全不同。

5. 校准、验证与实测数据

5.1 校准基准怎么搭:电阻箱比水浴更可控

很多入门工程师喜欢用冰水浴做 0℃ 校准,听着很标准,实际操作又是打冰又是保温,重复性还差。我更推荐用精密电阻箱直接模拟 RTD,电阻箱精度做到 0.01%,比冰水浴的重复性好得多,而且随时可以回到任意温度点。热电偶标定则用干井炉配合标准探头,把标准探头和被测探头绑在一起插进同一个恒温块,做多点比对。

5.2 两点校准的完整流程

两点校准的目的是消除放大链路里的增益误差和偏移误差。我在 0℃ 对应的 100Ω 和 100℃ 对应的 138.51Ω 两个标准点上,分别记录 ADC 换算出来的电阻值和标准值的偏差,然后做一次线性校正。

校正模型很简单:T_corrected = Scale × T_raw + Offset。把两个点的数据代进去,解二元一次方程组就能得到 Scale 和 Offset。得到的参数存进 STM32F722VE 的 Flash 预留区,每次上电时加载。这里有个提醒:Flash 的擦写次数有限,标定参数要用“读取-修改-写入”的方式管理,不要在设备运行时频繁回写。

5.3 实测精度和误差来源分析

用 0.01% 精密电阻箱模拟 PT100 做端到端验证,实测一组数据如下:

标准温度标准电阻系统读数误差
0.0℃100.00Ω100.01Ω+0.01Ω(约 +0.03℃)
25.0℃109.73Ω109.76Ω+0.03Ω(约 +0.08℃)
50.0℃119.40Ω119.38Ω-0.02Ω(约 -0.05℃)
75.0℃129.01Ω128.98Ω-0.03Ω(约 -0.08℃)
100.0℃138.51Ω138.49Ω-0.02Ω(约 -0.05℃)

这个精度在 RTD 测温系统里已经属于很好的水平。真正现场接上传感器后,误差会略大一点,因为引线电阻、端子接触电阻和传感器自身互换性都会叠进来。需要注意,误差里占比最大的往往不是 ADC,而是传感器本身的精度等级,比如 PT100 的 A 级允差是 ±0.15℃,B 级是 ±0.3℃,就算采集链路零误差,传感器自身误差也摆在那里。

6. 现场实战记录:那些年踩过的坑

6.1 读数乱跳:从 ±20 LSB 到 ±2 LSB

第一版 PCB 布完上电,ADC 读数在室温下跳得离谱,峰峰值超过 ±20 个 LSB,换算成温度大约 0.1℃ 到 0.2℃。排查下来发现是传感器输入走线和一路 PWM 风扇控制线在 PCB 背面平行走了约 4 厘米。把 PWM 线移到另一层并用地平面隔开后,噪声立刻降到 ±2 个 LSB。这件事给我的教训是:任何高速开关信号都是模拟链路的敌人,布线阶段宁可绕远路,也不要贪近。

6.2 温度整体偏高:IDAC 自热并不遥远

设备上电运行半小时后,读数稳定在一个比实际环境温度高约 0.3℃ 的位置。一开始怀疑是传感器探头质量问题,后来把 IDAC 电流从 1mA 降到 0.5mA,读数立刻降了 0.25℃,说明是传感器自热。工业现场的传感器很多封装在金属套管里,散热条件比实验室差很多,0.1mW 都可能带来可感知温升。所以现场用的激励电流能小则小,若信号幅度确实不够,优先调大 PGA 增益而不是加激励电流。

6.3 UART 偶发丢帧:时钟源和中断优先级都要查

系统连续运行几天后,偶尔会出现某次读取数据完全错误的现象。排查后有两个原因叠加:一是 STM32F722VE 的 UART 波特率依赖系统时钟,如果直接从 HSI 启动,频率偏差可能达到 1% 以上,高速率下就会丢帧;二是 ADC 数据接收中断被别的中断卡住时间过长,导致 UART 溢出。解决办法是把系统时钟切换到 HSE 外部晶振,并把 UART 接收中断提到最高优先级,同时协议层加了 CRC 校验和失败重发机制。

6.4 从 HVAC 到工业现场的扩展思考

最后提一下这套方案的扩展性。HVAC 项目里 ADC 和 MCU 通常是同一块 PCB;但到了工业电机控制柜里,模拟前端和主控之间往往隔着几十厘米甚至几米。得益于 ADS122U04IPWR 的 UART 接口,我可以把 ADC 单独做成一块小前端板,直接放在传感器端子旁边,UART 信号经过数字隔离芯片拉到主控板。长距离传输时再在 UART 后面接 RS485 收发器,这样整套固件和算法基本不用改,只是换了下物理层,架构上的灵活性正是当初选这颗带 UART 接口 ADC 的最大回报。

我个人在这套系统上最大的体会是:高精度温度采集的瓶颈从来不在那颗 24 位 ADC 上,而在传感器热路径设计、激励电流的自热管理、接地的干净程度这些“土”问题里。ADS122U04IPWR 和 STM32F722VE 只是给了你足够的硬件上限,能不能把精度做实,取决于你有没有把每一个细节都按它对物理世界的要求去对待。希望这篇记录能帮你少走一些我走过的弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询