ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ADS122U04+STM32L4A6RG工业温度采集方案详解

ADS122U04+STM32L4A6RG工业温度采集方案详解

做工业温度采集这些年,我一直偏爱“精密ADC+MCU”的组合,而用得最顺手的一对,就是ADS122U04IPWR配STM32L4A6RG。ADS122U04是一颗带 UART 接口的 24 位 Δ-Σ ADC,能直接接 PT100/PT1000、热电偶和 NTC 热敏电阻,省掉了传统模拟前端一大堆调理电路;STM32L4A6RG 则是 ST 的低功耗 Cortex-M4 系列,资源够、串口多、低功耗模式丰富,用它来做协议解析和温度算法非常合适。

这篇文章就围绕这套组合,把工业控制柜、HVAC 风管温度、冷水机组、环境监测这类场景里,从硬件连接、寄存器配置到温度换算算法的完整链路讲透。不论你在做现场仪表、楼宇自控面板,还是嵌入式数据采集模块,这套方案的思路都能直接抄走用。

1. 方案定位:为什么这个组合适合工业与 HVAC 的温度采集

1.1 从应用场景倒推芯片选型

工业和 HVAC(暖通空调)应用里的温度测量,和实验室环境完全两回事。传感器通常离控制器几十米远,现场有变频器、接触器、电磁阀带来的电磁干扰,环境温度可能从零下十几度到五六十度变化,而且这类设备往往要求 7×24 小时不间断运行。于是选型时我重点看几个硬指标:

  • 能直接接多种温度传感器,最好不用额外设计信号调理电路;
  • ADC 分辨率足够高,至少有 20 位有效分辨率,这样 0.1°C 级别的变化才不会被量化噪声吃掉;
  • 对工频 50Hz/60Hz 干扰有抑制作用;
  • 通信接口简单可靠,方便和 MCU 对接。

ADS122U04 就是按这个需求选的。它是一颗四通道、24 位 Δ-Σ ADC,内部集成了可编程增益放大器(PGA)、两个激励电流源(IDAC)、一个用于冷端补偿的内置温度传感器,还有 2 线 UART 数字接口。这意味着从模拟前端到数字输出,一个芯片全包了。MCU 端只需要通过串口发命令、收数据,不涉及 SPI 时序的紧张处理,也不用单独搭仪表放大器、恒流源或者滤波电路。

MCU 选择 STM32L4A6RG 则是从整个系统的“寿命”考虑的。它属于 STM32L4 系列,Cortex-M4 内核带浮点单元,主频 80MHz,片上却有 1MB Flash 和 320KB SRAM,跑温度查表、线性化、PID 控制逻辑、通信协议栈都有富余。更重要的是 L4 家族的低功耗能力:Stop 模式、Standby 模式、低功耗串口,让我在做电池供电的 HVAC 温控器或者无线传感器节点时,不用换平台。

1.2 两颗芯片的互补关系

ADS122U04 和 STM32L4A6RG 的分工很清晰:ADC 负责把物理世界的电阻、电压变成数字值,MCU 负责把所有数字值变成人可理解的温度,并处理告警、显示、联网。

这套组合最舒服的一点是接口对称,AD 端是 UART,MCU 端用 USART2 或 LPUART1 就能对接,波特率也不高(通常 9600 或 115200),总线上没有太多时序紧张的问题。而且 ADS122U04 本身就比较“傻瓜化”:它内部有配置寄存器,上电后用几帧命令配置好输入通道、增益、数据速率,之后每次读数据也只是收发几组字节的事。

实际项目中,如果你用的是带 SPI 接口的 ADS122S04,也不影响这套软件思路,但 UART 版本的好处是,用户或者现场工程师拿一个 USB-TTL 线就能直接抓 ADC 的输出,排查问题非常方便。这也是我在很多 HVAC 控制器中坚持用 UART 版本的原因之一。

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

2.1 ADS122U04IPWR 核心电路搭建

先确定供电。ADS122U04 的模拟供电 AVDD 范围是 2.3V 到 5.5V,数字 I/O 供电 IOVDD 可以单独接 1.8V 到 5.5V,所以我通常把 AVDD 和 IOVDD 都接到 3.3V,和 STM32L4A6RG 保持同一个电平域,省去电平转换。

AVDD 供电走 LDO 而不是 DC-DC。虽然 ADS122U04 对电源纹波有一定抑制能力,但 Delta-Sigma ADC 对电源上的高频毛刺仍然敏感。实测中发现,直接用开关电源供电时,读数跳变会比 LDO 供电时大 2 到 3 个 LSB。所以我在每个 ADC 的 AVDD 引脚附近放置了 0.1μF 陶瓷电容和 10μF 钽电容各一只,并保证这些电容的地是模拟地,单独打过孔回到底层模拟地区域。

参考电压部分,如果追求“比例测量”式的高精度,就直接在 REFP 和 REFN 之间接精密电阻 Rref,让 IDAC 电流同时流过参考电阻和 RTD 传感器。这样 ADC 输出的数字码值直接就是阻值比例,电流源的温漂和老化误差可以被抵消。Rref 的温漂系数要选低,我一般用 0.1% 精度、温漂 10ppm/°C 以下的金属膜电阻,或者是专用的精密电阻网络。

去耦、ESD 保护、输入滤波这些细节,下面按传感器类型分别说明。

2.2 PT100 三线制接法与电阻值计算

工业现场用得最多的还是 PT100。PT100 在 0°C 时阻值为 100Ω,温度每升高 1°C 阻值大约增加 0.385Ω,所以引线电阻 1Ω 就会造成约 2.6°C 的误差,绝不能忽视。

为了解决这个问题,我用三线制接法。ADS122U04 有两个内部 IDAC 电流源,正好派上用场:

  • IDAC1 接到 RTD 的一端,电流经引线电阻、RTD、另一根引线流到 AIN1;
  • IDAC2 接到与 AIN1 同一节点的引线电阻上,电流流向同一方向,在另一根引线上产生和 IDAC1 路径相同的压降。

测量时 ADC 的差分输入取 RTD 两端电压差,而两根引线上的电压降由于 IDAC1 和 IDAC2 电流相等而被抵消。实际连接是:

IDAC1 ──> AIN0 ──线阻Rw── RTD ──线阻Rw── AIN1 <── IDAC2

Rref 串联在 IDAC1 的回路上,使得 VREFP - VREFN = I × Rref。

假设选择 IDAC 电流为 500μA,Rref 用 1800Ω,则参考电压为 0.9V。PT100 在 150°C 时阻值约 157.3Ω,ADC 输入端的最大差分电压只有 500μA × 157.3Ω ≈ 78.7mV。如果 PGA 增益设为 1,那么这 78.7mV 只占满量程 0.9V 的 8.7%,有效分辨率会差很多。所以我通常把 PGA 设为 8 倍,放大到 630mV,接近满量程的 70%,噪声对结果的相对影响明显变小。

PT1000 的情况类似,只是阻值大十倍,IDAC 电流建议降到 250μA 或 100μA,避免自热误差太大。毕竟 PT1000 在 150°C 时电阻约为 1573Ω,250μA 电流下功耗约 98mW,大部分情况下可以接受,但贴片封装紧挨 PCB 铜皮时,还要留意温度被自身加热抬高的问题。

2.3 热电偶与 NTC 的接入方式

热电偶输出电压极低,K 型也才 40μV/°C 左右,所以 PGA 增益要调高。测量范围如果是 -40°C 到 300°C,K 型热电偶的电压范围大约 -1.5mV 到 12mV,我把 PGA 设为 64 或 128,再用 2.048V 内部参考,效果不错。

热电偶本身不接入 IDAC 电流,因为它是无源器件,不需要激励。冷端补偿则依赖 ADC 自带的内部温度传感器,它测量的就是芯片附近 PCB 的温度。关键的 PCB 布局问题是:必须让热电偶冷端、接线端子和 ADS122U04 芯片尽量靠近,并且保持等温,中间不要有大功率发热器件。不然内部温度传感器测出来的是芯片自己或附近元件的温度,根本不是真正的冷端温度。

NTC 热敏电阻接法更简单,直接用 IDAC 电流流过 NTC,将变化电压送到 ADC 输入。比如用 100μA 的 IDAC,25°C 时 10kΩ 的 NTC 上产生 1V 电压,PGA 可以设 1 或 2。NTC 的非线性很重,但 HVAC 中很多应用只关心几度的精度,配合查表法完全够用。

2.4 STM32L4A6RG 侧的连接设计

STM32L4A6RG 侧要做的连线不多:PA2/PA3 是 USART2 的 TX/RX,分别接到 ADS122U04 的 RXD/TXD(注意交叉),然后一根共地线,这是模拟链路和数字链路共地的重要连接。

为避免数字地噪声串进模拟地,我的做法是 ADC 模拟地采用星形单点接地,模拟地平面和数字地平面在 MCU 的 EPAD 下方用磁珠或 0Ω 电阻连接。ADS122U04 的 DGND 引脚和 AGND 引脚都要接地,但最好在 ADC 下方分别接模拟地。

电源方面,MCU 的 VDDA 单独用 LDO 供电,与模拟传感器的 AVDD 分开,可减少数字翻腾时对模拟电源的干扰。如果产品对可靠性要求高,建议给 STM32L4A6RG 外接 32.768kHz 晶振和主晶振,避免用内部 HSI 的高温漂移影响 UART 波特率匹配。

3. 软件实现:UART 通信与温度算法

3.1 ADS122U04 寄存器配置与 UART 通信时序

ADS122U04 通过 UART 接收主机命令,并返回状态和数据。主机与 ADC 之间是一问一答式的帧结构,重点配置下面几个寄存器:

  • 通道选择寄存器:把 AINP/AINN 设为对应传感器通道,参考电压选择外部 REFP/REFN;
  • PGA 寄存器:根据传感器类型设置增益,RTD 用 8,热电偶用 64;
  • 滤波与数据速率寄存器:设置 SINC3 滤波器挡位,通常选择 20SPS,这样可以同时抑制 50Hz 和 60Hz 工频干扰;
  • IDAC 寄存器:配置两个电流源的大小和输出引脚,RTD 场景设 500μA,NTC 场景设 100μA;
  • 转换模式寄存器:设成连续转换模式,MCU 定时读取最新结果即可。

初始化代码大体是这个样子:

// 伪代码:配置 ADS122U04 uint8_t cfg[] = {0x00, 0x08, 0x22, 0x78, 0x10, 0x00}; HAL_UART_Transmit(&huart2, cfg, sizeof(cfg), 1000);

具体寄存器值要以你实际选用的文档为准,但流程就是这样:上电延时几十毫秒,然后写入一组配置字节。UART 的波特率必须和 ADC 内部设置的波特率一致,ADS122U04 通常是通过 CS/TXD 引脚电平或命令配置的,我一般固定为 9600 波特率。实际调试时,可以先发一个复位命令,等待芯片回标志,再开始配置。

读取转换结果的时序是:每次主机发送读取命令后,ADC 返回 4 个字节,前 3 个是 24 位转换数据,第 4 个是状态字节。STM32 侧用中断接收、查询处理都可以。

3.2 RTD 温度计算:从 ADC 码值到摄氏温度

RTD 场景采用比例测量法时,ADC 输出的码值直接反映了 RTD 电阻和参考电阻的比值。设 24 位 ADC 满量程码值为 0x7FFFFF(二进制补码,约 8388607),则:

R_rtd = (code_rtd / code_ref) × Rref

如果 code_ref 是参考电阻对应的满量程码值(当差分输入满量程时),这部分要注意:ADS122U04 的双极性输出下,满量程码是 0x7FFFFF 对应正满量程,0x800000 对应负满量程。实际操作时,我建议先对参考电阻单独采集一个码值作为校准常数存下来,再用同一 ADC 测量 RTD 的码值,二者相除得到比例,从根本上消除参考电阻、电流源和 PGA 增益的绝对误差。

RTD 阻值到温度的换算,工业上常用 Callendar-Van Dusen 方程。0°C 以上可以用二次方程求解:

R(t) = R0 × (1 + A×t + B×t²)

对于 PT100,A=3.9083e-3,B=-5.775e-7,R0=100Ω。反解时:

t = [-A + sqrt(A² - 4B×(1 - R/R0))] / (2B)

这个方程在 0°C 到 850°C 范围内精度足够。0°C 以下还要引入 C 系数项,但 HVAC 很多场合下用二次方程也能对付。如果不想解方程,更简单的做法是建一个 0.1°C 间隔的查表数组,用线性插值。Flash 足够大,STM32L4A6RG 完全装得下。

3.3 热电偶温度计算:冷端补偿与查表方法

热电偶测量的核心是两个电动势相减:

E_total = E_meas + E_cold

E_meas 是 ADC 直接测到的热端相对冷端的电压,E_cold 是冷端温度 T_cj 对应的热电动势。先把 ADS122U04 内部温度传感器读到的冷端温度转换成 K 型热电偶的标准电动势,再叠加到实测电压上,最终用总电动势查表得到热端温度。

具体步骤:

  1. 读 ADC 内部温度传感器码值,换算成摄氏温度 T_cj。这一步 ADC 的换算公式在数据手册里有,通常是一个 14 位温度 ADC 的输出加上偏移;
  2. 用 K 型热电偶的 NIST ITS-90 多项式,或者查表函数,得到 E_cold = f(T_cj);
  3. 计算 E_total = E_meas + E_cold;
  4. 用 E_total 反查热电偶分度表,得到热端温度。

查表时要注意分度表的步长。我常用 1°C 步长的表,再用线性插值把误差控制在 0.05°C 以内。表格不要放在 RAM 里,直接 const 存在 Flash 中。STM32L4A6RG 有 1MB Flash,一个 K 型分度表也就几百字节,完全没有压力。

3.4 数据滤波与采样策略

ADS122U04 在 20SPS 数据速率下,自身已经有很好的滤除工频干扰能力,但现场电磁环境恶劣时,MCU 侧还需要再做一次数字滤波。我常用的方法是滑动窗口平均,窗口取 8 个点,每个点间隔 50ms,这样最后输出的温度值比较平稳。

如果系统对响应速度有要求,比如 HVAC 的 PID 控制环路需要 1 秒以内的温度反馈,我会改用一阶低通滤波:

filtered = filtered * 0.8 + new_value * 0.2;

这个系数的选择取决于采样周期。采样周期 50ms,滤波时间常数约 250ms,普通温控环路完全够用。需要注意,不要过度滤波,否则温度变化半天才反映到输出端,风门调节就会明显滞后。

4. 校准与验证:精度从设计到落地

4.1 校准流程与参考源选择

硬件设计完成后,最关键的步骤是校准。把校准理解为“把 ADC 的默认误差和系统级误差一次性修正掉”的过程。

对于 RTD 通道,我推荐用精密电阻箱来校准,而不是用温度源。因为精密电阻箱可以直接给出 100Ω、138.51Ω、175.84Ω 这些标准阻值,避免恒温槽的温场不均匀和温度计误差混进来。校准时:

  • 电阻箱设 100Ω,记录 ADC 码值,对应 0°C;
  • 电阻箱设 138.51Ω,记录 ADC 码值,对应 100°C;
  • 用两点式算增益误差和偏移误差,写入 MCU 的校准参数存储区。

对于热电偶通道,用直流电压源模拟热电偶输出更直接。K 型热电偶在 0°C 冷端条件下,热端 100°C 时电压是 4.096mV,热端 200°C 时电压是 8.137mV。把电压源接入 ADC 输入,调整增益和偏移修正,然后验证冷端补偿路径是否正常工作。

4.2 实例:一组实测数据与误差分析

我在一套 HVAC 风管温度采集模块上,使用 PT100 三线制 + ADS122U04 + STM32L4A6RG,校准后做了这样的实测:

标准温度(℃)电阻箱阻值(Ω)测量温度(℃)绝对误差(℃)
0100.000.03+0.03
25109.7324.96-0.04
50119.4050.02+0.02
75129.0874.98-0.02
100138.51100.01+0.01

这个结果是在常温 25°C 环境下、IDAC 500μA、PGA=8、20SPS 档位下测得的。误差来源主要是参考电阻的残余温漂和 ADC 内部噪声,但整体已经控制在 ±0.05°C 以内,对 HVAC 应用来说远优于需求。工业现场如果要求更高,可以把校准温度点增加为三点,并在使用环境温度附近重新校准。

需要提醒的是,校准参数和温漂补偿表最好存放在 MCU 的 Flash 独立区域,同时在出厂测试时把序列号、校准日期、校准温度一并写入,方便后续追踪。

5. 实战中总结的经验与常见问题排查

5.1 UART 通信异常的排查手段

第一类常见问题是 ADC 完全无应答。排查时先用示波器看 MCU 发送脚的波形是否正常,再检查 TXD/RXD 是否交叉接反。ADS122U04 的 RXD 接 STM32 的 TXD,TXD 接 STM32 的 RXD,这个顺序经常有人搞错。

第二类问题是时而能读时而超时。原因多为波特率不匹配。STM32L4A6RG 如果使用内部 RC 时钟,精度大约 ±1%~±2%,ADC 那边如果也是内部振荡器,累计误差可能超过 UART 能容忍的范围。解决办法是双方都改用晶振,或者用低速波特率 9600,容错能力明显更强。

第二类还有一个隐蔽原因:共地不良。MCU 和 ADC 分别由不同电源供电,如果两个电源只通过信号线间接共地,通信线上的地回路就会导致帧错误。我的做法是在两块板之间专门留一个 GND 连接点,用粗短导线或 PCB 覆铜连接。

5.2 读数漂移、自热误差与电磁干扰

读数缓慢漂移,大概率是热力学问题,而不是电学问题。RTD 通过 IDAC 电流发热,尤其在小体积模块里,这种温升会让读数比真实温度偏高。PT100 用 1mA 电流时,空气中自热大约 0.1°C/mW 到 0.3°C/mW,所以我建议 PT100 用 500μA,PT1000 用 250μA,宁可牺牲一点分辨率,也要保证长期稳定性。

读数跳变则可能来自电磁干扰。HVAC 现场有交流接触器、变频器,干扰频谱非常宽。排查时可以先把传感器从现场断开,接一个精密电阻箱放在 ADC 旁边,如果读数稳定,说明干扰是从传感器线路耦合来的,需要给传感器线缆加屏蔽层并将屏蔽层单端接地;如果读数依然跳变,则问题在 ADC 供电或布局,检查 AVDD 端的 LDO 和去耦电容。

工频干扰方面,我建议固定用 20SPS 的 SINC3 滤波器挡位。如果现场有变频器产生的非 50Hz 整数倍干扰,可以在数字侧再叠加一个 50ms 的移动平均滤波,效果立竿见影。

5.3 低功耗设计的落地技巧

最后单独聊聊功耗。虽然是工业/HVAC 场景,但很多数据采集模块都要求电池供电,或者通过 PoE 供电并对总功耗有上限限制。

我把这套方案做到平均功耗低于 1mW 的经验是:让 STM32L4A6RG 进入 STOP2 模式,ADC 进入待机模式,每 5 秒钟醒来一次,完成一次转换、读取和滤波后立即再睡。ADS122U04 最耗电的是 IDAC,500μA 电流在转换期间流经 RTD,但转换完成即刻关闭。整个唤醒窗口控制在 50ms 内,占空比约 1%,平均电流自然低。

另一个容易被忽略的点是 UART 接口在空闲状态下不要悬空。如果 ADC 的 TXD 引脚空闲时是浮动的,会有漏电流。我在驱动端配置内部上拉,或者干脆在线上加 10kΩ 上拉电阻,让静态电流可控。

根据我的实际经验,这套 ADS122U04 + STM32L4A6RG 方案最值得称赞的是它把高精度模拟采集和灵活的数字处理解耦得干净利落。硬件上我只需要考虑传感器接入、参考电阻、电源和布线的工程细节,软件上则可以把大部分精力放在温度算法、校准逻辑和系统功耗管理上。后续如果你想从单点测温扩展到多点测温网络,甚至每个节点挂 4 路传感器再加一个无线模块,这套架构仍然不需要推翻重来,只要在原有基础上扩展通道和唤醒策略就够了。

返回列表