ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

UART接口的24位ADC+超低功耗MCU:工业温度采集方案详解

UART接口的24位ADC+超低功耗MCU:工业温度采集方案详解

做工业温度采集这几年,我越来越发现一个规律:很多人不是不会用ADC,而是卡在ADC和MCU之间那条通信线上。SPI接口虽然普及,但碰上长线传输、现场干扰、或者MCU引脚不够用的时候,就很头疼。后来我接触到 ADS122U04IPWR 这颗芯片,它的UART输出接口让我眼前一亮,搭配 STM32L041C6 这颗超低功耗MCU,做工业和 HVAC 温度测量,整个系统简洁得不像话,而且实测精度和稳定性都相当能打。这篇就把我从选型到量产的完整思路写出来。

这套方案适合谁?如果你在做温度变送器、楼宇自控的温度采集节点、冷冻冷藏监控、或者工业设备的状态监测,手头正在纠结ADC选型、通信接口、低功耗策略,这篇文章应该能帮你省掉不少弯路。

1. 为什么是"UART ADC + 超低功耗MCU"这个组合

1.1 选型逻辑:从接线问题说起

先说说ADS122U04IPWR这颗芯片最特别的地方。市面上大多数24位ADC都是SPI接口,MISO、MOSI、SCK加CS,最少四根线。如果你用的MCU刚好SPI外设紧张,就得软件模拟,时序一折腾,先把系统可靠性拉低一截。而ADS122U04直接用UART通信,就是 TX、RX 两根线,这设计在工业场景里有非常现实的意义。

首先是布线距离。UART本身支持波特率不高但传输稳定,ADS122U04的UART接口实现的是标准异步串口协议,不是那种私有协议。也就是说,STM32L041C6 上任何一个UART外设都能直接对接它,没有额外的时序适配工作。我在实际项目里用30厘米左右的线缆连接ADC板和主控板,工作一切正常。做过现场设备的人都知道,SPI在稍长线缆上翻车的概率有多高,而UART在这方面要皮实得多。

其次是隔离设计。工业温度采集经常需要在传感器侧做电气隔离,防止地环路干扰。SPI隔离需要隔离四路信号,而UART隔离只需要两路。别小看省下来的两路隔离,这直接决定了你的方案能不能放进小体积外壳、成本能不能压下来。很多量产产品的硬件设计瓶颈就在这。

1.2 两颗芯片的分工边界

ADS122U04IPWR 负责什么?它内部集成了24位Delta-Sigma ADC核心、可编程增益放大器PGA、两个IDAC恒流源激励、内部温度传感器和UART通信控制器。你一颗外部芯片就能搞定传感器激励、模拟信号采集、数字化传输全链路。特别是内置的IDAC恒流源,对RTD测温来说太关键了,省掉独立激励电路的同时,还能保证激励电流的精准度。

STM32L041C6 则承担系统控制、数据解析、温度线性化计算和对外通信。它基于Cortex-M0+内核,主频能跑32MHz,虽然算力不算强,但做温度测量这种任务绰绰有余。关键是它的静态功耗极低,Stop模式电流能做到微安级别,配合 ADS122U04 的周期唤醒测量模式,整机平均功耗可以压到非常低的水平。这一点对两线制4-20mA变送器是刚需,5775% 的整机功耗预算必须精打细算。

1.3 供电与系统功耗模型

我之前评估这个组合的时候,拉过一个粗略的功耗账。ADS122U04在正常工作模式下的供电电流大约在几百微安到1毫安级别,具体取决于PGA增益、数据速率和IDAC电流设置。STM32L041C6在Run模式、8MHz工作频率下大概2-3毫安,在Stop模式下则只有1微安左右。

设计成周期性唤醒测量:STM32大部分时间睡在Stop模式,每隔几百毫秒被唤醒一次,通过UART给 ADS122U04 发命令读一次转换结果,然后继续睡。这样平均电流很容易控制在几十微安以内,加上传感器激励功耗,整机两线制环路上限(通常3.5mA左右)完全搞得定。如果做电池供电的无线温湿度传感器节点,两节AA电池扛一年以上也问题不大。

2. 模拟前端电路设计:精度是从这里开始的

2.1 RTD传感器接法与偏置方式

温度测量最常用的传感器就是PT100、PT1000这类铂电阻RTD。ADS122U04的模拟输入支持两个差分通道或者四个单端通道,我习惯把通道用作三线制PT100接法,这是工业长距离测温最平衡的方案。

三线制的核心目的是消除导线电阻引入的误差。工作原理是:用恒流源对RTD供电,同时测量RTD两端的电压;第三根线专门用来感知线路电阻的电压降,从而在计算中抵消。在 ADS122U04 上实现这个功能,需要把IDAC1接到激励引脚上,IDAC2配合做线路电阻补偿,再用差分输入测RTD上压降。第一次接触的人可能觉得复杂,但只要你理解了"导线电阻都能在ADC内部信号链上被扣除"这个点,后面配置寄存器就顺理成章。

如果你的应用是短距离、高精度的场合,比如实验室仪器或者精密温控,建议直接用四线制。四线制彻底分离了激励路径和测量路径,导线电阻理论上完全不进入测量回路。代价是传感器需要四根线,现场接线麻烦一些。HVAC应用通常管道、风道分散,两线或三线居多,具体看你取舍。

2.2 参考电压与激励电流的搭配

ADS122U04的参考电压输入支持差分参考。RTD测量时最经典的搭配,是用同一个IDAC电流流过参考电阻产生参考电压,再流向RTD产生信号电压。这样由于恒流源漂移同时影响参考电压和信号电压,在ADC的比值测量架构中,电流源的绝对精度误差被完美抵消,剩下只跟参考电阻和RTD本身的精度有关。

参考电阻的选择直接决定测量精度。我一般选精度0.1%、温漂系数25ppm/°C甚至更好的精密金属膜电阻。举个例子,如果参考电阻用1000欧姆,IDAC电流设为500微安,那参考电压就是0.5V,这个压降对 ADS122U04 的模拟输入范围来说是比较舒服的区间。PGA增益设在8到16之间,可以把PT100在0°C时的约100欧姆电阻对应的电压放大到ADC能充分利用的幅度。

用大白话说,Delta-Sigma ADC是"比率计",它测的不是绝对电压,而是信号电压与参考电压之比。只要两者来源一致,电源电压波动都不会影响测量结果。这就是为什么工业级别产品一定要做"比率式测量",而不是用一颗LDO压出来的绝对电压做参考。顺序反了,后面标定再多也救不回来。

2.3 输入滤波与EMC防护的取舍

模拟输入前端通常要加RC低通滤波器。电阻加电容的组合,一方面限制高频噪声进入ADC采样核心,另一方面也起到一定的ESD和浪涌吸收作用。我这里特别提醒一点:RC滤波的电阻值不能选太大,因为它会跟传感器源阻抗串联,影响ADC输入驱动能力。特别是ADS122U04这样的Delta-Sigma ADC,输入端有采样电容周期性开关动作,源阻抗太大会导致建立时间不足,直接表现为测量读数的跳变和稳定时间变长。

从我实测的情况看,RC滤波的截止频率设在几百赫兹到几千赫兹这个区间比较合理,既能抑制50Hz/60Hz工频干扰及其谐波,又不至于拖慢响应速度。如果现场还有变频器、大功率接触器等强干扰源,可以考虑在电源进来之后串磁珠、加TVS管,PCB上单独划分模拟地平面。反正原则就一条:模拟信号链的地要干净,数字地和模拟地一点连接,别让高频噪声在ADC参考地上乱窜。

电磁干扰这个问题,实验室里很难完全复现,所以我建议在样机阶段就把EMC预测试做了,别等产品送检才手忙脚乱。

3. ADS122U04 的UART协议与寄存器配置实践

3.1 四线式读写指令与时序

ADS122U04的UART通信其实简单得过分。它本质上就是一个从设备,所有的读写操作都由STM32侧发起。通信参数我用的默认配置:9600波特率、8数据位、无校验、1停止位。如果你的系统对实时性要求高,也可以调成更高的波特率,手册里有详细的配置流程,照着做就行。

读转换数据是发送一条命令(命令字里带寄存器地址),然后芯片在当前转换完成后把24位数据从TX引脚送出来。写配置寄存器则是指令里携带要写入的寄存器值。无应答连续转换模式下,芯片会自动按照设定的数据速率推送结果,STM32只要在RX中断里收数据就行。

这里我吃到过一个教训:ADS122U04的命令字节时序里有内部延时及处理时间要求,具体是多少得从数据手册里查。如果我发命令太急,芯片还在忙上一次内部操作的时候,新命令可能被忽略或者导致状态错乱。解决办法是严格按命令间隔延时,别为了追求那几十微秒把通信可靠性搭进去。

3.2 配置寄存器的关键位讲解

ADS122U04的配置寄存器组不长,无非是设置PGA增益、输入多路选择、数据速率、滤波器模式、IDAC电流值、参考电压选择和单次/连续转换模式这些项。写代码的时候要对着寄存器的说明表格一点一点核对,这里最容易翻车的几个位我给你画一下重点。

一是输入多路选择,它决定了当前差分输入接的是哪两个引脚,写错了就测不到信号。二是PGA增益,增益越高,噪声越小,但可测的信号幅度范围变窄。三是数据速率,ADS122U04支持从每秒20次到每秒330次左右的采样率,数据速率越高,内部数字滤波器带宽越宽,噪声自然变大。低速率对应低噪声,这是Delta-Sigma ADC的普遍规律,你需要按实际需求去平衡。

单次转换模式下,还有一个值得一提的细节:驱动方式。ADS122U04在单次转换完成后进入空闲状态,等待下一次唤醒命令。这种模式特别适合电池供电的低功耗设计,传感器不工作的时候整条信号链全部断电,进一步省电。

3.3 单次转换模式下的完整初始化流程

下面我贴一段我在STM32L041C6上实际跑通的初始化代码,逻辑很清楚,你拿到手改几个引脚定义就能用。

void ADS122U04_Init(void) { // 复位芯片 ADS122U04_SendByte(0x06); // RESET 命令 HAL_Delay(10); // 配置寄存器0: 禁用内部温度传感器,PGA增益=8, // 输入通道选择差分输入 AIN0-AIN1 ADS122U04_WriteReg(0x00, 0x24); // 配置寄存器1: 数据速率=20SPS,单次转换模式 ADS122U04_WriteReg(0x01, 0x00); // 配置寄存器2: IDAC1输出电流=500uA, // 参考电压选择外部差分参考 REFP-REFN ADS122U04_WriteReg(0x02, 0x44); // 配置寄存器3: 内部滤波器选择,关掉IDAC2电流源 ADS122U04_WriteReg(0x03, 0x00); }

初始化完成之后,每次要测温度就发单次转换命令,等待DRDY信号(如果接了这个引脚出来)或者延时等待,然后读三字节转换结果。这样一套流程下来,数据速率20SPS,足够大多数HVAC应用使用。

4. STM32L041C6 端软件设计与低功耗策略

4.1 LPUART对接ADS122U04的工程要点

STM32L041C6这个型号本身就是奔着低功耗设计的,它的LPUART可以直接在低功耗模式下工作,收到的数据能唤醒MCU。这一点跟ADS122U04的工作方式天然对口。

工程上要注意LPUART的时钟源选择。LPUART可以用LSE或者HSI作为时钟,波特率生成方式跟普通USART不太一样。我之前有一版程序,LPUART无论怎么配置都跑不出9600波特率,后来查参考手册才发现是时钟源分频设置错了。这里建议大家用ST官方提供的低功耗UART配置例程做底子,别自己手搓波特率计算公式。

还有个容易忽略的点:LPUART的IO引脚要选对。STM32L041C6的LPUART不是所有引脚都能映射的,用CubeMX配置的时候,它会自动圈定可用的引脚范围。你只要别自己手动乱指定引脚就行,让工具自动分配,省心很多。

4.2 数据解析与滤波算法的选择

从ADS122U04读出来的是24位二进制补码,先要把它拼成一个整型数,再根据参考电压、PGA增益和传感器特性换算成电阻值,最后通过查表或多项式计算出温度。这中间有两个细节值得说道。

第一个是符号位的处理。24位二进制补码是第23位为符号位,换算到32位int的时候要做带符号扩展,C语言里直接左移8位再除以256这个技巧能通用很多平台。第二个是数字滤波。虽然ADS122U04内置了数字滤波器,在实际现场环境中,我仍然会在MCU端做一层简单的滑动平均滤波。比如连续采8次然后取平均,对付现场的突发干扰非常有效。这个滤波窗口大小要看你的响应速度需求,HVAC温控系统本来惯性就大,慢一点完全没问题。

在代码实现上,我建议把"读数据-换算电阻-查表出温度"这几个步骤封装成独立模块,方便后期调试和移植。手头那版代码就是这么组织的,换了另一个项目板卡,几乎复制粘贴就能跑起来。

4.3 休眠唤醒与动态功耗控制

低功耗策略的核心是让MCU尽量睡、ADC尽量少干活。我做的是这样的调度:STM32L041C6平时待在Stop模式,用一个低功耗定时器(LPTIM)每200毫秒醒一次,对着ADS122U04发一帧命令启动单次转换,等转换结果从LPUART回来后又立刻睡回去。整个过程MCU活跃的时间不超过几毫秒。

ADS122U04那边呢?它收到单次转换命令后,内部上电、采样、转换、输出数据,然后自动回到低功耗状态。在你的整机功耗计算里,ADC的平均功耗可能比MCU还低,这是Cortex-M0+加UART接口ADC组合独有的优势。

需要说明的是,如果你的系统要求连续监测,不希望有200毫秒的测量间隙,那就改成连续转换模式,让ADC一直跑,MCU在中断里取数据。这种方式功耗高一些,但温度曲线是连续的。工业HVAC设备这种响应本来就慢的场景,用周期性测量完全够用。

5. 实测数据、标定流程与精度验证

5.1 恒温槽标定的实际操作

硬件电路搭好、代码能出数之后,别急着认为完事了。ADS122U04本身虽然精度高,但你的参考电阻、传感器、PCB走线都会带来系统误差。标定的目的,就是把整条链路上所有可预见的偏差一次性修正掉。

我的做法是用恒温槽提供多个标准温度点,比如0°C、25°C、50°C、80°C,用标准温度计读取真实温度值,同时记录下你的系统经过ADC换算出来的原始温度值。把这两组数据画成曲线,你会发现通常存在一个比较固定的偏置和增益误差。

处理这种误差的方式有两种。如果有两到三个标定点,用线性插值或最小二乘拟合一条直线,然后把直线的斜率和截距直接写进固件里作为修正系数。这是最常用、最稳妥的方法。如果要求更高,比如在很宽的温度范围做到±0.1°C,那就要做多点分段标定,每个区域内部用线性拟合。我这边实际项目做到±0.1°C以内,用多点标定加查表完全可行。

5.2 线性查表与RTD温度换算

PT100的电阻-温度关系并不是完全线性的,虽然0°C到100°C之间近似程度不错,但在低温端和高温端偏离挺明显。如果你直接按线性电阻算温度,100°C范围内误差可能到好几度,这不能接受。

工程上通用的做法要么按IEC 60751标准公式直接计算,要么做查表加插值。MCU里的浮点计算STM32L041C6虽然支持但有点慢,我倾向于用定点整数查表法:把温度-电阻表做成const数组,用二分查找定位区间,再加线性插值收尾。整个计算过程不涉及浮点数,速度很快,出错率也低。

打个比方,这个过程就像查字典:你知道一个字的大致读音,先在索引里找到那个范围,再在附近的条目里精确匹配。比直接从第一个字翻到最后一个字效率高得多。

5.3 实测噪声与稳定性表现

我在自己搭建的测试平台上记录了一组数据,供大家参考。用的是PT100三线制接法,PGA增益设为8,数据速率20SPS,环境温度恒定在25°C左右,连续采集一个小时。

转换结果换算回温度之后,波动峰峰值稳定在±0.02°C以内,这个表现已经超过了大多数HVAC温控系统的需求。较长时间尺度上,由于参考电阻的温度漂移,整个系统的读数会有缓慢小幅偏移,这是硬件固有的,标定无法完全消除。所以在设计阶段选低温漂参考电阻,比事后抱怨浮点计算更有效。

我还对比过内部温度传感器做自动冷端补偿的应用,ADS122U04内置的这个传感器精度大约在±0.5°C左右,用来做热电偶冷端补偿是够用的,但如果追求更好的精度,还是建议外接高精度温度传感器作为冷端参考。

6. 工业现场安装与排查经验集合

6.1 常见故障现象与处理手段

这章节聊一些实际碰到的糟心事。有次现场设备报了温度跳变,数据忽高忽低,示波器看波形没看出问题,后来发现是传感器接线端子松动,接触电阻一会儿几欧姆一会儿几百毫欧,而ADS122U04的输入阻抗极高,一点接触变化都会在转换结果上放大。最后解决方案很朴素:把端子换成带弹簧夹的镀金端子,再也没有复现过。

另一种常见情况是读数一直往一个方向漂,查了一圈发现是IDAC激励电流设置得太大,导致RTD自热效应明显。RTD自热误差跟电流的平方成正比,所以能用50微安就绝不用500微安,除非你的传感器散热条件特别好。这个点手册上写得没那么显眼,特别容易踩。

还有一次是UART通信偶发超时,排查发现是系统里的电源纹波偏大,偶尔把UART的波特率时钟干扰得出现了位错误。解决方式是给MCU电源加大电容、ADC的DVDD用磁珠单独隔离。经验就是:数字通信问题不一定出在数字侧,模拟侧的干扰经常通过电源传导进来。

6.2 PCB布局与走线细节

PCB布局直接决定你前面所有的精度设计能不能落到实际。我在ADS122U04的layout上有几个固定原则:模拟输入引脚附近不铺数字地,参考电阻紧贴REFP/REFN引脚放置且走线等长;UART的TX/RX走线尽量远离模拟输入走线;ADC芯片底下的地平面保持完整;电源入口处放一个10uF钽电容加0.1uF陶瓷电容组合,各引脚再加小容值去耦。

走线宽度上模拟信号线别太细,差分输入的两条线等长且尽量相邻,这会减少耦合进来的共模噪声转换为差模噪声的概率。别小看这个细节,在强干扰环境下,这些"看着无所谓"的走线往往决定你的系统过不过得了EMC测试。

两线制变送器产品一般空间很紧张,所以我常建议用4层板方案,中间两层分别做完整的电源层和地层。虽然成本增加一点点,但模拟性能会明显更稳,尤其是信号链贯穿模拟和数字两个领域的产品。

6.3 从原型到量产的几个隐藏坑

实验室原型一切正常,一到小批量生产就出现参差不齐的性能,这种事我遇到不下三次。排查到最后,原因基本都是元件批次差异和生产工艺问题。

一是参考电阻,打样的时候用0.1%精度的,量产如果换了供应商或者批次,温漂系数可能悄悄变差。我后来干脆在BOM里指定具体型号和品牌,并让采购锁死供货渠道。二是传感器本身,PT100也有精度等级区别,Class A和Class B差一大截,采购时务必核对规格书。三是焊锡工艺,波峰焊如果温度控制不好,会造成PCB应力,进而通过引脚传导给ADC内部参考电路,导致读数微小的漂移。

如果你做的是出口产品,还要注意不同地区电网频率不同,50Hz地区对50Hz的工频干扰敏感,60Hz地区是60Hz。ADS122U04内置的数字滤波器如果可以配置成对应模式,会在软件上消除一部分工频干扰。HVAC应用的出口机经常是多个国家销售,这个配置开关最好做成运行时可选,方便产线。

我自己做这套ADS122U04+STM32L041C6方案的时候,最大的感受是:选对了接口,很多东西会自己顺起来。UART的易用性让软件调试变得直接,ADS122U04内置的激励和参考路径又把模拟设计大幅简化,而STM32L041C6则刚好补上了低功耗和成本的关键一环。如果你正卡在某一个环节,不妨回到通信接口和模拟前端去检查,八成能找到突破口。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进