☰
ADS122U04与STM32的UART温度采集实战:从硬件到固件全解析
2026/11/5 3:16:51 网站建设 项目流程

如果你做过工业温度采集或者 HVAC 控制柜,大概率经历过这种尴尬:传感器、MCU 都没问题,结果卡在 ADC 和 MCU 之间那几根线的接口上。我最近给一套风机盘管控制器升级温度采集模块,用的就是 ADS122U04IPWR 搭配 STM32F417ZG,专门处理 PT1000 和 K 型热电偶的测量。这套方案最有意思的地方,不是 24 位精度本身,而是 ADS122U04 这颗 ADC 居然带 UART 接口,和 STM32 之间只需要两根数据线,这在现场布线、电气隔离、抗干扰这些环节上,直接省掉了一大堆麻烦。

ADS122U04IPWR 是 TI 的 24 位 Δ-Σ ADC,内部集成可编程增益放大器、激励电流源、内部基准和温度传感器,典型的应用场景就是 RTD、热电偶、热敏电阻这类温度传感器的高精度采集。STM32F417ZG 则是意法半导体 Cortex-M4F 内核的 MCU,带 FPU,主频可以到 168MHz,做温度换算、线性化修正,甚至顺手跑个 PID 控制都绰绰有余。这篇文章我会把这套系统从芯片选型、硬件电路、固件配置到现场调试中踩过的坑,完整地讲一遍,适合正在做工业数据采集、楼宇自控、HVAC 控制器的工程师参考。

1. 方案选型:为什么是“UART ADC + 通用MCU”这套组合

1.1 一块带 UART 接口的 24 位 ADC 解决了什么问题

很多人一听 ADC,脑子里第一个反应就是 SPI,因为工业采集板上一大片都是 SPI 接口的 ADC,比如 ADS1256、AD7793 这些。SPI 接口本身没什么问题,但在实际工程项目里,它有几个不那么舒服的地方。

首先是线束。标准 SPI 至少要四根线:SCLK、DIN、DOUT、CS,如果还要 DRDY 信号,就是五根。温度传感器往往不在主控板上,信号要经过端子排、线槽、航空插头才能到传感器位置,多一根线,现场接线的容错率就低一截。其次是隔离。工业环境里为了抗共模干扰和地电位差,ADC 和 MCU 之间经常要加数字隔离器,SPI 的时钟线和数据线一旦隔离,时序约束就变得很敏感,隔离器延迟、PCB 走线长度稍微有点差异,SPI 速率就得往下降。

ADS122U04IPWR 把接口换成了 UART 兼容的异步串行方式。对 MCU 来说,它就是一个串口外设,你不需要关心 SCLK 的相位、CS 的拉低时机,只要按照 UART 帧格式发命令,芯片就会回数据。MCU 端资源占用也很简单:一个串口 TX 接 DIN,一个串口 RX 接 DOUT,波特率配好就能通信。如果想做电气隔离,选一个两通道的数字隔离器就够了,不像 SPI 那样要通道多的隔离芯片。

在 HVAC 场景里,这个优势特别明显。风管温度传感器、水管温度传感器分布在几十米范围内,采集模块和主控制器之间经常走屏蔽双绞线。UART 接口本身对时序要求宽松,线长一点,波特率放低一点,照样能稳定工作。我在项目里用 9600 波特率,100 米的屏蔽线实测下来没有通信错误,这在 SPI 模式下是很难想象的。

1.2 STM32F417ZG 在这里担任什么角色

STM32F417ZG 这颗芯片用在温度采集模块上,规格上肯定有富余,但实际项目里它往往不只是负责读 ADC。我的这块板子上,STM32F417ZG 还要跑 Modbus 从站协议、控制继电器输出、做 PID 调节、处理按键和 LCD 显示,温度采集只是它的众多任务之一。选 F4 系列是因为它具有 FPU,做浮点运算效率比 F1 高得多,PT100 线性化需要迭代计算,热电偶需要查多项式,用浮点算起来很轻松。

另外,STM32F417ZG 有多个 USART 外设,这意味着我可以在一颗 MCU 上同时挂好几片 ADS122U04。每片 ADS122U04 独占一个 UART,互不干扰,不用像 SPI 总线那样担心设备地址冲突或者片选竞争。对于 HVAC 控制器来说,一路冷媒温度、一路回风温度、一路盘管进出水温度,刚好需要多路采集,这个架构非常自然。

如果你手里的项目只做单路温度测量,STM32 其实可以降级用 F1 系列,但 F4 的价值在于后续扩展性。我建议选型时不要只看眼前这一路温度,要想想以后要不要加第二路传感器、要不要加 4-20mA 输入、要不要做更复杂的控制算法,F4 系列给这些扩展都留足了余地。

2. 硬件电路设计:从传感器到 ADC 的完整链路

2.1 电源、参考与去耦

ADS122U04 的模拟部分和数字部分供电我习惯分开处理。模拟电源 AVDD 用低压差线性稳压器输出 3.3V,稳压器前面加 π 型滤波;数字电源 DVDD 可以直接和 STM32 的 3.3V 网络相连,但之间串一个磁珠,防止 MCU 的高速开关噪声灌进模拟电路。

有个细节容易被忽视:ADS122U04 的 AVDD 和 DVDD 都有上电时序要求,一般是 AVDD 先于 DVDD 或者同时上电。如果 DVDD 先上电,芯片可能进入一个不确定状态,表现为通信不响应或者读数异常。稳妥的做法是在 DVDD 引脚上加一个 RC 延时,或者让 MCU 控制一个负载开关来管理 DVDD。我在第一版原理图上偷懒没管这个,结果上电后偶发死机,查了一个下午才定位到是电源时序问题。

基准电压方面,ADS122U04 内部有 2.048V 基准,精度和温漂对于多数温度测量场景已经够用。但如果你做的是高精度计量级设备,建议改用外部基准。内部基准的温漂系数一般在几十 ppm 每摄氏度,而一块 0.1%、25ppm 的精密基准电阻或基准芯片,能把整个测量链路的主要误差源从基准上移开。

去耦电容的位置比容量重要。每颗引脚上最近的去耦电容不要超过 5mm 走线距离,我习惯在 AVDD 和 AVSS 之间放 1μF 陶瓷电容并联 0.1μF 高频电容,DVDD 同理。模拟地建议用独立的铺铜区域,通过一个过孔或磁珠在电源输入端和数字地汇合,避免模拟电流和数字电流在 PCB 上交叉。

2.2 PT100/PT1000 的比例式接法

RTD 测温最重要的概念是比例测量,这也是 ADS122U04 内部集成激励电流源的原因。比例测量的思路是:让同一个激励电流同时流过 RTD 和一个精密参考电阻 RREF,ADC 的输入电压取自 RTD 两端的电压,ADC 的参考电压取自 RREF 两端的电压。这样计算温度时用的是两个电压的比值,激励电流的绝对值温漂、电源电压波动,全部被消掉了。

我通常用三线制或者四线制接法。四线制最简单,两根线给 RTD 供激励电流,两根线测电压,完全消除导线电阻的影响。三线制在工业现场更常见,因为它少一根线,利用两个匹配的激励电流源可以近似抵消引线电阻。ADS122U04 有两个 IDAC 电流源,正好可以做成三线制。

具体接法是这样的:IDAC1 输出的激励电流经过 RTD,再经过 RREF 回到地;IDAC2 输出一个同向的补偿电流,流过其中一根引线电阻。ADC 差分输入端跨接在 RTD 的两根电压检测线上,参考输入端跨接在 RREF 上。使用 RREF 取 1.5kΩ,激励电流取 500μA,这样 RREF 上的电压是 0.75V,在 ADS122U04 外部参考电压允许范围内。

选 RREF 时要注意温漂系数。我用的还是 25ppm/°C 的精密薄膜电阻,但对于 0.1°C 级别的精度要求,25ppm 的温漂在 50°C 环境温升下能带来约 0.125% 的误差,对应的 PT100 温度误差将近 0.3°C。如果项目要求高,直接上 5ppm 或更低温漂的电阻,成本多不了几块钱,但效果立竿见影。

输入端的滤波电容要特别小心。很多人习惯在 ADC 输入端加一个大电容滤波,但在 RTD 比例测量里,激励电流源在向 RTD 提供电流的同时,也在给这个滤波电容充电,电容太大导致建立时间过长,转换结果会出现系统性偏差。我的做法是只加 1nF 到 10nF 的高频旁路电容,并且在软件上做了连续多次采样取平均,效果比单纯堆大电容好得多。

2.3 热电偶输入与冷端补偿

热电偶和 RTD 完全不同,它输出的是毫伏级电压,而且必须做冷端补偿。热电偶测温的原理是两种不同金属在接点处产生热电动势,但这个电动势反映的是热端和冷端的温差,不是绝对温度。所以你必须知道冷端温度,才能算出热端温度。

ADS122U04 内部自带温度传感器,可以用来测量芯片附近的温度,做粗略的冷端补偿。但内部温度传感器测的是芯片自身温度,和热电偶冷端所处的端子温度有差异,尤其当主控板上有发热元件时,误差可能达到好几度。我的做法是:在热电偶端子旁边放一颗高精度 NTC 或者 PT1000 作为冷端温度参考,用单片 ADC 的另一路输入采集它,然后在软件里做补偿。

热电偶信号幅度很小,K 型热电偶在 1000°C 时输出电压大约 41mV。如果 PGA 设置为 128 倍,输入电压范围可以达到 ±16mV,这显然不够测满量程。这时可以把 PGA 降为 32 倍,或者调整增益和输入范围的匹配。ADS122U04 的 PGA 增益越高,等效输入噪声越低,但输入范围越窄。对于 K 型热电偶,我倾向于 PGA 选 32 倍,这样输入范围约 ±64mV,室温到 600°C 都在合理区间内,再高就要换更高增益档位或者接受饱和。

热电偶的输入滤波也要做。热电偶引线通常很长,如果穿过动力电缆密集的区域,会感应到很强的工频干扰。我在前端加了差分 RC 滤波器,电阻用 1kΩ,电容用 100nF,这个组合的截止频率约 1.6kHz,既能滤掉大部分干扰,又不会因为阻值太大影响热电偶信号。要注意 RC 电阻不宜再加大,否则会引入显著的电压降误差,因为热电偶回路的内阻相对较低,但滤波电阻串联在回路里,信号电流经过它会形成误差电压。

2.4 隔离设计与 PCB 布线的几个原则

工业级温度采集通常要求输入侧和主控侧电气隔离。常见的做法是隔离电源加数字隔离器。UART 接口在隔离方面优势很大,ADS122U04 和 STM32 之间只有 DIN、DOUT 两根线,我选两通道数字隔离器,型号用的是 ISO7721,隔离侧单独用一块 DC-DC 隔离电源模块给传感器和 ADC 供电。

隔离电源模块的纹波是个隐患。DC-DC 模块的输出纹波通常有几十毫伏,如果不处理直接给 ADS122U04 供电,会严重影响 ADC 性能。我在这块板上用了 DC-DC 模块输出后端接 LC 滤波,再用线性稳压器二次稳压,最后给 AVDD 供电。实测下来 ADC 输出噪声和用实验室电源供电时几乎一样。

PCB 布线方面,模拟部分和数字部分分区布局是第一原则。ADC 放在传感器端子附近,STM32 放在另一侧,中间走隔离器。模拟地平面要完整,不要在 ADC 下面乱走数字信号线。我曾经在第二版 PCB 上贪方便,把一路 UART TX 线从 ADC 正下方穿过,结果测量数据多了明显的周期性干扰,后来把线绕开才恢复正常。

差分输入的两根线要尽量等长平行走线,这样共模干扰才能在两端抵消。RREF 的两端也要靠近 ADC 的参考输入引脚,避免长走线引入寄生电阻和噪声。如果你做的是高精度测量,RREF 最好用四线开尔文接法,虽然 ADS122U04 没有专门的 SENSE 引脚,但将 RREF 的反馈点尽量靠近电阻本体,也能显著减少走线电阻带来的参考电压误差。

3. 固件实现:从 UART 初始化到温度值输出

3.1 STM32 的 UART 初始化

固件方面,第一步是把 STM32 的串口配置成正确的模式。ADS122U04 的 UART 帧格式采用标准 8N1,即 8 个数据位、无校验、1 个停止位,波特率我用的 9600。这个速率对温度采集来说完全够用,因为在低频数据速率下,芯片内部滤波器已经把大部分噪声滤掉了,通信本身反而不是瓶颈。

初始化代码很简单,但有一个坑:STM32 的 USART 默认发送空闲电平是高电平,ADS122U04 的 DIN 端在空闲状态也需要高电平,这刚好兼容。如果某些 UART 转接板或者电平转换芯片把信号反相了,通信会失败。我在调试时用逻辑分析仪看过波形,确认空闲高电平后才继续往下走。

下面是一段我实际用的初始化代码,基于寄存器操作,方便你移植:

void UART1_Init(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; RCC->APB2ENR |= RCC_APB2ENR_USART1EN; GPIOA->MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10); GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; GPIOA->OTYPER &= ~(GPIO_OTYPER_OT9 | GPIO_OTYPER_OT10); GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED9 | GPIO_OSPEEDR_OSPEED10; GPIOA->AFR[1] &= ~(0xFF << 4); GPIOA->AFR[1] |= (7 << 4) | (7 << 8); // PA9, PA10 -> USART1 USART1->BRR = 84000000UL / 9600; USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; }

这里的 84MHz 是 APB2 外设时钟,你要根据自己的时钟树配置来改。STM32F417ZG 主频跑到 168MHz 时,APB2 通常配 84MHz,所以 BRR 值等于 84MHz 除以波特率,8750 这个值写进去就是 9600 波特率。如果你的 APB2 时钟不是 84MHz,算出来的值就不同,这个很容易在移植时出错。

发送和接收一个字节的函数也要单独写好,后面所有命令交互都依赖它们。接收部分我用的是查询方式,因为项目里对实时性要求不高,20SPS 的转换速率意味着每 50ms 才需要读一次数据,查询等待完全够用,而且代码更直观。

3.2 ADS122U04 的寄存器配置

ADS122U04 的寄存器配置是通信的核心,配置错了,后面读到的数据再好看也没用。芯片上电后默认配置可能不适合你的传感器,所以初始化流程一定是:复位、写配置寄存器、等待稳定、启动转换、读取数据。

先说复位。上电后我会发送复位命令,然后延时至少 10ms 让内部电路稳定。这一步看起来多余,但在现场设备上非常重要,因为电源上电过程和实验室稳压电源不同,可能有跌落或毛刺,复位一下能确保芯片处于已知状态。

然后写配置寄存器。ADS122U04 有四个配置寄存器,分别控制输入多路选择器、PGA 增益、数据速率、工作模式、参考源、IDAC 电流源等。以我常用的 PT1000 配置为例:

  • 配置寄存器 0:选择差分输入通道 AIN0/AIN1,PGA 增益选 8 倍。PT1000 在 0°C 时电阻 1000Ω,500μA 激励电流产生 0.5V 电压,8 倍增益后满量程范围内完全够用。
  • 配置寄存器 1:选择连续转换模式,数据速率 20SPS。这个速率下芯片内部滤波器衰减效果最好,温度信号变化本来就不快,20SPS 足够。
  • 配置寄存器 2:参考源选择外部参考,也就是 RREF 上的电压。如果要用内部温度传感器,也是在这个寄存器里开启。
  • 配置寄存器 3:配置 IDAC 激励电流为 500μA,并且将 IDAC1 路由到固定电流输出引脚。

我遇到的第一个坑就和配置寄存器相关:有一次我在没有复位芯片的情况下直接写配置,结果寄存器值写进去了,但芯片还在用旧的 PGA 增益运行,读出来的温度跳变非常奇怪。后来我强制规定,写配置之前一定先发复位命令,而且写完所有寄存器后再次发送复位?不,正确的是先复位,再写配置,写完配置后等待一段时间再启动转换,中间不要穿插其他命令。ADS122U04 的命令接口不支持同时读写,一条命令没执行完就发下一条,经常会被忽略。

写配置寄存器的代码可以用串口发送命令头和数据字节。比如写配置寄存器 0,发送命令 0x40(代表写寄存器 0),紧跟一个数据字节。具体命令码以你手里的数据手册为准,我在项目里用的是这套,稳定运行了很长时间。

3.3 读取转换结果与 24 位补码解析

数据准备好之后,需要发读取命令,然后从串口接收三个字节。ADS122U04 的数据是 24 位二进制补码格式,最高位是符号位,正满量程对应 0x7FFFFF,负满量程对应 0x800000。

读取数据时有个细节:不要只读一次。我的做法是连续读取三次,如果三次结果基本一致,说明转换稳定;如果有逐次递增或递减的趋势,说明信号还在建立过程,要等它稳定后再取平均值。温度采集不是高速采集,多等几十毫秒完全无所谓,但能避免很多莫名其妙的波动。

下面是我用的数据解析函数,注意 24 位补码转成 int32 的符号扩展:

int32_t ADS122U04_ReadData(void) { uint8_t buf[3]; int32_t raw; UART1_SendByte(0x12); // RDATA 命令 for (int i = 0; i < 3; i++) { buf[i] = UART1_RecvByte(); } raw = ((int32_t)buf[0] << 16) | ((int32_t)buf[1] << 8) | buf[2]; if (raw & 0x800000) { raw |= 0xFF000000; // 符号扩展,保持补码语义 } return raw; }

连续转换模式下,DRDY 信号很重要。如果你的设计把 DRDY 引脚接在了 STM32 的 GPIO 上,建议用外部中断触发数据读取,这样每完成一次转换就立刻读走,数据不会新旧混叠。如果用查询方式,那就必须先确认转换完成再发读命令,否则读回来的可能是上一次的结果。

我在 CAN 总线式 HVAC 控制器上用的是中断方式,因为 MCU 同时要响应通信中断,查询方式容易因为占用了 CPU 太长时间导致通信超时。中断服务函数里只做一件事:把三个字节搬进缓冲区,置一个标志位,回到主循环再去解析数据,这样中断占用时间极短。

3.4 温度换算与线性化(RTD 和热电偶)

拿到原始码之后,最重要的一步是把它换算成温度。很多初学者卡在这里,因为 ADC 原始值和温度不是线性关系,尤其是 PT100 在低温段和高温段的电阻变化曲线有明显非线性。

先算电阻值。比例测量模式下,RTD 电阻等于原始码与满量程比值乘以 RREF。公式可以写成:

float rtd_resistance = (float)raw / 8388607.0f * RREF;

这里的 8388607 是 2^23 - 1,对应正满量程。我实测过,这个公式在室温附近算出来的电阻值和万用表测量值误差在 0.01Ω 以内,精度足够。如果原始码为负,说明接线方向错了或者传感器断线,要单独处理。

拿到电阻值后再转换成温度。PT100 和 PT1000 的电阻-温度关系可以用 Callendar-Van Dusen 方程描述,0°C 以上用二次方程,0°C 以下用四次方程更准确。工程上最实用的做法是查表,把芯片内部 Flash 里的一个 201 点温度表拿来用,0°C 到 200°C 每 1°C 一个点,线性插值,精度 0.1°C 以内。查表比直接解方程快得多,而且温度表的数据可以直接从标准文件转换出来。

如果你的项目要求较高,不想维护一个庞大的表格,也可以用牛顿迭代法解方程。先根据电阻值估算一个初始温度,然后迭代修正,迭代三次就能收敛到 0.01°C 以内。STM32F417ZG 有 FPU,浮点运算不费劲,我计算过,一次完整的温度换算加线性化,CPU 耗时不到 200 微秒。

热电偶的换算稍微复杂一些。首先要根据冷端温度算出冷端对应的热电动势,然后用实测热电动势加上冷端电动势得到修正后的总电动势,最后查热电偶分度表得到热端温度。K 型热电偶的分度表是非线性的,但每 10°C 一个点加线性插值,就能把误差控制在 0.5°C 以内。如果要求精度到 0.1°C,需要用 NIST 多项式,这个多项式在 STM32 上跑起来也就几十毫秒。

4. 校准、自发热与抗干扰的实战经验

4.1 激励电流与自发热的取舍

激励电流不是越大越好。RTD 的测温原理是电阻随温度变化,但它本质是个电阻元件,电流流过它就是会发热。电流越大,电阻上产生的焦耳热越多,测出来的温度就越高于真实温度。这个现象就是自发热,在高精度测量里很致命。

ADS122U04 的 IDAC 电流有几档可调,从 10μA 到 1.5mA 都有。PT100 的标称电阻只有 100Ω,如果激励电流选 1mA,功耗就是 0.1mW,在静止空气中能让探头内部温度升高约 0.1°C 到 0.2°C,对于 0.1°C 精度要求的系统来说已经不可接受了。所以我通常选 250μA 或者 500μA,PT1000 因为电阻大,选 250μA 就能产生足够的信号电压,PT100 因为电阻小,需要电流稍大一点才能让输入信号高于噪声底。

自发热还有个隐藏问题:它跟介质的热阻有关。同一颗电流源在流水管道里校准得很好,放到静止空气的风管里读数就偏高,因为空气热阻大,热量散不出去。我在 HVAC 项目里分别对水管和风管做了两组自发热修正系数,校正之后误差明显改善。

有一种策略是脉冲激励,只在采样瞬间开启 IDAC,采样完成后关闭,这样平均功耗大幅降低,自发热也跟着降下来。但 ADS122U04 的命令接口本身有一定延迟,脉冲激励实现起来稍微复杂,我一般只在没有主动散热、测量间隙很长的场合用。

4.2 两点校准怎么做

芯片的增益误差和偏置误差不会恰好等于数据手册标称值,每一颗芯片之间都有差异。对于工厂量产的产品,两点校准是必须的。我之前见过不少项目省掉这一步,结果每一台设备的零点漂移差异有几度,装配时才发现,返工成本远高于校准成本。

校准方法不复杂。第一步,把传感器置于冰水混合物中,测到的电阻值应该正好等于标称值,记录下此时 ADC 的原始码。第二步,把传感器置于沸水或者精密恒温槽中,比如 100°C,再记录一组原始码。然后你用这两组数据算出实际的增益修正系数和偏置修正系数,写入 MCU 的 Flash 保存。以后每次计算温度时,先用修正系数校正原始码,再做线性化。

用精密电阻箱做校准比用实际温度源更可控。电阻箱设定为 100Ω,相当于 0°C 的 PT100;设定为 138.5Ω,相当于 100°C。这样不用准备冰水浴和沸水浴,而且可以绕开探头自发热的影响,标的是整个“电阻测量链路”的准确性。等到探头现场装好,再用实际温度源做一次端到端验证。

有一点要注意:校准要用和实际测量相同的配置。包括 PGA 增益、数据速率、激励电流、参考电阻,一个都不能变。我犯过一次错,校准时用的 PGA=8,实际运行时改用 PGA=4,结果修正系数全部无效,读数差了接近 1°C。这个问题的根源是增益倍数不同,ADC 的偏置误差会被放大不同的倍数,不能混用。

4.3 噪声、漂移与现场常见干扰

现场环境比实验室恶劣得多。变频器、电机启停、继电器吸合这些动作,都会向空间辐射电磁噪声,或者通过地线耦合到传感器线上。ADS122U04 的内部 Δ-Σ 调制器对工频干扰有一定的抑制能力,但面对强干扰时,前端滤波和屏蔽仍然不可缺少。

我在项目中遇到过一次持续性的读数跳动,跳动幅度超过了 ±0.5°C。排查了很久,最终发现是变频器的载波频率和 ADC 的数据速率产生了差拍干扰。数据速率 20SPS 时,如果变频器载波是 4kHz,两者没有直接数学关系,但会在转换结果上产生一个低频包络。解决办法是调整 ADC 的数据速率,避开干扰频率的整数倍关系,同时在传感器线上加磁环。ADS122U04 有多种数据速率可以选择,20SPS、45SPS、90SPS 都可以试,找到一个读数最稳的档位即可。

漂移问题也要重视。系统的零点漂移主要来自两个地方:一个 ADC 输入偏置电流随温度变化,一个参考电阻的温漂。输入偏置电流的影响可以通过输入短接测量来评估,软件里做一个自动零点校正,定期用通道切换功能把所有输入短接,记录漂移值,然后在后续测量中减掉。这个方法我强烈推荐,成本为零,效果却很明显。

另外一个容易被忽略的干扰来源是 LCD 刷新。因为 STM32F417ZG 驱动 LCD 时,数据总线上有大量快速翻转的信号,如果 LCD 数据线和 ADC 的模拟部分靠得太近,数字噪声会耦合进测量链路。我在改版时特意把 LCD 数据线放在 PCB 的另一侧,并且在 ADC 的模拟输入和电源引脚上增加了磁珠,读数立竿见影地稳定下来。

5. 常见问题与排查技巧实录

5.1 常见故障速查表

故障现象可能原因排查方法
上电后完全无响应电源时序错误、复位未完成检查 AVDD/DVDD 上电时序,发送复位命令后延时再通信
读数恒为 0x7FFFFF输入开路、引线断开检查传感器接线,用万用表量 RTD 阻值
读数恒为 0x800000输入反接、PGA 饱和检查差分输入极性,降低 PGA 增益
读数跳变幅度大滤波不足、电源纹波大检查前端 RC、去耦电容,用示波器看 AVDD 纹波
通信偶发失败波特率不匹配、隔离器时序异常用逻辑分析仪抓 UART 帧,核对帧格式
温度读数整体偏移参考电阻误差、校准参数丢失重新做两点校准,检查 RREF 实际阻值

5.2 几个容易踩的坑

第一个坑是 UART 接收超时。ADS122U04 返回数据的速度很快,STM32 如果在中途被更高优先级的中断打断,串口接收缓冲可能溢出。我建议把接收做到中断里,或者用 DMA,不要在主循环里用阻塞查询方式等待三个字节全部到位。否则在系统繁忙时,偶发的丢字节会让整个数据帧错位,解析出来的温度值像随机数一样。

第二个坑是参考电阻的地线处理。第一版 PCB 上我把 RREF 的地端和 ADC 的地端分开了,结果 RREF 两端的电压和 ADC 内部参考输入之间产生了地电位差,读数出现了固定偏移。后来我让 RREF 的地端直接连接到 AVSS 引脚附近的一个点上,单点接地,问题解决。

第三个坑是 HVAC 环境中结露。传感器端子板在低温高湿环境下容易结露,露水在 PCB 上形成微小的泄漏电流,直接改变了 RTD 的等效电阻。我在这块板的传感器端子上涂了三防漆,并且把走线之间的间距拉大到 0.5mm 以上,故障率大幅下降。这个问题在实验室里很难复现,但在北方冬季的空调机组现场非常常见。

第四个坑是软件滤波和硬件滤波过度叠加。一开始我觉得读数抖动太大,于是先在后端加了一阶惯性滤波,又在前端加了大电容,最后整个系统的响应时间变得很慢,冷媒温度变化时需要好几分钟才能跟踪上。后来我撤掉了软件滤波,只保留前端小电容,用 ADC 本身 20SPS 的速率做平均,响应速度和噪声水平达到了平衡。

就我个人而言,ADS122U04IPWR 加 STM32F417ZG 这套组合做完之后,最大的感受是:UART 接口的 ADC 并不是性能妥协,反而在系统架构层面打开了很大的操作空间。你不需要为了多路采集去抢 SPI 总线,不需要为了隔离而牺牲通信速率,也不需要为了滤波去拼 PCB 布线。温度测量这个领域,方案往往不是输在芯片指标,而是输在系统集成时那些不起眼的细节。如果你正在规划类似的工业或 HVAC 测温项目,我建议你直接照着我这套硬件和固件框架搭一个最小系统,先跑通数据链路,再一步步加隔离、加校准、加滤波,过程比你想的要快得多。

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

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

立即咨询