24位UART ADC搭配低功耗MCU:高精度温度测量系统设计

ADS122U04IPWR 这个料号,很多做传感器变送器和仪表采集的工程师看第一眼就知道,是 TI 那颗带 UART 接口的 24 位 ADC;R7FA2L1AB2DFP 则是瑞萨 RA2L1 系列里非常典型的一颗低功耗 MCU,Cortex-M23 内核,专为工业传感和家电、HVAC 控制这类场景设计。把这两颗放在同一套温度测量系统里,本质原因其实很朴素:用尽量少的周边器件拿到 24 位的稳定温度数据,同时让 ADC 和 MCU 之间的数据交换足够抗干扰、足够简单,正好覆盖 HVAC 控制器、工业温度变送器这类产品最看重的几个点。

这套组合最适合谁来参考?一种是正在做 RTD/Pt100 温度采集模块、想把传感器信号链做得更干净的硬件工程师;另一种是用 MCU 做暖通空调控制器,发现板载 ADC 分辨率不够、又不想引入复杂 SPI 时序的嵌入式开发者。文章里我不会只讲理想到能直接流片的方案,而是更多分享我在实际项目和实验室调试里遇到过的接地、噪声、通信异常问题,把这些经验直接给到读者。

1. 硬件选型逻辑:为什么是 24 位 UART ADC 配低功耗 MCU

1.1 UART 接口的 ADC 解决的不只是“少两根线”

很多工程师第一反应是:SPI 接口的 ADC 满地都是,ADS1220、ADS124S08,为什么非要选带 UART 的 ADS122U04?我在多个工业项目里吃过 SPI 的亏之后,才真正理解 UART 接口的优势。

SPI 是同步串行接口,SCLK、MISO、MOSI、CS 四根线,PCB 上挤一挤没问题,但如果传感器探头离控制器有两三米、甚至十米以上,SPI 的时序就会变得很脆弱。时钟线上的振铃、地电位差导致的共模噪声,都会让数据错位,一旦错位又很难自动恢复,必须重新拉 CS 复位整个通信状态机。而 UART 是异步接口,只要波特率准确、电平稳定,一根 TX、一根 RX 就能把几百 Kbps 的数据传得又远又稳。ADS122U04IPWR 这颗 24 位精度的 ADC 内部把转换结果以 UART 帧格式输出,天然适合“ADC 贴近传感器、MCU 放在控制板”这种分布式布局。

另外,UART 通信的容错性好,一个起始位加数据位就能自同步,偶发噪声造成的单字节错误可以通过帧格式和 CRC 校验发现并重发,比 SPI 硬同步方式更好处理。我在 HVAC 项目里通常会把 PCB 分成探头板和主控板,两块板之间只用一根 4 芯屏蔽线连接,ADS122U04 在探头板上完成模拟采样,R7FA2L1AB2DFP 在主控板上做数据处理和协议转换,这个架构在产线上验证过几百套,通信稳定性比以前用 SPI 的方案高一截。

1.2 R7FA2L1AB2DFP 在信号链里的角色

R7FA2L1AB2DFP 属于瑞萨 RA2L1 家族,48 引脚 LQFP 封装,Arm Cortex-M23 内核,主频可以跑到 48 MHz,Flash 和 RAM 对于这个小系统来说绰绰有余。它最吸引我的是三件事:工作电压范围宽、睡眠功耗低、外设里 UART(SCI)模块完整好配置。

RA2L1 支持 1.6V~5.5V 供电,这意味着可以直接用 3.3V 或 5V 的单电源,配合需要一个稳定模拟电源的 ADC 时,电源设计压力小很多。Cortex-M23 虽然是入门级内核,但该有的中断嵌套、低功耗模式一个不少,HVAC 温控器这种 7x24 小时通电的设备,主控平时大部分时间在 SLEEP 模式,只在 ADC 转换完成中断到来时醒来读数据,整体功耗可以压得很低。FSP(灵活配置软件包)也是瑞萨现在主推的开发环境,图形化界面里把 SCI 配置成 UART,生成代码直接就能用的,对项目周期紧张的情况很友好。

至于为什么“非它不可”?也不是。RA 系列里同封装的还有其他选择,但 R7FA2L1AB2DFP 在 48pin 封装里提供了足够的串口数量,方便日后扩展 RS485 或 BMS 通信协议,我把它当作一个通用主控来用,而不仅是 ADC 的“读码器”。

1.3 这套组合适用到哪一步

ADS122U04 加 RA2L1,能做的事情很多,但边界也要说清楚。ADS122U04 本质上是一个精密模数转换器,内置可编程增益放大器(PGA)、两个激励电流源、内部 2.048V 基准,甚至片上温度传感器都有。配合 Pt100/Pt1000 或热电偶,它可以覆盖 -50°C 到 +400°C 的绝大多数 HVAC 和工业温度测量场景。

但要注意,ADS122U04 只有 4 个模拟输入端,单颗 ADC 处理一路差分 Pt100 或最多四路单端输入就已经把通道占满了。如果你需要同时监控八个温度点,我的建议不是硬扩展多路复用器,而是按区域分多块探头板,每块板上一颗 ADS122U04,然后通过 UART 总线挂到主控 MCU 上,这样既避免模拟信号长距离传输损失精度,也让系统扩展性更好。总线上多颗 UART 从机需要地址区分,ADS122U04 本身支持地址配置,这个我在后面软件章节会展开。

2. 传感器到 MCU 的电路设计与接线实战

2.1 Pt100 的接线方式:两线、三线还是四线

温度测量里最常用的是 Pt100 铂电阻。它的阻值在 0°C 时是 100Ω,温度每升高 1°C,阻值大约增加 0.385Ω,把它接到 ADS122U04 的激励电流源上,就能得到一个与温度对应的电压信号。

如果你的产品预算允许,我强烈建议用四线制或三线制接法。四线制是两条线提供恒流激励,另外两条线专门用来测电压,引线电阻完全不影响测量,精度最高。三线制是通过在两条激励线和一条测量线上做对称补偿,在工业现场是非常常见的折中方案。两线制虽然省线,但引线电阻会直接叠加到传感器阻值里,长线场景下误差可能达到好几度,只在探头线非常短、精度要求不高的消费类 HVAC 温控器里用。

ADS122U04 内置的 IDAC1 和 IDAC2 两个激励电流源,正好可以做三线制。具体做法是让 IDAC1 从 AIN0 引脚输出,经传感器的一根引线流进 Pt100,再从另一根引线回到 AIN1,同时 IDAC2 从另一个引脚输出一个大小相同的电流,流经第三根引线产生一个补偿电压。这样,两段引线电阻上的压降被系统相减消除,只剩 Pt100 本体上的电压差。实际布板时,激励电流建议设在 500µA 左右,太大 Pt100 自热效应明显,太小又会让信号幅度偏低、信噪比下降,500µA 是 TI 官方常见推荐值,实测在 HVAC 场景下表现很稳定。

2.2 热电偶、内部温度传感器和冷端补偿

除了 Pt100,ADS122U04 也支持接 K 型或 J 型热电偶。热电偶输出的是毫伏级电压信号,温差几十度时电压变化可能只有几百微伏,所以必须用 PGA 把信号放大后再进 ADC。此时一般把增益设到 8 倍以上,输入范围也相应缩小,24 位分辨率才能体现优势。

热电偶最大的麻烦是冷端补偿。热电偶测的是热端和冷端的温差,冷端如果没有温度标定,读数就不是绝对温度。ADS122U04 自带内部温度传感器,可以先读芯片内部温度作为冷端参考,再用软件把该温度值换算成冷端毫伏电压,加到热电偶的测量电压中,最终得到热端真实温度。这个流程在工业变送器里很标准,需要注意的点是:ADC 内部温度传感器和外部热电偶冷端之间如果存在温差,会产生误差。所以探头板上冷端要紧贴热电偶接线端子,PCB 铜皮能均匀导热,才能保证补偿准确。

同时,别忘了 ADS122U04 还有一个 AVDD 供电范围的限制,热电偶的共模电压不能超出模拟输入范围,否则放大器会饱和。通常我会把热电偶负极接到 AIN1,正极接 AIN0,让共模电压保持在 AIN1 附近,配合 PGA 的差分输入就能可靠工作。

2.3 供电、基准电压和 PCB Layout 关键点

ADS122U04IPWR 的模拟供电 AVDD 和数字供电 DVDD 虽然可以连在一起,但为了精度我还是习惯分别布置。模拟电源经过一个 LC 滤波或至少一个 10Ω 串联电阻加 10µF 电容,再给 ADS122U04 供电。数字电源和模拟电源的地不要在信号链上共用同一条细线,最好在 ADC 下方的覆铜区单点汇合。RA2L1 的供电同样要干净,3.3V 经 LDO 输出,MCU 附近的 100nF 去耦电容一个都不能省。

参考电压方面,ADS122U04 内置了 2.048V 基准,这是省事的选择,温漂指标对于 HVAC 应用来说足够。如果产品要做到更高精度,可以外接精密基准芯片,把 REF 引脚接外部电压。我的经验是:HVAC 场景用内部基准完全没问题,工业温度变送器想做到 0.1°C 精度,最好还是外挂基准并做校准。

模拟输入的滤波也是容易被忽略的坑。每路信号输入对地加上一个 1nF~10nF 的电容,能有效滤掉射频干扰。ADS122U04 是高精度 Delta-Sigma ADC,输入阻抗的切换特性会让外部 RC 滤波的参数选择变得微妙,RC 过大反而增加建立时间,我一般选用 1kΩ 串联电阻加 1nF 电容,配合 20SPS 左右的数据速率,既滤波又不会牺牲稳定时间。

3. 软件实现:从寄存器配置到温度标定

3.1 用 FSP 配置 RA2L1 的 UART(SCI)模块

拿到 R7FA2L1AB2DFP,开发环境直接用瑞萨的 e² studio 加 FSP。新建项目后,芯片型号选 R7FA2L1AB2DFP,系统会自动套用对应的引脚定义。配置 SCI 模块时,我通常选 SCI0 或 SCI1,模式设为 UART,波特率 115200bps,8 位数据位,无校验,1 位停止位。RA2L1 的 UART 支持 FIFO 和中断,我建议配置一个接收完成中断,主循环只需要处理温度换算逻辑,数据到达时由中断置位标志。

刚开始调的时候,容易犯的一个错误是忘记在 FSP 里开启 SCI 的引脚复用。有的工程师直接改寄存器,但 FSP 图形界面里引脚分配必须把对应 P1xx 设置为 SCI 功能,生成的代码才有正确的 I/O 初始化。另一个问题是时钟源选择,如果外部晶振没焊上,FSP 默认用内部高速时钟也能跑,但波特率误差会偏大,UART 通信在高速率下就可能随机出错。我一般用板上 20MHz 或 24MHz 晶振作为主时钟,再经过 PLL 分频给 SCI 模块,实测 115200bps 下整个工作日通信零误码。

3.2 ADS122U04 的配置命令和数据读取流程

ADS122U04 的命令不是简单的 SPI 寄存器读写,它有自己的 UART 命令格式。初始化时,需要向 ADC 发送配置命令,设定输入多路开关选择、PGA 增益、数据速率、激励电流源开关和大小。

以我的典型配置为例:输入选择 AIN0 和 AIN1 作为差分对,PGA 增益设为 8 倍,数据速率设为 20SPS,IDAC1 和 IDAC2 都开启,电流 500µA,内部基准 2.048V。配置命令发完后,发送启动转换命令,然后等待转换完成。ADS122U04 支持连续转换模式,数据准备好后会自动通过 UART 发送 24 位转换结果,MCU 在接收中断里按三字节拼接。

第一次调通这个流程时,最好先用逻辑分析仪抓到 ADC 发出的字节,再把三字节按大端方式拼成一个 32 位整数,右侧对齐后根据 PGA 增益换算电压。不要一上来就追求速度,先以 20SPS 低速把整个链路摸熟,后面再提速到 640SPS 也不迟。UART 接口有一个天然优点:只要波特率匹配,不需要像 SPI 那样严格关注时钟相位,数据时序调试起来省不少时间。

3.3 从 ADC 原始码值换算到温度值

温度换算这一步是整个软件算法里最值得写清楚的部分。设 ADS122U04 的内部基准 Vref 为 2.048V,PGA 增益为 G,24 位 ADC 的满量程输入范围是 ±2·Vref/G。那么每一个 LSB 对应的电压是:

LSB = (2 × Vref) / (G × (2^24 - 1))

代入 G=8,Vref=2.048V,可以算出大约为 0.0305µV/LSB,分辨能力非常恐怖。但实际系统里噪声和 PCB 热电势会把有效位数拉低,最终能稳定在 18 到 20 位有效分辨率就已经很理想了。换算电压时:

电压 = ADC_Code × LSB

得到电压后,再根据激励电流值换算 Pt100 电阻。如果是两线制,电阻 R = 电压 / I_idac;如果是三线制或四线制,电压已经消除了引线电阻影响,公式一样。注意保持在配置里用同一个 IDAC 电流做计算,比如 500µA,那么 0°C 时 Pt100 上电压是 100Ω×500µA = 50mV,200°C 时电阻约 175.84Ω,电压约 87.92mV,都在增益为 8 时的输入范围内。

得到电阻后有两类办法求温度。一类是用查表法加线性插值,把 IEC 60751 标准表格放进 Flash,每 1°C 一个点,温度显示时细分插值,精度高;另一类是用 Callendar-Van Dusen 公式,直接二次方程求解。HVAC 场景温度范围通常 -20°C~80°C,我用一个简单的线性近似就够了:温度 = (电阻 - 100) / 0.385。如果做工业级控温,还是老老实实查表,全温度段误差可控。

3.4 自校准、断线检测和数据校验

工业温度测量最让我头疼的不是换算,而是“传感器断线时读数依然看起来正常”。Pt100 断线时,ADS122U04 输入悬空,由于内部偏置,ADC 码可能跑到满量程正端或负端。所以我会在软件里做判据:如果原始 Code 接近满量程的 99% 以上,或者换算出的电阻大于 500Ω,直接判定传感器断线,输出错误状态而不是异常温度值。同理,短路的 Pt100 会读出接近 0Ω,也要判为错误。

校准方面,批量生产时每块板不可能完全一致,我会在产线做两点校准:冰水混合物(0°C)和沸水(100°C)各采一次,得到两个偏移和增益系数。软件里把这组系数存到 MCU 的 Data Flash,每次开机加载校正公式,温度精度能明显提升。ADS122U04 的自偏移校准命令也可以定期执行,用来消除 ADC 内部的低频漂移。

数据通信的校验更别省,我用的 UART 协议里每一帧温度数据都会附一个简单的累加和校验字节。RA2L1 收到后先算校验再更新显示,校验失败就丢弃这一帧,上一帧温度保持不变。这个策略让系统在嘈杂电磁环境下不会跳出瞬时错误值,用户看到的是平滑的温度变化,体验好很多。

4. HVAC 与工业现场里的可靠性设计与实战经验

4.1 UART 电平、传输距离和总线拓扑的取舍

ADS122U04 输出的 UART 电平是普通 CMOS 电平,在 PCB 内部走线没有问题,但如果探头到主控板走线超过 30cm,就建议不要在板上直接跑原始 TTL 信号。工业现场里变频器、压缩机、水泵一开,电机电刷火花产生的干扰会让单端 UART 数据满帧出错。

我实际用过的方案有几种。最简单的是在 ADS122U04 和 RA2L1 之间加一块双通道数字隔离器(比如 ISO7721),把模拟地和数字地彻底隔开,再用屏蔽双绞线传输 UART 信号。这种方案能撑到三到五米,HVAC 风管温度探头到控制器足够用。更稳的是在 ADC 端加一个 RS485 收发器,用差分信号传输,即使走线十米以上也没问题。这时候 ADS122U04 相当于总线上的一个从站,RA2L1 发起查询,从站回数据,协议变成 Modbus 风格,整套系统也更好升级成多探头总线结构。

选哪种取决于成本。工程上的直觉是:单机产品用隔离 UART,组网产品用 RS485。我自己做的一款商用空调用温度采集卡,就是隔离 UART 加屏蔽线,量产以来没出现过通信故障。布线时 UART 的 TX 和 RX 保持在同一层、尽量平行走线,两侧都要加终端电阻匹配吗?普通速度不加也行,高速率下才需要。共地问题则是首先要解决的,隔离方案正好一劳永逸。

4.2 电源噪声、电机干扰和地环路

HVAC 环境的电磁兼容问题集中在感性负载上。压缩机启停瞬间,母线上可以出现几伏的电压跌落和尖峰;交流接触器动作时,空间辐射干扰也会耦合进传感器线。为了保证温度采样不被污染,我总结出三条硬性规则。

第一,模拟地、数字地、机壳地分层铺设,在电源入口处用 Y 电容和共模电感处理。第二,ADS122U04 的 AVDD 用独立的 LDO 供电,不要和风扇电机驱动共用一个 DC-DC。第三,传感器屏蔽层只在主控板端单点接地,不能在探头端也接地,否则会形成地环路,反而把工频干扰引进来。这三点看起来是低频模拟设计的常识,但真到样品测试时,很多报“温度乱跳”的问题最后都能回溯到这三条没做好。

另外,RA2L1 的 ADC 虽然也有 12 位模拟输入,但我在这个项目里从不拿它直接测 Pt100,因为板载参考和 PGA 能力不足。一个更稳的搭配是:RA2L1 的 12 位 ADC 专门做 NTC 的粗略温度监测或者电源电压检测,Pt100 的精密温度通道全权交给 ADS122U04。分而治之,系统可靠性反而更高。

4.3 固件层面的看门狗、数据帧超时和状态机

可靠设计不只是硬件的事。我写 RA2L1 固件时会开一个 IWDT 看门狗,主循环每隔 100ms 喂一次,如果因为外部干扰导致程序跑飞,看门狗能强制复位。ADS122U04 这边也做了 UART 超时判断,如果超过 500ms 没有收到新的有效温度帧,主控就会进入故障保护状态,叫风机去看门还是关压缩机,取决于 HVAC 系统的安全逻辑。

通信协议的状态机我一般分成四态:等待命令头、等待地址字节、等待数据长度、等待校验字节。任何一态出错都回到等待命令头,不会卡死。这种方法看着简单,但对杂散噪声干扰下的系统鲁棒性提升非常明显。有些工程师图省事,用阻塞式延时读串口,一收到错字节就重启 MCU,结果现场温度一波动就频繁复位,问题越搞越乱。正确思路是“错一帧丢一帧,不阻塞,不重启”。

5. 调试实录:我踩过的坑和排查手册

5.1 UART 数据乱码、通信中断怎么查

项目刚开始联调时,最容易碰到的现象就是 RA2L1 收不到 ADS122U04 的数据,或者收到的字节完全不可读。我的排查顺序固定如下:

先查波特率误差。ADS122U04 的命令时序和 MCU 的 SCI 波特率都由各自的时钟决定,如果 MCU 用的是内部 48MHz 晶振而配置上却按外部晶振计算,波特率会差好几个百分点,115200bps 下直接乱码。我常用的方法是让 MCU 回显收到的字节,在串口助手对比 ASCII 码,能立刻看出位偏移。

再查 TX/RX 是否接反。UART 必须交叉连接,ADC 的 TX 接 MCU 的 RX,ADC 的 RX 接 MCU 的 TX。这问题听上去低级,但调试时十次里有三次是它。查完接线再查电平,用示波器看 ADC 的 TX 脚有没有高低电平变化,如果没有,多半是 ADC 没有正确进入运行模式,或者 RESET 引脚一直被拉低。

5.2 温度读数跳变、有毛刺怎么办

如果通信正常但温度波动很大,先别怀疑 ADC 坏。拿一块已知准确的干体温度计做对比测试,读数跳到 ±1°C 以上的话,基本就是噪声问题。把 ADS122U04 的数据速率从高速调到 20SPS,如果毛刺明显变小,说明是输入信号高频噪声混叠,ADC 的调制器响应不过来。此时检查输入引脚上的 RC 滤波电容是否做到位,并在软件里加一个滑动平均滤波,连续采样八次取平均值,最多再加一次中值滤波,去掉极端毛刺。

另一个隐蔽来源是 Pt100 自热。如果激励电流调到 1mA 且探头是小型薄膜铂电阻,本身温升就有 0.5°C 上下。把激励电流降到 500µA 甚至 250µA,读数就能平静下来。温度显示还是跳,就要怀疑热电势,尤其是探头接线端用不同金属材料时,一米长的线就可能产生几微伏的热电势,对应零点几度的误差,极难察觉。解决办法是尽量用镀锡铜端子,让两种金属的热电结保持在同温区。

5.3 温度整体偏高或偏低,常见原因和校零

温度值与实际值有固定偏差,问题一般不在 ADC,而在线阻和基准电压。两线制接线时,每增加一米 0.5mm² 铜线大约带来 0.1Ω 电阻,对应 0.26°C 的偏移。发现整体偏高且数值随探头线长度变化,先改四线制或用软件补偿线阻。

还有一种情况是基准电压偏差。ADS122U04 内部基准标称 2.048V,但全温区内有漂移,且每一颗芯片的实际值不是严格一样。批量产品不做校准,就会呈现同批次所有温度点都偏同一方向的特征。我在产线用高精度电阻箱作为模拟传感器,分别给 100Ω 和 138.5Ω 两个点,反推出 ADC 的基准电压实际值,再在软件里用实测 LSB 替代理论 LSB,这样系统误差就可以减掉大半。

5.4 断线、短路与传感器类型识别

最后是传感器故障判断。我写了一个初始化自检函数:上电后先读一次 Pt100 电阻,如果在 80Ω~400Ω 之间判定正常,低于 20Ω 判短路,高于 800Ω 判断线。HVAC 控制器需要同时支持 Pt100 和 Pt1000 时,软件会自动根据第一次读出电阻值落在哪个区间来选择换算表。这个设计在产线上很实用,不需要拨码开关,物料管理也简单。

如果使用热电偶,断线检测逻辑稍有不同,热电偶开路时读到的电压会接近 PGA 输出上限,而短路时接近 0 微伏。逻辑判断和 Pt100 模式分开处理,别套用同一个阈值。现场用万用表量一下故障信号源端就能定位。

工程中,我用这个组合完成过一套风冷机组的温度采集板。真正落地的过程中,ADS122U04 的连接易用性让我省了很多事,RA2L1 的低功耗和开发效率也名副其实。但温度测量的精度从来不是靠一颗 ADC、一颗 MCU 单方面决定的,传感器安装位置、线缆走线、接插件选型、软件滤波和校准策略,每一步都会贡献或被消耗几分之一度。最后再分享一个细节:HVAC 系统里,温度探头最好安装在气流混合充分、没有直接辐射热源的位置,否则芯片性能再好,测出来的也是局部温度。把这个“测点即真理”的思路贯彻到位,再回头优化信号链,整个系统会比单点硬调增益有效得多。