1. 工业测温方案的选型逻辑与整体架构
工业现场和暖通空调(HVAC)系统里的温度测量,跟我们在实验室用个万用表测室温完全是两码事。实验室里环境恒定、干扰小、对精度要求也没那么苛刻,但工业现场是什么情况?电机启停带来的共模干扰、变频器产生的高频噪声、几十米甚至上百米的传感器引线、从零下几十度到几百度的宽温区、还有常年不间断运行的可靠性要求。这些因素叠加在一起,就决定了工业测温方案不能随便拿个单片机内部ADC凑合了事。
我这次做的项目,核心就是用ADS122U04IPWR这颗24位ΔΣ模数转换器,搭配STM32F732IE这颗带硬件浮点单元的Cortex-M7微控制器,搭建一套面向工业和HVAC场景的温度测量系统。选这两个器件的组合不是拍脑袋决定的,背后有很明确的工程逻辑。
先说测温传感器。工业和HVAC领域最常用的温度传感器无非三类:热电偶、热敏电阻(NTC/PTC)和铂电阻(RTD)。热电偶适合高温但精度一般,热敏电阻便宜但线性度差、互换性不好,而RTD(尤其是PT100和PT1000)凭借出色的线性度、长期稳定性和可互换性,成了工业测温的主力选择。PT100在0°C时阻值100Ω,PT1000则是1000Ω,后者灵敏度更高、引线电阻影响更小,在长距离传输场景下更有优势。这个项目我选的是PT1000三线制接法,原因后面细说。
那为什么非得用24位的ADS122U04?PT1000的灵敏度大约是3.85Ω/°C,如果我们要做到0.1°C的分辨率,就需要分辨出约0.385Ω的阻值变化。假设激励电流是1mA,那对应的电压变化只有0.385mV。要在这个量级上做精确测量,同时还要覆盖-200°C到+850°C的宽温区,16位ADC勉强够用但余量不足,24位ΔΣ ADC才是稳妥之选。ADS122U04内置PGA(可编程增益放大器)、双匹配电流源、基准电压和振荡器,几乎把RTD测温需要的外围全集成进去了,这大大简化了电路设计。
STM32F732IE的角色则是系统控制核心。它负责配置ADS122U04的寄存器、读取转换数据、运行温度换算算法、处理线性化和冷端补偿(如果用热电偶的话)、驱动显示屏或通信接口。F732的Cortex-M7内核跑在216MHz,带双精度硬件浮点单元,做RTD的多项式拟合和数字滤波绰绰有余。而且它外设丰富,SPI、I2C、UART、USB一应俱全,方便对接上位机或组态软件。
整个系统的信号链是这样的:STM32通过SPI配置ADS122U04,ADS122U04的内部IDAC输出激励电流流过PT1000,产生的电压经过PGA放大后送入ΔΣ调制器,转换结果通过SPI回传给STM32,STM32再根据Callendar-Van Dusen方程把阻值换算成温度值。这个链路看起来简单,但每个环节都有讲究,下面我逐个拆解。
2. ADS122U04的关键特性与RTD测温电路设计
2.1 为什么ADS122U04适合RTD测温
ADS122U04是TI的一款24位、4通道、低功耗ΔΣ ADC,专门为小信号传感器测量优化。它有几个特性对RTD测温特别友好:
第一是双匹配电流源(IDAC)。RTD测量本质上就是给电阻通一个已知电流,测它两端的电压,然后算阻值。ADS122U04内置两个可编程电流源,电流值可以设为10μA、50μA、100μA、250μA、500μA、1000μA、1500μA。两个电流源的匹配度很高,这对三线制或四线制RTD的引线电阻补偿至关重要。
第二是PGA。ADS122U04的PGA增益可以设为1到128。对于PT1000在1mA激励下满量程也就几伏的情况,增益设1到4就够了;但如果用PT100或者需要测量更小的信号,PGA就能派上大用场。PGA是差分输入的,对共模干扰有天然抑制。
第三是内部基准。ADS122U04有内置的2.048V基准,温漂典型值只有5ppm/°C。当然你也可以用外部基准,但在大多数工业场景下内部基准已经足够。基准的稳定性直接决定了测量精度,这一点后面还会展开说。
第四是集成振荡器。不需要外部晶振,省了BOM成本和板子面积。
第五是宽电源范围。模拟电源2.3V到5.5V,数字电源也是2.3V到5.5V,可以跟STM32的3.3V系统直接对接,不需要额外的电平转换。
2.2 三线制RTD接法的原理与优势
RTD的接法有二线制、三线制和四线制。二线制最简单,但引线电阻会直接叠加到测量结果里,假设引线电阻0.5Ω,对PT1000来说就是约0.13°C的误差,而且这个误差还随环境温度变化。四线制最精确,完全消除引线电阻影响,但需要四根线,布线成本高。
三线制是工业和HVAC场景下的最佳平衡点。它用三根线,通过两次测量或者利用ADS122U04的双电流源交替激励,可以抵消引线电阻的影响。具体原理是这样的:假设三根引线电阻分别为RL1、RL2、RL3,通常同一根电缆里这三根线的电阻是匹配的,即RL1≈RL2≈RL3。ADS122U04的IDAC1从AIN0流出经过RL1到RTD一端,IDAC2从AIN3流出经过RL3到RTD另一端,RTD的另一端经过RL2回到AIN1。通过合理配置,可以让RL1和RL3上的压降在差分测量中相互抵消,只剩下RTD本身的压降和RL2的影响,而RL2可以通过第二次测量或软件补偿消除。
实际接线时,我通常这样分配引脚:IDAC1接AIN0,RTD一端接AIN0和AIN1(即Kelvin连接),RTD另一端接AIN2和AIN3,IDAC2接AIN3,基准测量用AIN2和AIN3之间的电压。这样配置的好处是基准电压和RTD电压来自同一电流源,电流源的漂移会被比值抵消,这就是所谓的比例式测量,精度极高。
2.3 激励电流的选择与自热效应权衡
激励电流选多大,这是个需要仔细权衡的问题。电流越大,RTD上的电压信号越大,对ADC噪声和失调的要求就越低;但电流越大,RTD自身的焦耳热(I²R)就越大,会导致自热误差。PT1000在1mA下的功耗是1mW,在静止空气中可能引起0.1°C到0.3°C的温升,在流动液体中则小得多。
我的经验是:对于PT1000,500μA到1mA是比较合适的范围。如果传感器封装很小、散热条件差,就选500μA甚至250μA;如果是工业管道里带保护套管的RTD,热传导好,1mA完全没问题。ADS122U04的IDAC可以编程,你可以在固件里根据应用场景灵活调整,甚至可以在不同测量周期用不同电流来估算自热效应并补偿。
还有一点容易被忽略:IDAC的 compliance voltage。ADS122U04的IDAC需要一定的裕量电压才能正常工作,具体值跟电流大小有关。1mA时大约需要0.9V的裕量。所以AVDD至少要比IDAC输出端的最高电压高0.9V。如果AVDD是3.3V,RTD上压降加引线压降加IDAC裕量不能超过3.3V,否则电流源会失稳。PT1000在1mA下满量程压降约2.85V(850°C时约3.28kΩ),加上裕量就超了。所以高温段要么降低电流,要么提高AVDD到5V。这个坑我踩过,当时用3.3V供电测高温段,数据一直跳,查了半天才发现是IDAC进入非线性区了。
2.4 基准电压与比例式测量
前面提到比例式测量,这里展开说一下。ADS122U04的基准可以选外部基准,也可以选内部2.048V基准。如果用外部基准,我强烈建议用RTD激励电流流过一颗精密参考电阻产生的电压作为基准。比如用一颗10kΩ、0.1%、10ppm/°C的电阻,1mA电流流过产生10V?不行,超了。用2kΩ产生2V,正好在基准输入范围内。
这样做的好处是:RTD电压和基准电压都正比于同一个激励电流,电流的温漂和长期漂移在比值中被消掉了。ADC的转换结果直接就是RTD阻值与参考电阻阻值的比值,再乘以参考电阻值就得到RTD阻值。整个测量链路的精度就只取决于参考电阻的精度和ADC的线性度,而这两个指标都很好保证。
如果用内部基准,虽然省了一颗精密电阻,但内部基准的绝对精度和温漂不如好的外部基准,而且激励电流的漂移不会被抵消。所以高精度场合我还是推荐外部参考电阻方案。
3. STM32F732IE的固件架构与温度换算算法
3.1 硬件接口与SPI通信配置
STM32F732IE和ADS122U04之间通过SPI通信。ADS122U04的SPI接口支持模式1(CPOL=0,CPHA=1),最高SCLK频率跟DVDD有关,3.3V时大约可以跑到10MHz。我一般配置成4MHz到8MHz,兼顾速度和信号完整性。
STM32这边用SPI1或SPI2都可以,配置成Master模式,数据宽度8位,MSB First,软件控制CS。ADS122U04的CS、SCLK、DIN、DOUT/DRDY四个信号线,其中DOUT/DRDY是复用引脚,既做数据输出又做数据就绪中断。我通常把DRDY配置成外部中断下降沿触发,这样STM32不用轮询,转换完成自动进中断读数据,效率高。
初始化流程大致是:拉低CS,发送RESET命令(0x06),延时,发送START/SYNC命令(0x08),然后配置寄存器。ADS122U04有四个配置寄存器,需要根据你的RTD类型、电流大小、增益、数据速率等参数逐个写入。写寄存器用WREG命令,读用RREG命令。配置完成后发送START命令开始转换,等待DRDY下降沿。
这里有个细节:ADS122U04上电后默认是单次转换模式,需要发START命令才转换一次。如果要连续转换,要在配置寄存器里设成连续转换模式。连续模式下DRDY会周期性下降沿,STM32在中断里读数据就行。
3.2 寄存器配置详解
ADS122U04的寄存器配置是固件开发的核心。我以PT1000、1mA激励、增益1、20SPS数据率、外部基准为例,给出一个典型配置:
寄存器0(0x00):MUX[3:0]选择输入通道。对于三线制RTD,第一路测量选AIN0和AIN1,第二路选AIN2和AIN3。增益GAIN[2:0]设为000(增益1)。PGA旁路位设0(PGA使能)。
寄存器1(0x01):数据速率DR[2:0]设为000(20SPS)或010(45SPS)。20SPS时50/60Hz工频抑制最好,工业现场首选。模式位设0(连续转换)。转换模式位设0(单次)或1(连续)。温度传感器模式设0(关闭,我们用外部RTD)。基准选择位设1(外部基准)。IDAC电流设100(1mA)。
寄存器2(0x02):IDAC1路由设000(AIN0),IDAC2路由设011(AIN3)。DRDY模式设0(专用DRDY引脚)。IDAC旋转模式设0。
寄存器3(0x03):IDAC使能位设1。其他保持默认。
这些配置值需要根据实际硬件微调。比如你的RTD接在AIN2/AIN3上,那MUX和IDAC路由都要改。我建议在固件里把寄存器配置做成结构体或宏定义,方便不同硬件版本切换。
3.3 RTD阻值到温度的换算:Callendar-Van Dusen方程
拿到ADC原始码后,第一步是算RTD阻值。如果是比例式测量,ADC码直接对应RTD阻值与参考电阻的比值:
R_RTD = (ADC_CODE / 2^23) * R_REF * PGA_GAIN注意ADS122U04是24位ADC,但输出是二进制补码格式,满量程对应2^23-1。如果用了PGA,还要除以增益。如果没用比例式测量而是用内部基准,那公式变成:
R_RTD = (ADC_CODE / 2^23) * V_REF / I_IDAC拿到阻值后,用Callendar-Van Dusen方程换算温度。对于T≥0°C:
R(T) = R0 * (1 + A*T + B*T²)对于T<0°C:
R(T) = R0 * (1 + A*T + B*T² + C*(T-100)*T³)其中R0是0°C时的阻值(PT1000是1000Ω),A、B、C是常数。对于PT100和PT1000,IEC 60751标准给出的值是:
- A = 3.9083 × 10⁻³ °C⁻¹
- B = -5.775 × 10⁻⁷ °C⁻²
- C = -4.183 × 10⁻¹² °C⁻⁴
从阻值反算温度,T≥0°C时可以直接解二次方程:
T = (-A + sqrt(A² - 4*B*(1 - R/R0))) / (2*B)T<0°C时没有解析解,需要用迭代法或查表法。我一般用牛顿迭代,三四次就能收敛到0.001°C以内。STM32F732有硬件浮点,这些计算耗时可以忽略。
3.4 数字滤波与工频抑制
工业现场的50Hz/60Hz工频干扰是测温精度的头号杀手。ADS122U04在20SPS数据率下,数字滤波器的-3dB带宽很窄,对50Hz和60Hz都有很好的抑制(典型值>80dB)。但前提是你的数据率设置正确,而且转换是连续均匀的。
如果现场干扰特别严重,可以在STM32端再加一级数字滤波。我常用的是滑动平均滤波加中值滤波的组合:先做5点中值滤波去掉脉冲噪声,再做16点滑动平均平滑随机噪声。这样处理后的数据既稳定又不至于响应太慢。对于温度这种慢变量,响应慢一点完全没问题。
还有一点:ADS122U04的DRDY信号一定要用中断而不是轮询。轮询会引入不确定的延迟,导致采样时刻抖动,影响数字滤波器的工频抑制效果。中断方式下,STM32在DRDY下降沿立即读数据,采样时刻由ADC内部振荡器决定,非常均匀。
4. 系统校准与精度验证实操
4.1 零点与满量程校准
任何高精度测量系统都离不开校准。ADS122U04虽然出厂校准过,但PCB上的寄生参数、参考电阻的初始误差、IDAC的绝对精度都会引入系统误差。校准分两步:零点校准和满量程校准。
零点校准:用一个高精度电阻箱代替RTD,设置到1000.000Ω(对应0°C),记录ADC码。理想情况下这个码应该对应R_REF的某个比例,但实际会有偏移。把这个偏移存到STM32的Flash里,后续测量都减去这个偏移。
满量程校准:把电阻箱设到某个高温点,比如2120.515Ω(对应300°C),记录ADC码,计算增益误差。增益校准系数也存Flash。
校准时的环境温度要记录,因为参考电阻和电阻箱都有温漂。如果校准环境温度跟使用环境温度差很多,校准系数需要做温度补偿。我一般在校准报告里记录环境温度、湿度、使用的仪器型号和校准日期,方便追溯。
4.2 用精密电阻箱验证线性度
校准完两个点后,还要验证线性度。在-200°C到+850°C范围内均匀取10到20个点,每个点用电阻箱设置对应的标准阻值,记录测量温度,计算误差。IEC 60751标准对Class A和Class AA RTD有明确的允差要求,Class A是±(0.15 + 0.002|T|)°C,Class AA是±(0.1 + 0.0017|T|)°C。你的系统误差应该远小于RTD本身的允差,否则就是系统设计有问题。
我实测下来,用ADS122U04加0.1%参考电阻,在-50°C到+300°C范围内,系统误差可以做到±0.05°C以内,线性度非常好。高温段(>500°C)误差会稍大,主要是PT1000在高温下的非线性增强,以及IDAC compliance voltage的余量变小。
4.3 自热效应评估与补偿
前面提到自热效应,这里说怎么评估。方法很简单:分别在1mA和0.5mA激励下测量同一个RTD在稳定温度下的读数,两个读数的差值就是自热引起的温升(因为功耗跟电流平方成正比,1mA和0.5mA的功耗差4倍)。如果差值超过0.1°C,就要考虑降低激励电流或者做软件补偿。
软件补偿的思路是:先测一次1mA下的温度T1,再测一次0.5mA下的温度T2,自热误差ΔT = (T1 - T2) * (I1²/(I1² - I2²))。然后真实温度T_true = T1 - ΔT。这个方法在恒温条件下有效,变温条件下需要更复杂的动态补偿。
4.4 常见问题排查速查表
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 读数跳变严重 | 工频干扰、滤波不足 | 示波器看RTD引线波形 | 降低数据率到20SPS,加屏蔽线,加RC滤波 |
| 高温段读数不准 | IDAC compliance不足 | 测IDAC输出端电压 | 提高AVDD到5V或降低激励电流 |
| 低温段读数偏大 | 引线电阻未补偿 | 短接RTD引线测零点 | 检查三线制接线,做引线电阻补偿 |
| 读数缓慢漂移 | 参考电阻温漂、IDAC温漂 | 恒温下长时间记录 | 换低温度系数参考电阻,用比例式测量 |
| DRDY不触发 | SPI配置错误、寄存器未正确写入 | 读回寄存器验证 | 检查SPI模式,确认START命令已发送 |
| 噪声频谱有尖峰 | 开关电源干扰、数字噪声耦合 | 频谱分析 | 加LDO给模拟供电,数字地和模拟地分开 |
这个表是我在实际调试中总结的,每一条都对应我踩过的坑。特别是第一条,早期我用1000SPS数据率,读数跳得没法看,后来降到20SPS立刻就稳了。ADS122U04在20SPS下的工频抑制是它的核心优势,一定要用上。
5. 工业与HVAC场景的工程化考量
5.1 长引线带来的挑战与对策
工业现场的RTD引线动辄几十米,引线电阻可能达到几欧姆甚至十几欧姆。对PT1000来说,1Ω引线电阻约等于0.26°C误差,三线制可以补偿大部分,但前提是三根线电阻匹配。实际电缆里三根线的电阻差异可能在几十毫欧,对应0.01°C量级,可以接受。
长引线还会引入共模干扰和射频干扰。对策是:用双绞屏蔽电缆,屏蔽层单点接地(接在变送器端),RTD端不接地避免地环路。ADS122U04的差分输入和PGA对共模干扰有抑制,但共模电压不能超过AVDD范围。如果现场共模电压很高,可能需要加隔离放大器或共模扼流圈。
还有一个容易被忽略的问题:长引线的分布电容。双绞线的分布电容大约50pF/m,100米就是5nF。ADS122U04的输入是开关电容结构,对源阻抗有要求。如果引线电阻加RTD电阻太大,建立时间不够,会导致增益误差。PT1000在高温下3.3kΩ,加引线电阻可能到3.5kΩ,在20SPS下建立时间足够,但如果你用更高速率就要注意了。
5.2 电磁兼容设计与PCB布局要点
PCB布局对高精度ADC至关重要。我的经验是:
模拟部分和数字部分严格分区。ADS122U04的AVDD和DVDD分别用独立的LDO供电,AVDD的LDO噪声要低。模拟地和数字地在ADC下方单点连接,避免数字回流经过模拟区。
RTD输入走线要对称,差分对等长,远离时钟线和开关电源走线。参考电阻紧靠ADC放置,走线尽量短。IDAC输出走线也要对称,因为IDAC匹配度直接影响三线制补偿效果。
去耦电容用0.1μF加1μF组合,紧靠电源引脚。基准引脚加0.1μF到1μF。如果用了外部基准,基准电容要用低ESR的钽电容或陶瓷电容。
STM32的晶振远离模拟区,SPI走线不要跨越模拟区。如果实在避不开,中间加地线隔离。
5.3 HVAC场景的特殊需求
HVAC场景跟纯工业场景有些不同。HVAC的温度范围通常在-40°C到+150°C,不像工业过程那么宽,但对成本和可靠性要求更高。HVAC设备往往常年不间断运行,MTBF要求高。而且HVAC现场电磁环境复杂,风机、压缩机、变频器都在附近。
针对HVAC,我一般会:降低激励电流到500μA减少自热,因为HVAC的RTD封装通常较小;数据率用20SPS保证工频抑制;增加软件看门狗和ADC自检功能,定期检查DRDY是否正常、读数是否在合理范围;用TVS管保护RTD输入端口,防止静电和浪涌。
还有一点:HVAC系统经常需要多点测温,比如送风、回风、盘管、室外等多个位置。ADS122U04有4个输入通道,可以轮流测量多个RTD,通过外部多路开关还能扩展到更多通道。STM32F732IE的算力足够同时处理多路换算和通信。
5.4 标定与长期稳定性维护
工业设备出厂前要标定,运行一段时间后还要复标。我的做法是在固件里预留标定接口,通过UART或USB发送标定命令,用精密电阻箱输入标准阻值,系统自动计算并存储校准系数。这样现场维护人员不需要拆机就能复标。
长期稳定性方面,参考电阻的长期漂移是关键。好的精密电阻年漂移在10ppm到25ppm,对应0.0025°C到0.006°C,可以忽略。IDAC的长期漂移在比例式测量下也被抵消。RTD本身的长期漂移才是主要误差源,但这属于传感器问题,变送器无能为力。
我还会在固件里加一个趋势记录功能,定期把温度数据存到Flash或通过通信上传,方便分析系统长期稳定性。如果发现读数有缓慢单向漂移,可能是参考电阻老化或RTD老化,需要复标或更换。
6. 实操心得与踩坑记录
6.1 那些年我踩过的ADS122U04配置坑
第一个坑:忘了发START命令。ADS122U04上电后默认是单次转换模式,配置完寄存器后必须发START/SYNC命令才会开始转换。我一开始以为配置完就自动转换了,等了半天DRDY不动,查手册才发现这个问题。
第二个坑:SPI模式搞错。ADS122U04支持SPI模式1,但有些STM32的SPI配置默认是模式0。模式不对读出来的数据全是乱的。我现在的习惯是先用示波器看SCLK和DIN的相位关系,确认模式正确再调数据。
第三个坑:寄存器写入后没回读验证。ADS122U04的寄存器写入需要一定时间,如果紧接着就读可能读到旧值。我现在的做法是写完等1ms再回读,确认所有寄存器值正确后才发START。
第四个坑:IDAC路由配置错误。ADS122U04的IDAC可以路由到不同的AIN引脚,寄存器2的IDAC1和IDAC2路由位要跟实际硬件接线一致。我有一次硬件改了接线但忘了改固件,结果测出来的温度差了十几度。
6.2 提升测量稳定性的几个实用技巧
技巧一:多次采样取平均。ADS122U04在20SPS下噪声已经很低,但如果你要更高分辨率,可以连续采16次或32次取平均,等效分辨率能提高2到3位。STM32F732的RAM足够存这些数据。
技巧二:用ADC的内部温度传感器做环境温度补偿。ADS122U04有一个内部温度传感器,虽然精度不高(±1°C),但可以用来监测ADC自身温度,对参考电阻和IDAC做一阶温度补偿。
技巧三:定期做零点自检。在测量间隙,通过外部多路开关把ADC输入短接,测量零点偏移。如果偏移超过阈值就报警。这个功能在无人值守的工业现场特别有用。
技巧四:电源上电顺序。ADS122U04的AVDD和DVDD上电顺序没有严格要求,但为了安全,我一般先上AVDD再上DVDD,或者同时上。如果DVDD先上而AVDD没上,ADC可能进入不确定状态。
6.3 从原型到产品的工程化建议
原型阶段可以用开发板飞线,但产品阶段必须做正式PCB。我的经验是:模拟部分用四层板,有完整地平面;ADC和参考电阻放在同一层,下面挖空减少寄生电容;RTD接口加RC滤波和TVS保护;电源入口加共模扼流圈和π型滤波。
固件方面:加看门狗,防止程序跑飞;加通信超时重试,防止SPI死锁;加数据合理性检查,读数超出-200°C到+850°C范围就标记为故障;加校准系数CRC校验,防止Flash数据损坏。
外壳方面:如果用在HVAC现场,要考虑防护等级。变送器外壳至少IP54,接线端子用可插拔式,方便现场更换。如果用在工业过程,可能要IP65或更高,甚至防爆认证。
这个方案我从最初的原型到现在的小批量,前后调了大半年,中间经历了好几次改板。最深的体会是:高精度测量是个系统工程,ADC只是其中一环,电源、基准、布局、固件、校准每个环节都不能掉链子。ADS122U04和STM32F732IE这个组合,硬件设计得当、固件配置正确的话,做到0.05°C的测量精度是完全可行的,对于绝大多数工业和HVAC应用都绰绰有余。