ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于ADS122U04与STM32F373RC的高精度工业测温方案设计与实现

基于ADS122U04与STM32F373RC的高精度工业测温方案设计与实现

工业现场的温度测量,最怕两件事:一是小信号被噪声吃掉,二是冷端补偿没做对,读数飘得让人怀疑人生。我最近在做一个 HVAC 风管温度采集的项目,用的就是ADS122U04IPWR这颗 24 位 ΔΣ ADC 配STM32F373RC,前者负责把铂电阻和热电偶的微弱信号抠出来,后者负责换算、线性化和通信。整套方案跑下来,-40℃ 到 200℃ 区间内实测精度能稳在 ±0.3℃ 以内,成本却比买成品变送器低了一大截。这篇就把选型逻辑、硬件设计、寄存器配置、冷端补偿算法和踩过的坑一次性讲清楚,适合正在做工业测温、HVAC 温控、或者想从 12 位 ADC 升级到高精度方案的嵌入式工程师参考。

1. 为什么是 ADS122U04 加 STM32F373RC 这个组合

1.1 先搞清楚测温链路里谁在决定精度

很多人做温度测量,第一反应是选个高精度传感器就完事了,其实整条链路的误差是逐级累积的。传感器本身的精度、激励源的稳定性、PGA 的噪声、ADC 的分辨率、参考电压的温漂,每一环都会往最终读数里塞误差。我习惯把这条链路拆成三段来看:前端激励与信号调理、模数转换、数字处理与补偿。

前端这块,铂电阻(RTD)需要恒流激励,热电偶需要冷端补偿,热敏电阻虽然简单但线性度差。模数转换这块,工业现场 4-20mA 或者直接 mV 级信号,12 位 ADC 在 3.3V 参考下每个 LSB 就是 0.8mV,换算到 PT100 上大概 2℃,根本不够看。数字处理这块,线性化、滤波、冷端补偿都得靠 MCU 算。

所以选型的核心矛盾就变成了:在有限的 BOM 成本内,把前端和 ADC 的噪声压到最低,同时 MCU 要有足够的算力做实时补偿。ADS122U04 和 STM32F373RC 这个组合,恰好卡在这个平衡点上。

1.2 ADS122U04 到底强在哪

ADS122U04 是 TI 的一颗 24 位、4 通道、ΔΣ 架构的 ADC,内置 PGA、基准电压源和激励电流源。我选它主要看中几个点:

  • 内置 2.048V 基准,温漂典型值 5ppm/℃。别小看这个,外置基准芯片便宜的一颗也要几毛钱,还占板面积,内置基准省事又省心。
  • PGA 增益 1 到 128 可配。PT100 在 0℃ 时只有 100Ω,1mA 激励下压降才 100mV,增益拉到 16 或 32 正好把信号顶到 ADC 满量程附近,有效位数能多出两三位。
  • 两路匹配的 IDAC 激励电流源。做三线制或四线制 RTD 时,两路电流源可以互相抵消引线电阻,这个后面细讲。
  • SPI 接口,最高 2MHz。STM32F373RC 的 SPI 跑起来毫无压力。
  • 内置温度传感器,虽然精度一般(±0.5℃ 左右),但做冷端补偿的粗基准够用了。

它的封装是 TSSOP-16,引脚间距 0.65mm,手工焊接有点费劲,但批量贴片没问题。

1.3 STM32F373RC 的角色不只是"读数据"

STM32F373RC 是 ST 的 Cortex-M4 系列,带 FPU,主频 72MHz,有 256KB Flash 和 32KB RAM。选它而不是更便宜的 F0 或 F1,原因有三个:

第一,它自带 16 位 SDADC。虽然这个项目里高精度转换交给 ADS122U04 了,但 SDADC 可以用来做辅助通道,比如监测环境温度或者激励电流的实际值,省一颗外部 ADC。

第二,FPU 对温度补偿算法很关键。PT100 的 Callendar-Van Dusen 方程、热电偶的多项式拟合,都是浮点运算,没有 FPU 的话用软件浮点库会拖慢采样周期。

第三,外设够用。三路 SPI、多路 UART、CAN,做 HVAC 网关时可以直接把数据往上送,不用再加通信芯片。

提示:如果只是做单通道温度采集,STM32F373 有点浪费,用 F0 加软件浮点也能跑。但如果是多通道、带通信、带显示的温控器,F373 的性价比就体现出来了。

2. 硬件设计里那些容易翻车的地方

2.1 模拟前端布局:地平面分割不是玄学

ADS122U04 的模拟输入是差分输入,对共模干扰有一定抑制,但不代表可以随便布线。我在第一版板子上就吃了亏:ADC 的 AGND 和 MCU 的 DGND 混在一起,数字回流路径穿过模拟区域,结果采样值里混进了明显的开关噪声,频谱上看正好是 SPI 时钟的谐波。

正确的做法是单点接地。具体操作:

  1. 在 PCB 上划分模拟区和数字区,ADS122U04、基准电容、输入滤波电容全部放在模拟区。
  2. AGND 和 DGND 用 0Ω 电阻或者磁珠在靠近 ADC 的位置单点连接。
  3. 模拟输入走线尽量短,差分对等长,远离 SPI 时钟线和电源开关节点。
  4. 输入端的共模滤波电容(一般 10nF 到 100nF)要靠近 ADC 引脚,差模滤波电容(1nF 到 10nF)跨接在 AINP 和 AINN 之间。

我实测过,同样的电路,地平面处理好了,噪声有效值能从 20μV 降到 5μV 以下,换算到 PT100 上就是 0.05℃ 的差别。

2.2 激励电流源与 RTD 接法:三线制还是四线制

PT100 的引线电阻是个绕不开的问题。一根 0.5mm² 的铜线,每米电阻大概 35mΩ,如果引线有 10 米,来回就是 0.7Ω,换算到 PT100 上差不多 1.8℃ 的误差。这个误差不能忍。

两线制最简单,但引线电阻直接串进测量回路,只适合引线极短或者精度要求不高的场合。

三线制是工业上最常用的。ADS122U04 有两路匹配的 IDAC,可以这样接:IDAC1 从 AIN0 流出,经过 RTD 到 AIN1,再经过引线回到地;IDAC2 从 AIN2 流出,经过另一根补偿引线到 AIN1。这样两根引线的压降在差分测量里互相抵消,前提是两路 IDAC 匹配度够好。ADS122U04 的 IDAC 匹配度典型值是 0.1%,已经够用了。

四线制精度最高,两路电流源分别从 RTD 两端注入,另外两根线专门做电压检测,完全消除引线电阻影响。缺点是接线多,适合高精度实验室场合。

我一般推荐三线制,性价比最高。接线示意如下:

接法引线数引线电阻影响适用场景
两线制2完全计入短引线、低精度
三线制3基本抵消工业现场、HVAC
四线制4完全消除实验室、高精度

2.3 热电偶的冷端补偿电路怎么搭

热电偶测的是热端和冷端的温差,要得到绝对温度,必须知道冷端温度。冷端补偿有两种常见做法:

一种是用 ADS122U04 内置的温度传感器。它测的是芯片结温,如果冷端节点和 ADC 芯片温度一致(比如冷端就在 PCB 上),那直接用内置传感器读数做补偿就行。缺点是芯片自身发热会影响读数,需要做自热补偿。

另一种是外置一颗高精度温度传感器,比如 TMP117 或者 DS18B20,贴在冷端接线端子附近。这样测的是真实的冷端温度,精度更高,但多一颗料。

我在 HVAC 项目里用的是第二种,因为风管机的接线端子离主板有段距离,内置传感器测的温度和实际冷端温度差了 3℃ 多,补偿出来误差太大。外置传感器用 TMP117,I2C 接口,精度 ±0.1℃,直接挂在 STM32 的 I2C 上。

注意:冷端补偿的关键是"冷端节点"和"温度传感器"要热耦合良好。我见过有人把传感器放在板子另一头,中间隔着电源模块,测出来的温度比冷端高 5℃,补偿完全失效。正确做法是把传感器贴在接线端子背面,中间涂导热硅脂,或者用铜箔把两者连起来。

2.4 电源与去耦:别让 LDO 毁了一切

ADS122U04 的模拟电源和数字电源是分开的,AVDD 和 DVDD 都要干净。我用的是 3.3V 单电源供电,AVDD 通过一颗低噪声 LDO(比如 TPS7A47)单独供电,DVDD 直接接系统 3.3V。

去耦电容的配置:

  • AVDD 到 AGND:10μF 钽电容 + 100nF 陶瓷电容,靠近引脚。
  • DVDD 到 DGND:1μF + 100nF。
  • 基准输出 REFOUT 到 AGND:1μF 钽电容 + 100nF,这个电容对基准噪声影响很大,不能省。
  • 每个模拟输入引脚到 AGND:100nF,做共模滤波。

我试过把 AVDD 直接接系统 3.3V,结果采样噪声大了将近一倍。后来加了 LDO,噪声立刻降下来。所以如果项目对精度有要求,模拟电源一定要单独处理。

3. ADS122U04 的寄存器配置与 SPI 通信实操

3.1 寄存器映射与关键配置项

ADS122U04 有 4 个配置寄存器(Config0 到 Config3),通过 SPI 读写。SPI 命令格式是:第一个字节是命令,后面跟数据。常用命令:

  • 0x01:读寄存器,后面跟要读的寄存器地址。
  • 0x03:写寄存器,后面跟寄存器地址和数据。
  • 0x08:启动转换。
  • 0x0C:进入关断模式。

Config 寄存器的关键位:

寄存器位功能我的配置
Config0MUX[3:0]输入通道选择根据通道切换
Config0GAIN[2:0]PGA 增益16(PT100)
Config0PGA_BYPASSPGA 旁路0(使能)
Config1DR[2:0]数据速率20SPS
Config1MODE[1:0]转换模式连续转换
Config1CM转换模式单次
Config2VREF[1:0]基准选择内部 2.048V
Config2IDAC[2:0]激励电流1mA
Config3I1MUX[2:0]IDAC1 路由AIN0
Config3I2MUX[2:0]IDAC2 路由AIN2

数据速率的选择很关键。20SPS 时,50Hz 和 60Hz 工频抑制同时有效,这对工业现场特别重要。如果追求速度,可以提到 90SPS 或 330SPS,但工频抑制会变差。HVAC 温度变化慢,20SPS 完全够用,我一般就用这个速率。

3.2 STM32 端 SPI 初始化代码

STM32F373RC 的 SPI 配置成主机模式,时钟极性 CPOL=0,相位 CPHA=1,对应 ADS122U04 的 SPI 模式 1。时钟频率先降到 1MHz 调试,稳定后再提到 4MHz。

void ADS122U04_SPI_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; SPI_HandleTypeDef hspi1; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE(); // PA5=SCK, PA6=MISO, PA7=MOSI GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; HAL_SPI_Init(&hspi1); }

片选 CS 用普通 GPIO 控制,每次读写前拉低,完成后拉高。注意 ADS122U04 要求 CS 在命令之间保持高电平,否则会复位通信状态机。

3.3 读转换结果的完整流程

一次完整的温度采集流程是这样的:

  1. 配置寄存器,设置通道、增益、数据速率、IDAC。
  2. 发送 START/SYNC 命令(0x08)启动转换。
  3. 等待 DRDY 引脚变低,表示转换完成。
  4. 读取 3 字节转换结果(24 位)。
  5. 把二进制补码转换成有符号整数。
  6. 根据基准电压和增益换算成电压值。
  7. 用电压值反推电阻或热电偶电动势。
  8. 查表或多项式计算温度。

读取数据的代码:

int32_t ADS122U04_ReadData(void) { uint8_t txBuf[4] = {0x10, 0x00, 0x00, 0x00}; // 读数据命令 uint8_t rxBuf[4] = {0}; int32_t rawData = 0; CS_LOW(); HAL_SPI_TransmitReceive(&hspi1, txBuf, rxBuf, 4, 100); CS_HIGH(); rawData = ((int32_t)rxBuf[1] << 16) | ((int32_t)rxBuf[2] << 8) | ((int32_t)rxBuf[3]); // 24位补码转32位有符号 if (rawData & 0x00800000) { rawData |= 0xFF000000; } return rawData; }

换算公式:

V = (rawData / 2^23) * VREF / Gain

其中 VREF = 2.048V,Gain = 16。满量程输入是 ±VREF/Gain = ±128mV,对应 24 位有符号数的 ±2^23。

提示:DRDY 引脚一定要用中断或者轮询检测,不要用固定延时。因为 ADS122U04 在连续转换模式下,第一次转换需要的时间比后续长(要等基准和 PGA 稳定),固定延时容易读到无效数据。

4. 从原始码值到温度:补偿算法与线性化

4.1 PT100 的 Callendar-Van Dusen 方程

PT100 的电阻和温度关系不是线性的,标准用 Callendar-Van Dusen 方程描述:

  • 当 T ≥ 0℃ 时: R(T) = R0 * (1 + AT + BT²)
  • 当 T < 0℃ 时: R(T) = R0 * (1 + AT + BT² + C*(T-100)*T³)

其中 R0 = 100Ω,A = 3.9083e-3,B = -5.775e-7,C = -4.183e-12。

反过来,从电阻求温度,正温度区间可以用二次方程求根:

T = (-A + sqrt(A² - 4*B*(1 - R/R0))) / (2*B)

负温度区间没有解析解,一般用迭代法或者查表加插值。我在 STM32 上用的是分段线性插值加牛顿迭代,先查表得到粗略温度,再用牛顿法迭代两次,精度能到 0.01℃。

float PT100_ResistanceToTemperature(float resistance) { float R0 = 100.0f; float A = 3.9083e-3f; float B = -5.775e-7f; float C = -4.183e-12f; float T; if (resistance >= R0) { // 正温度,二次方程求根 float discriminant = A*A - 4*B*(1 - resistance/R0); T = (-A + sqrtf(discriminant)) / (2*B); } else { // 负温度,牛顿迭代 T = (resistance - R0) / (R0 * A); // 初值 for (int i = 0; i < 5; i++) { float f = R0 * (1 + A*T + B*T*T + C*(T-100)*T*T*T) - resistance; float df = R0 * (A + 2*B*T + C*(4*T*T*T - 300*T*T)); T = T - f / df; } } return T; }

4.2 热电偶的多项式拟合与冷端补偿

热电偶的输出是热端和冷端的温差电动势,要得到热端绝对温度,需要:

  1. 测量热电偶输出电压 V_tc。
  2. 测量冷端温度 T_cold。
  3. 查表得到冷端温度对应的等效电动势 V_cold。
  4. 计算热端等效电动势 V_hot = V_tc + V_cold。
  5. 用 V_hot 查表或多项式计算热端温度 T_hot。

NIST 提供了各种热电偶的分度表,但直接查表占 Flash。我一般用分段多项式拟合,把整个量程分成几段,每段用 5 到 7 阶多项式,系数存在 Flash 里。以 K 型热电偶为例,-200℃ 到 0℃ 和 0℃ 到 1372℃ 用不同的系数。

冷端补偿的代码逻辑:

float Thermocouple_GetTemperature(float v_tc, float t_cold) { // 冷端温度对应的等效电动势 float v_cold = KType_TempToVoltage(t_cold); // 热端等效电动势 float v_hot = v_tc + v_cold; // 反查热端温度 return KType_VoltageToTemp(v_hot); }

这里有个坑:冷端补偿的符号不能搞反。热电偶的输出电压是热端减冷端,如果冷端温度升高,输出电压会减小。所以补偿时要加上冷端的等效电动势,而不是减去。我第一版代码就是符号搞反了,室温下读数偏低 20 多度,排查了半天。

4.3 数字滤波:在响应速度和噪声之间找平衡

ADS122U04 在 20SPS 时已经做了 sinc 滤波,但输出数据里还是有随机噪声。我在 MCU 端再加一级滑动平均滤波,窗口大小 8 到 16 个点。窗口越大噪声越小,但响应越慢。

对于 HVAC 应用,温度变化本身就很慢,时间常数几十秒都正常,所以窗口可以取大一点。我一般用 16 点滑动平均,配合 20SPS 的采样率,等效更新率大概 1.25Hz,完全够用。

如果遇到快速变化的场景,比如温度冲击测试,可以切换到中值滤波加滑动平均的组合:先取 5 个点去掉最大最小,剩下的做平均。这样既能抑制脉冲干扰,又不会太拖慢响应。

注意:滤波窗口大小要和采样率匹配。如果采样率是 20SPS,窗口 16 意味着 0.8 秒的数据延迟。如果系统要求 100ms 内响应,这个窗口就太大了,得降到 4 或者 8。

5. 实测中踩过的坑与排查过程

5.1 读数跳变:从电源噪声查到 SPI 时序

项目调试到一半,发现温度读数每隔几秒就跳一下,幅度大概 0.5℃。一开始怀疑是传感器问题,换了一根 PT100 还是一样。用示波器看 ADC 的模拟输入,发现上面有周期性的尖峰,频率和 SPI 通信一致。

排查过程:

  1. 先断开 SPI,让 ADC 自由运行,跳变消失。说明干扰来自 SPI。
  2. 检查 PCB 布局,发现 SPI 时钟线从模拟输入走线旁边经过,平行长度大概 5mm。
  3. 把 SPI 时钟线改道,远离模拟区域,跳变幅度降到 0.1℃。
  4. 进一步在模拟输入端加 RC 滤波(1kΩ + 100nF),跳变完全消失。

这个坑的教训是:SPI 时钟线是高频开关信号,绝对不能和模拟输入走线平行或者交叉。如果 PCB 已经做好了,可以在软件上把 SPI 时钟降速,也能缓解,但根治还是要改板。

5.2 冷端补偿偏差:传感器位置决定成败

前面提到过,我把冷端补偿传感器放在主板另一头,结果补偿出来误差 3℃ 多。后来把 TMP117 移到接线端子背面,误差降到 0.2℃ 以内。

这里还有个细节:TMP117 和接线端子之间要填充导热材料。我一开始只是用双面胶贴上去,接触热阻大,响应慢。后来改用导热硅胶垫,热耦合好了很多,冷端温度跟踪速度快了一个数量级。

另外,如果冷端附近有发热元件(比如 LDO 或者 MCU),要把它们隔开,或者加屏蔽罩。我在板子上把 LDO 移到了远离接线端子的位置,冷端温度稳定性明显改善。

5.3 寄存器配置不生效:SPI 模式选错

有一次换了颗新的 ADS122U04,发现怎么配置寄存器都读回来是默认值。检查了电源、片选、时钟,都没问题。最后用逻辑分析仪抓 SPI 波形,发现数据在时钟的第二个边沿被采样,而我配置的是第一个边沿。

ADS122U04 的 SPI 模式是CPOL=0,CPHA=1,也就是时钟空闲低电平,数据在第二个边沿采样。STM32 的 SPI 配置里,这对应SPI_PHASE_2EDGE。我一开始配成了SPI_PHASE_1EDGE,数据错位,寄存器自然写不进去。

改过来之后一切正常。这个坑很隐蔽,因为 SPI 通信看起来"有波形",但数据是错的。建议调试 SPI 设备时,一定要用逻辑分析仪或者示波器看波形,不要只靠代码判断。

5.4 自热效应:激励电流不能太大

PT100 的激励电流会产生自热,电流越大自热越严重。1mA 激励下,PT100 上的功耗是 I²R = 1mA² × 100Ω = 0.1mW。这个功耗在静止空气中会让传感器温度升高大概 0.1℃ 到 0.2℃。

如果追求极致精度,可以把激励电流降到 0.5mA 甚至 0.25mA,但信号幅度也会减小,对 ADC 噪声要求更高。ADS122U04 的 IDAC 可以配 10μA 到 1.5mA,我一般用 1mA 做折中,精度要求特别高时用 0.5mA。

另外,连续转换模式下自热是持续的,如果传感器在静止空气中,温升会累积。可以改成单次转换模式,测完就关断 IDAC,等下次测量再开启。这样自热影响能降到最低,代价是每次测量前要等基准和 PGA 稳定,响应慢一点。

6. 系统集成与 HVAC 场景的特殊考量

6.1 多通道切换:MUX 的建立时间不能忽略

ADS122U04 有 4 个模拟输入通道,可以轮流测量多个传感器。但通道切换后,PGA 和 ADC 需要建立时间。如果切换后立刻启动转换,第一次读数会不准。

我的做法是:切换通道后,先丢弃前两次转换结果,从第三次开始取数。这样虽然牺牲了一点速度,但保证了精度。如果通道间电压差很大,建立时间还要加长,可以适当降低数据速率。

对于 HVAC 应用,一般测 2 到 4 个点:送风温度、回风温度、室外温度、 maybe 一个湿度补偿用的温度。4 通道轮流测,20SPS 下每个通道 5SPS,完全够用。

6.2 与上位机的通信协议设计

温度数据算出来后,要通过 UART 或者 CAN 往上位机送。我用的协议很简单:

字节内容说明
0帧头 0xAA固定
1通道号0-3
2-5温度值float,小端
6状态0=正常,1=传感器故障
7校验和前面字节异或
8帧尾 0x55固定

这个协议简单可靠,解析方便。如果走 Modbus,可以把温度值放大 100 倍存成 16 位整数,用保持寄存器传输。

6.3 故障检测:断线和短路的判断逻辑

工业现场传感器断线是常事,系统要能检测出来并报警。PT100 断线时,ADC 读数会跑到满量程或者负满量程,因为 IDAC 没有回路,输入电压被拉到电源轨。

判断逻辑:

  • 如果原始码值接近 +2^23 或者 -2^23,判定为断线。
  • 如果读数在正常范围内但变化率异常大(比如一秒内跳变超过 10℃),判定为干扰或者接触不良。
  • 如果冷端补偿传感器读不到数据,切换到内置温度传感器做降级补偿,同时报警。

我在代码里加了一个状态机,每个通道独立维护故障标志,故障恢复后自动清除。这样上位机能看到每个通道的健康状态,方便运维。

6.4 低功耗设计:电池供电场景的取舍

如果设备是电池供电的,功耗就要仔细算了。ADS122U04 在连续转换模式下功耗大概 1.5mW,关断模式下不到 1μW。STM32F373RC 跑 72MHz 时大概 30mA,休眠时几微安。

低功耗策略:

  1. 平时 MCU 休眠,定时器唤醒。
  2. 唤醒后给 ADS122U04 上电,等基准稳定(大概 1ms)。
  3. 启动单次转换,等 DRDY。
  4. 读数据,算温度,通过无线或者总线发送。
  5. 关断 ADS122U04,MCU 继续休眠。

这样平均功耗可以做到几十微安,两节 AA 电池能用好几年。代价是每次测量要等基准稳定,响应慢,适合温度变化慢的场合。

提示:ADS122U04 从关断模式唤醒后,基准和 PGA 需要建立时间。数据手册上写的是典型 1ms,但实际测试中,如果环境温度变化大,建立时间可能更长。建议唤醒后延时 2ms 再启动转换,保险一点。

7. 精度验证与校准方法

7.1 用标准电阻箱做多点校准

板子做出来后,不能直接信读数,要用标准电阻箱校准。我用的是一台 0.01% 精度的电阻箱,模拟 PT100 在不同温度下的阻值:

温度点PT100 标准阻值实测阻值误差
-40℃84.27Ω84.31Ω+0.04Ω
0℃100.00Ω100.02Ω+0.02Ω
50℃119.40Ω119.38Ω-0.02Ω
100℃138.51Ω138.55Ω+0.04Ω
150℃157.33Ω157.30Ω-0.03Ω
200℃175.86Ω175.90Ω+0.04Ω

误差在 ±0.05Ω 以内,换算成温度大概 ±0.13℃。这个精度对于 HVAC 应用绰绰有余。

校准的时候要注意:电阻箱的引线电阻要算进去。我用的是四线制接法,电阻箱端子的引线电阻被消除了,但如果是两线制,引线电阻会直接叠加,校准就不准了。

7.2 温度循环测试:看长期稳定性

校准完还要做温度循环,把板子放进温箱,从 -40℃ 升到 85℃,再降回来,看读数是否一致。我做了 5 个循环,记录每个温度点的读数偏差。

结果发现,第一次循环的偏差比后面几次大,大概 0.2℃。分析原因是 PCB 上的应力在温度变化中释放,导致焊点接触电阻变化。跑完两个循环后,偏差稳定在 0.1℃ 以内。

所以如果项目对精度要求高,建议做温度老化,让板子在高温下放几个小时,再校准。这样能消除大部分应力影响。

7.3 现场安装的注意事项

板子装到现场后,还有几个坑:

  • 传感器引线要屏蔽。工业现场电磁干扰强,不屏蔽的话读数会跳。屏蔽层单端接地,接在板子的 AGND 上。
  • 传感器和板子之间的地电位差。如果传感器离板子很远,两地之间可能有电位差,形成共模干扰。可以用隔离放大器或者隔离 ADC,但成本高。简单做法是确保传感器地和板子地可靠连接。
  • 接线端子要防氧化。HVAC 现场湿度大,铜端子容易氧化,接触电阻变大。用镀金端子或者涂防氧化剂。

我在一个项目里遇到过端子氧化导致读数偏高 2℃ 的情况,换了镀金端子后问题解决。这种问题很隐蔽,因为一开始读数正常,过几个月才慢慢漂移。

8. 写在最后的一些个人体会

这套 ADS122U04 加 STM32F373RC 的方案,我从第一版调试到稳定运行,前后花了大概两个月。最大的感受是:高精度温度测量的瓶颈往往不在 ADC 本身,而在前端设计和补偿算法。ADS122U04 的 24 位分辨率听起来很厉害,但如果前端噪声没压住,有效位数可能只有 16 位甚至更低。

另一个体会是冷端补偿和引线补偿这些"细节"决定成败。很多人把精力花在选高精度 ADC 上,却忽略了传感器接法和补偿算法,最后精度上不去,还找不到原因。我的建议是,先把前端电路和补偿逻辑做扎实,再考虑升级 ADC。

最后分享一个调试小技巧:用已知温度点反推系统误差。比如冰水混合物是 0℃,沸水是 100℃(注意气压修正),用这两个点快速验证系统是否正常。如果偏差大,先查硬件;如果偏差小但线性度差,查补偿算法。这个方法比直接上温箱快得多,适合快速定位问题。

这套方案目前在几个 HVAC 项目上跑了一年多,现场反馈稳定。如果你也在做类似的东西,希望这些经验能帮你少走点弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进