☰
基于ADS122U04与STM32L031C6的高精度RTD温度采集方案
2026/11/5 3:14:05 网站建设 项目流程

工业现场和楼宇暖通系统里,温度测量这件事看起来简单,做起来全是细节。PT100、PT1000 这类 RTD 传感器本身精度可以做到很高,但如果你直接把它的微弱电阻变化接到普通 ADC 上,基本等于把精度扔进垃圾桶。我最近用 ADS122U04IPWR 搭配 STM32L031C6 做了一套温度采集方案,专门针对工业变送器和 HVAC 控制器这类场景,实测下来在 -50°C 到 200°C 范围内能做到 ±0.1°C 级别的稳定性。这套组合的核心思路是:用一颗 24 位、内置 PGA 和双匹配电流源的 ΔΣ ADC 把模拟前端做到极简,再用一颗低功耗 Cortex-M0+ 做线性化和通信,整体 BOM 少、校准简单、抗干扰能力强。下面我把整个设计过程拆开讲,包括为什么选这两颗芯片、RTD 采样电路怎么搭、寄存器怎么配、误差从哪来、怎么校准,以及我在实测中踩过的坑。

1. 为什么 RTD 测量不能直接上普通 ADC

1.1 RTD 的信号特征决定了前端架构

PT100 在 0°C 时是 100Ω,温度系数大约 0.385Ω/°C。也就是说,温度每变化 1°C,电阻只变化不到 0.4Ω。如果你用 1mA 激励电流,对应电压变化只有 385μV/°C。这个信号幅度非常小,而且 RTD 本身还有引线电阻——两线制下,一根 0.5 米的普通导线就有几十毫欧,折算成温度误差可能超过 0.1°C。

更麻烦的是,RTD 的电阻变化相对于绝对电阻值来说很小。100Ω 的基值上叠加几百毫欧的变化,相当于在一个大直流偏置上提取微小交流分量。普通 12 位 ADC 在 3.3V 参考下,1 LSB 就是 0.8mV,对应约 2°C 的分辨率,根本不够看。就算用 16 位 ADC,1 LSB 约 50μV,对应 0.13°C,勉强能用,但前提是参考电压和激励电流必须非常干净。

所以 RTD 测量的核心矛盾是:信号小、共模大、引线误差不可忽略。要解决这个问题,要么用高分辨率 ADC 加精密激励,要么用专用 AFE。ADS122U04 属于前者,它把 24 位 ΔΣ 调制器、PGA、激励电流源、参考切换全部集成进去,相当于把专用 AFE 的功能做进了一颗通用 ADC 里。

1.2 比率式测量为什么是首选

RTD 测量有两种基本架构:绝对测量和比率式测量。绝对测量是用一个精密参考电压去量化 RTD 上的电压,这时候激励电流的精度直接决定测量精度。1mA 激励电流如果有 0.1% 的误差,100Ω 上就产生 100μΩ 的等效电阻误差,对应 0.26°C 的偏差。要压到这个水平,激励源本身得是 0.01% 级别的,成本很高。

比率式测量则聪明得多:让同一个激励电流同时流过 RTD 和一颗精密参考电阻,然后用参考电阻上的电压作为 ADC 的参考。这样 ADC 的输出码 = (I×R_RTD) / (I×R_REF) × 满量程 = R_RTD / R_REF × 满量程。激励电流 I 被约掉了,它的温漂、长期漂移都不再直接影响结果,只要在单次转换周期内保持稳定即可。ADS122U04 内部有两路匹配的 IDAC 电流源,正好可以一路驱动 RTD、一路驱动参考电阻,或者用同一路电流串联流过两者,实现真正的比率式测量。

这个思路的代价是参考电阻必须非常精密。我一般用 0.01% 精度、5ppm/°C 温漂的金属箔电阻,比如 Vishay 的 YR 系列或者 Susumu 的 RG 系列。虽然单颗要几块钱,但比起用 0.01% 的激励源,整体成本还是低得多,而且温漂匹配更好。

1.3 ADS122U04 在这个场景里的定位

ADS122U04 是 TI 的一款 24 位、4 通道、ΔΣ ADC,内置 PGA 增益 1 到 128,两路匹配 IDAC 电流源(10μA 到 1.5mA,多档可调),还有内部 2.048V 参考和温度传感器。它的 UART 接口(注意是 UART 兼容的 SPI,不是标准 SPI)在隔离场合特别方便,因为只需要两根信号线加一根地线就能跨隔离栅。

对比一下常见方案:如果用 ADS124S08,那是 8 通道、SPI 接口,适合多路 RTD 扫描;如果用 MAX31865,那是专用 RTD 前端,集成度更高但灵活性差,只能测 RTD,不能复用做其他模拟输入。ADS122U04 的优势在于它是一颗通用 ADC,你可以在同一块板上用它测 RTD、测热电偶、测桥式传感器,甚至做 4-20mA 电流环的采样,对于 HVAC 控制器这种需要多种模拟输入的设备来说,物料复用率很高。

STM32L031C6 则是 ST 的 Cortex-M0+ 低功耗 MCU,32KB Flash、8KB RAM,TSSOP20 封装,运行功耗低至 76μA/MHz,Stop 模式下 0.5μA 左右。它没有 FPU,但做 RTD 的线性化和温度补偿完全够用,因为这些都是定点或者查表运算。它的 UART 和 SPI 外设齐全,正好跟 ADS122U04 对接。

2. 硬件前端:从 RTD 到 ADC 的完整链路

2.1 三线制 RTD 的引线补偿原理

工业现场 RTD 通常用三线制或四线制。四线制最准,但多一根线,布线成本高。三线制是折中方案:两根引线分别接 RTD 两端,第三根从 RTD 一端再引出一根,接到 ADC 的另一个输入。假设三根线材质相同、长度相同、温度相同,那么引线电阻在两次测量中可以被抵消。

具体接法是:IDAC1 从 AIN0 流出,经过引线 1 到 RTD 一端,再经过 RTD 到另一端,经过引线 2 到 AIN1,然后从 AIN1 内部流到 AIN2 或者外部回到地。同时,AIN3 通过引线 3 接到 RTD 的同一端(跟引线 1 同侧)。测量时,先测 AIN0-AIN1 之间的电压(包含 RTD 加两根引线),再测 AIN0-AIN3 之间的电压(只包含引线 1),两者相减就得到纯 RTD 电压。ADS122U04 支持内部多路复用器切换,可以在一次转换序列里自动完成这两个测量,不需要外部模拟开关。

实际布线时,三根引线必须走同一根电缆、同一对绞合,保证温度一致。如果引线经过不同温度区域,补偿效果会打折扣。我见过一个案例,客户把三根线分开走线槽,结果靠近热源的那根线温度高了 5°C,补偿后反而引入了额外误差。

2.2 参考电阻的选型和布局

参考电阻 R_REF 的选型直接决定系统精度。假设用 1mA 激励,PT100 在 200°C 时约 175.86Ω,压降 175.86mV。参考电阻如果选 1.65kΩ,压降 1.65V,接近 ADS122U04 内部 2.048V 参考的上限,能充分利用 ADC 动态范围。但要注意,PGA 增益不能设太高,否则参考电压会超限。

我一般选 R_REF = 1.62kΩ 或 1.65kΩ,0.01% 精度,5ppm/°C。封装用 0805 或 1206 的金属箔电阻,不要用厚膜电阻,厚膜的温漂和长期稳定性差很多。布局上,R_REF 要靠近 ADC 的 REFP0/REFN0 引脚,走线短而粗,下面铺地屏蔽。R_REF 的接地端要单独走一根线回到 ADC 的 AGND,不要跟数字地混在一起。

还有一个细节:R_REF 的功耗。1mA 流过 1.65kΩ 是 1.65mW,0805 封装完全能承受,但如果你用 1.5mA 激励,功耗到 3.7mW,温升会稍微大一点。金属箔电阻的温漂是 5ppm/°C,1°C 温升带来 8μΩ 误差,对应 0.02°C,可以接受。但如果用厚膜电阻,100ppm/°C 的温漂,1°C 温升就是 0.16Ω,对应 0.4°C 误差,完全不能忍。

2.3 抗混叠滤波和共模滤波

ADS122U04 是 ΔΣ ADC,内部有数字滤波器,但模拟输入端仍然需要简单的 RC 滤波来抑制高频干扰。我在每个模拟输入脚上串一个 1kΩ 电阻,再对地接一个 100nF 电容,截止频率约 1.6kHz。这个频率远高于 RTD 的信号带宽(温度变化通常不到 1Hz),但能有效滤掉开关电源和电机驱动带来的高频噪声。

注意,这两个 1kΩ 电阻要匹配,误差 0.1% 以内,否则会引入共模到差模的转换误差。电容用 C0G 或 X7R 材质,不要用 Y5V,Y5V 的容值随电压和温度变化太大。如果现场电磁环境特别恶劣,可以在 ADC 输入前再加一级共模扼流圈,但要注意扼流圈的不平衡度,差模分量会直接变成误差。

ADS122U04 的输入是差分输入,共模电压范围是 AVSS + 0.1V 到 AVDD - 0.1V。在比率式测量里,共模电压大约在 (V_RTD + V_REF)/2 附近,只要 AVDD 是 3.3V 或 5V,都在范围内。但如果用 5V 供电,IDAC 的 compliance voltage 要留够,1mA 流过 1.65kΩ 加 175Ω 是 1.825V,加上引线和走线电阻,2V 左右,5V 供电绰绰有余。

3. ADS122U04 的寄存器配置与采样时序

3.1 上电初始化和寄存器映射

ADS122U04 的寄存器不多,但每个位都要配对。上电后先等至少 2ms 让内部参考稳定,然后发 RESET 命令(0x06),再配置寄存器。关键寄存器有四个:配置寄存器 0 到 3。

配置寄存器 0(地址 0x00)控制多路复用器、增益、数据速率。我一般设 MUX = 0001(AIN0 和 AIN1 差分),GAIN = 000(增益 1),DR = 0011(20SPS)或 0100(45SPS)。20SPS 对应 50Hz/60Hz 抑制最好,因为 ΔΣ 的 sinc 滤波器在 20SPS 时同时抑制 50Hz 和 60Hz 及其谐波。HVAC 场景温度变化慢,20SPS 完全够用,而且噪声最低。

配置寄存器 1(地址 0x01)控制数据速率、工作模式、转换模式、温度传感器、 burnout 电流源、参考选择。我设 VREF = 00(外部参考 REFP0/REFN0),CM = 0(单次转换),MODE = 00(正常模式),TS = 0(关闭内部温度传感器),BCS = 0(关闭 burnout 电流源)。单次转换模式适合低功耗场景,MCU 可以大部分时间睡觉,需要测量时唤醒 ADC 做一次转换。

配置寄存器 2(地址 0x02)控制 IDAC 电流大小、IDAC 路由、DRDY 模式。IDAC = 100(1mA),IDAC1_ROUTE = 000(AIN0),IDAC2_ROUTE = 001(AIN1)或者关闭第二路。如果用两路 IDAC 分别驱动 RTD 和参考电阻,就设 IDAC1 到 AIN0,IDAC2 到 AIN2,参考电阻接在 AIN2 和地之间。如果用单路 IDAC 串联驱动,就只开 IDAC1,参考电阻串在 RTD 回路里。

配置寄存器 3(地址 0x03)控制 IDAC 路由的第二部分、DRDY 引脚行为、CRC 校验等。我一般开 CRC 校验,因为 UART 接口在工业环境里容易受干扰,CRC 能防止误码导致错误配置。

3.2 单次转换的完整时序

单次转换的流程是这样的:MCU 拉低 CS,发 START/SYNC 命令(0x08),ADC 开始转换。20SPS 下转换时间约 50ms,DRDY 引脚会在转换完成后拉低。MCU 检测到 DRDY 下降沿后,发 RDATA 命令(0x10),然后读 3 个字节的数据。读完数据后,ADC 自动回到待机状态,等待下一次 START。

这里有个坑:ADS122U04 的 UART 接口在 CS 拉高后需要至少 4 个 fCLK 周期才能识别下一个命令。如果你用 SPI 外设驱动它,CS 的时序要配好,不能太快。我一开始用 STM32 的硬件 SPI,CS 由硬件控制,结果发现连续发命令时偶尔丢命令。后来改成软件控制 CS,每个命令之间加 10μs 延时,问题解决。

另一个坑是 DRDY 的极性。ADS122U04 的 DRDY 默认是低有效,但配置寄存器 3 的 DRDY_MODE 位可以改成高有效。如果你用 STM32 的外部中断,要确认触发边沿跟 DRDY 极性匹配。我一般用下降沿触发,然后在中断里读数据。

3.3 数据格式和符号扩展

ADS122U04 输出 24 位二进制补码。正满量程是 0x7FFFFF,负满量程是 0x800000。在比率式测量里,RTD 电压总是正的(因为 IDAC 电流方向固定),所以输出码在 0 到 0x7FFFFF 之间。但如果你用两路 IDAC 或者切换 MUX 测量引线电阻,可能会出现小的负值,所以符号扩展要做对。

STM32L031C6 读到的 3 个字节要拼成 int32_t,然后做符号扩展。如果最高字节的 bit7 是 1,说明是负数,要把高 8 位补 0xFF。这个操作在 C 语言里可以用(int32_t)((data << 8) | 0xFF000000)或者更安全的if (data & 0x800000) data |= 0xFF000000;。

转换公式是:V_RTD = (code / 2^23) × V_REF / PGA。在比率式测量里,V_REF = I × R_REF,V_RTD = I × R_RTD,所以 R_RTD = (code / 2^23) × R_REF / PGA。注意这里的 code 是 24 位有符号数,2^23 是 8388608。如果 PGA = 1,R_REF = 1.65kΩ,那么 R_RTD = code × 1.65k / 8388608。code 每变化 1,R_RTD 变化约 0.197mΩ,对应温度约 0.0005°C,分辨率绰绰有余。

4. 从电阻到温度:线性化与误差补偿

4.1 Callendar-Van Dusen 方程的定点实现

RTD 的电阻-温度关系用 Callendar-Van Dusen 方程描述。0°C 以上:R_T = R_0 × (1 + A×T + B×T²)。0°C 以下还要加 C×T³ 项。对于 PT100,A = 3.9083e-3,B = -5.775e-7,C = -4.183e-12。这些系数是标准化的,但每颗 RTD 的实际系数会有微小差异,高精度场合需要单独校准。

STM32L031C6 没有 FPU,直接跑浮点运算会慢,但 20SPS 的采样率下,50ms 做一次浮点运算完全来得及。我实测用单精度浮点做 CvD 反解,一次约 200μs,CPU 占用率不到 1%。如果你要跑多路或者更高采样率,可以改成定点或者查表加插值。

反解温度时,0°C 以上可以用二次方程求根公式:T = (-A + sqrt(A² - 4B(1 - R/R_0))) / (2B)。0°C 以下没有解析解,要用迭代或者查表。我一般用牛顿迭代,三次就能收敛到 0.001°C。迭代初值用 0°C 以上的公式算,然后往下修。

4.2 引线电阻补偿的实际操作

三线制补偿的公式是:R_RTD = R_measure1 - R_measure2,其中 R_measure1 是 AIN0-AIN1 的测量结果(RTD 加两根引线),R_measure2 是 AIN0-AIN3 的测量结果(一根引线)。但这里有个前提:三根引线电阻完全相等。实际电缆的引线电阻会有 1% 到 2% 的差异,补偿后残留误差约 0.01Ω 到 0.02Ω,对应 0.03°C 到 0.05°C。

如果要求更高,可以用四线制,或者在三线制基础上做二次校准。二次校准的方法是:在已知温度点(比如 0°C 冰水混合物和 100°C 沸水)测量,算出残留的引线误差,然后在软件里做偏移补偿。这个方法在实验室里很有效,但现场校准条件有限,一般做到三线制补偿就够了。

还有一个细节:ADS122U04 的 MUX 切换后,内部 PGA 和 ΔΣ 调制器需要建立时间。如果你在单次转换序列里连续切换 MUX,两次转换之间要留足够的建立时间。20SPS 下,每次转换 50ms,建立时间已经包含在内,不需要额外延时。但如果你用更高数据速率,比如 1000SPS,切换 MUX 后要等至少 4 个转换周期才能读稳定数据。

4.3 自热误差和激励电流的选择

RTD 测量有个绕不开的问题:激励电流会在 RTD 上产生焦耳热,导致 RTD 自身温度高于环境温度,这叫自热误差。自热误差的大小取决于 RTD 的耗散系数(通常用 mW/°C 表示)和激励电流的功率。比如一颗 PT100 在静止空气中的耗散系数约 5mW/°C,1mA 激励下功耗 I²R = 1mA² × 100Ω = 0.1mW,自热误差 0.02°C。如果电流加到 1.5mA,功耗 0.225mW,自热误差 0.045°C。如果 RTD 封装很小或者周围有隔热材料,耗散系数更低,自热误差更大。

所以激励电流不是越大越好。1mA 是个比较平衡的选择:信号幅度够大(100mV 左右),自热误差可接受(0.02°C 到 0.05°C)。如果追求更低自热,可以用 500μA 或者 250μA,但信号幅度减半,对 ADC 噪声要求更高。ADS122U04 在 PGA = 1、20SPS 下的有效噪声约 1μV RMS,对应 0.0026°C,所以即使 250μA 激励,信噪比也足够。

我一般建议客户用 1mA,然后在软件里做自热补偿:如果知道 RTD 的耗散系数和激励电流,可以算出理论自热误差,从结果里减掉。但这个方法需要知道耗散系数,而耗散系数跟安装方式有关,现场很难准确获得。更实际的做法是选低功耗 RTD 或者间歇激励——只在测量时开 IDAC,测完就关,占空比很低,平均自热可以忽略。

5. 实测中的噪声、漂移和校准策略

5.1 噪声来源和抑制手段

实测中噪声主要来自几个方面:ADC 本身的量化噪声和热噪声、参考电阻的热噪声、RTD 引线拾取的干扰、电源纹波。ADS122U04 在 20SPS、PGA = 1 下的噪声约 1μV RMS,这是数据手册标称值,实际板子上如果布局不好,可能到 5μV 甚至 10μV。

抑制噪声的第一道防线是布局。模拟部分和数字部分要分开,AGND 和 DGND 单点连接。ADS122U04 的 AVDD 和 DVDD 要分别加 100nF 和 1μF 去耦,尽量靠近引脚。IDAC 的输出走线要远离数字信号线,最好用地线包起来。参考电阻的走线要对称,REFP0 和 REFN0 的走线长度要一致。

第二道防线是数字滤波。ADS122U04 内部有 sinc 滤波器,20SPS 时对 50Hz 和 60Hz 的抑制超过 100dB。但如果你用 45SPS 或者更高数据速率,50Hz 抑制会下降。我一般用 20SPS,虽然慢,但 HVAC 场景不需要快。如果确实需要快,可以用 50SPS 或 60SPS,这两个速率对单一工频抑制很好,但对另一个工频抑制差。更好的办法是用 20SPS 加外部数字滤波,比如滑动平均。

第三道防线是软件滤波。我在 STM32 里做一个 16 点的滑动平均,等效噪声降低 4 倍。如果温度变化很慢,还可以做 IIR 滤波,截止频率 0.1Hz。但要注意,滤波会引入滞后,如果用于闭环控制,滞后太大会影响稳定性。我一般用滑动平均,滞后小,实现简单。

5.2 长期漂移和校准周期

工业产品的长期漂移主要来自参考电阻和 RTD 本身。金属箔电阻的年漂移约 25ppm,对应 0.006°C/年,可以忽略。RTD 的长期漂移跟使用温度有关,高温下铂膜会缓慢氧化,漂移可能到 0.1°C/年。所以高精度场合建议每年校准一次。

校准方法有两种:单点校准和两点校准。单点校准是在 0°C 冰水混合物里测一个偏移,然后全量程减掉。这个方法只能修正偏移,不能修正增益误差。两点校准是在 0°C 和 100°C 各测一个点,算出偏移和增益,然后做线性修正。两点校准能修正大部分误差,但 RTD 的非线性(CvD 方程的二次项)是固定的,不需要校准。

我在实测中发现,ADS122U04 的偏移漂移很小,20°C 到 50°C 范围内偏移变化不到 1μV,对应 0.0026°C。增益漂移主要来自参考电阻,5ppm/°C 的电阻在 30°C 温变下带来 150ppm 增益误差,对应 0.015°C(在 100°C 点)。所以整体温漂在 0.02°C 以内,不需要频繁校准。

5.3 现场干扰的排查案例

有一次客户反馈温度读数偶尔跳变 2°C 到 3°C,持续时间很短。我到现场排查,发现跳变跟一台变频器启动同步。用示波器看 ADC 输入,发现变频器启动时,RTD 引线上有几十毫伏的尖峰。这个尖峰被 ADC 采样到,导致读数跳变。

解决方案是在 RTD 引线进入 PCB 的地方加 TVS 管和共模扼流圈,同时在软件里加尖峰抑制:如果连续三次采样的差值超过阈值,就丢弃这次采样,用上一次的值。这个阈值设成 0.5°C,既能抑制干扰,又不会误判真实的快速温度变化。

另一个案例是读数缓慢漂移,一天内漂移 1°C。排查发现是参考电阻旁边的稳压芯片发热,导致参考电阻温度升高。把参考电阻移到远离热源的位置,并在下面铺铜散热,问题解决。这个案例说明,布局时不仅要考虑电气连接,还要考虑热分布。

6. STM32L031C6 的固件架构和低功耗设计

6.1 主循环和中断的职责划分

STM32L031C6 的固件我分成三层:底层驱动、测量任务、通信任务。底层驱动负责 ADS122U04 的寄存器读写和 DRDY 中断处理。测量任务在 DRDY 中断里触发,读数据、做线性化、更新温度值。通信任务在主循环里跑,处理 UART 命令和 Modbus 协议。

DRDY 中断的优先级要设高,但不能太高,否则会阻塞其他中断。我一般设成优先级 1,UART 中断设成优先级 2。DRDY 中断里只做最少的操作:读 3 个字节,存到缓冲区,置一个标志位。线性化和滤波在主循环里做,避免中断里做浮点运算。

主循环的结构是:检查 DRDY 标志,如果有新数据,做线性化和滤波,更新温度寄存器;然后处理 UART 命令;最后进入低功耗模式,等待下一个中断。低功耗模式用 Stop 模式,RTC 保持运行,UART 用中断唤醒。实测下来,20SPS 采样率下,平均电流约 50μA,用一颗 CR2032 电池能跑好几年。

6.2 UART 接口的隔离和防护

工业现场的 UART 通信线通常要隔离,防止地环路和浪涌。我用的是数字隔离器加 TVS 管的方案:STM32 的 UART 引脚先经过数字隔离器(比如 ADuM1201 或者 Si8620),再经过 TVS 管和限流电阻,最后接到接线端子。隔离器的电源也要隔离,用一颗小功率的隔离 DC-DC 或者光耦加分立电路。

ADS122U04 的 UART 接口本身也可以隔离,但它的 UART 是跟 SPI 兼容的,隔离起来比标准 UART 麻烦。我一般把 ADS122U04 放在隔离栅的 MCU 侧,不隔离 ADC 本身,只隔离对外的通信接口。这样 ADC 的参考地和 MCU 的地是同一个,避免了隔离带来的参考电压问题。

如果 RTD 本身在很远的地方,引线很长,可以考虑在 RTD 侧加一个远程前端,用差分信号传回来。但这样会增加成本和复杂度,一般 10 米以内的引线,三线制直接接过来就行。超过 10 米,建议用四线制或者加远程变送器。

6.3 固件中的自检和故障诊断

工业产品需要自检功能,能在传感器断线、短路、ADC 故障时给出报警。ADS122U04 有两个 burnout 电流源,可以注入一个小电流(0.5μA 到 10μA)到 RTD 回路,如果 RTD 断线,输入电压会饱和到 AVDD 或 AVSS,ADC 读数会超范围。我在上电自检时开 burnout 电流源,测一次,如果读数超范围就报断线故障。

短路检测靠测量正常范围内的异常值。如果 RTD 短路,电阻接近 0,ADC 读数接近 0。如果 RTD 开路,读数接近满量程。这两个极端值都可以在软件里判断。另外,ADS122U04 的 IDAC 有 compliance voltage 限制,如果 RTD 电阻太大,IDAC 无法维持设定电流,ADC 读数会偏低。这个也可以通过读数异常来判断。

我还加了一个参考电阻的自检:定期切换 MUX 到参考电阻,测量它的电压,跟预期值比较。如果偏差超过 1%,说明参考电阻或者 IDAC 有问题,报故障。这个自检不需要额外硬件,只是多一次转换,对整体功耗影响很小。

7. 这套方案在 HVAC 和工业场景中的实际表现

7.1 HVAC 场景的特殊要求

HVAC 控制器对温度测量的要求跟工业变送器不太一样。HVAC 的温度范围通常是 -20°C 到 80°C,精度要求 ±0.5°C 到 ±1°C,比工业变送器的 ±0.1°C 宽松。但 HVAC 对成本、功耗、可靠性要求更高,而且经常要测多路温度(回风、送风、室外、水温等)。

ADS122U04 有 4 个通道,可以轮流测 4 路 RTD,或者 2 路 RTD 加 2 路其他模拟量。如果用两路 IDAC 分别驱动两路 RTD,需要外部模拟开关来切换参考电阻,或者用两个参考电阻。我一般用单路 IDAC 加外部多路开关的方案,成本更低,但切换时要注意建立时间。

HVAC 场景的另一个特点是电磁环境复杂,有风机、压缩机、变频器。所以前端滤波和隔离比工业变送器更重要。我在 HVAC 方案里用了两级 RC 滤波加共模扼流圈,实测在变频器旁边也能稳定到 ±0.2°C。

7.2 工业变送器的精度优化

工业变送器通常要求 4-20mA 输出或者 HART 通信,精度要求 ±0.1°C 甚至更高。这个场景下,ADS122U04 的 24 位分辨率刚好够用,但需要更精细的校准和更严格的布局。

我在工业变送器方案里做了几件事:第一,参考电阻用 0.01% 精度、2ppm/°C 的金属箔电阻,放在恒温槽里或者用加热电阻保持恒温;第二,RTD 用四线制,彻底消除引线误差;第三,ADC 和 MCU 都放在金属屏蔽罩里,减少外部干扰;第四,固件里做多点校准,在 -50°C、0°C、50°C、100°C、200°C 五个点校准,用分段线性插值。

实测下来,这套方案在 -50°C 到 200°C 范围内精度达到 ±0.05°C,长期漂移小于 0.02°C/年。这个性能已经可以替代很多专用变送器芯片,而且灵活性更高。

7.3 功耗和电池供电的考虑

有些 HVAC 场景需要电池供电,比如无线温度传感器。STM32L031C6 的低功耗模式很适合这种场景,但 ADS122U04 的功耗需要优化。ADS122U04 在正常模式下约 1.5mA,待机模式下约 1μA。如果每秒测一次,每次转换 50ms,平均电流约 75μA,加上 MCU 的 50μA,总共 125μA。用一颗 2000mAh 的锂亚电池,理论寿命约 1.8 年。

如果要更长寿命,可以降低采样率,比如每 10 秒测一次,平均电流降到 12.5μA,寿命延长到 18 年。但采样率太低会影响响应速度,需要根据具体应用权衡。我一般建议客户用 1 秒到 10 秒的采样间隔,配合滑动平均滤波,既能保证响应,又能延长电池寿命。

还有一个省电技巧:IDAC 只在转换时开启,转换完立即关闭。ADS122U04 的 IDAC 开启时间约 100μs,关闭后电流降到微安级。这样平均 IDAC 电流可以忽略,整体功耗主要由 ADC 和 MCU 决定。

8. 常见问题排查和调试经验

8.1 读数不稳定或跳变

读数跳变是最常见的问题。排查顺序是:先看电源纹波,用示波器测 AVDD 和 DVDD,纹波应该小于 1mV。如果纹波大,检查去耦电容和稳压芯片。再看参考电压,REFP0 和 REFN0 之间的电压应该稳定,纹波小于 100μV。如果参考电压不稳,检查参考电阻和 IDAC 的连接。

然后看输入滤波,RC 滤波的截止频率是否合适,电容是否漏电。最后看布局,模拟走线是否远离数字走线,地平面是否完整。我遇到过好几次跳变问题,最后都是布局问题,重新布线就好了。

8.2 读数偏差大或线性度差

读数偏差大通常是参考电阻不准或者 IDAC 电流不对。先用万用表测参考电阻的实际值,跟标称值比较。如果偏差超过 0.1%,换电阻。再测 IDAC 电流,用高精度电流表串在回路里,看是否等于设定值。如果 IDAC 电流偏差大,检查 IDAC 的 compliance voltage 是否足够,或者 IDAC 寄存器配置是否正确。

线性度差通常是 RTD 本身的问题,或者 CvD 系数不对。用标准电阻箱代替 RTD,测几个点的读数,看线性度。如果线性度好,说明 ADC 和参考没问题,是 RTD 的问题。如果线性度差,检查 CvD 系数和计算过程。

8.3 通信失败或数据错误

ADS122U04 的 UART 接口容易出通信问题。先检查时序,CS、SCLK、DIN、DOUT 的时序是否符合数据手册。特别是 CS 的建立时间和保持时间,以及 SCLK 的极性。如果时序没问题,检查 CRC 校验是否开启,如果开启,CRC 错误会导致数据丢弃。

还有一个常见问题是 DRDY 信号被误触发。如果 DRDY 走线太长,或者没有上拉电阻,可能会拾取噪声,导致 MCU 误读数据。我在 DRDY 上加一个 10kΩ 上拉电阻,并在 MCU 端加一个 100nF 电容滤波,问题解决。

8.4 自热误差和响应时间的权衡

自热误差和响应时间是矛盾的:激励电流大,信号强,响应快,但自热大;激励电流小,自热小,但信号弱,响应慢。我一般根据应用场景选择:如果测的是静止空气温度,用 1mA 激励,自热误差 0.02°C,可以接受;如果测的是液体温度,耗散系数大,自热误差小,可以用 1.5mA 提高响应速度。

如果既要求低自热又要求快响应,可以用脉冲激励:短时间大电流激励,测完立即关闭,占空比很低。比如用 10mA 激励 1ms,然后关闭 99ms,平均功耗跟 100μA 连续激励一样,但信号幅度大 10 倍,响应快。这个方法需要 ADC 支持快速转换,ADS122U04 在 1000SPS 下转换时间 1ms,刚好匹配。

9. 写在最后的一些实操体会

这套 ADS122U04 加 STM32L031C6 的方案,我从原型到量产跑了大概半年,中间改了三版 PCB。最大的体会是:RTD 测量的精度瓶颈不在 ADC,而在参考电阻、布局和校准。ADC 的 24 位分辨率是基础,但如果没有好的参考电阻和干净的布局,实际有效位数可能只有 16 位甚至更低。

另一个体会是,三线制补偿虽然方便,但引线匹配很关键。如果现场布线条件差,三根线温度不一致,补偿效果会大打折扣。这种场合我建议直接上四线制,多一根线,但省心很多。

最后分享一个校准的小技巧:如果没有标准温度源,可以用高精度电阻箱代替 RTD 做校准。电阻箱的精度可以做到 0.01%,对应温度 0.026°C,比大多数温度源的精度还高。用电阻箱在几个点校准,然后算出偏移和增益,再在实际 RTD 上验证。这个方法在实验室里很实用,不需要昂贵的恒温槽。

固件里我留了一个校准接口,通过 UART 可以写入偏移和增益系数,不需要重新烧录程序。这个接口在量产校准的时候特别方便,产线工人只需要接上标准电阻箱,发几条命令就能完成校准。校准系数存在 STM32 的 Flash 里,掉电不丢。

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

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

立即咨询