news 2026/11/5 3:12:17

高精度温度采集方案:ADS122U04与STM32的工业级设计与校准实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高精度温度采集方案:ADS122U04与STM32的工业级设计与校准实践

前面一段时间在做 HVAC 相关的项目,需要设计一块通用型温度采集板卡,用来测量风管温度、回水温度、机房环境温度这些点位。传感器类型有 PT100、热电偶,也有少量 NTC。刚开始我想省事,直接用 MCU 内置 ADC 采,但算了一下精度和长期稳定性,发现不太够。后来把方案改成了外置高精度 ADC(ADS122U04IPWR)配合 STM32F373RC,效果提升非常明显,整个系统的零漂和温漂都控制得很好。这篇文章就把我在这个项目里的方案设计、硬件连接、固件思路、校准方法以及踩过的坑完整整理出来,给同样在做工业温度采集或者 HVAC 系统集成的朋友参考。

先说结论:这套组合特别适合做“多种传感器兼容、需要现场标定、要稳定输出”的通用温度采集节点。ADS122U04IPWR 负责把毫伏级、微伏级的传感器信号高保真地变成数字量,STM32F373RC 负责接收、换算、滤波、诊断和对外通信。两个芯片各干各的,配合起来非常顺。

1. 整体方案与选型思路

1.1 为什么是“ADS122U04 + STM32F373”而不是更常见的组合

接触过温度采集的人都知道,市面上的方案非常多:直接用 MCU 内置 ADC(比如 STM32 的 12 位 ADC、F373 的 16 位 SDADC),用国产 24 位 ADC 芯片(比如 HX711、TM7707),用仪表放大器加普通 ADC,用 PT100 专用芯片(比如 MAX31865),用数字温度传感器(DS18B20、SHT30),当然还有最传统的 NTC 加比较器方案。

说实话,如果只是测一个 NTC 或者 DS18B20,根本不需要 ADS122U04。DS18B20 够便宜、够简单,直接一根线就能读数。但它的精度和稳定性都不够:12 位分辨率对应 0.0625℃ LSB,但出厂校准差,长期漂移和寄生电容问题不少。工业现场如果要测 PT100/PT1000、热电偶,DS18B20 就完全不够用了。

那为什么不用 STM32F373 片内的 SDADC?这个问题我在很多交流群里被问过。F373 的 SDADC 确实是好东西,16 位无失码、内置 PGA、支持差分输入,但有几个现实问题:

  • 它的输入范围、PGA 增益、采样率、失调校准都需要在代码里仔细配置,而且 SDADC 的输入阻抗比较低,直接接高阻传感器(比如热电偶、RTD)会引入误差。
  • 片内 ADC 的基准源是 VDD 或者外部 VREF,温漂特性一般,要做到高精度需要外部基准。
  • 它和数字外设(PWM、DMA、USB)共用电源域,数字噪声会耦合进模拟采样,想做到 16 位有效分辨率,硬件布线要很小心。

而 ADS122U04 本身就是为高精度温度测量设计的:24 位(有效分辨率可能只有 20 位左右,但已经远超需求)、内置 PGA(可选增益 1/2/4/8/16/32/64/128)、内置低温漂基准(典型 10ppm/℃)、内置两个精密电流源(用于 RTD 激励)、内置温度传感器(用于冷端补偿)、支持 2/3/4 线 RTD 接法,还自带 50Hz/60Hz 工频抑制滤波器。再加上 UART 接口,MCU 端就非常干净——不需要处理时序紧张的 SPI 读操作,只要收串口数据就行。

所以这套组合的本质是:用片外专业 ADC 保证模拟链路精度,用带浮点的通用 MCU 保证系统灵活性和扩展能力。F373 的浮点运算虽然对温度计算不是必须的(温度计算里顶多做个多项式拟合),但以后要扩展 PID、滤波、诊断、通信协议栈,M4F 的算力余量会让你很舒服。

我个人的建议是:如果你只需要做单一类型的温度采集,并且量很大,那直接用专用前端芯片更合适;但如果要做的是“多传感器类型兼容、多种输出方式、需要现场标定和通信”的通用采集模块,ADS122U04 + STM32 这套组合非常扎实。

1.2 系统框图与功能划分

这个项目的定位是一块小型的、可扩展的工业温度采集板卡。核心模块可以拆成下面这些:

  • 传感器接口:支持 2、3、4 线 PT100/PT1000、热电偶(K/J/T 型)、NTC(需要外部电阻分压)、mV 级差分信号。
  • 模拟前端:多路输入选择(用模拟开关或者直接固定通道)、ADS122U04 的差分输入/PGA、滤波电容和钳位保护。
  • 数字核心:STM32F373RC,负责发送 ADS122U04 的配置命令、接收转换结果、做线性化、冷端补偿、滤波、平均、故障判断。
  • 输出与通信:UART 调试口、RS485(通过外挂收发器)、4-20mA 输出(可选,需要 DAC 或 PWM 加调理)、OLED/LCD(可选,调试用)。
  • 电源:24V 或者 12V 输入,DCDC 降到 5V,再 LDO 出 3.3V 模拟和数字分开;参考电压(如果需要外部基准,但 ADS122U04 内部基准已经够用,所以预留 VREF 引脚做扩展测试)。
  • 隔离(可选):如果需要 PLC 直连,UART 侧加数字隔离器(比如 ISO7741),或者直接用 RS485 的隔离收发器(比如 ISO3082);传感器侧如果长线,建议加 TVS 和共模电感。

这样划分的好处是:模拟部分完全集中在 ADS122U04 周边,数字部分就是 STM32 的标准最小系统,两层之间只有 UART 和 GPIO 连接,调试和维护都非常清楚。而且任何一个环节出问题,定位很快。

下面我们按“模拟前端 → 数据采集 → 数据处理与校准 → 通信与应用”这条主线逐步展开。

2. 硬件设计细节与关键参数

2.1 传感器接入方案:PT100/PT1000 与热电偶的差别处理

很多新手拿到 ADS122U04 第一反应是“我直接把传感器两根线接到 AIN0 和 AIN1 就行了吧”。如果你测的是 mV 级差分信号,比如热电偶,那确实可以,但测 RTD(电阻随温度变化)不能这么干,因为 RTD 需要激励电流流过它产生电压,而且导线电阻会带来不可忽略的误差。

RTD 的测量原理是:让一个已知电流流过 PT100,测量其两端电压,根据电压和电流算出电阻,然后查表或者用 Callendar-Van Dusen 方程得到温度。这里有个经典问题——导线电阻。

  • 2 线制:激励电流经过导线到 RTD,再经另一根导线回来。如果导线电阻是 1Ω,PT100 在 0℃ 时是 100Ω,那测出来的电阻是 102Ω,对应温度就多了好几度。所以 2 线制只适合短线、精度要求不高的场合。
  • 3 线制:一条激励线、一条测量线、一条公共线。通过两次测量(或者用 ADC 差分测量)可以抵消一条导线的电阻。这是工业最常见的做法。
  • 4 线制:两根激励线、两根测量线。测量线中几乎没有电流,所以导线电阻完全不影响读数。精度最高,但传感器贵,接线多。

ADS122U04 内置了两个 IDAC(可编程电流源),可以很方便地实现 3 线和 4 线 RTD。我实测下来,4 线制的稳定性和精度明显高于 3 线制,特别是在线比较长的时候。如果你做的是 HVAC 现场,传感器线动不动就是几十米,强烈建议用 4 线或者至少 3 线制。

以 4 线 PT100 为例,连接方式是:IDAC1 输出到 RTD 一端(激励正),RTD 另一端接 IDAC2(激励负)或者直接接 AGND;AIN0 和 AIN1 分别接 RTD 两端的“测量线”。这样测量回路里没有激励电流(严格说只有 ADC 输入偏置电流,非常小),导线电阻的影响就被消除了。

激励电流的选取:ADS122U04 的 IDAC 可设 0、250µA、500µA、1000µA、1500µA 等。我用 500µA 或者 1mA 比较多。

  • 500µA 时,PT100 在 0℃ 产生 50mV 的信号,在 200℃ 产生约 97mV,PGA 设个 8 或 16 倍,信号就能打满 ADC 量程的相当大一部分。
  • 1mA 时信号翻倍,但要注意 RTD 的自热效应:电流越大,传感器自身发热越明显,特别是小体积的薄膜 PT100,误差会明显。500µA 是精度和信噪比之间的好平衡。

通常连接参考电阻 RREF:激励电流也流过 RREF(比如 1.5kΩ 或者 1kΩ 的精密电阻),ADC 用 RREF 两端的电压作为参考(通过 REFP/REFN)。这样电流源的温漂和时间漂移被自动抵消,因为参考电压和传感器电压都来自同一个电流。这正是 ADS122U04 支持“比例式测量”的意义所在,后面我们再细说。

2.2 热电偶测量的冷端补偿与偏置电阻

热电偶是另一种常见传感器,它的原理是“两种不同金属接触时,温差会产生热电势”。但注意——热电偶测的是“测量端和冷端(参考端)之间的温差”,如果你要绝对温度,必须知道冷端的温度。这就是冷端补偿(CJC)。

ADS122U04 内置了一个温度传感器,可以读芯片内部的结温。实际工程中,冷端参考点通常不放在芯片上,而是放在接线端子附近,然后用一个 NTC 或者专用温度传感器贴在端子上测“端子温度”,再结合热电偶的类型做补偿。因为芯片结温不等于端子温度,特别是板子上有功耗器件的时候,差异会非常大。

我自己的做法是:板卡上在接线端子附近焊了一个 NTC(10kΩ B=3435),用另一个低成本 ADC 通道(F373 内置 ADC 即可,不需要高精度)采集,经过查表得到冷端温度。然后用查表法或者多项式法对热电偶电压做补偿。ADS122U04 内部温度传感器只作为参考,不作为正式补偿依据。

热电偶的输出电压非常小:K 型热电偶大概 41µV/℃,J 型大概 55µV/℃,整个工作范围也就十几到几十毫伏。所以 PGA 增益一般设到 32 或 64,这时小信号也能有足够的分辨率。但高增益会放大噪声,所以热电偶测量对 PCB 布局和滤波很敏感。

还有一个很多人忽略的问题:热电偶输入是“浮空”的,ADC 的差分输入需要一个共模电压。如果不接偏置电阻,输入端悬空,读数会乱跳甚至饱和。ADS122U04 手册里明确要求:在 AINP/AINN 上对 AGND 接一个较大电阻(比如 1MΩ~10MΩ),把输入共模点拉到一个确定电位。这个电阻不能太小,否则会分压;也不能不接,否则噪声和漂移很大。我一般用 10MΩ,两个脚各一个。

2.3 电源与 PCB 布局:24V 供电下的多层次降压

一个工业采集模块,供电通常是 24V DC(HVAC 系统里很常见)。直接从 24V 降到 3.3V 做 LDO 太浪费,发热大,而且 DCDC 的开关噪声会污染模拟信号。我的经验是分两步:

  • 第一步:用一片高效率 DCDC(比如 TPS5430 或者国产兼容料)把 24V 降到 5V。避免用太便宜的开关芯片,优先选频率适中(500kHz 左右)、内部补偿完善的型号,输出纹波控制在 30mV 以内。
  • 第二步:5V 用 LDO 降到 3.3V。模拟部分和数字部分各一颗 LDO,比如 ADP151(低噪声)分别供电。模拟 VREF 可以用 ADS122U04 的内部基准,但如果要更高稳定度,也可以外部加一颗 REF3125 或 REF5025。

PCB 布局上的几个原则,我踩过不少坑,后面会细讲,先列一下核心:

  • 模拟地和数字地要单点连接。最简单的办法是:在 PCB 上把整块地分成 AGND 和 DGND 区域,然后在 ADC 芯片底部或者磁珠/0Ω 电阻处单点汇合。不要在多个地方盲目敷铜相连,否则数字回流会穿模拟区。
  • ADS122U04 周边走线尽量短粗,特别是 IDAC 到 RTD、RTD 到 AIN 的走线。长线传感器到板卡之间要加 TVS 二极管(比如 SMAJ6.0A)和串联电阻(比如 1kΩ 或者 100Ω)做限流,防止静电和浪涌把 ADC 打坏。
  • 晶振尽量远离模拟输入走线。STM32 的 HSE 晶振是 8MHz(或者用 HSI 也行,但 UART 波特率精度要求不高的话 HSI 也能用),高频信号会在模拟走线上耦合噪声。
  • 如果加了 RS485 隔离,隔离芯片下方要开槽,把两侧地彻底分开,否则隔离效果大打折扣。

电源是这种“模拟采集 + 数字处理”系统最容易出问题的地方,常表现为:UART 通信正常,但 ADC 读数跳动、噪声大、温漂异常。你如果用示波器抓 AVDD 或者 VREF,会看到和 DCDC 开关频率同步的纹波。所以电源分层一定不能省。

3. ADS122U04 的使用与配置要点

3.1 UART 接口通信机制:命令、应答与数据流

ADS122U04 和 MCU 之间就是一个 UART。它支持两种模式:命令模式和连续输出模式。默认是连续输出模式,上电后如果转换完成,会通过 TX 脚把数据自动发出来。如果你只用默认配置,什么都不用做,MCU 那边就能一直收到 24 位数据。

但实际项目里几乎不可能只靠默认配置,因为你要切换通道、改 PGA 增益、设置 IDAC、开启滤波器等。所以需要发送命令来写寄存器或触发单次转换。

ADS122U04 的 UART 帧格式:一个起始位、8 个数据位、偶校验或无校验、一个停止位,波特率最高大概支持到 2.4Mbps(我印象里上限是 2.4Mbps,实际我用到 57600 或者 115200 很稳定)。寄存器配置通过命令写入,具体命令表建议以官方手册为准。常用命令大致有:

  • 写配置寄存器:0x60之后跟要写入的寄存器数量减一(0~3),然后跟 4 个字节的寄存器值。
  • 读配置寄存器:0x20或类似命令,返回当前寄存器内容。
  • 触发单次转换:芯片上电默认是在连续转换模式,但可以配置成单次转换模式,然后发送单次转换触发命令。
  • 复位命令:可以用硬件 RESET pin 或者软件复位命令。

需要注意的是:ADS122U04 的寄存器是 4 个 8 位寄存器(配置寄存器 0~3),里面定义了输入多路复用器选择、PGA 增益、IDAC 电流大小与方向、滤波器模式、转换模式等。每个寄存器只有 8 位,改动时常常需要先读出当前值再修改某几个位,否则不小心会把别的配置改掉。

我建议的初始化顺序:

  1. 硬件复位(RESET 拉低至少 10µs 再拉高)。
  2. 等待芯片内部上电稳定(可以参考手册的 t_POR 时间,我一般等 10ms)。
  3. 用写寄存器命令按需配置:输入通道(AIN0~AIN3 的差分组)、PGA 增益、IDAC 设置、滤波器、转换模式。
  4. 如果配置为连续模式,芯片会自动开始转换并输出数据;如果是单次模式,发命令触发。
  5. 每次收到数据后,先判断数据头/校验(UART 帧里一般会带 CRC 或者奇偶校验),再解析 24 位 ADC 原始码。

有一个很容易踩的坑:UART 波特率不匹配会导致数据全错。ADS122U04 的波特率由引脚配置决定(比如用 CLK 引脚的分频或者内部定时器),不是自适应波特率。你需要根据手册里的表格,用 GPIO 或者硬件跳线去设置波特率,然后 MCU 端 UART 配置成完全一样。如果出现“发命令没反应、数据乱码”,先检查波特率是不是对上了。

3.2 寄存器配置示例:4 线 PT100 与热电偶场景

我用一个最简单实用的场景来说明:4 线 PT100,PGA=8,IDAC=500µA,内部基准,连续转换模式。

寄存器配置的思路(以 ADS122U04 硬件手册为准,这里给出逻辑步骤而非绝对数值):

  • 输入多路复用器:选择 AIN0=AINP,AIN1=AINN,组成差分输入对,也就是 RTD 的测量线。
  • PGA 增益:设为 8 或 16。500µA 流过 100Ω(0℃)时,信号是 50mV;200℃ 时约 97mV。8 倍增益后是 400mV~776mV,如果 VREF=2.048V、PGA=8,则满量程差分电压约 ±256mV,0℃ 的 50mV 只占到 20% 左右,分辨率仍然很高,但为了充分利用量程可以设 PGA=16。我之前用 PGA=16 配合 500µA 和 PT100,效果不错。
  • IDAC1 输出通道:接到 RTD 激励正端(通过一个匹配电阻或者直接接参考电阻后到 RTD)。
  • IDAC2 输出通道:可以设为关闭或者接到 RTD 的另一端形成回路。4 线制时通常用 IDAC1 提供电流,IDAC2 可以关掉,回路通过 AGND 完成;但其实也可以两个 IDAC 一起用形成“双电流源驱动”,参考电阻两端接 REFP/REFN,这个看具体接法。
  • 参考电压选择:使用内部基准(REFP 引脚接内部基准输出,REFN 接 AGND);或者使用外部参考电阻(比例式测量)——我更推荐后者,因为电流源和 ADC 参考来自同一个激励回路,精度不受电流源绝对值影响。
  • 滤波器模式:选 SINC 滤波器,并启用 50Hz/60Hz 抑制(比如同时抑制模式下数据速率 20 SPS 左右)。HVAC 现场市电工频干扰很厉害,这一步很重要。

热电偶场景则不同:

  • PGA 设 32 或 64。
  • IDAC 通常关闭,除非你需要用 IDAC 去驱动冷端补偿 NTC——这是可选的,不在标准热电偶接法里。
  • 必须给输入端加偏置电阻(10MΩ 对 AGND)。
  • 滤波器模式用 SINC,数据速率选低一些(比如 20~100 SPS),提高噪声抑制。
  • 冷端补偿:由 MCU 读 NTC 温度,查热电偶分度表,把冷端温度对应的热电势加到测量值上,再查总电势对应的温度。

3.3 比例式测量与参考电压设计

说到参考电压,我必须单独拿出来讲一节,因为这是 ADS122U04 这类 Σ-Δ ADC 做 RTD 测量的灵魂。

比例式测量的意思是:ADC 的参考电压和传感器的激励电流来自同一个电流源。具体做法是在激励回路上串联一个精密电阻 RREF(一般取比 RTD 最大电阻略大,比如 1.5kΩ 或 2kΩ),让这个电流经过 RREF 产生一个电压,把这个电压接到 ADS122U04 的 REFP/REFN 引脚。

为什么这样好?

  • 如果电流源有温漂(比如温度升高,输出从 500µA 变成 495µA),传感器上的电压会降低,但同时 RREF 上的电压也降低。ADC 测量的是“传感器电压 / 参考电压”,两者同比例变化,比值不变。
  • 这样一来,电流源的绝对精度和温漂都不重要了,稳压基准也不需要多高级。4 线制 + 比例式测量是做高精度 RTD 的首选结构。
  • 代价是:需要两个额外的引脚(REFP/REFN)接线,还要浪费 RREF 的功耗。RREF 选低温漂的金属箔电阻或者精密薄膜电阻(25ppm/℃ 以下,最好 5ppm/℃),阻值精度倒不重要,因为温度校正时会做标定。

用生活类比理解:比例式测量就像称重时用同一个秤砣既称物体又称标准砝码,如果秤砣本身偏了,两个读数同时偏,比值不变,你就不会错。而普通测量是“用固定砝码称物体”,砝码一旦漂移,全部读数都错。

所以我的建议是:如果你做高精度 RTD 采集,务必用比例式测量。如果你只是做粗略的 NTC 测量,那随便用内部基准就好。

4. STM32F373 固件设计与数据处理

4.1 工程结构与关键代码段

STM32 端的固件,我习惯用 HAL 库(虽然 F373 也可以用标准外设库,但 HAL 更通用,交接给别人也容易上手)。工程的核心模块是:

  • UART:接收 ADS122U04 的数据。通常直接在中断里接收一个完整帧,存到环形缓冲区。
  • GPIO:控制 RESET 脚、可选的 DRDY/中断脚、板卡 LED。
  • 校准与应用层:处理原始码到温度的转换、滤波、故障判断。
  • 通信层:把结果通过另外一个 UART(调试/RS485)输出,协议自己定或者用 Modbus——HVAC 现场 Modbus RTU 是标配,建议直接做。

ADS122U04 的数据帧格式要仔细看手册:它输出的是 24 位数据加上一些状态位,可能还有校验。我一般不去校验每一帧(如果有硬件 CRC 最好用),但至少要做简单的丢帧判断:如果 UART 接收超时(比如 100ms 没有新帧),就要认为 ADC 异常,重新初始化。

核心代码逻辑上,初始化是这样:

void ADS122U04_Init(void) { // 1. 硬件复位 HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET); HAL_Delay(10); // 2. 写寄存器配置 uint8_t txBuf[6]; txBuf[0] = 0x60; // 写配置寄存器命令 txBuf[1] = 0x03; // 要写入 4 个寄存器(数量-1) txBuf[2] = config0; // 输入 MUX、PGA 增益等 txBuf[3] = config1; // 转换模式、数据速率等 txBuf[4] = config2; // IDAC 设置 txBuf[5] = config3; // 参考电压设置、滤波器等 HAL_UART_Transmit(&huart1, txBuf, 6, 100); }

这里config0~config3需要严格按照 ADS122U04 寄存器表去位赋值。不同版本的手册地址可能不完全一样,但逻辑结构类似。新手容易犯的错误是:把命令码当成唯一的写命令,结果读回来发现寄存器的值没变,然后开始怀疑芯片坏了。其实要先看手册确认命令码。

接收解析的例子:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 把收到的字节放入环形缓冲 ringbuf_push(&adc_rb, adc_rx_byte); HAL_UART_Receive_IT(&huart1, &adc_rx_byte, 1); } }

然后主循环或者一个定时任务里,把完整帧从环形缓冲取出来,解析 24 位原始码,转成电压、电阻、温度。

需要提醒的是:ADS122U04 的输出码可能是二进制补码格式,也可能是偏移二进制格式,看你寄存器里“输出格式”位怎么设置。转换的时候一定要先判符号,不要直接当无符号数算,否则负温度(比如 -20℃ 的 PT100 电压仍然是正的,但热电偶冷端补偿前可能产生负电压)会出现莫名其妙的巨大跳变。

4.2 温度线性化:查表法与 Callendar-Van Dusen 方程

温度传感器不是线性的。PT100 在 0℃ 是 100Ω,在 100℃ 是 138.5Ω,电阻变化率大约 0.385Ω/℃,但严格来说曲线有轻微弯曲。热电偶更麻烦:热电势和温度的关系是分段的非线性曲线。

工程上做线性化有两条路:

  1. 查表法:把传感器分度表(IEC 60751 的 PT100 表,或者 IEC 60584 的热电偶表)转成数组或者分区间插值。优点是灵活,缺点是要占存储。PT100 的表格不算大,从 -50℃ 到 300℃ 每 0.1℃ 一个点也就几千字节。热电偶表更大一些,但可以每 1℃ 存一个点,MCU 端线性插值。
  2. 解析公式法:PT100 用 Callendar-Van Dusen 方程,热电偶用多项式拟合。优点是省存储,速度快,缺点是拟合系数的精度要够。像 STM32F373 这种带 FPU 的芯片,算多项式其实非常快,我推荐用这种方式。

Callendar-Van Dusen 方程大致是:

  • 在 0℃ 以上:R(t) = R0 * (1 + At + Bt²)
  • 在 0℃ 以下:R(t) = R0 * (1 + At + Bt² + C*(t-100)*t³)

IEC 60751 标准里,A=3.9083e-3,B=-5.775e-7,C=-4.183e-12(仅 0℃ 以下)。用这个方程,误差能控制在 0.01℃ 级别。

热电偶的线性化,我习惯用 ITS-90 标准的多项式系数。比如 K 型热电偶,正温区用一次多项式加指数项,负温区用另一个多项式。手册里会给系数,直接搬进代码就好。查表法的好处是不用背系数,解析式的好处是代码干净,我实际项目中两种都做过,最终偏向解析式,因为便于参数化校准(后面讲多点校准)。但如果你是新手,查表更稳妥,不用理解底层数学也不容易出错。

4.3 数字滤波与均值处理:现场噪声的应对

ADC 出来的是原始码,直接转温度通常能看但不够稳。HVAC 现场有变频器、压缩机、水泵、电磁阀,干扰源非常多。ADS122U04 自带 SINC 滤波器,已经把很大一部分高频噪声滤掉了,但还需要 MCU 端做进一步处理。

我常用的滤波策略:

  • 中值滤波 + 滑动平均:取最近 N 个原始码,去掉最大最小值,再求平均。N 取 5、7、9 都行。这样既能抗脉冲干扰(电机启停瞬间),又能平滑随机噪声。
  • 限幅滤波:设定一个最大变化率,超过就保持上次值。比如温度每秒最多变化 2℃,超过这个速率认为异常或干扰,丢弃。这个在防突变上很有效。
  • IIR 低通(一阶惯性滤波):y[n] = a*y[n-1] + (1-a)*x[n],a 取 0.8~0.95。适合输出端的最终平滑,但会让响应变慢。温度控制里如果要用 PID,滤波时间常数不要太大,否则闭环会延迟。

我的经验是:先做“中值”再“滑动均值”,输出端再做一阶惯性,效果很稳。但要注意,所有滤波都会引入延迟,HVAC 的温控响应本来就慢(分钟级),所以延迟几秒完全无所谓;如果是做数据记录仪,那就无所谓;如果做快速响应的高温保护,就要折中。

4.4 校准与自检:让精度真正落地

ADS122U04 的绝对精度很高,但“高”是相对于未校准而言的。要让最终温度读数在 0.1℃ 级别,必须在系统层面做校准。校准点根据传感器类型定:

  • PT100:至少做 0℃ 和 100℃ 两点(用冰水混合物和沸水,或者更专业的干体炉)。然后做多项式插值或两点偏移/增益校准,把 ADC 原始码到电阻的换算关系修正。
  • 热电偶:冷端补偿是重中之重。冷端温度传感器(NTC)本身要校准,最好和热电偶冷端在同一个温度场下比对,减少误差。
  • 系统增益校准:用精密电阻箱代替 RTD,接在输入端,设置几个标准电阻值(100Ω、200Ω、300Ω...),看 ADC 输出的电阻值和实际差多少,做线性或分段校准。

具体的做法是:先在不接传感器的情况下,短接 AINP 和 AINN,记录 ADC 的失调码(offset);再在激励回路上接一个已知精密电阻,记录增益误差(gain error)。然后每次测量时用比例关系算出真实电阻。

更简单的做法是直接做两点校准:

T_corrected = (T_raw - T_off) * K_gain + T_bias

K_gain 和 T_bias 通过两个已知温度点解出来。我对批量板卡的做法是:出厂前用恒温槽做三四个点标定,把每个板子的校准系数写进 STM32 的 Flash(比如放在最后一个扇区),每次上电程序启动时读取。这样换板子也不用重新编译固件,运维和产线都非常方便。

自检逻辑也很重要。我至少会做这几项:

  • ADC 通信自检:上电后读一遍寄存器,对比写入值,如果不一致,报通信故障。
  • 断线检测:RTD 开路时,激励电流没有回路,AIN 输入会飘到电源或者地,ADC 输出会饱和或异常码。用“异常码 + 超量程”判断断线或者传感器短路。
  • 温度合理性检查:计算出来的温度如果超出了设定的工作范围(比如 -50℃~200℃),要标记为故障,不能直接使用。
  • 数据新鲜度检查:UART 连续接收如果中断,比如 200ms 没收到新的 ADC 帧,认定采集链路异常,回到重置流程。

工业设备最怕“报一个假数据”而不是“坏了”。一个明显的坏值可能导致系统误动作,比如 HVAC 里温度传感器断线被读成 0K(绝对零度),控制器会拼命加热,后果很严重。所以故障标志和无效数据标记是必须要做的。

5. 常见问题与排障实录

5.1 问题速查表

下面这个表格是我在实际调试中积累的,新增的板卡遇到问题时我会先对着查。

现象可能原因排查与解决
UART 接收乱码波特率引脚配置不对、MCU 与 ADC 波特率不一致重新确认 ADS122U04 波特率选择引脚电平,MCU 端配置一致
发送命令无响应命令格式错误、UART 方向接反用逻辑分析仪抓 TX/RX,比对命令帧格式
ADC 读数始终为 0xFFFFFF传感器断线、输入浮空、PGA 饱和检查输入偏置电阻、用万用表测 AIN 对地电压
ADC 读数噪声大电源纹波、PCB 布局差、传感器长线未滤波抓 AVDD/VREF 波形,观察噪声频率;检查模拟走线
温度读数漂移明显参考电阻温漂大、电流源自热、冷端补偿不准换低温漂 RREF,减小 IDAC 电流,重新标定冷端
低温段误差大Callendar-Van Dusen 方程系数未用 0℃ 以下项检查代码是否实现 t<0 时的 C 系数项
通信正常但读数全部偏大增益校准系数错误、PGA 配置未生效用精密电阻箱做增益校准,检查寄存器写入是否成功
接上长线后读数乱跳共模干扰、TVS 未加、接地环路增加共模电感、TVS,检查隔离地

这个表不用死记,关键是遇到问题知道先抓“电源 → 差分信号 → ADC 配置 → 软件滤波”这条链路,从前往后逐段定位。我调试过太多板子,最终发现绝大多数模拟采集问题都出在电源或者输入共模上,不是 ADC 芯片本身不行。

5.2 我踩过的最深的三个坑

第一个坑:参考电阻放错位置。第一次做比例式测量时,我把 RREF 放在了 IDAC 的输出支路上,但 REFP/REFN 取的是 ADC 内部参考电压,结果读数极其不稳定。后来改用“激励电流同时流过 RREF 和 RTD,REFP 接 RREF 高端,REFN 接 RREF 低端(AGND)”,问题立刻解决。比例式测量里,参考电压的路径必须和传感器激励的路径共享同一个电流源,这一点不能错。

第二个坑:冷端补偿做在芯片结温上。早期为了省事,直接用 ADS122U04 内部温度传感器做 K 型热电偶补偿,在环境温度稳定的实验室看起来还行。一旦把板子放进 HVAC 机箱,周围有电源模块和 MCU,芯片结温比端子温度高了好几度,温差读数一路偏。后来把 NTC 贴到热电偶接线端子附近,再单独走线到 ADC 的一个输入通道,精度立刻回来了。工业现场,“参考端温度”必须定义在传感器接线端,而不是 ADC 芯片内部。

第三个坑:UART 波特率配置引脚被 GPIO 复用。ADS122U04 的波特率选择引脚如果被我误配置成 MCU 的普通 GPIO(上拉输出),工作正常时没事,但只要这块 GPIO 被其他逻辑拉低或者拉高,ADC 的 UART 波特率就变了,随后出现偶发乱码。排查了半天才发现是引脚冲突。所以建议:ADS122U04 的波特率选择引脚直接硬连电压或者通过跳线帽固定,不要交给 MCU 动态控制,除非你确定整个生命周期都不会改。

5.3 现场长期运行的几点提醒

一年多的现场运行下来,除了调试期的问题,还有几个长期可靠性方面的体会:

  • 连接端子一定要选耐振动的。HVAC 机箱里如果有压缩机,振动不小,劣质端子几个月后接触电阻变大,RTD 读数开始漂。工业用弹簧端子或者螺丝端子都要压实。
  • 传感器线建议走屏蔽线,屏蔽层单端接地(在板卡端接 AGND)。两端都接地容易形成地环路,反而引入工频干扰。
  • 防护器件不能省。我在每路传感器入口加了 TVS 和串联电阻,雷击浪涌不一定天天发生,但变频器启动瞬间的浪涌很常见。第一次做样机没加 TVS,一个夏天就烧了两片 ADC,心疼了挺久。
  • 固件升级时注意保存校准参数。我遇到过:做 OTA 升级后,新固件把 Flash 里的校准区域覆盖了,整板校准参数全丢,现场数据全部偏差。现在我把校准区和应用固件分开两个扇区,每次升级前先备份,升级后校验。

6. 从模块到产品:扩展方向与长远思考

如果你打算把这个采集模块做成完整的产品,前端采集只是基础,后面还有很多事情要考虑。先把我的建议列出来:

  • 通信协议:HVAC 领域最实用的是 Modbus RTU over RS485。一个主站挂几十个温度采集模块,每个模块一个地址,通过寄存器映射读温度、状态、校准系数。F373 串口资源够,用一个 UART 做 ADC 通信,另一个 UART 挂 RS485,完全够用。
  • 多通道扩展:如果一路 ADC 不够,可以每个 ADS122U04 单独一组(因为它是 UART,原则上可以一主多从,但需要芯片支持菊花链或者地址模式,要看手册)。更常见的做法是每块板卡一个 ADC,多个板卡用 RS485 组网。
  • 4-20mA 输出:很多 HVAC 控制器只接受模拟量。可以在 F373 上用带 DAC 的型号(F373 本身就带 DAC)输出 0~3.3V,再通过 V/I 转换电路驱动 4-20mA 环路。或者用 PWM + 有源滤波器 + 运放做 V/I。温度到 4-20mA 的映射做线性化:比如 0℃=4mA,100℃=20mA,中间按校正后的温度值算。
  • 本地显示与按键:调试阶段我有一个板卡用 12864 OLED 显示当前温度和 ADC 原始码,非常方便。量产后如果要做现场显示,可以用 Modbus 从站加一个 HMI,或者直接在模块上加数码管。
  • 数据记录:STM32F373 内部 Flash 容量不算大,如果需要本地记录,可以外挂一个 SPI Flash(比如 W25Q64)或者 SD 卡,记录每分钟一个温度点,几个月的数据也就几 MB,完全没压力。
  • 低功耗:如果做电池供电的无线温度记录仪,这套方案的功耗会偏高。ADS122U04 本身空闲电流不大,但 F373 加上 LDO 后整板电流会到几十毫安。要做低功耗建议换低功耗 MCU 或者做电源门控,不过这就是另一个项目了,不在标题范围内。

做产品还有一个重要理念:把测量链路做成标准化模块,后面换 MCU、换通信(从 Modbus 换 BACnet),底层传感器调理和校准逻辑都不用动。这也是当初我选择“ADC 外置、MCU 通用”的原因——你换 F373 为 F4 或 F0 只需要改 UART 驱动层,算法层和硬件前端可以整体复用。一个在 HVAC 行业做了十几年的老前辈跟我说过一句话:“温度采集这种东西,原理大家都懂,但真正拉开差距的是稳定性和一致性。”我现在很认同,ADS122U04 + STM32 这种组合,就是为了把“稳定性和一致性”做扎实而选的。

7. 结尾的私人建议

最后说点个人体会。做工业测量模块这几年,我越来越觉得,项目成功不是看芯片选得多高级,而是看你能不能让系统在恶劣环境下长期稳定地输出可靠数据。ADS122U04IPWR 和 STM32F373RC 的组合,性能上完全有余量,真正的功夫都花在电源设计、PCB 布局、校准流程和固件健壮性上。

如果你正准备做类似的东西,我建议第一版不要急着一口气把多通道、RTD、热电偶全都做好。先固定一种传感器(比如 4 线 PT100),打通“ADC 采集 → UART 接收 → 温度计算 → 通信输出”这条完整回路,跑一个礼拜看稳定性,再逐步加通道和传感器类型。温度测量这东西,数据对不对,一眼就能看出来;但稳不稳,要连续跑几天才能验证。第二版再针对问题做电源优化、校准和一致性提升。这样迭代,比一开始就堆功能要省心得多。

如果你之后在调试中遇到“读数漂、噪声大、通信乱”之类的问题,欢迎评论交流,我尽量给出排查方向。做硬件就是一个不断踩坑和解坑的过程,把坑记录下来,后面的人才不用重新踩一遍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 3:11:40

ADS122U04搭配PIC18F86K90:工业RTD温度采集方案解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:11:35

工业温度测量硬件设计:ADS122U04IPWR+STM32F745ZG高精度信号链构建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:11:16

基于ADS122U04与PIC18F87J50的高精度RTD温度采集方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:11:14

工业级温度测量:ADS122U04+STM32F207高精度抗扰设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:11:13

ADS122U04+STM32F072RB:工业高精度温度采集系统设计与调试实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:11:06

ADS122U04+STM32L031多路RTD/NTC温度采集设计指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华