☰
基于ADS122U04与STM32F413RH的工业级RTD测温方案设计
2026/11/5 1:06:14 网站建设 项目流程

1. 工业与HVAC温度测量方案的整体设计思路

1.1 为什么工业现场偏爱RTD而不是热电偶

在工业自动化和HVAC(暖通空调)领域,温度测量看似简单,实际上是一个容易被低估的环节。很多刚入行的朋友第一反应是用DS18B20这类数字温度传感器,便宜、单总线、接线简单。但真正到了工业现场,你会发现这类传感器几乎不会出现在关键测点上。原因很直接:工业环境对测温的要求集中在三点——精度、长期稳定性、抗干扰能力,而RTD(铂电阻温度检测器)在这三项上都有明显优势。

RTD的工作原理是利用铂金属电阻随温度变化的线性关系。以最常见的PT100为例,0℃时阻值为100Ω,温度系数约为0.385Ω/℃。它的线性度远好于热电偶,不需要冷端补偿,长期漂移小,在-200℃到+600℃范围内都能保持不错的精度。HVAC场景中常见的冷冻水供回水温度、热水出水温度、风管温度,测点往往分布在机房、管井、屋顶机组等位置,布线距离长、电磁环境复杂,RTD配合高精度ADC的方案就成了主流选择。

但RTD有个“麻烦”:它的阻值变化很小。PT100在0℃到100℃之间,阻值只从100Ω变到138.5Ω,满量程变化不到40Ω。如果要用它测出0.1℃的分辨率,意味着要能分辨约0.038Ω的阻值变化。这对信号链的精度、噪声、激励电流稳定性都提出了很高要求。这就是为什么不能随便拿个STM32内部ADC就上,必须配一颗专用的高精度ΔΣ ADC。

1.2 ADS122U04IPWR在这套方案里扮演什么角色

ADS122U04IPWR是德州仪器的一款24位ΔΣ模数转换器,四通道差分输入,内置PGA(可编程增益放大器)、激励电流源、基准电压和温度传感器。它最大的特点是把RTD测量需要的几乎所有模拟前端都集成进去了:两路可编程激励电流源(IDAC)可以直接给RTD供电,PGA可以把微弱的差分电压放大到ADC的最佳输入范围,内部基准省去了外部基准芯片。

选它而不是选分立方案(比如运放+基准+独立ADC),核心原因是噪声和漂移的控制。24位ADC的有效位数不是随便就能做到的,PCB布局、基准噪声、激励电流的匹配都会影响最终结果。ADS122U04把激励电流源和基准做在同一颗芯片里,温漂可以相互跟踪,比例式测量(ratiometric measurement)能抵消掉很大一部分激励电流漂移带来的误差。这一点在工业宽温环境下特别关键。

另外它支持SPI接口,STM32F413RH这边用硬件SPI驱动,通信速率可以跑到几MHz,读取一次转换结果的时间开销很小。U04后缀代表它是UQFN封装,4mm×4mm,对于空间受限的变送器板子很友好。

1.3 STM32F413RH的选型理由与资源分配

STM32F413RH属于STM32F4系列的高性能线,Cortex-M4内核带FPU,主频100MHz,1.5MB Flash,320KB SRAM。选它做这个方案的主控,主要看中几点:一是FPU可以加速温度计算中的浮点运算,PT100的Callendar-Van Dusen方程或者查表插值都需要浮点;二是SPI外设丰富,可以同时挂ADS122U04和其他外设;三是它的定时器资源足够做多路采样调度和看门狗。

在这个方案里,STM32F413RH的任务分配大致是:SPI1负责和ADS122U04通信,TIM2做采样周期定时,USART2输出调试信息或接上位机,另外留一路I2C给EEPROM存校准系数。如果做多通道测温,可以用ADS122U04的四个通道轮流切换,配合外部多路复用器还能扩展更多测点。

整体信号链是这样的:PT100 → ADS122U04(激励+放大+ADC)→ SPI → STM32F413RH(计算+校准+输出)。下面我把每个环节拆开讲。

2. 硬件电路设计与关键参数计算

2.1 RTD接口电路:两线、三线还是四线

RTD接线方式直接决定精度上限。两线制最简单,但导线电阻会直接叠加到RTD阻值上。假设你用0.5mm²的铜线,每米电阻约0.035Ω,来回20米就是1.4Ω,换算成温度误差约3.6℃。这在工业现场完全不可接受。

三线制是工业上最常用的折中方案。它假设三根导线电阻相同,通过两次测量抵消掉导线电阻。ADS122U04支持三线制RTD测量,具体做法是用两路IDAC分别给RTD和补偿线提供激励电流,然后测量RTD两端电压和其中一根引线电压,通过软件计算消除引线影响。

四线制精度最高,用两根线通激励电流,另外两根线做高阻输入测电压,导线电阻完全不进入测量回路。但四线制需要四根线,布线成本高,一般用在实验室或高精度计量场合。

对于HVAC和一般工业应用,我建议用三线制。ADS122U04的IDAC可以配置成两路同时输出,正好匹配三线制需求。具体连接方式:IDAC1接RTD的A端,IDAC2接RTD的B端,RTD的A端和B端分别接ADC的两个差分输入,同时B端还接一根补偿线到ADC的另一个输入。这样通过两次转换就能算出真实RTD阻值。

2.2 激励电流的选择与自热误差计算

激励电流不是越大越好。电流大,信号强,但RTD自身会发热,产生自热误差。PT100在空气中的自热系数大约是0.2℃/mW,在水中约0.05℃/mW。假设你用1mA激励,PT100在100℃时阻值138.5Ω,功耗就是I²R = 0.001² × 138.5 = 0.1385mW,自热误差约0.028℃(空气中),可以接受。如果用2mA,功耗翻四倍到0.554mW,误差约0.11℃,就有点大了。

ADS122U04的IDAC可以设置成10μA到1.5mA多档。我一般选500μA到1mA之间。500μA时PT100满量程电压约69mV,配合PGA增益8倍,输入到ADC约552mV,接近内部基准2.048V的四分之一,信噪比不错。1mA时电压翻倍,PGA增益可以降到4,噪声表现更好,但自热稍大。

实际选的时候要看你RTD的封装。如果是贴片式PT100,散热好,可以用1mA;如果是铠装探头插在管道里,散热条件差,建议降到500μA甚至250μA。我一般会在固件里留一个IDAC配置接口,现场调试时根据实测自热情况调整。

2.3 基准电压与比例式测量

ADS122U04内部基准是2.048V,温漂典型值5ppm/℃。如果直接用内部基准,激励电流的漂移会直接影响测量结果。比如IDAC温漂50ppm/℃,在-40℃到85℃范围内变化125℃,电流变化0.625%,对应温度误差约0.6℃。这太大了。

解决办法是比例式测量:用一个精密电阻(Rref)和RTD串联,ADC测量RTD电压和Rref电压的比值,而不是绝对值。因为激励电流同时流过RTD和Rref,电流漂移在比值里被抵消了。ADS122U04支持外部基准输入,你可以把Rref两端的电压接到REFP和REFN引脚,这样ADC的基准就是Rref上的压降,转换结果直接是RTD/Rref的比例。

Rref的选值要匹配RTD满量程阻值。PT100在最高测量温度(比如200℃)时阻值约175.8Ω,Rref选180Ω到200Ω比较合适。Rref的精度和温漂直接决定系统精度,建议用0.1%精度、10ppm/℃的金属膜电阻,比如Vishay的PTF系列。我实测过用普通1%电阻,温漂能到100ppm/℃,整个系统精度直接掉到±1℃以上。

2.4 PCB布局的几条硬规矩

高精度ADC的PCB布局,说难也不难,但踩坑的人特别多。我总结几条必须遵守的:

  • 模拟地和数字地分开,在ADC下方单点连接。ADS122U04的AGND和DGND引脚要分别接对应的地平面,最后在芯片正下方用0Ω电阻或磁珠连起来。
  • 激励电流走线要对称。IDAC1和IDAC2到RTD的走线长度、宽度尽量一致,否则两路电流失配会引入误差。
  • 基准输入加RC滤波。REFP和REFN之间并一个0.1μF的C0G电容,靠近芯片引脚。如果Rref离得远,再加一个10Ω电阻和1μF电容做低通。
  • SPI走线远离模拟输入。STM32的SPI时钟线不要从RTD走线旁边穿过,必要的话用地线隔离。
  • RTD输入加共模滤波。每个差分输入对地加1nF到10nF的C0G电容,截止频率设在1MHz左右,滤掉高频干扰但不影响ΔΣ ADC的采样。

这些规矩看着琐碎,但每一条背后都是实际调试时用示波器和频谱分析仪测出来的教训。我见过一个板子因为SPI时钟线离RTD输入太近,读数跳动超过0.5℃,重新布局后降到0.02℃。

3. 固件实现:从SPI驱动到温度计算

3.1 ADS122U04的寄存器配置流程

ADS122U04有四个配置寄存器,上电后需要按顺序写入。我一般用STM32的硬件SPI,模式0(CPOL=0,CPHA=0),时钟先设到1MHz,配置完再升到4MHz读数据。

配置流程大致是:

  1. 复位:发送RESET命令(0x06),等待1ms。
  2. 写配置寄存器0:设置MUX(通道选择)、GAIN(PGA增益)、PGA_BYPASS。
  3. 写配置寄存器1:设置数据速率、工作模式、转换模式。
  4. 写配置寄存器2:设置IDAC电流大小、IDAC路由、基准选择。
  5. 写配置寄存器3:设置IDAC2路由、DRDY模式等。

以三线制PT100、1mA激励、增益8、20SPS为例,配置寄存器0可以设为0x08(MUX=AIN0/AIN1,GAIN=8),寄存器1设为0x00(20SPS,连续转换),寄存器2设为0x50(IDAC=1mA,路由到AIN0和AIN1),寄存器3根据具体补偿线接法设置。

这里有个细节:IDAC路由和MUX通道要匹配。比如IDAC1从AIN0流出,IDAC2从AIN1流出,那MUX就要选AIN0和AIN1作为差分输入。如果接错了,读数会完全不对。我第一次调的时候就把IDAC2路由到了AIN2,结果补偿线没电流,三线制退化成两线制,误差好几度。

3.2 三线制RTD的两次测量与计算

三线制测量的核心是两次转换。假设RTD三根线分别接AIN0、AIN1、AIN2,其中AIN0和AIN1是RTD两端,AIN2是补偿线。

第一次测量:IDAC1从AIN0流入,IDAC2从AIN1流入,MUX选AIN0-AIN1差分。此时测量的是RTD阻值加上引线电阻的影响。

第二次测量:IDAC1从AIN0流入,IDAC2从AIN2流入,MUX选AIN1-AIN2差分。此时测量的是两根引线电阻的差值。

通过两次测量的组合,可以消掉引线电阻。具体公式推导比较绕,简单说就是:Rrtd = (V1 - 2×V2) / I,其中V1是第一次测量值,V2是第二次测量值,I是激励电流。实际固件里我会把两次转换结果都读出来,用这个公式算。

代码实现上,我用一个状态机来调度:

typedef enum { MEAS_STATE_IDLE, MEAS_STATE_RTD, MEAS_STATE_LEAD, MEAS_STATE_CALC } meas_state_t; void ads122u04_task(void) { switch (state) { case MEAS_STATE_IDLE: if (sample_timer_flag) { ads122u04_set_mux(MUX_AIN0_AIN1); ads122u04_start_conversion(); state = MEAS_STATE_RTD; } break; case MEAS_STATE_RTD: if (ads122u04_data_ready()) { rtd_raw = ads122u04_read_data(); ads122u04_set_mux(MUX_AIN1_AIN2); ads122u04_start_conversion(); state = MEAS_STATE_LEAD; } break; case MEAS_STATE_LEAD: if (ads122u04_data_ready()) { lead_raw = ads122u04_read_data(); state = MEAS_STATE_CALC; } break; case MEAS_STATE_CALC: calculate_temperature(rtd_raw, lead_raw); state = MEAS_STATE_IDLE; break; } }

这个状态机每20ms跑一轮,两次转换加计算总共不到50ms,对于HVAC这种慢过程完全够用。

3.3 PT100温度计算的两种方法

拿到RTD阻值后,要换算成温度。有两种常用方法:查表插值和公式计算。

查表法适合资源受限的MCU,把-200℃到850℃的阻值表存在Flash里,用二分查找加线性插值。STM32F413RH的1.5MB Flash存这个表绰绰有余。查表法的精度取决于表的分度值,如果用1℃分度,插值后精度可以到0.01℃。

公式法用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³)

其中A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。反解T需要迭代,一般用牛顿法迭代3到4次就能收敛到0.001℃。

我一般用查表法做粗算,再用公式法做精算。具体做法是:查表找到最近的温度点,以此为初值代入公式迭代两次。这样既快又准。实测在STM32F413RH上,一次完整计算耗时约80μs,对100MHz的M4来说毫无压力。

3.4 校准:两点校准还是多点校准

再好的硬件也有误差,校准是必须的。最简单的两点校准:在0℃(冰水混合物)和100℃(沸水)各测一次,算出增益误差和偏移误差,存到EEPROM里。

但工业现场往往要求全量程精度,两点校准在中间温度段可能有偏差。我推荐三点校准:0℃、50℃、100℃。用最小二乘法拟合一条二次曲线,补偿非线性。如果要求更高,可以做五点校准,覆盖-20℃到120℃。

校准的时候要注意:RTD本身也有误差。普通B级PT100在0℃时允许±0.12℃误差,A级是±0.06℃。如果你用B级PT100做校准,校准出来的系数其实是在补偿RTD的个体误差,换一个探头就不准了。所以校准要么用标准铂电阻做参考,要么把校准系数和探头绑定。

我在实际项目里的做法是:出厂前用高精度恒温槽做三点校准,把系数写到板载EEPROM里,同时记录探头序列号。现场更换探头时,如果探头是同一批次,可以直接用;如果换了批次,建议重新校准。

4. 常见问题排查与实战避坑指南

4.1 读数跳动大、噪声高的排查思路

这是最常见的问题。我按优先级列一个排查清单:

现象可能原因排查方法解决措施
读数跳动±0.5℃以上激励电流不稳定示波器测IDAC引脚波形检查基准电容、改用比例式测量
读数跳动±0.1℃SPI通信受干扰逻辑分析仪抓SPI波形降低SPI速率、加地线隔离
读数缓慢漂移自热误差降低IDAC电流看是否改善减小激励电流或增加散热
读数周期性跳变电源纹波示波器测AVDD纹波加LC滤波、改用LDO供电
某通道读数异常MUX配置错误读回寄存器确认检查IDAC路由和MUX匹配

我遇到最多的是电源纹波问题。ADS122U04的AVDD对纹波很敏感,开关电源的100kHz纹波会直接调制到ADC输出上。解决办法是用一颗低噪声LDO(比如TPS7A47)给AVDD供电,输入输出都加10μF钽电容加0.1μF陶瓷电容。

还有一个隐蔽的坑:STM32的SPI时钟相位。ADS122U04要求CPHA=0,但有些STM32的SPI配置默认CPHA=1,导致数据错位。读出来的原始码看着像正常值,实际是错的。我建议初始化SPI后先读一次配置寄存器,确认读回值和写入值一致,再做后续操作。

4.2 三线制补偿线接错的典型表现

三线制接错线是新手最容易犯的错误。典型表现是:常温下读数正常,但加热后误差越来越大。原因是补偿线没接对,引线电阻没被抵消,温度升高后引线电阻变化被算进了RTD阻值。

判断方法很简单:用手捏住RTD的引线,如果读数明显上升(超过0.5℃),说明引线补偿没生效。正常情况下手捏引线,读数变化应该小于0.1℃。

正确的三线制接法:RTD的A端接AIN0和IDAC1,B端接AIN1和IDAC2,补偿线从B端引出接AIN2。注意补偿线要和B端在同一物理位置引出,否则补偿的是错误的引线电阻。

4.3 校准系数存储与读取的注意事项

校准系数存EEPROM看着简单,但有几个坑:

  • 字节序:STM32是小端,EEPROM读写要统一。我一般用union把float转成字节数组存。
  • 掉电保护:写EEPROM过程中掉电会导致数据损坏。建议用双备份加CRC校验,读的时候如果CRC不对就切到备份。
  • 校准系数版本:固件升级后如果计算公式变了,旧系数可能不适用。我在EEPROM里存一个版本号,固件启动时检查版本,不匹配就提示重新校准。
typedef struct { uint16_t version; float gain; float offset; float quad; uint16_t crc; } calib_data_t; uint8_t calib_read(calib_data_t *data) { eeprom_read(CALIB_ADDR, (uint8_t*)data, sizeof(calib_data_t)); if (data->version != CALIB_VERSION) return 0; if (crc16((uint8_t*)data, sizeof(calib_data_t)-2) !=>

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

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

立即咨询