☰
UART型24位ADC+低功耗MCU的工业温度采集方案
2026/11/5 3:11:40 网站建设 项目流程

前阵子帮一个做楼宇自控的朋友改一套旧温度变送器,现场传感器有PT100也有K型热电偶,要求都是0.1°C档的稳定度,数据要进PLC和上位机。市面上现成的温度采集模块能买到,但要么通道少、要么价格离谱,最后他干脆决定把整块采集卡重新设计。核心器件定下来就是TI的ADS122U04IPWR和瑞萨的R7FA2L2094CFM。这篇文章把整套方案里踩过的坑、配置寄存器的思路、UART握手细节,以及工业现场最容易被忽略的接地问题都写出来,方便以后做类似项目的朋友直接参考。

这套方案适合谁?如果你也在做HVAC风管/水管温度监测、工业设备测温、多通道变送器这类项目,而且需要自己控制成本和精度,那这个组合非常值得试。ADS122U04IPWR负责把传感器模拟信号变成高精度数字量,R7FA2L2094CFM负责算温度、跑协议、给人机界面喂数据;两个芯片之间走UART,不需要SPI那种高速时钟,隔离和长线传输都省事。下文从选型逻辑开始,一路讲到信号链路、驱动代码、抗干扰和校准,内容偏实战,照着抄也能跑通。

1. 为什么非要用“UART型24位ADC+低功耗MCU”这个组合

1.1 ADS122U04IPWR 到底替我们解决了什么

ADS122U04IPWR 是TI的一款24位Δ-Σ ADC,属于ADS122系列。它最大的特点是模拟前端集成度非常高:内部带了可编程增益放大器PGA,增益可以做到1到128;内部有2.048V基准电压,省掉一颗精密基准芯片;还集成了两路可编程激励电流源,专门给RTD这类电阻型传感器供电;另外还内置了芯片温度传感器和传感器开路检测功能。

这些功能单独拆开看不稀奇,但合在一起,对于做温度采集的人来说很关键。热电偶满量程才几十毫伏,PT100在0°C附近每度只变化0.39Ω,如果拿普通的10位、12位ADC去测,量化噪声就把信号淹没了。24位ADC配合PGA之后,理论上能分辨到亚微伏量级的电压变化,对PT100和热电偶都足够。而且PGA还有一个不容易注意的好处:输入信号先被放大,后续ADC量化噪声相对于信号的比例就变小了,信噪比明显改善。

它和ADS1220最大的区别就是通信接口。ADS1220走SPI,需要主机提供SCLK、片选信号,还要处理时钟极性、相位,一旦时序不对整包数据就错位。ADS122U04走UART,MCU这边只需要一组TXD/RXD,接线少了一两根,隔离方案也成熟得多。工业现场经常要用数字隔离器把传感器端和主控端隔开,UART隔离器在市场上很常见,直接把TXD/RXD串过去就行,不需要额外处理SCLK和片选。

1.2 R7FA2L2094CFM 在系统里扮演什么角色

R7FA2L2094CFM 是瑞萨RA2L2系列的Cortex-M23内核MCU,主频最高48MHz。RA2L2系列主打低功耗和电容触摸,片上的Flash和SRAM资源对温度采集这种任务来说非常充裕。选这颗芯片不是因为它算力多强,而是因为它在极低功耗下能跑完所有事情,而且瑞萨的FSP配置工具对串口、定时器、DTC传输控制器都提供了现成驱动,开发效率高。

主控的活分四块:第一,通过UART给ADS122U04IPWR发配置命令,及时读回24位转换结果;第二,把原始码换算成电压、电阻、温度,这一步要做查表和线性化;第三,做滤波、开路判断、校准系数修正;第四,把最终温度通过RS485/Modbus或者LCD屏交给上层系统。这些操作RA2L2裸机状态机就能管得很好,不需要上RTOS。

选型时还考虑了一点:RA2L2的引脚和封装形式适合做小尺寸采集板,可以很自然地跟ADS122U04IPWR放在同一块板上。有些项目为了省成本会把主控换到更低端的MCU,但开发人员如果对Cortex-M0+或M23熟悉,维护成本其实更低。瑞萨的e2studio免费,没有license问题,对做产品的团队来说也没有额外风险。

2. 传感器到ADC:PT100、热电偶到底怎么接

2.1 三线制PT100的比例式测量,引线电阻怎么被“消掉”的

PT100是工业温度测量里最常见的热电阻,0°C时标称100Ω,温度升高电阻变大。它的问题在于:传感器到采集板之间总有一段导线,导线电阻本身也有几欧姆到十几欧姆,如果直接把PT100接成两线制,引线电阻会直接叠加到测量结果里。0.39Ω/°C的灵敏度,10Ω引线电阻就意味着大约25°C的误差,完全不可接受。

所以工业现场要用三线制,配合ADC的激励电流源做比例式测量。思路是这样:让同一路电流源同时流过PT100和一个精密参考电阻RREF,ADC先采样PT100上的压降,再采样参考电阻上的压降,然后用这两个数字量的比值反推PT100阻值:

Rt = Code_RTD / Code_REF × RREF

这个公式的核心价值在于,激励电流源的绝对值、温漂、老化都被约掉了。不管电流源实际是1.000mA还是0.998mA,只要两次采样用的是同一个电流,比例值只取决于电阻比值。这就是“比例式测量”的魅力,也是工业仪表里特别推崇的做法。

接线细节上,我用的配置是这样:激励电流源IDAC1接到PT100的高侧,PT100的高侧同时接到ADC的差分正输入;PT100低侧分出两根线,一根接到ADC差分负输入,另一根接到参考电阻RREF的电流回路上;RREF的另一端接地。这样差分输入测到的电压是RTD本体上的压降加上一段引线电阻压降,而参考电阻和引线电阻共享回路,通过比例计算能把引线电阻的影响抵消掉。前提是两条引线尽量用相同规格、相同长度,保证对称性。

这里给一张三线制对比表:

项目两线制三线制
接线数量2根3根
引线电阻影响直接计入RTD阻值,误差大两根引线对称时基本抵消
适用场景短距离、精度要求低HVAC管道、工业仪表
配置复杂度低中,需仔细接线

激励电流值我建议选500µA或1mA。电流太小,信号电压低,PGA压力大;电流太大,RTD自身发热,比如1mA流过100Ω时功率是0.1mW,大多数贴片和铠装热电阻还能接受,但再往上就得算探头的耗散系数了。

2.2 热电偶接入:毫伏级信号和高增益配置

热电偶和PT100是两种完全不同的信号类型。热电偶输出的是热电动势,K型热电偶大约41µV/°C,0到100°C温差也就4.1mV左右。这个信号微弱到不放大根本没法看,所以ADS122U04IPWR的PGA必须打开。我通常把增益设到32或64,如果测量范围很小,也可以设到128。增益不是越高越好,太高时有效输入范围变小,容易在温度快速变化时溢出,所以要根据量程来。

K型热电偶的冷端补偿是另一个大头。热电偶测的是“测量端和参考端之间的温差”,如果你的接线端子正好在PCB上,参考端温度会随环境变化,必须用一个温度传感器在冷端位置测量实际温度,再加上热电偶的热电势查表,才能得到真正的被测温度。

ADS122U04IPWR内部有个温度传感器可以用,但我实测下来它的绝对精度有限,做1°C左右的补偿勉强,做0.1°C档的系统就不够了。我的建议是:外接一颗薄膜NTC贴在热电偶接线端子座附近,把NTC的读数作为冷端温度,配合查表使用。NTC出厂误差再小,也建议在整板校准时做一次偏置修正。这是个容易踩的坑——很多人只盯着ADC精度,忘了冷端补偿也会贡献0.5°C以上的误差。

热电偶输入还有个常见问题:传感器开路。热电偶丝很细,现场振动、腐蚀都可能让它断掉。ADC内部有开路检测功能,配置寄存器里打开以后,断线时输入会被拉到一个已知状态,读取结果会出现明显的满偏特征。软件里再做一层判断,比如连续三次读数超过0x7F0000就报“传感器开路”,这个在后面抗干扰章节里还会细说。

2.3 一种更省事的延伸:4~20mA变送器信号直接进ADC

做HVAC项目时,除了直接接PT100和热电偶,还经常要面对4~20mA电流输出型变送器,比如风管温湿度变送器、压力变送器。这些变送器的输出电流和被测物理量成正比,采集端只需要在输入回路并联一只250Ω精密电阻,电流流过电阻产生1V到5V的电压,然后送进ADC。

这个做法的好处是通用性很强,一套采集板既能接电阻型传感器,又能接电流型变送器。配置上PGA设为1,输入范围要覆盖0到5V,注意ADC的绝对输入范围不能超过供电电压。如果通过250Ω电阻采样,共模电压基本都在0~5V以内,和ADC供电轨匹配。

4~20mA还有个额外的优点:它天然能检测断线。如果回路断了,电流变成0mA,电阻上的电压就是0V,软件读到的码值接近0或者负值,直接设一个低于1V的阈值判断“输入信号异常”就行。这比加额外硬件看门狗简单得多。唯一的坑是两线制变送器需要回路供电,必须保证24V电源和采样电阻的串联关系正确,不然变送器没有工作电流。

3. 让两个芯片“对话”:UART命令协议与驱动要点

3.1 先搞清楚ADS122U04的工作状态机

ADS122U04IPWR是命令控制型ADC,主机发命令、ADC应答,和SPI那种“随时拍一拍读数据”的模式不同。上电之后我习惯先发一个复位命令,等两毫秒,再依次写配置寄存器。常用的命令包括RESET、RREG/WREG读写寄存器、START开始转换、RDATA读转换数据、POWERDOWN进入低功耗。每一条命令都有固定字节长度,UART通信的好处是主机端一个字节一个字节发,不需要担心时钟相位不匹配;坏处是UART本身没有“帧起始”信号,一旦字节流中间错位,后面所有解析都会乱掉。

所以在驱动里一定要有一套“重新同步”的机制。我踩过的坑是:系统跑久了,偶尔一次干扰导致接收端吃掉半个字节,之后所有命令都歪了,ADC回了乱码,主控还在那傻等。后来解决办法很简单:超时未收到正确响应时,先连续发几个0x00或者0xFF脉冲,再发RESET,重新读一遍寄存器确认同步了才继续工作。主机端软重置不算复杂,但能省掉大量现场重启的麻烦。

另一个注意点是每次写完配置寄存器后,必须重新发START命令,否则ADC不会用新配置开始转换。这个顺序很多人会忘记,特别是初始化代码写得很长时,改了一个通道配置,结果还停在旧寄存器状态,读出来的数据完全不对。这种问题不需要逻辑分析仪,跟踪一下配置流程就能发现。

3.2 RA2L2的SCI配置和FSP生成项目

R7FA2L2094CFM的开发我用的是瑞萨官方的e2studio加FSP。创建项目时芯片型号会自动识别,主要工作是配置SCI串口。在Pins视图里选一个SCI通道,打开TXD/RXD功能,然后在Stacks视图添加UART driver,配置成8位数据位、无校验、1位停止位,波特率根据ADC支持范围选。工业现场长线传输我倾向用19200或者9600,稳定优先;调试阶段用115200方便抓日志,但线缆长了以后别怪码率太高出噪声。

RA2L2的DTC传输控制器很好用。UART收到的每个字节可以由DTC自动搬到内存缓冲区,全部收完再产生完成中断,这样CPU不用每个字节都进一次中断,功耗低很多。配置时我把UART接收缓冲区固定成转换结果的长度,收到完整一帧再进回调函数解析,代码结构非常清晰。

给一段初始化流程伪代码:

/* FSP生成的g_uart0_ctrl和g_uart0_cfg可以直接使用 */ fsp_err_t err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg); if (err != FSP_SUCCESS) { /* 错误处理:打开串口失败,一般先检查引脚配置 */ } /* 启动DMA/DTC接收,缓冲区长度对应一帧完整数据 */ R_SCI_UART_Read(&g_uart0_ctrl, g_rx_buf, RX_BUF_LEN); /* 发送命令时用R_SCI_UART_Write,写完等待发送完成 */

还有一点值得注意:RA2L2进入低功耗模式后,UART外设通常也会关闭。如果产品需要低功耗待机,别指望SCI在睡眠状态下还帮你收数据。我更习惯让ADS122U04的转换完成信号接一个GPIO口,用普通外部中断唤醒MCU,唤醒后再打开串口、重建同步。这个顺序做反了会莫名丢第一帧数据。

3.3 24位数据的接收解析:符号、字节序、缩放

ADS122U04IPWR的转换结果是一个24位有符号数,以二进制补码形式存在。UART回传时,三字节数据按什么顺序发,我在第一次调通时专门抓了一把确认,不能想当然按MSB first解析。拿到三字节以后,先拼成int32,再判断符号位,这是最常见的解析流程。

int32_t ads_parse_24bit(uint8_t hi, uint8_t mid, uint8_t lo) { int32_t raw = ((int32_t)hi << 16) | ((int32_t)mid << 8) | lo; if (raw & 0x800000) { raw |= ~0xFFFFFF; /* 符号扩展,从24位变成32位负数 */ } return raw; }

接下来换算电压:

float ads_get_voltage(int32_t raw, float vref, uint8_t gain) { return raw * vref / (8388608.0f * gain); }

这里的8388608就是2^23,也就是24位数据表示的码值范围中心。正满量程对应接近0x7FFFFF,负满量程对应0x800000。新手容易把负值当成故障,其实负值只是输入信号低于参考点时很正常的状态。

对PT100来说,拿到电压后还要再走一步:把RTD的采样电压和参考电阻的采样电压做比值,得到RTD阻值,然后查PT100分度表或者用Callendar-Van Dusen方程算出温度。直接线性近似温度在0~100°C段误差不大,但超过100°C就要小心,PT100的电阻-温度曲线本身就有一点非线性,要求高时别省查表。

4. 工业现场真正值钱的坑:电源、接地与抗干扰

4.1 ADC供电和参考电压:脏电进来的第一道雷

HVAC控制箱里通常是另一片世界:接触器吸合、电磁阀动作、变频器启动,电源线上瞬变非常剧烈。ADS122U04IPWR这类24位ADC对电源噪声极其敏感,模拟供电AUDDC一定要用低噪声LDO,不能直接从开关电源取。开关电源的纹波经常有几十毫伏,反映到24位ADC结果里,可能就是好几百个LSB跳动,数据看起来非常抖,但你不一定马上想到是电源问题。

我的习惯做法是:数字逻辑部分用一颗小DC-DC,比如5V转3.3V,带起来MCU和数字接口;模拟部分单独用一颗低噪声LDO,比如3.3V低噪声固定输出,只给ADC的模拟供电和基准电路供电。模拟地和数字地在ADC芯片下方用0Ω电阻单点汇接,其他地方尽量不要大面积铺铜把两个地彻底连通,免得数字开关电流在地平面上制造电压差。

参考电压也一样。ADS122U04内部有2.048V基准,RTD比例式测量时基准绝对精度不太影响最终结果,因为比例会约掉。但直接测热电偶这种绝对电压时,内部基准的温漂就显出来了。如果项目要求宽温范围,或者在-40°C到85°C环境下精度也要保证,我会选择外接精密基准,比如REF50系列,并加旁路电容;预算有限时,内部基准配一次校准也能用。

基准方案温漂成本适合场景
内部2.048V中等,约几十ppm/°C低比例式RTD、普通HVAC
外部精密基准低,可到个位数ppm/°C中偏高热电偶绝对测量、宽温工业仪表

这里有个很容易被忽略的点:外部基准的输出噪声和驱动能力同样重要。基准芯片输入ADC的参考引脚时,引脚旁边的小电容不是随便放的,太大会让基准响应变慢,太小又滤不掉高频噪声。按数据手册推荐的容值起步,实测波形没问题再微调。

4.2 采样率选择:20SPS还是1000SPS

ADS122U04IPWR的采样率档位在20SPS到1000SPS之间。很多人以为采样率越高越好,但其实在工业现场,50Hz工频干扰是最大的坑。当采样率设为20SPS时,ADC的数字滤波器积分窗口正好可以压制50Hz及其谐波,读出来的数据非常干净。我实测过同样一块板子,45SPS时数据明显比20SPS抖,原因就是滤波器零点没落在工频上。

所以我的原则是:能接受慢响应就锁定20SPS,稳定的数据比高刷新率值钱得多。如果是多通道巡检,20SPS意味着每个通道读一次可能要几百毫秒,整个系统更新频率会嫌慢。这时可以选更高的采样率,但代价是需要自己加软件滤波,比如移动平均或者一阶低通。

另一个隐藏成本是通道切换后的稳定时间。ADC内部滤波器和PGA在输入信号变化后需要一定时间才能稳定,如果切换通道后立刻读数,前几个转换值基本是废的。我习惯每次切换通道后丢弃前两次转换结果,第三次才开始累积有效数据。这个做法在低采样率下尤其重要,否则哪怕所有硬件都完美,读数还是会周期性偏移。

4.3 屏蔽、走线和传感器开路检测的联动

工业现场传感器线缆要走屏蔽双绞线,屏蔽层单端接地,一般接到采集板的地。两端都接地会形成地环路,反而会引入更大的共模噪声。PT100三线制的三根线尽量同长度、同线径,否则三线制抵消引线电阻的前提就不成立了。

热电偶的延长线要用对应分度号的补偿导线,普通铜线代替会引入额外的寄生热电动势。接线端子注意防潮防氧化,现场灰尘水汽一旦进入端子,接触电阻和热电势都会漂移。这些都是“软故障”,软件查不出,只能靠安装规范去避免。

传感器开路检测要和软件联动。硬件上打开ADS122U04的开路检测功能后,断线时输入被拉到已知状态,读数会明显偏大或者偏小。我在软件里加了一层状态机:连续三次读数超过阈值,才上报“传感器开路故障”;一旦读回正常范围,再连续三次正常才清除故障。这样消除抖动,不会让一个瞬时尖峰触发布线报警,也不会在恢复瞬间频繁报警。

这里再强调一次:上位机看到满偏码值不等于传感器变坏了,要结合阈值判断,比如24位数据0x7F0000以上基本可以断定输入悬空或者开路。

5. 校准和实测:把温漂和偏差一点一点抠干净

5.1 误差分配表:先说清楚误差去哪了

做温度采集最怕的是不知道误差在哪。把误差源列清楚以后,很多问题都能看出来。我通常按下面这个思路分配:

误差来源典型影响消除方式
PT100引线电阻0.5~2°C三线制、四线制
RTD自热0.01~0.1°C降低IDAC电流,选耗散系数大的探头
ADC量化噪声通常小提高增益、降低采样率
内部基准温漂随温度变化比例式测量、外部基准
线性化误差0.2~1°C查表或CVD方程
热电偶冷端误差0.5~2°C外接NTC并校准

这张表不是绝对数值,但它给出一个责任划分原则。如果你测出来的温度整体偏了0.5°C,先怀疑冷端和基准,而不是急着怀疑ADC。24位ADC本身的量化误差很小,工程上真正的误差大头永远是传感器和模拟前端。

5.2 两点校准怎么做:冰点和沸点

校准是让温度数据真正可用的最后一步。我习惯用冰点槽做0°C参考,用干体炉或沸水浴做100°C参考。系统先通电老化半小时,让板温稳定下来,再分别记录两个校准点的读数。

假设系统在冰点读到的温度是0.15°C,在干体炉100.00°C时读到的温度是99.72°C。那么线性校正可以写成:

k = (99.72 - 0.15) / 100 = 0.9957 b = 0.15

校准后温度 = k × 原始温度 + b

代码实现很简单:

float correct_temperature(float raw_temp) { const float k = 0.9957f; /* 增益误差系数 */ const float b = 0.15f; /* 偏置误差 */ return k * raw_temp + b; }

两点校准在0°C到100°C之间效果很明显,但别指望把它用到全量程。超出校准区间后,NTC和热电偶的非线性会让误差重新冒出来。宽温要求的话,做三点或者分段线性化,或者直接把查表环节和校准系数合并进分度表。

还有一个容易忽略的细节:校准要注意传感器本身的校准源精度。干体炉或者恒温槽如果本身只有±0.3°C精度,那你的系统最终精度一定不可能超过它。校准源至少要比你的目标精度高三倍,才能作为可信参考。

5.3 稳定性实测:看懂码值跳动比看懂平均更重要

数据稳定性和绝对精度一样关键。同样的读数,平均值在0°C附近很漂亮,结果是每五分钟跳一次0.3°C,这样系统根本没法用。我的稳定性测试方法很简单:连续采集1000个20SPS读数,打印最大值、最小值、平均值和标准差。

如果码值跳动范围在几十个LSB以内,对应温度通常远小于0.1°C,属于正常水平。如果跳几百个LSB,第一步查电源纹波,第二步查基准退耦,第三步检查PGA增益配置和输入走线。这三个检查完了,很多时候问题就解决了,不用急着换ADC芯片。

对于那些经常在半夜出现温度瞬变的项目,我建议在软件里加一个简单的“变化率告警”。0.1°C档的温度系统正常变化都很缓慢,如果相邻两次读数跳变超过预设斜率,大概率是接触不良、线缆受潮或者ADC同步异常。通过设置变化率门限,可以提前发现故障,而不是等数据漂到离谱了才知道。

最后再分享一次实际调试里的经验:UART型ADC虽然省了两根线,但协议同步问题比SPI更隐蔽。量产阶段的每一块板子,我都建议在自检程序里加一步“发复位、回读寄存器、丢弃废弃数据”的握手序列,把现场因为同步错乱导致的故障率压到最低。如果正在做类似的采集项目,不妨把这套思路先跑一遍,很多时候听别人说一次比自己调一天有效得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询