news 2026/11/5 1:09:21

UART接口24位ADC与MCU组合实现高精度PT100温度采集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UART接口24位ADC与MCU组合实现高精度PT100温度采集

这几年做工业采集和暖通空调控制,我踩过不少温度测量的坑。最典型的就是MCU自带ADC直接测PT100:室温下看着还行,一旦接上管道探头、放到变频器柜旁边,数据要么跳字,要么现场标定一变温度就偏。后来折腾了几版方案,落到ADS122U04IPWR加R7FA2E1A92DFM这个组合上,算是把精度、成本、抗干扰三者平衡得比较好。ADS122U04IPWR是TI那颗带UART接口的24位Δ-Σ ADC,R7FA2E1A92DFM是瑞萨RA2E1系列基于Cortex-M23内核的MCU,这两颗芯片搭在一起,非常适合做分布式温度采集。这篇文章我会把完整链路拆开讲:为什么选UART型ADC、比例测量怎么理解、串口通信怎么搭、原始码怎么变成温度,以及工业现场最容易踩的干扰坑。给正在做楼宇自控、制冷机组、仪器仪表的朋友一个可以直接抄作业的参考。

1. 为什么是“UART型ADC + 通用MCU”这个组合

1.1 工业和HVAC现场对温度测量真实要求没那么简单

很多刚接触工业测控的人会问:MCU自带的ADC不是也能采集温度吗?确实能,但分场合。MCU内置ADC一般是12位或16位,用来读个NTC热敏电阻、判断个过温保护完全够用,可一旦要做PT100/PT1000铂电阻的高精度测量,问题就暴露了。

举个HVAC里的实际场景:风管温度传感器要参与PID调节,室温波动控制在±0.3℃以内,而PT100在0到100℃范围内每变化1℃大约对应0.385Ω的阻值变化。如果激励电流是1mA,那温度每变化1℃对应的电压变化只有0.385mV。MCU自带ADC的参考电压通常是3.3V,12位分辨率下每个LSB对应0.8mV,这精度完全不够看;16位ADC理论上LSB是0.05mV,但考虑到噪声、基准漂移、布线引入的干扰,实际有效精度也很难做到±0.2℃。

工业环境更苛刻。冷却水温度、压缩机排气温度、换热器进出口温差,这些参数直接关系到设备效率和保护逻辑。有的场合要求在-40℃到150℃范围内做到±0.1℃的重复性,这时候就必须上独立的高精度ADC,而且不能只靠堆位数,还要靠测量架构本身去消除激励电流、基准电压的漂移。

1.2 为什么选UART接口而不是SPI或I2C

ADS122U04IPWR最有意思的地方就是它用UART接口而不是常规的SPI/I2C。第一眼你可能觉得奇怪,ADC芯片用UART,多不方便?但仔细想想工业和HVAC的布线场景,UART反而有不可替代的优势。

SPI接口需要SCLK、MOSI、MISO、CS四根线,I2C虽然只用两根线但需要严格的上拉时序和地址仲裁。这两种总线在PCB板上短距离通信都很棒,一旦把ADC放到传感器旁边、MCU留在几十米外的控制柜里,问题就出来了。SPI的时钟线在长线上非常容易产生反射和串扰,CS线的选通时序稍有不匹配数据就错;I2C的抗干扰能力也一般,而且长线电容会让通信速率被迫降得很低。

UART不一样。UART是异步串口,没有时钟线,只有TX和RX两根线,线少、电平容忍度高,还非常容易做光电隔离。工业现场最值钱的就是隔离能力,MCU这边是数字控制地,ADC那边是传感器地,中间用一颗光耦或者数字隔离器隔开,两边地电位再怎么漂,通信照样稳定。而且UART天然适合一点对一点的远程数据采集,根本不用考虑总线仲裁问题。

ADS122U04IPWR支持2400到230400bps的自动波特率检测,接线只有DIN和DOUT两根数据线、加上地线,最多再有一根CS做多片同步。这比SPI在工程部署上省心太多。

1.3 两颗芯片的任务划分,其实是一套“模拟前端”设计思路

R7FA2E1A92DFM这颗RA2E1系列MCU,主频48MHz,Cortex-M23内核,资源不算夸张但很均衡。它要干的事是:通过UART下发命令给ADS122U04IPWR、读取转换结果、做温度换算和控制逻辑。而ADS122U04IPWR负责最关键的模拟部分:输入多路复用、可编程增益放大、24位Δ-Σ模数转换、RTD激励电流源、内部基准、断线检测。

这种架构本质上是把模拟前端和数字处理彻底分开。好处不只是精度提高,还有开发效率的提升。MCU侧的软件不用操心模拟信号调理的细节,ADS122U04IPWR的寄存器配置好了之后,读数据就像串口收包一样简单。而且这两颗芯片都是低功耗器件,如果做电池供电的无线温度标签或者便携式测温仪,整体功耗也很容易压下来。

2. ADS122U04IPWR的比例测量核心:激励电流漂移不再是问题

2.1 从24位Δ-Σ到比例测量,算一笔账

很多人看到“24位ADC”就觉得精度高,这个观点对也不对。24位是理论分辨率,实际能不能用满,取决于基准电压的稳定性、PGA的增益误差、以及测量架构本身的抗漂移能力。ADS122U04IPWR解决这个问题的思路很聪明,它支持比例测量,也就是让ADC的数字输出直接等于RTD阻值和基准电阻阻值的比值,而不是绝对电压。

先看基本公式。对Δ-Σ ADC来说,输出的数字码对应的是输入电压和参考电压的比值:

Code = (PGA × VIN / VREF) × 2^24

在RTD比例测量电路里,用两个匹配的IDAC恒流源分别激励RTD和基准电阻RREF。RTD两端电压VIN = I × R_RTD,基准电阻两端电压VREF = I × R_REF。代进前面的公式:

Code = PGA × R_RTD / R_REF × 2^24

这个公式非常漂亮,电流I直接约掉了。也就是说,无论恒流源因为温度变化漂了1%还是5%,只要两个电流源是匹配的,最终数字码完全不受影响。这是模拟设计里的一个经典技巧,而ADS122U04IPWR把相关电路全集成在片内了。

2.2 四线制PT100/PT1000接线和IDAC电流源配置

RTD测量有2线制、3线制、4线制之分。2线制最简单但导线电阻直接进测量回路,100米长铜线有1.7Ω左右电阻,PT100上相当于4℃多的误差,完全不能用。4线制则把激励电流回路和电压采样回路分开,采样回路里几乎没有电流流过,导线电阻不会影响测量精度。

接法上,我把IDAC1输出接到PT100的激励端,同时把激励端也接到AIN0输入引脚,PT100的另一端接AIN1输入,电流从AIN1路径流回地。RREF电阻接在IDAC2回路上,RREF两端直接作为ADC的外部基准输入。注意整个回路里,两个IDAC的电流要配置成相同值,这样比例测量的前提才成立。

驱动电流怎么选?这是RTD测量最容易忽略的细节,电流越大信号幅度越大、精度越高,但自热效应也越严重。PT100在0℃时阻值是100Ω,如果通1mA电流,功耗是0.1mW,还算可以;如果通2mA,功耗0.4mW,在静水或套管安装中可以接受,但在风管里散热条件差,可能带来0.1℃以上的额外温升。PT1000阻值是1000Ω,同样的电流功耗大10倍,所以更应该用小电流。我的经验值是PT100用0.5mA~1mA,PT1000用0.25mA~0.5mA。

2.3 根据测量范围选择RREF和PGA,这里有几个坑

RREF和PGA的配合是整篇文章里最值得讲的部分。前面那个公式Code = PGA × R_RTD / R_REF × 2^24,很多人直接拿一个常见电阻值就往上怼,结果发现测量范围不对。

PGA的作用是把小信号放大后再送进调制器,但ADC的满量程输入范围其实是被VREF和PGA共同限制的。最大允许差分输入约为VREF / PGA。以PT100测0到200℃为例,200℃时PT100阻值约175.8Ω,如果IDAC用0.5mA,VIN就是87.9mV。如果RREF用1kΩ,VREF就是0.5V。为了让200℃时的数字码不饱和而且尽量占满量程,PGA不能选太高。

我调试时一般按这个思路反推:先定RREF,再算PGA,让满量程温度点的Code不超过0.7~0.8FS,同时让0℃点落在0.3~0.5FS附近。这样既留出超量程余量,又把有效分辨率用到了比较充分的位置。一套实际用过的参数是:PT100、IDAC=0.5mA、RREF=2kΩ、PGA=8。0℃时Code比例约为0.4FS,150℃时约为0.63FS,线性度和分辨率都能兼顾。

加一句提醒:RREF电阻一定要选低温度系数的精密电阻,推荐25ppm/℃以下,最好10ppm/℃。如果RREF自己飘了,整个测量链路全飘,这是比例测量系统里唯一没法自动抵消的误差源。

3. R7FA2E1A92DFM侧串口链路搭建与关键代码

3.1 RA2E1的引脚分配和UART硬件连接

R7FA2E1A92DFM这颗芯片,我用的是它的一路SCI模块做UART通信,常见配置下用P2系列或P3系列的引脚做TX/RX。ADS122U04IPWR的DIN接MCU的TX,DOUT接MCU的RX,两边地线共地。如果做隔离设计,中间插一颗数字隔离器,比如ISO7721,或者直接用光耦,TX/RX各一只。

我这里实际项目中的做法是:不隔离时,UART波特率先固定成19200bps,ADC那边会自动检测;隔离时,波特率也选19200,因为光耦的延时对高低速都能容忍,而自动波特率检测要求主机发送的同步字节足够干净。

电源方面,ADS122U04IPWR的模拟供电和数字供电建议分开走,模拟电源用LDO单独供电,不要直接把DC-DC的输出怼到AVDD上。滤波电容用10μF钽电容加0.1μF陶瓷电容并联,放在芯片电源脚附近。

3.2 ADS122U04IPWR的UART命令帧和自动波特率锁定

ADS122U04IPWR上电之后,主机要发送0x00、0xFF这样的同步序列用来做自动波特率锁定。锁好之后,后续的命令按普通UART字节发送即可。它支持的命令不多,常用的几个:

  • 0x06:复位
  • 0x08:启动转换
  • 0x20:RDATA,读取最新转换结果
  • 0x20~0x23:读取寄存器
  • 0x40~0x43:写寄存器

读转换结果时,ADS122U04IPWR会返回4个字节,第一个是状态字节,后面三个是24位转换数据。状态字节里包含了PGA是否饱和、基准是否异常等信息。

时序上有个要注意的地方:发送RDATA命令之前,必须确保本次转换已经完成。最简单的方法是固定延时,按配置的数据速率等够时间。比如配置成20SPS,一帧50ms,那么发完START之后至少等50ms再读。也可以拉DRDY引脚做中断,但UART模式下我习惯直接用延时,省一个引脚。

3.3 初始化、启动和读取温度的代码骨架

我用FSP生成UART驱动,然后封装一层ADS122U04的驱动。初始化函数大概是这样的:

/* 写寄存器的基本操作 */ void ads122u04_write_reg(uint8_t reg, uint8_t val) { uint8_t cmd[2]; cmd[0] = 0x40 | (reg & 0x03); cmd[1] = val; ads122u04_uart_send(cmd, 2); delay_ms(1); } /* 初始化:复位、配置、启动 */ void ads122u04_init(void) { uint8_t cmd; cmd = 0x06; /* RESET */ ads122u04_uart_send(&cmd, 1); delay_ms(10); /* * 寄存器0:选择AIN0/AIN1差分输入,单极性模式 * 寄存器1:PGA=8,外部基准来自RREF两端 * 寄存器2:数据速率20SPS * 寄存器3:IDAC1=IDAC2=0.5mA */ ads122u04_write_reg(0x00, 0x00); ads122u04_write_reg(0x01, 0x28); ads122u04_write_reg(0x02, 0x04); ads122u04_write_reg(0x03, 0x22); cmd = 0x08; /* START */ ads122u04_uart_send(&cmd, 1); } /* 读取转换结果:状态字节+24位数据 */ uint32_t ads122u04_read_raw(void) { uint8_t cmd = 0x20; /* RDATA */ uint8_t buf[4]; ads122u04_uart_send(&cmd, 1); ads122u04_uart_receive(buf, 4); /* 先把state存起来,再拼24位码 */ ads122u04_status = buf[0]; return ((uint32_t)buf[1] << 16) | ((uint32_t)buf[2] << 8) | ((uint32_t)buf[3]); }

上面寄存器值只是示意,实际工程要按数据手册逐位核对。不过整个通信框架就是这几步,装好了之后轮询读数据就行。调试阶段建议把原始码直接打印到串口助手,先看原始码的趋势,再换算温度,排查问题会直观很多。

3.4 FSP工程里需要注意的串口细节

RA2E1的SCI模块用FSP配置时,UART波特率要精确匹配。ADS122U04IPWR的自动波特率检测范围很大,但我在实际项目里发现一个问题:如果FSP这边波特率误差超过2%,同步序列偶尔会锁失败,现象就是读回来的数据全是0xFF或者0x00。解决方法是不要依赖默认时钟树,确认PLL配置后的SCI时钟准确,尤其别用内部低速RC当SCI时钟源。

另外,UART接收用中断还是DMA?我的习惯是中断接收,因为ADS122U04IPWR一次返回4字节,中断开销很小。DMA在这种低速小数据量的场景体现不出优势,反而增加调试复杂度。

4. 从原始码到温度:线性化、滤波与故障诊断

4.1 24位原始码怎么换算成PT100阻值

拿到24位原始码后,第一步是换算成阻值。比例测量模式下,用前面推导的公式反推:

R_RTD = Code × R_REF / (PGA × 2^24)

需要确认数据手册里Code是满量程占比还是二进制补码形式。我用单极性模式时,为了保险,会先把24位数据转成有符号数处理,再映射成0到1的分数,避免负温时出现符号混乱。

换算成阻值后,下一步是线性化。PT100的阻温关系不是直的,用查表加线性插值最简单。如果MCU资源充裕,也可以直接用Callendar-Van Dusen公式反算温度,0℃以上用:

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

A = 3.9083e-3,B = -5.775e-7。反向求解时用牛顿迭代或者二分法,几轮就能收敛到0.001℃以内。对HVAC这种要求不极端的场景,查表完全够用,我一般把-50℃到250℃每隔1℃做一张表,查表加线性插值,误差不超过0.05℃。

4.2 数据滤波:在响应速度和稳定性之间找平衡

温度系统的惯性很大,传感器本身就有热滞后,所以滤波可以做重一点。我的做法是两级滤波:先做中值滤波去掉偶发的尖峰,再做一阶惯性滤波平滑输出。

中值滤波窗口取5个点,足够打掉变频器启停带来的突发干扰。一阶惯性滤波的系数α选0.1到0.3之间,对应的时间常数大约1到3秒。HVAC控制环路对这种延迟完全无感,但示波器上看输出曲线,那叫一个丝滑。

有个很容易犯的错:滤波器参数定死,不同探头响应速度差异导致控制回路震荡。风管里的小直径探头时间常数不到10秒,套管里的重探头可能几分钟。我的办法是在固件里留两个滤波档位,根据安装方式切换。

4.3 状态字节、断线检测和校准手段

ADS122U04IPWR返回的状态字节别忽略。PGA溢出位如果拉起来,说明输入超量程了,可能是RREF配错或者传感器短路;基准异常位拉起,多半是RREF接触不良。

工业现场最头疼的是传感器断线。PT100断了之后,输入悬空,ADC可能读到满量程或者随机值。一定要开断线检测,利用片内偏置电流源定期拉一下输入端,如果电压接近电源轨,就判定断线。比在软件里判断“温度超过500℃就报故障”可靠得多,因为那只能事后兜底。

校准方面,两点校准是性价比最高的。用精密电阻箱模拟0℃和100℃,记录实际换算值和标准值的偏差,做增益和偏移修正。增益误差主要来自RREF精度和PGA增益误差,偏移误差主要来自运放失调。校准参数存到MCU的Flash数据区,出厂前每台设备跑一遍自动校准,现场安装后一般不需要再标。

5. 工业现场“温度测不准”的几类典型问题

5.1 变频器柜旁边的干扰:屏蔽层接地才是关键

我在一个制冷机房项目里遇到过很经典的干扰场景。AHU变频柜和温度采集箱并排安装,变频器一启动,温度读数波动±0.3℃。一开始以为是ADS122U04IPWR的问题,后来用示波器量模拟输入端,发现AIN0和AIN1之间叠加了几十毫伏的共模噪声。

处理办法分两步。第一步是信号线全部换屏蔽双绞线,屏蔽层单点接地,接在传感器侧,不要两端都接。第二步是给ADC模拟电源加共模电感,把变频柜传导过来的高频噪声滤掉。改完之后,读数从±0.3℃的抖动降到±0.02℃,效果立竿见影。

这里要特别强调:工业现场的干扰大部分不是直接辐射而是地环路造成的。ADC的模拟地和控制柜的数字地之间只要有电位差,噪声就会从地线串进去。所以要么彻底共地、让地电位差消失,要么彻底隔离、切断地环路。两者夹在中间最糟糕。

5.2 UART隔离和供电隔离,一个都不能省

如果ADC放在传感器端,跟MCU距离超过20米,我建议直接上隔离方案。UART隔离容易,两颗光耦搞定TX和RX,但很多人忽略供电隔离。光耦能隔断信号地,电源还是共用的,那噪声照样通过电源线传导。

正解是ADC侧用隔离DC-DC模块单独供电,比如B0505S这类小功率隔离模块,输出再接LDO稳压给ADS122U04IPWR。这样是真正浮空的模拟前端,传感器侧地电位随便漂,MCU这边纹丝不动。代价是增加一点点成本,但工业项目里可靠性比这点成本值钱。

顺便说一句,UART隔离后波特率最好不要超过115200。光耦的上升沿有延迟,波特率太高容易产生码间干扰。19200bps在50米双绞线上非常稳,完全能满足温度采集的带宽需求。

5.3 可以直接参考的两套配置

把前面说的整理成两张配置表,方便直接抄。

第一套是HVAC风管和水管温度,PT100,范围-40℃到150℃:

参数数值说明
IDAC1/IDAC20.5mA兼顾信噪比和自热
RREF2kΩ低温漂精密电阻
PGA8满量程余量充足
数据速率20SPS温度响应足够
滤波中值5点+一阶α=0.2稳定优先

第二套是工业过程测温,PT1000,范围-40℃到300℃:

参数数值说明
IDAC1/IDAC20.25mAPT1000自热控制
RREF2kΩ与PGA配合
PGA4覆盖300℃不饱和
数据速率45SPS稍快一点
滤波中值7点+一阶α=0.1抑制过程噪声

这两套配置都是实际项目调过的,直接用问题不大。但要注意RREF的温漂一定要压实,这是整套系统精度的天花板。

5.4 安装工艺里的小事,往往决定精度上限

探头安装这块,很多工程师不太在意,但实际影响很大。套管安装时,探头和套管壁之间要填导热硅脂或导热泥,不然空气层造成的热阻会让响应变慢,还会引入几℃的安装偏差。小管径管道上,探头要斜插逆着水流动方向,保证探头全部浸入介质。

HVAC还有个特别容易踩的坑:冷凝水。风管温度传感器安装在保温层不好的位置,夏天管壁结露,水珠顺着探头流到接线端子,造成绝缘下降、测量漂移。处理方法是接线端子朝上,加防水接头,探头进线处做密封。这属于“测试台上永远遇不到,现场必然遇到”的问题。

一点个人的体会

这套ADS122U04IPWR和R7FA2E1A92DFM的组合,我前后用了快一年。最大的感受是,测温度这件事的难度并不在某个单点,而在整条链路的配合。24位ADC给了你足够的分辨率基础,比例测量把激励电流漂移这个老大难消掉了,UART接口让远距离隔离变得实用,而RA2E1这边用FSP配置串口也省了很多底层功夫。剩下的线性化、滤波、标定、安装工艺,都是可以靠工程经验慢慢磨的。

如果你也在做类似的仪表或者控制器,建议先按文中第二套配置搭一个最小系统,把串口打印的原始码跑起来,然后再逐步加滤波、加标定、加故障诊断。快把基础链路跑通,后面在精度和可靠性上做的每一分投入,都是看得到回报的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 1:09:13

ADS122U04+STM32F030R8:UART高精度温度采集方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:08:08

ADS122U04与PIC18F4458组合:工业温度采集的可靠方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:07:23

基于ADS122U04IPWR与PIC18F86J50的工业温度采集方案设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:07:05

基于ADS122U04与PIC18F47K42的HVAC高精度温度采集方案实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:05:30

ADS122U04IPWR+STM32L021K4工业级温度测量方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:04:38

ADS122U04IPWR+STM32F373VC工业温度测量实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华