☰
STM32L031+ADS122U04:UART接口24位ADC工业级温度测量方案
2026/11/5 8:40:12 网站建设 项目流程

做这个选题之前,我先把背景交代清楚:我在一个楼宇自控设备的项目里负责测温链路,主控选了 STM32L031C6,ADC 选了 ADS122U04IPWR,最终要稳定读出工业级和 HVAC 场景下的温度。这个组合不是随处可见的“网红搭配”,但它非常典型地解决了两类问题:一是 MCU 内部 ADC 精度和噪声都不够,二是很多模块不想为了一个传感器去布线 SPI,让一个只有 UART 的低成本小内核去对接一个 24 位高精度 ADC,听起来像错位,实际做起来却很顺手。这篇文章会按我的真实推进顺序展开,尽量把能直接抄作业的东西都写出来。

1. 这个温度测量方案在工业和 HVAC 场景的适用位置

1.1 为什么挑 STM32L031C6 这种小资源主控

先看 MCU 的选型逻辑。STM32L031C6 属于 STM32L0 系列,Cortex-M0+ 内核,主频最高 32MHz,Flash 32KB,RAM 8KB,价格低、封装小、外设不多,看起来确实“小”。但 HVAC 场景里温度采集节点往往不是独立存在的,它多半要配合无线通信(LoRa、Sub-1G 或者 BLE),或者挂在 RS-485 总线上做 Modbus 从机,真正 CPU 做的事情很少:定时采集、算温度、跑协议、睡眠。这种工况下 L031 的优势就完全发挥出来了。

它内部有多个低功耗模式,Stop 模式电流可以做到微安级。做电池供电的温湿度传感器节点时,一个 CR2032 撑一年没有任何问题。用到温度测量项目里,我的习惯是让系统大部分时间休眠,每隔几秒唤醒读一次温度,然后继续睡。L031 的唤醒时间短,从 Stop 模式起来到能跑 UART 大概也就是微秒级到毫秒级的事,不会拖累采集实时性。

另一个很实际的点:L031 有 USART、I2C、SPI,但引脚不多。如果你选的 ADC 是 SPI 接口,那就得占用 MOSI、MISO、SCK、CS 四根线,还要额外用通用 IO 去模拟 CS 时序,这对引脚紧张的 L031 并不友好。UART 接口的 ADC 可以只用两根线(TX/RX),把 CS 的活儿交给协议层去做,整个板子走线也变得很简单。

1.2 为什么不用 STM32L031 内置 ADC,而是外挂 24 位 ADS122U04

有人会问:STM32L031 自己就有 12 位 ADC,测个温度难道不够用吗?分场景说。如果只是测 NTC 热敏电阻,检测电路板温度,那内部 ADC 确实够用,只要电阻分压网络设计好,0.1 摄氏度的分辨率也不是难事。但工业和 HVAC 场景经常面对的是这样几类传感器:

  • PT100 / PT1000 铂电阻,温度范围 -50℃ 到 +300℃,需要较高分辨率和低噪声;
  • K 型热电偶,毫伏级信号,冷端一变化就是几十微伏误差;
  • 4-20mA 变送器输出后的取样电压,可能有共模干扰;
  • 多路温度信号,希望一个芯片就能完成通道切换。

这些场景对 ADC 的要求是:分辨率要高、输入噪声要低、要有可编程增益放大(PGA)去配合不同幅度的信号、最好还能提供恒流源,方便做 RTD 的激励。STM32L031 内置 ADC 没有 PGA,没有恒流源,参考电压精度也一般,做 RTD 比例法测量时需要外部搭一堆运放和基准电路,非常折腾。

ADS122U04 属于 TI 的 24 位 4 通道 ADC 产品线,集成 PGA、内部温度传感器、两个可编程电流源、以及 4 个通用 IO(GPIO)。更关键的是它把 SPI 换成了 UART 传输方式,对一个“只想要结果、不想处理时序”的工程师来说,这比 SPI 更省心。UART 没有时钟线,不用考虑时钟极性相位,不用处理 CS 片选,只要波特率配好,发命令收数据就行。

下面这个表是我选型时做的对比:

方案位数接口需要的外部元件噪声表现适合场景
STM32L031 内置 ADC12-bit内部电阻分压、运放中等热敏电阻、粗精度
普通 16-bit SPI ADC16-bitSPI参考电压芯片中上一般工业采集
ADS122U0424-bitUART很少,内部集成优秀RTD/热电偶/多通道
使用高端 ADC 加 MCU24-bitSPI电平转换、隔离优秀高要求数据采集

这个对比表基本能看出,ADS122U04 在中等成本预算下,把精度和外部复杂度平衡得不错。下面我会一步步拆开它的内部结构和接线方式。

2. ADS122U04 内部架构与传感器前端的对应关系

2.1 24 位转换核心与多路复用、PGA、基准源的配合

ADS122U04 的核心是一个 Δ-Σ(Delta-Sigma)ADC,24 位分辨率。它的输入前端有一个 4 通道多路复用器(MUX),可以配置成 4 路差分输入或 8 路单端输入。实际工业项目里我很少把通道全开,因为多路复用的扫描速率有限,通道多了之后每一路的实际有效采样率会下降。但“有 4 个通道”这件事本身价值很大,意味着一个电路板上可以同时接 PT1000、NTC、热电偶和外部 0-5V 信号,不用每个传感器配一个 ADC。

在 MUX 后面是 PGA。PGA 增益范围可以从 1 倍一直放到 128 倍,最大量程随增益降低。这个很关键,因为热电偶输出只有几十毫伏,如果直接用增益 1 去测,等于把宝贵的满量程浪费了;配上 PGA 之后效果完全不同。但要注意,放大倍数不是越大越好,高增益会把输入端的噪声也一起放大,所以实际项目中得折中。以 K 型热电偶为例,常用增益是 32 或 64,差分输入直接接热电偶正负极,不需要额外做放大电路。

然后是基准源。ADS122U04 内部有 2.048V 的基准参考,也可以使用外部参考。测 RTD 时最佳做法是用比例法,让同一个恒流源既流过 PT 电阻,也流过标准参考电阻,把 ADC 参考电压接在标准电阻两端。这样电源波动、基准漂移对测量结果的影响会被抵消掉,精度会非常好。这一点后面我会单独展开。

数字滤波器方面,ADS122U04 提供多种数据率选择。记得典型值包含 20 SPS、45 SPS、90 SPS、175 SPS、330 SPS 几档,具体以手册为准。如果环境里有 50Hz 工频干扰,选择 90 SPS 可以让滤波器对工频及其谐波有额外的抑制。这是我在 HVAC 配电间里测温度时特别看重的一个特性。

2.2 板载温度传感器、IDAC 电流源和 GPIO 的真实作用

很多人觉得“ADC 不就是把电压转成数字吗,为什么要装温度传感器在里面”。ADS122U04 内部集成的温度传感器,最大的用处是热电偶冷端补偿。

热电偶测温的原理是:两种不同金属接触点之间会产生热电势,这个电势的大小取决于测量端温度和冷端温度之差。你在现场把热电偶探头放到管道上,但热电偶的另一端终究要接到 PCB 上的接线端子,PCB 的温度就相当于冷端温度。如果 PCB 温度会漂移(毕竟芯片会发热,机柜里也不均匀),就需要知道冷端此刻到底多少度,再去查表修正。

ADS122U04 内置温度传感器可以帮助估算结温,配合外部 NTC 或者装配位置的热模型,可以比较准确地补偿冷端。我见过很多业余项目直接把热电偶接到 ADC 上,然后用室温补偿,夏天冬天差出好几度,这是很典型的问题。

至于内部电流源 IDAC,它是给 RTD 用的。以 PT1000 为例,恒流源输出 500μA 或 1mA,流过 PT1000 后产生一个与电阻成正比的电压,再用 ADC 测量。用内部 IDAC 的好处是省掉外部恒流源芯片。但要注意,IDAC 的输出端到模拟输入端的路径上,电流源本身也有温度系数,所以要求特别高的场合还是需要校准。工业项目里,用 IDAC 配合比例法测 PT1000,实际做到 ±0.2℃ 级别并不难。

GPIO 的用途更灵活。ADS122U04 自带的 4 个 GPIO,可以用来控制传感器电源的开关。工业测温最怕“自热误差”:恒流源持续流过 PT1000,电阻自身会发热,导致读数比真实环境温度高。用 GPIO 控制 IDAC 在采样前 50ms 再打开,采样完成后立刻关掉,能明显减少自热。我这里强烈建议所有低速高精度 RTD 测量都这么做。

3. STM32 一侧的硬件搭建与接线实践

3.1 最小系统的供电、去耦、启动配置

STM32L031C6 的典型供电是 1.8V 到 3.6V,我常见到 3.3V 单电源设计,板上同时跑无线模块和 ADC,电源轨统一用 3.3V。ADS122U04 的模拟电源 AVDD 和数字电源 DVDD 都可以用 3.3V,但我不会让它们直接从同一个 LDO 输出引脚拉过去,而是加 π 型滤波:10μF 电容、1Ω 电阻、100nF 电容,把 MCU 数字开关噪声和 ADC 的模拟电源隔开一些。

去耦电容的位置要靠近芯片电源引脚。ADS122U04 的 AVDD 引脚附近放 1μF 陶瓷电容加 0.1μF 高频电容是通用做法,DVDD 同样。STM32L031 的 VDD 引脚也需要 0.1μF 和 1μF。这些基本功如果不做,后面在实际项目中会出现“ADC 读数跳,但板上看起来一切正常”的现象。

启动配置方面,L031 的 BOOT0 引脚需要拉低,否则上电会进入系统存储器引导模式。如果只做温度采集节点,建议把 BOOT0 串一个 10kΩ 电阻接地。ADC 的复位引脚(如果有)也要处理,具体引脚名按 ADS122U04 手册为准。UART 的两根线 TX/RX 在 MCU 和 ADC 之间交叉连接:MCU 的 TX 接 ADC 的 RX,MCU 的 RX 接 ADC 的 TX。此外,ADS122U04 一般还有 GPIO 相关引脚,我会把其中一个接到 STM32L031 的外部中断引脚,用于在有数据准备好时唤醒 MCU,而不是 MCU 疯狂轮询。

提示:STM32L031C6 的 USART 引脚不要默认配置成推挽输出。如果你把 TX 配置成推挽,而 ADC 还没上电,RX 端可能被强行拉高,导致 ADC 内部逻辑状态错乱。稳妥做法是把 TX 初始化为复用功能开漏,外部上拉或依靠线性内部上拉,也可以先设成 GPIO,初始化完成后再切到复用。

3.2 传感器接线:PT1000 比例法、K 型热电偶和 NTC 实战区分

传感器接线是整个硬件设计中最值得花时间的地方。

PT1000 比例法的接法是这样的:从 ADS122U04 的一个 IDAC 输出引脚出来,接到 PT1000 的一端,PT1000 另一端接到基准电阻后再回到 AGND。同时把 ADC 正输入端接到 PT1000 与基准电阻的公共节点,负输入端接到 AGND 的采样点;参考电压的正端接基准电阻的高端,参考负端接低端。这样 ADC 的数字输出就直接是 PT1000 和参考电阻的比值,再乘以参考电阻阻值得到 PT1000 当前电阻,最后查表或计算得到温度。整个过程几乎不受 3.3V 电源波动影响。

K 型热电偶则更讲究。热电偶两端是两根不同材料的金属线,直接接 ADC 差分输入时,必须把 ADS122U04 内部输入多路复用器配置成差分模式。为了避免共模干扰,可以加一个 RC 低通滤波器,每根线串联 1kΩ 电阻并对地接 100nF 电容,把高频噪声滤掉。但注意,这个 RC 也会稍微引入一点误差,采样时间要足够长,等电容上的电压稳定后再读取。

从我的经验看,接线端子位置附近是冷端温度最不稳定、同时也是最容易测的位置。设计 PCB 时,把热电偶端子放在板边,让冷端尽量接近 PCB 上的一颗 SMD NTC 或者靠近 ADS122U04 的板载温度传感器引脚。最好让这个冷端温度测试点与 PCB 大面积地铜皮贴合,这样温度场更均匀。

NTC 热敏电阻的接线相对简单,用分压法,分压电阻精度要高。NTC 的非线性比较厉害,如果测量范围很宽(比如 -40℃ 到 +125℃),建议做多点校准或使用高精度查表。ADS122U04 的 24 位分辨率在 NTC 上完全是性能溢出,好处是分压误差和参考噪声占比降到很低。

4. 打通 UART 链路与寄存器配置细节

4.1 ADS122U04 的 UART 通信帧结构

用 UART 通信的 ADC,核心问题其实是帧格式。ADS122U04 的 UART 接口可以配置为多种格式,常见的是 8 个数据位、无校验位、1 个停止位(8N1)。波特率方面,我在项目里用 115200,配合 STM32L031 的时钟很顺手。如果你的系统时钟源用 HSI 内部振荡器,STM32 的 USART 波特率误差在允许范围内也能正常通信,但想更稳妥就把 STM32L031 配置为使用无源晶振或者有源晶振。

命令帧的构成逻辑大致是:帧头、命令字节、寄存器地址、数据字节、校验。具体字节序和长度要以 ADS122U04 数据手册的 UART 协议表为准。项目里我不会手写一个复杂协议解析器,而是把它做成一个简单状态机:空闲、等待帧头、等待命令、等待数据、等待校验。这套状态机在 STM32L031 上跑起来很容易,RAM 占用很小。

需要注意的一点是,UART 协议没有 SPI 的 CS 线来区分“本次通信开始和结束”,所以帧头校验和超时机制是必须的。我的做法是给每帧加一个固定的 0xA5 作为帧起始,后面紧跟命令类型和长度,帧尾加一个简单的和校验。这样即使一个字节丢失,下次帧头出现时也能自动重新同步。

4.2 STM32L031 的 USART 初始化和 ADC 交互流程

下面给一段我实际工程里常见的初始化代码示例。重点不是代码能直接编译通过,而是把“交互流程”这件事说清楚。

void ADS122U04_UART_Init(void) { // 1. 开启 GPIO 和 USART2 时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART2_CLK_ENABLE(); // 2. 配置 PA2(TX2) 和 PA3(RX2) 为复用功能 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 3. 配置 USART2 参数:115200, 8N1 huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart2); }

初始化之后,读取温度的流程大概是:

  1. MCU 发送“写寄存器”命令,配置通道选择、PGA 增益、基准源、滤波器;
  2. MCU 发送“启动转换”命令,让 ADC 开始转换当前通道;
  3. 等待数据准备完成,这个可以从 ADC 的 DRDY 引脚(如果有)拉低来获知,也可以按时间估算等待一个采样周期;
  4. MCU 发送“读转换结果”命令,收到 3 字节的 24 位数据;
  5. 如果存在多通道,循环切换通道并重复。

用 UART 的好处就在第四步:SPI 读取要时时刻刻盯着时钟沿,UART 直接用 DMA 接收,MCU 可以去做其他事情。我在项目中用的是 USART2 的 DMA 接收,中断里只设置一个标志位,数据处理放到主循环,这样不会阻塞协议解析。

4.3 寄存器配置举例与典型值说明

我不建议在这里把 ADS122U04 所有寄存器的每一个 bit 都列出来,因为手册更新变化很快。我举几个我在项目中一定会确认的关键项:

  • 输入多路复用器选择:差分通道 AIN1/AIN2,还是单端通道?接 PT1000 和热电偶时我都会明确配成差分。
  • PGA 增益:热电偶选 32 或 64,PT1000 选 1 或 2,NTC 分压选 1。
  • 基准源选择:PT1000 用外部基准(标准电阻),热电偶用内部 2.048V 基准。
  • 电流源设置:RTD 模式下使能 IDAC,电流大小选 500μA 或 1mA,命令关断的功率开关配置好。
  • 数据速率:工频环境使用 90 SPS 或更低,配合内部数字滤波器滤除 50/60Hz。

一个典型的 RTD 测量,我会把 ADC 配置为:差分输入、PGA=1、外部基准、IDAC 电流 1mA、数据率 90 SPS。这个组合在 0℃ 到 100℃ 范围内表现稳定。热电偶测量则配置为差分输入、PGA=64、内部基准、TCPW 功率开关开启以便读取内部温度传感器做冷端补偿。

5. 从原始 ADC 值到温度的完整物理量还原

5.1 热电偶测量与冷端校正的计算路径

用 ADC 读回一个原始码值之后,真正的挑战才开始。以 24 位 ADC 为例,原始码值通常是二进制补码格式,正负都有。第一步是判断正负,然后换算成电压值。

换算公式很简单:
电压 = 原始码值 × 满量程电压 ÷ 满量程码值。比如内部参考电压 2.048V,24 位码值范围是 ±2^23,那么每个 LSB 的电压大约为 2.048V / 8388608,也就是 0.244μV。这个微伏级的量化能力,对热电偶测量非常重要。

接下来是冷端补偿。ADC 读到的热电偶电压其实是“热端温度与冷端温度的温差”对应的电压,如果直接把电压换算温度会出大问题。正确流程是:

  1. 测量冷端温度,我一般用 ADS122U04 内部温度传感器或外部 NTC 获得;
  2. 把冷端温度转化为对应的热电偶电压,这里用到反向查表;
  3. 将测到的热电偶电压加上冷端电压,得到总电压;
  4. 用总电压正向查表,得到热端温度。

用 K 型热电偶举例,如果 ADC 测到 20mV,冷端是 25℃,查表得到 25℃ 对应的 K 型补偿电压约为 1.000mV,那么实际热端对应的等效电压就是 21mV,查表得到大约 509℃。如果不做这个补偿,直接把 20mV 查成 484℃,足足差了 25℃。

注意:冷端补偿的精度直接取决于冷端温度测的准不准。ADS122U04 内部温度传感器测的是芯片结温,和接线端子温度不完全一致,中间隔着 PCB 热阻。要求高时,把冷端温度传感器放在接线端子正下方,并用软件做一次偏移校准。

5.2 RTD 比例法换算与典型计算示例

RTD 使用比例法时,换算公式可以直接用 ADC 码值比来算,不需要精确的基准电压值。假设 ADC 原始码值是 data,满量程码值是 full_scale,参考电阻是 Rref,那么 RTD 电阻值 R_rtd 约等于:

R_rtd = data × Rref / full_scale

举个例子。如果满量程码值是 2^24 = 16777216,参考电阻 4300Ω(常见 PT1000 用 4.3kΩ 参考),ADC 读回码值约为 4,000,000,那么 R_rtd = 4,000,000 × 4300 / 16,777,216 ≈ 1025Ω。查 PT1000 分度表,对应温度大约 6℃ 左右。这个过程中,任何电源误差都会被抵消,因为 ADC 参考电压和传感器共用了同一个电流源,这是我最推荐的做法。

PT100 是 100Ω 铂电阻,如果要测到 0 到 300℃,需要导线电阻补偿。三线制和四线制是常见做法。ADS122U04 有两个电流源,可以用一个电流源走一根线进传感器,另一个电流源走另一根线,然后把它们的压差相减来补偿线阻。如果条件有限,至少使用双线制并在软件里把已知线阻减掉。HVAC 应用中很多管路温度传感器只有两线,这时候我更推荐先做一次两点校准,把线阻误差消掉,简单有效。

5.3 热电偶查表与线性化的误差控制

热电偶的电压-温度关系是非线性的,工程上常用两种方式处理:一是直接把分度表做成常量数组,用二分查找或者插值。查找表占用 Flash 空间很大,K 型从 -200℃ 到 +1370℃ 全范围如果每1℃一个点,表格能到 K 字节级别,好在 STM32L031 有 32KB Flash,放一个表没问题。二是用多项式拟合,这种代码少,但多项式次数太高时可能过拟合,需要分段拟合。

我在项目中偏向用“查找表 + 线性插值”。温度基准点不用每 1℃ 一个,每 10℃ 一个点,中间段用插值,误差在 0.1℃ 以内。插值计算需要小心 16 位或 32 位运算时的溢出,用浮点的话代码简单,但 STM32L031 没有 FPU,软件浮点会占掉不少 CPU 时间,好在采样率不快,问题不大。如果想省电省时间,可以全部用定点整数运算,把电压放大 1000 倍再查表,速度会快很多。

6. HVAC 现场调试中容易踩的坑和针对性解决

6.1 工频干扰、长线缆和接地环路

HVAC 现场最常见的干扰源就是工频 50Hz。配电柜里的接触器一动作,整个系统噪声立刻上升。我在调试初期遇到过这样的现象:温度读数稳定时很稳,但只要旁边空调压缩机一启动,ADC 码值就会周期性跳动。后来排查发现是长距离传感器线缆感应了工频电压,进入 ADC 之后形成了共模信号。

解决方法是:一是配置数字滤波器,选择 90 SPS 等和 50Hz 有关系的档位;二是在模拟输入前端加 RC 低通滤波,每根线对地接 100nF 电容,串联 1kΩ 电阻;三是尽量使用屏蔽线,屏蔽层单点接地。如果是长距离走线且存在明显电位差,还需要考虑隔离方案,比如给传感器侧加隔离电源和隔离通信,但那样成本会明显上升,一般设备级产品不会这么设计。

接地环路又是一个隐蔽问题。我曾经在一次测试中,传感器线缆的屏蔽层两端同时接了机壳地,结果形成环路电流,反而引入更多噪声。正确做法是按“一点接地”原则处理,屏蔽层只在主控板一侧接地。

6.2 自热效应、校准温漂和元件老化

RTD 自热是任何高精度测温都绕不开的问题。恒流源电流越大,电阻上产生的热量越大。普通 PT1000 在 1mA 电流下,空气中自热误差可能在几十毫欧级别,换算成温度大约 0.01-0.05℃;但在狭窄探头内部,散热变差,自热可能到 0.1℃ 以上。所以我在产品固件里固定一个原则:上电后延迟 300ms,让传感器和 ADC 完成上电稳定,再开始采样;如果是周期性采集,在每个采集周期开始前才打开电流源,“读一次,关一次”。

校准也是必须做的。24 位 ADC 精度高,但传感器本身有误差。工业 PT1000 的精度等级分为 A 级、B 级,B 级的误差可以达到 ±0.3℃(0℃时),所以 FE 级温度变送器一般都要做两点校准。我的校准方法是:准备一个实验室用恒温槽,分别设置 0℃ 和 100℃(如果用热电偶就是冰水混合物和沸水),记录 ADC 读数和真实温度,然后在线性修正曲线里保存两个 offset。在固件里做一个简单的两点线性校正,把最终输出调到偏差 ±0.1℃。

校准完成之后也不能一劳永逸。PCB 上的分压电阻、参考电阻都会随温度和湿度变化。参考电阻的选择尤为重要,至少用 25ppm/℃ 温漂系数,更好的用 10ppm/℃ 甚至 5ppm/℃。如果预算允许,直接用高精度金属箔电阻或者低温漂的薄膜电阻网络。

6.3 UART 通信的这些坑:波特率误差、丢帧与热插拔

ADS122U04 的 UART 通信在实验室里跑得很顺,到了现场往往出问题。最大元凶就是波特率误差。如果你的 STM32L031 使用内部 HSI 振荡器(在 25℃ 下大约是 ±1% 到 ±2%),波特率和 115200 差一点,短帧可能侥幸不错,长帧就会收错。最好的办法是换用外部晶振,或者在使用 HSI 时,仔细核对系统时钟分配,确保 USART 时钟源和波特率设置匹配。

丢帧问题也要重视。如果 MCU 在某个时刻忙于处理无线协议,没来得及读 UART 接收寄存器,ADC 发来的数据就会被覆盖。我在代码里对所有 ADC 数据的读取都使用 DMA 环形缓冲,并且每帧校验检查,一旦发现校验失败,就自动发送一个同步帧让 ADC 重新同步。这样即使在恶劣环境下偶尔丢帧,系统也不会卡死。

另一个实际经验是关于热插拔。工业设备有时允许在线更换传感器,如果用户在 ADC 上电情况下插拔传感器,会产生毛刺和电流浪涌。轻则让本次读数出错,重则损坏 MCU 引脚。正规项目中,传感器接口会加 ESD 保护二极管和限流电阻,更稳妥的还加上铁氧体磁珠。如果你的板子面对的是现场维护人员,这部分绝对不能省。

6.4 长期稳定性和数据平滑策略

一个温度采集系统在调试期间表现很好,不代表运行几个月后依然稳定。我发现两个最容易恶化的问题:一是基准电压或参考电阻漂移,二是传感器连接端子氧化导致接触电阻变大。后者对 PT100 这种低阻值传感器影响尤其大,几十毫欧的接触电阻就能让温度差出 0.1℃。

软件上我还会做一点数据平滑。ADS122U04 的数字滤波器本身已经有滤波效果,但做控制或变送时,我会再加一个一阶低通滤波,公式是:滤波值 = 上次值 × α + 本次值 × (1 - α),α 取 0.7 到 0.9。这样既不会让输出响应太迟钝,又能压掉秒级的随机抖动。但要注意,滤波不能无休止地加,否则系统响应变慢,控制环路可能会振荡。特别是 HVAC 的温控阀执行器,需要的是快速且稳定的温度反馈,过度平滑会直接影响舒适度。

7. 我的最终实现里还藏了哪些小技巧

实际项目收尾时,我还做了一件容易被忽略的事:把 STM32L031 和 ADS122U04 之间的 UART 通信速率降下来。很多人一开始就用 115200 甚至更高,但工业场景里 115200 对 CRC 校验、抗干扰和低功耗来说并不划算。最终我常用 19200 或 38400,ADS122U04 本身支持的数据率没那么高,温度采样的吞吐量需求也极小。波特率低了,眼图更宽,现场误码率大幅下降。

功耗控制上,我最满意的一个设计是用 STM32L031 的 RTC 定时唤醒。平时整个系统在 Stop 模式下,只有 RTC 在跑。到了采样时刻,RTC 唤醒 MCU,MCU 给 ADS122U04 上电,等稳定后发起一次 UART 读取,处理完数据后就重新进入 Stop 模式。这样整板平均电流可以做到几十微安,对电池供电的 HVAC 无线传感器来说,是决定能否真正部署的指标。

代码层面上,我建议把所有 ADC 相关的寄存器配置、命令解析、温度换算都封装成独立模块,不要散落在应用代码里。因为这类项目后期维护的人很可能不是你,而 ADS122U04 这种带 UART 协议的芯片,如果封装清晰,可以极大降低后人理解成本。我在模块里加上所有配置的注释,特别是每个配置对应哪一种传感器,这样别人改测温量程时只需要看注释,不用再翻一遍手册。

如果你的项目也在考虑类似方案,我给的建议是:先拿一块官方评估板,用 USB 转串口直接和 ADS122U04 通信,把所有寄存器配明白,再用 STM32L031 去对接它。不要在 PCB 打样后就急着调软件,先把 UART 链路用 PC 跑通一次,能大大缩短开发周期。毕竟 24 位 ADC 这类器件,问题往往不在芯片本身,而在信号链路的每一个细节上。

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

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

立即咨询