ADS122U04+STM32L081高精度温度采集方案:从信号链到低功耗设计

发布时间:2026/11/5 6:29:00
ADS122U04+STM32L081高精度温度采集方案:从信号链到低功耗设计

你是否见过这种情况:温度探头接好了,程序也写完了,实验室里数据很漂亮,现场一通电就完全变了个样。我之前做工业采集和 HVAC 控制器时,这个问题一直比较折磨人。后来把思路改成“模拟前端与 MCU 分离”之后,情况才彻底好转——AD 转换交给专门的 Δ-Σ ADC,MCU 只负责通信和逻辑,传感器信号链的稳定性和可维护性都提升了一大截。ADS122U04IPWR 配 STM32L081CB 是我在多个项目里反复验证过的一套组合,这篇文章就把这套方案从选型到落地完整拆一遍,包括信号链接法、UART 通信、固件换算、硬件布局和校准实测,适合正在做工业温度采集、HVAC 控制器、楼宇自控或电池供电温度节点的朋友参考。

1. 为什么把 ADC 拆出去:内置 ADC 的边界与高精度接口选型

1.1 内置 12-bit ADC 的精度上限在哪里

STM32L081 芯片内部是有一个 12-bit ADC 的,分辨率 4096 格。假如只测 0 到 100℃ 的范围,1 LSB 换算下来约 0.024℃,理论上好像够用。但“理论上够用”和“实际上稳定”是两回事。

实际应用中,内置 ADC 的有效位数往往到不了 12 bit。MCU 内部的数字逻辑、时钟翻转、电源噪声都会耦合到模拟采样电路上,真正稳定有效的分辨率可能只有 10 bit 甚至更低。此外,内置 ADC 的参考电压来自芯片内部 VREF,这一路参考会随温度和电源电压漂移。我实测过一批电路板,用内置 ADC 读同一个 NTC,板间差异和温漂加起来能到 1 到 2℃,对家用温控器也许无所谓,但遇到工业协议要求的 ±0.2℃ 或者 HVAC 冷热水管温度采集,这就很被动。

外置 24-bit Δ-Σ ADC 解决的就是这些问题。以 ADS122U04IPWR 为例,它内部集成了可编程增益放大器 PGA,可以先把传感器信号放大再转换;Δ-Σ 架构本身通过过采样和噪声整形把量化噪声推到高频区,再用数字滤波器滤掉,低频段可以获得很高的信噪比。同时数字滤波器对 50/60Hz 工频干扰有天然抑制作用,这在工业现场特别实用——你永远不知道配电柜旁边会有什么强电干扰。

1.2 为什么偏偏选 UART 接口的 ADC

市面上外置 ADC 接口无非 SPI、I2C、UART 三种。我做过几个产品后,对接口选择有一套自己的判断:

接口优点缺点适合场景
SPI速率高、全双工、时序可控线多(SCLK/MOSI/MISO/CS),长线缆时钟容易畸变,隔离成本高PCB 内部短距离高速采集
I2C线少、支持多设备速率低,抗干扰弱,长线缆扯皮多,地址冲突时更麻烦板内近距离低速通信
UART两根线搞定,抗干扰好,隔离容易,MCU 标配外设速率中等,异步通信对时钟精度敏感工业长线缆、隔离场景、低功耗唤醒

ADS122U04IPWR 就是一颗把寄存器操作全部封装进 UART 帧的 24-bit ADC。主机通过 TX、RX 两根线和它通信,命令帧带 CRC 校验,电气上就是标准 8N1 串口帧。工业现场经常需要做电气隔离,UART 只要隔离两条数据线和一个电源,配合数字隔离器非常简单;如果线缆从传感器端子到主控板走了几十米,UART 的抗干扰能力也明显比 SPI 时钟线靠谱。

MCU 选择 STM32L081CB 也是考虑过的。这颗片子是 Cortex-M0+,主频 32MHz,在一秒钟只有几十次温度转换的应用里性能绰绰有余。重要的是它的功耗:Stop 模式下电流可以做到微安甚至纳安级别,同时 LPUART 能在停止模式下监听 RX 引脚,数据来了再唤醒 MCU。电池供电的 HVAC 温度节点、无线温控器就是冲着这个特性选它的。192KB Flash 对于查表法温度换算、协议栈、Bootloader 来说也足够宽裕。

2. 传感器信号链设计:PT100、热电偶与 NTC 的接法与参数计算

2.1 PT100/PT1000 采用 IDAC 激励与比例测量

测温传感器里最绕不开的是铂电阻。PT100 在 0℃ 时是 100Ω,温度每升高 1℃ 电阻大约增加 0.385Ω。温度不是直接量出来的,而是通过电阻值反推出来的,这里面的关键问题就是:你用多大的电流去激励它,这个电流本身稳不稳。

很多人刚开始做的时候,习惯用一颗恒流源芯片或者电阻分压来激励 PT100,然后测电压。这种方案的误差来源很多:电流源的温漂、基准电压的漂移、ADC 参考电压的漂移,最后都会折算到温度上。我的做法是直接用 ADS122U04 内部的 IDAC 恒流源,同时做比例测量。

比例测量的思想很巧妙:让同一个 IDAC 电流同时流过 PT100 传感器和一颗精密参考电阻,ADC 分别测量这两个电压。因为电流是共用的,电流的任何漂移都会同时作用在两个电压上,在计算比值时相互抵消。最终结果只取决于一个比值:

R_pt = R_ref × (Code_pt / Code_ref)

这就像两个人背靠背站在天平两端,无论地面怎么倾斜,只要两边等量变化,天平读数不受影响。R_ref 选一颗 0.1% 精度、温漂 5ppm/℃ 的精密电阻,整个比例测量的根基就稳了。

参数计算方面,我常用的配置是:IDAC 设置为 1mA,PT100 在 0℃ 时压降是 100mV,在 100℃ 时压降约 138.5mV。把 PGA 增益设为 8,ADC 输入信号大约 0.8V 到 1.1V,相对 2.048V 的内部参考电压有足够摆幅余量,不会削顶。传感器自身的功耗约 0.1mW 左右,对 PT100 自热的影响基本可以忽略。如果系统精度要求特别高,可以把 IDAC 降到 0.5mA,用牺牲一点信噪比换取更低的自热。

2.2 三线制接法解决导线电阻问题

PT100 接线的第一个大坑是导线电阻。普通铜导线一米就有零点几欧姆,导线电阻一旦串联进传感器,就会当成传感器阻值的一部分。两线制接法下,两根导线电阻全部算进测量结果,一米线缆可能贡献几欧姆误差,对应 PT100 就是好几摄氏度的偏差,完全不能接受。

为了解决这个问题,工业上普遍用三线制。三线制的原理是通过 IDAC1 和 IDAC2 两条电流源分别驱动传感器两侧的导线,让导线电阻上的压降在差分测量中被对称抵消。ADS122U04 内部有两路 IDAC,做三线制接法时正好用上:一个电流源从 AIN1 流入 PT100,再从 PT100 流出经导线到 AIN2,另一路电流源用于补偿第三根线上的压降。

实际布线时要注意,三根线的线径和长度最好一致,这样导线电阻才能尽量匹配。若用四线制就更彻底了,两条线走激励电流,两条线走测量电压,测量回路几乎不流过电流,导线电阻的影响趋近于零。四线制精度最高,但对线缆数量要求也最高,HVAC 现场一般三线制就是精度和成本的最佳平衡点。

2.3 热电偶的小信号与冷端补偿

工业上测高温的情况,PT100 就不太合适了,这种场景基本都选热电偶。K 型热电偶灵敏度约 41μV/℃,也就是说从 0℃ 到 100℃ 产生的热电势只有 4mV 左右。这种微弱信号必须依赖 ADC 内部的 PGA 做前置放大,如果 PGA 倍数不够,24-bit ADC 的分辨率优势也会被埋在噪声里。

热电偶测量有个绕不开的问题:它测的是热端和冷端之间的温差,不是绝对温度。冷端指的是热电偶导线连接到电路板端子的那一端。如果冷端温度是 25℃,而你把它当成 0℃ 处理,100℃ 的目标温度读出来就成 75℃,偏差大到离谱。所以必须做冷端补偿。

ADS122U04 内部自带一个温度传感器,距离芯片引脚比较近,可以用来估算冷端温度。更讲究的做法是在端子旁边贴一颗高精度 NTC 或 PT1000,把冷端温度测准,然后在软件里按照热电偶分度表做补偿计算:先根据冷端温度查冷端对应的热电势,把它加到实测热电势上,再反查热端温度。这套流程在固件里实现并不复杂,难的只是查表逻辑是否严谨。

2.4 NTC 的两种接法

HVAC 行业大量使用 NTC 热敏电阻,10K、B=3950 这种常温 10kΩ 的型号到处都是。它价格便宜、响应快,精度在窄温区内做校准后也够用。NTC 的接法有两种路线。

第一种是电阻分压:一颗固定电阻串联 NTC,中间点接到 ADC 输入,用内部参考电压做基准。优点是简单省事,缺点是电源波动、参考漂移都会进入测量链路,误差来源多。第二种是用 IDAC 恒流源直接激励 NTC,测量 NTC 两端压降。这种方法的好处是信号量直接对应阻值,误差链路更短。缺点是 NTC 阻值变化范围极大——零下 40℃ 时可能几百千欧,85℃ 时只有几百欧,恒流激励下高低端电压差异巨大,ADC 量程不好兼顾。

我的取舍标准是:如果系统精度要求不高、量程窄,用分压法足够;如果要做宽温区、高一致性,优先 IDAC 激励法。NTC 的换算用 B 值公式就能满足大部分场景:

T = 1 / (1/T0 + ln(R/R0)/B) - 273.15

其中 T0 是 25℃,R0 是 T0 下的阻值。B 值选好了,窄温区误差可以控制在 0.5℃ 以内,配合单点校准还能更进一步。

3. UART 通信链路:时钟、波特率与低功耗唤醒

3.1 把 ADS122U04 当串口设备操作

ADS122U04 的通信模型和使用普通 SPI ADC 的思维不太一样。它的寄存器读写、启动转换、读取数据,全都封装成了 UART 帧。主控要做的就是把命令按协议格式发过去,然后等它返回带数据的响应帧。帧里带 CRC 校验,通信可靠性比裸 I2C 要好不少。

初始化流程一般是:复位 ADC,等待稳定,然后通过写寄存器配置输入多路选择器、PGA 增益、IDAC 电流、数据速率、滤波器、参考源和波特率。配置完成后发启动转换命令,等待数据就绪信号,再发读取命令把原始码收回来。整个过程里最考验人的不是协议本身,而是时序和异常处理——比如 ADC 忙的时候不能发读命令,超时了要有重试机制,不能死等。

3.2 内部时钟和外置时钟的坑

ADS122U04 支持用内部振荡器,也可以外接时钟。这也是最容易踩坑的地方之一。很多人图省事直接用了内部振荡器,波特率设置在 115200,结果一开始通信就偶发错帧,或者环境温度一变化丢帧概率明显上升。

原因就是 UART 是异步通信,收发双方波特率误差必须控制在很小范围内。内部 RC 振荡器受温度和电压影响明显,测试环境里没问题,一到工业现场的宽温范围就暴露了。我把这个问题的优先级排得很高,项目里一律在 CLK 引脚接外部精准时钟,或者从 MCU 输出一路精准的时钟给 ADC。同时波特率不要盲目追求高,9600 或者 19200 在温度采集这种低数据量场景完全够用,低速率的容差窗口更大,通信更稳。还有个细节,ADC 侧的波特率分频配置和主控 UART 的实际波特率必须严格一致,否则会出现那种“能收到消息但内容错位”的隐蔽故障,排查起来非常浪费时间。

3.3 LPUART 实现低功耗唤醒

STM32L081 的 LPUART 是个好东西。常规 UART 在 MCU 休眠时就罢工了,LPUART 却可以在 Stop 模式下继续工作,等待 RX 引脚上的起始位把 MCU 唤醒。这套机制做成低功耗温度节点的时候非常舒服:

主控平时进入 Stop 模式,ADC 也进入断电模式。外界要读取温度时,上位机通过总线发送一个查询字节,LPUART 检测到起始位后唤醒 MCU,MCU 再给 ADC 上电、启动转换、读取结果、上报数据,然后重新休眠。整个过程只有几十毫秒,待机电流是微安级别。这种结构用在电池供电的 HVAC 温控器、无线传感器上是真能干活的状态,而不是实验室里摆样子。

4. 固件架构与温度换算:从原始码到稳定读数

4.1 用有限状态机代替散装 if-else

固件结构我建议直接用状态机。温度采集系统的状态其实很清晰:初始化、空闲、测量、读取、换算、上报、休眠。我见过不少同事把逻辑写成一堆 if-else 嵌套,功能是能跑,但一加需求就乱套,排查问题全靠猜。状态机的价值在于每个状态只有一个出口和一组明确的转移条件,出问题时只要看当前状态和条件就能定位。

核心状态可以这样划分:

typedef enum { ST_INIT, // 系统初始化、ADC 复位和寄存器配置 ST_IDLE, // 等待查询命令或定时事件 ST_WAKE_ADC, // 给 ADC 上电并等待稳定 ST_START_CONV, // 发起转换 ST_READ_DATA, // 读取原始码 ST_PROCESS, // 换算温度、滤波、校准补偿 ST_REPORT, // 按协议上报结果 ST_SLEEP // 进入低功耗模式 } sys_state_t;

主循环就是一个 switch-case 分发给各状态函数处理,状态转移条件写清楚,整个系统会非常容易维护。再配合一个简易的定时调度器,比如每 1 秒触发一次测量,查询命令来了立即唤醒响应,就能兼顾周期采集和事件响应两类需求。

4.2 温度换算:查表插值优于硬解方程

拿到 ADC 原始码后,第一步是还原电阻值,第二步才是换算温度。以 PT100 为例,按比例测量的公式 R_pt = R_ref × (Code_pt / Code_ref) 得到电阻,然后问题就变成了“电阻如何对应温度”。

有人喜欢直接解 Callendar-Van Dusen 方程,理论上没问题,但涉及高次方程求解,代码写起来繁琐,还容易在单片机这种资源受限环境里引入浮点精度问题。我更推荐查表加线性插值:把 -50℃ 到 200℃ 范围内每 1℃ 对应的 PT100 电阻值做成表,存进 Flash,运行时先用二分法找到区间,再在区间内做线性插值。查表法速度快、代码直观,1℃ 间隔的线性插值误差大约在 0.01℃ 级别,足够覆盖绝大多数工业和 HVAC 要求。热电偶的换算同理,需要准备“温度-热电势”分度表和“热电势-温度”反查表,配合冷端补偿一起做。

4.3 滤波策略不是越强越好

24-bit ADC 的数字滤波器已经把大部分带外噪声滤掉了,但读数仍然会有一点随机晃动。这时候很多人直接取平均值,其实未必合适。平均滤波对高频随机噪声有效,但对现场常见的尖峰干扰很敏感——一个尖峰就能把平均值拉偏。

我的习惯是组合滤波:先做中值滤波,窗口取 5 或 7,把偶发的脉冲剔除;再做滑动平均,把剩下的小幅抖动平滑掉;最后做死区判断,输出温度如果变化小于某个阈值(比如 0.05℃),就保持上次数值不变。这个设计对 HVAC 控制器的交互体验特别重要,上位机界面上的温度数字看起来非常稳定,不会跳来跳去,同时真实的变化也都能反映出来。

还有一点值得单独提醒:如果温度值要参与控制回路,滤波不要过头。PID 控制器对信号延迟很敏感,滤波太深会造成相位滞后,甚至让系统震荡。我的经验是分两条路径处理数据——显示和控制各用各的滤波参数:显示路径重度平滑,控制路径快速响应。

5. 硬件布局、EMC 与 ESD:现场返修率低才是真本事

5.1 模拟电源、参考和地的处理

ADS122U04 是混合信号器件,它的电源和参考干净程度直接决定最终噪声水平。PCB 设计上,我习惯把模拟电源 AVDD 和数字电源 DVDD 分开滤波,即使它们来自同一个 LDO,也要用磁珠或者 RC 隔离。4.7μF 加 0.1μF 的去耦电容组合是基本操作,电容尽量贴近 ADC 电源引脚摆放。

参考电压的处理同样重要。如果使用内部参考,要保证 AVDD 的纹波足够小;如果为了更高精度选了外部参考,参考芯片的布局和去耦就必须专门对待,参考走线尽量短,不要在下面过任何高频数字信号。地的处理上,我坚持传感器地、模拟地、数字地单点连接,形成星形接地。这样做的目的是避免数字地回流电流在模拟地路径上产生压降,再把噪声串进测量通道。

5.2 长线缆干扰的应对思路

工业现场传感器往往通过几十米电缆接入控制器,这根电缆就是个天线,会把电机启停、变频器开关带来的干扰全捡回来。差分输入对共模干扰有一定抑制,但最有效的手段还是物理层解决:信号线走屏蔽双绞线,屏蔽层在控制器侧单端接地,传感器侧浮空或者通过高阻接地,避免两端接地形成地环路电流。

在 ADC 输入端加 RC 低通滤波也是标准做法,比如 1kΩ 串联电阻加 1nF 对地电容。RC 不仅能抑制高频噪声,还能配合 ESD 器件保护 ADC 引脚。需要留意的是 RC 参数不能随意选,RC 时间常数会影响信号建立时间,尤其在高阻抗传感器和低 IDAC 电流下,过大的 RC 会造成稳定的偏差。板级调试阶段可以用示波器确认一下信号建立波形再做固化。

5.3 ESD 防护和现场返修

HVAC 设备在现场经常要被安装工反复接线、拆端子,人手静电放电是模拟前端芯片损坏的重要来源。ADS122U04 内部虽有保护二极管,但现实是现场静电能量可能远高于芯片耐受能力。我现在的标准做法:每一根外部信号线上串联 1kΩ 到 10kΩ 的电阻,再对地并联 TVS 管。这个成本只不过几分钱,但换回的是大规模降低现场返修率。配电柜里接线、风机盘管安装、温控器更换,这些场景都存在大量人手触摸的可能,很少有客户会按 ESD 规范操作后再去接线的。

6. 校准流程与 HVAC 场景实测数据

6.1 批量校准的两个层次

每块板子上的参考电阻有误差,ADC 的增益偏移也各不相同,只靠元件的标称值直接出厂是不行的。校准我最推荐“两点校准”。具体方法是用精密电阻箱模拟传感器的特征阻值——比如 PT100 的 100Ω 对应 0℃,138.5Ω 对应 100℃——分别记录 ADC 读数,然后线性拟合出增益系数和偏移量。这套方法不需要恒温槽,量产执行起来非常快。

如果条件允许,更好的方式是直接把传感器接上,用干井炉或者恒温槽提供标准温度源,做系统级整体校准。这样能把传感器本身的误差、信号链增益误差、参考误差一次性打包校正掉。校准数据要存到 MCU 的 Flash 里,并带 CRC 校验,防止上电读到坏数据。启动时如果检测到校准区 CRC 错误,设备应该进入出厂状态而不是带着坏参数运行。

6.2 一组典型的实测数据

我拿一套 PT100 三线制方案做过实际测试:IDAC=1mA,PGA=8,数据速率 20SPS,内部参考,在 0℃ 冰水混合物和 100℃ 干井炉两点校准。校准后回到 25℃、50℃、75℃ 的中间点测试,误差全部落在 ±0.1℃ 以内。设备持续通电 24 小时,温漂在 ±0.15℃ 以内。这套数据在 HVAC 冷热水管温度测量里是完全够用的,在不少工业协议要求下也能达标。

如果换成热电偶方案,因为涉及冷端补偿和传感器本身精度,整机的绝对误差会大一些,通常在 ±1℃ 到 ±2℃ 之间。但热电偶的价值不在绝对精度,而在宽量程和耐高温。做方案评估时,先想清楚现场到底需要什么,再决定传感器类型和校准深度。

6.3 HVAC 场景的几个特殊考量

HVAC 系统和纯工业场景不太一样,它在意的往往不是极限指标,而是长时间稳定和成本控制。温度采集范围通常就落在 -10℃ 到 50℃ 区间,对量程要求不高,但对长期的稳定性很敏感。设备在机房或者吊顶里一跑就是好几年,每年 1℃ 的漂移是不被允许的,所以校准和元器件选型比功能堆叠更重要。

电池供电在这类设备里越来越常见,低功耗设计的优先级要提到跟精度同等高度。ADC 和传感器只在采样瞬间上电,MCU 平时尽量在 Stop 模式里待着,整套系统的平均功耗能压得很低。我自己做这类项目时的经验是:先把“谁在什么时候耗电”列一个清楚的时间表,再谈优化。另外 HVAC 控制器内部往往同时存在继电器、电动阀、风机驱动这类强干扰源,硬件布局和软件滤波两边都要提前考虑,别等现场出现控制误动作再回头补。

最后分享一个实际体会:这套 ADS122U04IPWR 加 STM32L081CB 的组合,真正让我满意的地方不是某一项指标特别突出,而是整条链路从头到尾都能把控得住——信号接法、通信协议、固件换算、硬件防护、校准流程,每一环都有清晰的决策依据,出了问题也能快速定位。做测温系统最怕的不是参数不够,而是整个链路里有一两个说不清道不明的模糊环节。把这几个环节用最直白的方式做扎实,系统自然就稳定了。