基于ADS122U04与STM32F415RG的24位高精度RTD温度测量方案

发布时间:2026/11/5 1:06:44
基于ADS122U04与STM32F415RG的24位高精度RTD温度测量方案

工业现场的温度测量,最怕两件事:一是小信号被噪声淹没,二是长期漂移导致数据不可信。ADS122U04IPWR 这颗 24 位 ΔΣ ADC 配合 STM32F415RG,恰好是冲着这两个痛点去的组合——前者负责把 RTD 那点毫伏级压降干净地数字化,后者负责把数据算成温度、跑滤波、做通信。这套方案在 HVAC 的冷热量表、风管温度、锅炉回水监测里都能直接落地。下面我把从选型到跑通的完整链路拆开讲,包括那些手册上不会写、但调试时一定会遇到的细节。

1. 为什么工业温度测量绕不开 24 位 ΔΣ 架构

1.1 RTD 的信号到底有多"小"

先算一笔账。工业上最常用的 PT100,0℃ 时阻值 100Ω,温度系数约 0.385Ω/℃。如果激励电流取常见的 1mA,那么 0℃ 时 RTD 两端压降是 100mV,每升高 1℃ 只增加 0.385mV。也就是说,你要分辨 0.1℃ 的变化,就得稳定地测出 38.5μV 的电压差。

这个量级意味着什么?STM32F415RG 内置的 12 位 ADC,参考电压 3.3V 时最小分辨率为 3.3V/4096 ≈ 806μV。用它直接测 RTD,连 1℃ 的分辨率都勉强,更别说工业场合常要求的 ±0.1℃。所以外挂一颗高精度 ΔΣ ADC 不是"锦上添花",而是"没有它根本做不了"。

ADS122U04IPWR 的 24 位分辨率、内置 PGA(增益 1~128)、双匹配电流源,正好把这件事变得简单:PGA 把 100mV 量级的信号放大到接近满量程,24 位分辨率把量化误差压到 nV 级,电流源直接给 RTD 供电,省掉外部恒流电路。

1.2 ΔΣ 与逐次逼近的本质差异

很多人知道 ΔΣ 精度高,但说不清为什么。简单类比:逐次逼近(SAR)像用一把刻度尺去量长度,量一次读一次;ΔΣ 则像用天平反复比较、把误差"平均"掉。ΔΣ 通过过采样和噪声整形,把量化噪声推到高频段,再用数字滤波器滤除,从而在低频段获得极高的有效位数。

对温度测量这种"变化极慢"的信号,ΔΣ 是天然匹配的——你根本不需要高速采样,你需要的是低频段的低噪声和高分辨率。ADS122U04 在 20SPS 数据率、增益 128 时,有效分辨率能到 20 位以上,等效输入噪声只有几十 nV,这就是它能测出 0.01℃ 级别变化的底气。

1.3 集成度带来的系统简化

传统方案是"运放 + 基准 + 独立 ADC + 外部恒流源",四五个器件,每个都贡献误差和漂移。ADS122U04IPWR 把这些收进一颗 TSSOP-16 里:

  • 内置低漂移基准(典型 5ppm/℃),省掉外部基准芯片
  • 双匹配电流源,专门为 RTD 比例测量设计
  • 内置 PGA,省掉前置放大
  • 内置温度传感器,可做冷端补偿
  • 支持 SPI 和 UART 两种接口

对 HVAC 这种成本敏感、又要长期稳定的场景,器件越少、误差链越短,可靠性越高。这是我选它而不是"分立方案"的核心理由。

2. ADS122U04IPWR 与 STM32F415RG 的硬件连接设计

2.1 接口模式的选择:SPI 还是 UART

ADS122U04 的"U"后缀表示它支持 UART 接口,但同时也兼容 SPI。这里有个容易踩的坑:它的 SPI 模式并不是标准四线 SPI,而是通过配置寄存器切换的。实际项目里我建议用 SPI,原因有三:

第一,STM32F415RG 的 SPI 外设成熟,DMA 配合方便,采样节奏好控制;第二,SPI 时钟可以拉到较高频率,读寄存器效率高;第三,UART 模式下多机通信和帧同步处理更麻烦,HVAC 现场电磁环境复杂,UART 更容易受干扰误帧。

接线大致如下:

ADS122U04 引脚功能STM32F415RG 连接
SCLKSPI 时钟PA5 (SPI1_SCK)
DIN数据输入PA7 (SPI1_MOSI)
DOUT/DRDY数据输出/数据就绪PA6 (SPI1_MISO)
CS片选PA4 (GPIO 输出)
AVDD模拟电源3.3V(经 LC 滤波)
DVDD数字电源3.3V
REFP0/REFN0基准输入接内部基准或外部基准
AIN0~AIN3模拟输入RTD 与参考电阻

注意:DOUT/DRDY 是复用引脚,读数据时是 DOUT,空闲时是 DRDY 中断输出。配置时务必确认寄存器里 DRDY 功能已使能,否则中断永远不来。

2.2 模拟电源的"脏"与"净"

这是我最想强调的一点。ADS122U04 的 AVDD 如果和 STM32 的数字 3.3V 直接共用一条走线,你会看到读数里混进明显的周期性噪声——那是数字开关噪声通过电源耦合进来的。

正确做法是:AVDD 用独立的 LDO 供电,或者至少在 AVDD 前串一个磁珠(如 600Ω@100MHz)加 10μF + 0.1μF 去耦。模拟地和数字地在 ADC 下方单点连接,不要铺成一大片连在一起。我实测过,同样的电路,电源处理得当,噪声能降一个数量级。

2.3 基准与比例测量

RTD 测量最优雅的方式是"比例法":让同一个激励电流同时流过 RTD 和一颗高精度参考电阻,ADC 测两者的比值。这样激励电流的温漂、绝对值误差都被约掉了,只剩参考电阻的精度决定结果。

ADS122U04 的双匹配电流源就是为这个设计的。IDAC1 流过 RTD,IDAC2 流过参考电阻,两个电流源匹配度典型 0.1%。参考电阻选 0.1% 精度、10ppm/℃ 低温漂的金属膜电阻,比如 1.62kΩ(对应 PT100 在 0℃ 附近的比例关系)。

配置寄存器时,把基准源选为 REFP0/REFN0(外部参考),增益设为 8 或 16,让信号落在合适量程。具体增益怎么算,下一节展开。

3. 寄存器配置与增益、数据率的取舍逻辑

3.1 增益不是越大越好

很多人直觉认为 PGA 增益拉满(128)最准,其实不然。增益放大的同时,输入共模范围会收窄,而且 PGA 本身有噪声和失调。正确做法是让信号在 ADC 满量程的 50%~80% 之间,既充分利用动态范围,又留出余量。

以 PT100、1mA 激励、-50℃~150℃ 量程为例:

  • -50℃ 时 RTD 约 80.31Ω,压降 80.31mV
  • 150℃ 时 RTD 约 157.33Ω,压降 157.33mV
  • 信号跨度约 77mV

若基准为 2.048V,增益 16 时满量程输入为 2.048/16 = 128mV。信号最大 157mV 会超量程。增益 8 时满量程 256mV,信号落在 31%~61%,比较合适。所以这里选增益 8,而不是盲目上 16 或 128。

3.2 数据率与噪声的权衡

ADS122U04 的数据率从 5SPS 到 2000SPS 可调。数据率越低,内部数字滤波器抑制工频干扰越强,噪声越低。工业温度测量根本不需要高速,我一般选 20SPS——这个档位对 50Hz 和 60Hz 工频都有很好的抑制(sinc 滤波器零点正好落在工频上)。

如果你现场工频干扰特别严重,可以选 20SPS 并开启 50/60Hz 同步抑制模式。代价是响应变慢,但对温度这种慢变量完全无所谓。

3.3 关键寄存器配置示例

下面是一段初始化配置的核心逻辑(伪代码形式,便于理解寄存器含义):

// 配置寄存器0:增益8,20SPS,连续转换 // MUX选择AIN0/AIN1差分输入 write_reg(REG0, 0x08 | 0x04 | 0x00); // 0x08: 增益8 | 0x04: 20SPS | 0x00: 连续转换模式 // 配置寄存器1:使能内部基准,IDAC电流1mA write_reg(REG1, 0x30 | 0x02); // 0x30: 内部基准使能 | 0x02: IDAC 1mA // 配置寄存器2:IDAC1接AIN2,IDAC2接AIN3 write_reg(REG2, 0x50 | 0x0A); // 0x50: IDAC路由 | 0x0A: 电流源输出引脚选择 // 配置寄存器3:DRDY使能,SPI模式 write_reg(REG3, 0x80);

提示:每次上电后建议先发复位命令(0x06),再写配置,避免寄存器处于未知状态。我遇到过因为没复位导致增益配置没生效、读数偏小一半的情况,排查了半天。

4. 从原始码值到温度:换算链路与校准

4.1 比例法换算公式

用比例法时,温度计算不依赖激励电流的绝对值。设:

  • RTD 阻值 R_rtd
  • 参考电阻 R_ref
  • ADC 测得 RTD 通道码值 Code_rtd
  • ADC 测得参考通道码值 Code_ref

则:

R_rtd = R_ref × (Code_rtd / Code_ref)

得到 R_rtd 后,再用 Callendar-Van Dusen 公式换算温度:

T > 0℃: R = R0 × (1 + A×T + B×T²) T < 0℃: R = R0 × (1 + A×T + B×T² + C×(T-100)×T³)

PT100 的标准系数:A = 3.9083e-3,B = -5.775e-7,C = -4.183e-12。

正温度区间可以直接解二次方程;负温度区间建议用迭代法或查表插值,因为四次项解析求解麻烦。我在 STM32 上用的是牛顿迭代,三次就收敛,耗时可以忽略。

4.2 为什么必须做两点校准

理论公式再准,实际电路也有偏差:参考电阻的容差、走线电阻、PGA 失调。所以出厂前必须做两点校准。

做法是:把传感器放到已知低温点(比如冰水混合物 0℃)和已知高温点(比如沸水或恒温槽 100℃),记录 ADC 读数,拟合出实际的增益和偏移修正系数。校准后精度通常能从 ±0.5℃ 提升到 ±0.1℃ 以内。

注意:校准用的参考温度源精度必须比目标精度高一个数量级。用普通温度计去校准 0.1℃ 精度的系统,等于白校。

4.3 三线制 RTD 的引线电阻补偿

工业现场 RTD 离变送器往往几米到几十米,引线电阻不可忽略。两线制会把引线电阻直接算进 RTD 阻值,每米铜线约 0.02Ω,10 米就是 0.2Ω,对应约 0.5℃ 误差。

三线制是标准解法:两根引线分别接 IDAC 和 ADC 输入,第三根做补偿。ADS122U04 支持通过配置实现三线制补偿——让 IDAC1 和 IDAC2 分别流过两根引线,在 ADC 输入上引线压降相互抵消。配置时要把 MUX 设成对应的差分对,并在软件里做一次补偿计算。

四线制最准,但布线成本高,一般只在实验室或高精度场合用。HVAC 现场三线制是性价比最高的选择。

5. 实测中那些手册不会告诉你的坑

5.1 DRDY 中断丢失导致读数卡死

现象:系统跑一段时间后温度值不再更新,但 SPI 通信正常。

根因:DRDY 是开漏输出,如果上拉电阻太大(比如 100kΩ),加上走线电容,上升沿变缓,STM32 的边沿中断可能漏触发。我一开始用 100kΩ 上拉,偶发丢中断;换成 10kΩ 后彻底稳定。

另一个原因是中断服务函数里做了太多事(比如直接在里面算温度),导致下一次 DRDY 来时还在处理上一次。正确做法是中断里只置标志位,主循环处理数据。

5.2 工频干扰的识别与压制

如果读数呈现周期性波动,周期约 20ms(50Hz)或 16.7ms(60Hz),基本可以确定是工频耦合。

排查顺序:先看数据率是否设在 20SPS(sinc 滤波器零点在工频);再看模拟输入走线是否远离强电;最后检查 RTD 引线是否用了屏蔽双绞线、屏蔽层是否单端接地。

我遇到过一次,现场风机变频器干扰通过 RTD 长线耦合进来,最后靠"屏蔽层在变送器端单点接地 + 输入端加 RC 低通(1kΩ + 100nF)"解决。

5.3 自热效应:激励电流不能随便加大

IDAC 电流越大,信号越强、信噪比越好,但 RTD 自身会发热,导致读数偏高。PT100 在静止空气中,1mA 激励的自热误差约 0.05℃;如果加到 2mA,误差翻倍到 0.1℃ 以上。

工业标准一般推荐 1mA 或更低。如果一定要用大电流提高信噪比,就得在软件里做自热补偿,或者用脉冲激励(只在测量瞬间通电)。HVAC 场合我一般就用 1mA,配合 20SPS 已经足够。

5.4 冷端与接线端子的温度梯度

变送器接线端子处的温度如果和 RTD 本体差很多,三线制补偿也会引入误差。尤其是机柜内发热元件旁边,端子温度可能比环境高 5~10℃。

对策:接线端子尽量远离发热源,必要时在端子上贴一颗 NTC 做端子温度监测,软件里做二次修正。这个细节很多人忽略,但在高精度场合是实打实的误差来源。

6. 软件架构:让采样、换算、通信各司其职

6.1 分层设计思路

我把固件分成三层:

  • 驱动层:负责 SPI 读写、寄存器配置、DRDY 中断处理,只输出原始码值
  • 算法层:负责比例换算、CVD 公式求解、滤波、校准系数应用
  • 应用层:负责 Modbus/自定义协议上报、报警判断、参数存储

这样分层的好处是,换传感器或换 ADC 时只动驱动层,算法和应用不受影响。我在一个项目里从 PT100 换成 PT1000,只改了参考电阻和增益配置,算法层一行没动。

6.2 数字滤波的取舍

硬件已经滤掉大部分高频噪声,软件滤波主要对付随机跳动。我常用的是"滑动平均 + 限幅"组合:滑动窗口取 8~16 个点做平均,同时对单次跳变超过阈值的点做限幅,防止野值污染。

不建议用复杂的卡尔曼滤波——温度信号本身很慢,卡尔曼的收益有限,反而增加调试难度。除非你的应用对动态响应有要求,否则滑动平均足够。

6.3 断线与短路检测

ADS122U04 内置激励电流检测功能,可以判断 RTD 是否断线。配置寄存器开启后,如果检测到电流异常,会置位相应标志。软件里读到标志就上报故障,这对 HVAC 远程监测很重要——传感器坏了必须能报出来,而不是给个假温度。

短路检测则靠量程判断:如果换算出的阻值接近 0 或远超量程上限,直接判故障。

7. 这套方案在 HVAC 场景的落地形态

7.1 冷热量表中的应用

冷热量表需要同时测进水和回水温度,温差精度直接决定热量计量精度。用两路 ADS122U04(或一颗四通道型号)分别接进回水 PT100,配合 STM32F415RG 的浮点运算能力做焓值计算,是标准做法。关键是两路要用同一颗基准、同一批参考电阻,保证通道间一致性。

7.2 风管温度与室外温度监测

风管温度测量点分散,通常用 RS485 总线组网。STM32F415RG 带多个 USART,一路接 ADC 做本地测量,一路做 Modbus RTU 从站,很方便。室外温度则要注意防雷和宽温设计,ADC 和 MCU 都要选工业级温度范围。

7.3 长期稳定性设计

HVAC 设备动辄运行十年以上,长期漂移是最大敌人。除了选低温漂器件,还要做定期自校准:利用系统内已知的参考电阻,周期性测量其阻值,如果偏离标称值超过阈值,说明基准或电流源漂移了,触发维护提醒。这个机制我在多个项目里都用过,能提前发现老化问题。

8. 调试工具与验证方法

8.1 用高精度万用表做交叉验证

调试阶段,用六位半万用表同时测量 RTD 两端电压和参考电阻电压,和 ADC 读数对比。如果偏差在几个 LSB 以内,说明换算链路正确;如果偏差大,逐级排查增益、基准、公式。

8.2 恒温槽标定流程

正式标定要用恒温槽,至少取 0℃、50℃、100℃ 三个点,做最小二乘拟合。每个点等温度稳定后连续采 100 个点取平均,记录均值和标准差。标准差反映噪声水平,均值反映准确度,两者都要看。

8.3 长时间老化测试

新设计的板子我会连续跑 72 小时,记录温度读数的漂移曲线。如果前几小时漂移明显、之后趋于平稳,通常是器件预热效应;如果持续单调漂移,可能是基准或电阻有问题。这个测试能筛掉大部分隐患。

我个人在实际操作中的体会是,这套 ADS122U04IPWR + STM32F415RG 的组合,硬件设计占成功率的六成,软件算法占三成,剩下那一成是调试耐心。电源和基准处理好了,后面基本顺风顺水;电源马虎,后面全是玄学问题。另外,别迷信理论精度,实测校准永远比公式可靠——我见过太多"理论 ±0.01℃、实测 ±0.3℃"的案例,问题都出在没做现场校准。最后分享一个小技巧:把参考电阻和 RTD 放在同一块导热良好的铝基板上,让它们温度一致,比例法的温漂抑制效果会更好,这个细节在温差大的机柜环境里特别管用。