ADS122U04+STM32L4A6RG工业温度采集方案详解
做工业温度采集这些年我一直偏爱“精密ADCMCU”的组合而用得最顺手的一对就是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 端是 UARTMCU 端用 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、另一根引线流到 AIN1IDAC2 接到与 AIN1 同一节点的引线电阻上电流流向同一方向在另一根引线上产生和 IDAC1 路径相同的压降。测量时 ADC 的差分输入取 RTD 两端电压差而两根引线上的电压降由于 IDAC1 和 IDAC2 电流相等而被抵消。实际连接是IDAC1 ── AIN0 ──线阻Rw── RTD ──线阻Rw── AIN1 ── IDAC2Rref 串联在 IDAC1 的回路上使得 VREFP - VREFN I × Rref。假设选择 IDAC 电流为 500μARref 用 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°CK 型热电偶的电压范围大约 -1.5mV 到 12mV我把 PGA 设为 64 或 128再用 2.048V 内部参考效果不错。热电偶本身不接入 IDAC 电流因为它是无源器件不需要激励。冷端补偿则依赖 ADC 自带的内部温度传感器它测量的就是芯片附近 PCB 的温度。关键的 PCB 布局问题是必须让热电偶冷端、接线端子和 ADS122U04 芯片尽量靠近并且保持等温中间不要有大功率发热器件。不然内部温度传感器测出来的是芯片自己或附近元件的温度根本不是真正的冷端温度。NTC 热敏电阻接法更简单直接用 IDAC 电流流过 NTC将变化电压送到 ADC 输入。比如用 100μA 的 IDAC25°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/REFNPGA 寄存器根据传感器类型设置增益RTD 用 8热电偶用 64滤波与数据速率寄存器设置 SINC3 滤波器挡位通常选择 20SPS这样可以同时抑制 50Hz 和 60Hz 工频干扰IDAC 寄存器配置两个电流源的大小和输出引脚RTD 场景设 500μANTC 场景设 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²)对于 PT100A3.9083e-3B-5.775e-7R0100Ω。反解时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_coldE_meas 是 ADC 直接测到的热端相对冷端的电压E_cold 是冷端温度 T_cj 对应的热电动势。先把 ADS122U04 内部温度传感器读到的冷端温度转换成 K 型热电偶的标准电动势再叠加到实测电压上最终用总电动势查表得到热端温度。具体步骤读 ADC 内部温度传感器码值换算成摄氏温度 T_cj。这一步 ADC 的换算公式在数据手册里有通常是一个 14 位温度 ADC 的输出加上偏移用 K 型热电偶的 NIST ITS-90 多项式或者查表函数得到 E_cold f(T_cj)计算 E_total E_meas E_cold用 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.030.0325109.7324.96-0.0450119.4050.020.0275129.0874.98-0.02100138.51100.010.01这个结果是在常温 25°C 环境下、IDAC 500μA、PGA8、20SPS 档位下测得的。误差来源主要是参考电阻的残余温漂和 ADC 内部噪声但整体已经控制在 ±0.05°C 以内对 HVAC 应用来说远优于需求。工业现场如果要求更高可以把校准温度点增加为三点并在使用环境温度附近重新校准。需要提醒的是校准参数和温漂补偿表最好存放在 MCU 的 Flash 独立区域同时在出厂测试时把序列号、校准日期、校准温度一并写入方便后续追踪。5. 实战中总结的经验与常见问题排查5.1 UART 通信异常的排查手段第一类常见问题是 ADC 完全无应答。排查时先用示波器看 MCU 发送脚的波形是否正常再检查 TXD/RXD 是否交叉接反。ADS122U04 的 RXD 接 STM32 的 TXDTXD 接 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μAPT1000 用 250μA宁可牺牲一点分辨率也要保证长期稳定性。读数跳变则可能来自电磁干扰。HVAC 现场有交流接触器、变频器干扰频谱非常宽。排查时可以先把传感器从现场断开接一个精密电阻箱放在 ADC 旁边如果读数稳定说明干扰是从传感器线路耦合来的需要给传感器线缆加屏蔽层并将屏蔽层单端接地如果读数依然跳变则问题在 ADC 供电或布局检查 AVDD 端的 LDO 和去耦电容。工频干扰方面我建议固定用 20SPS 的 SINC3 滤波器挡位。如果现场有变频器产生的非 50Hz 整数倍干扰可以在数字侧再叠加一个 50ms 的移动平均滤波效果立竿见影。5.3 低功耗设计的落地技巧最后单独聊聊功耗。虽然是工业/HVAC 场景但很多数据采集模块都要求电池供电或者通过 PoE 供电并对总功耗有上限限制。我把这套方案做到平均功耗低于 1mW 的经验是让 STM32L4A6RG 进入 STOP2 模式ADC 进入待机模式每 5 秒钟醒来一次完成一次转换、读取和滤波后立即再睡。ADS122U04 最耗电的是 IDAC500μA 电流在转换期间流经 RTD但转换完成即刻关闭。整个唤醒窗口控制在 50ms 内占空比约 1%平均电流自然低。另一个容易被忽略的点是 UART 接口在空闲状态下不要悬空。如果 ADC 的 TXD 引脚空闲时是浮动的会有漏电流。我在驱动端配置内部上拉或者干脆在线上加 10kΩ 上拉电阻让静态电流可控。根据我的实际经验这套 ADS122U04 STM32L4A6RG 方案最值得称赞的是它把高精度模拟采集和灵活的数字处理解耦得干净利落。硬件上我只需要考虑传感器接入、参考电阻、电源和布线的工程细节软件上则可以把大部分精力放在温度算法、校准逻辑和系统功耗管理上。后续如果你想从单点测温扩展到多点测温网络甚至每个节点挂 4 路传感器再加一个无线模块这套架构仍然不需要推翻重来只要在原有基础上扩展通道和唤醒策略就够了。