☰
UART接口24位ADC+STM32:PT1000温度采集方案全解析
2026/11/5 1:07:22 网站建设 项目流程

前几个月在给一套楼宇自控的空调箱做控制板,温度部分需要测 12 路 PT1000 温度探头,现场探头分布在 40 多米长的管道和设备夹层里。按老思路会上一个板载 ADC 加 SPI 隔离,但板子空间挤不下,而且长线抗干扰又是一堆事。最后选了 TI 的 ADS122U04IPWR,一颗带 UART 接口的 24 位 ΔΣ ADC,配合手里的 STM32L162ZE,一条串口线就把采集问题解决了。这中间踩了不少坑,今天把整个方案的选型逻辑、硬件接线、固件实现和现场经验整理出来,给正在做温控器、传感器节点或工业仪表的朋友一个参考。

这篇内容适合两类人:一类是做嵌入式硬件和固件的工程师,想看看 UART 型高精度 ADC 怎么和 STM32 配合;另一类是在 HVAC、工业过程控制场景里做温度采集选型的人,想确认这套方案到底适不适合自己的项目。

1. 为什么选这套组合:UART 型 24 位 ADC + 带 LCD 的低功耗 MCU

1.1 ADS122U04IPWR 这几个字母到底代表了什么

很多人在选 ADC 的时候,第一反应是 SPI 接口的,比如 ADS124S08、ADS1220 之类。但 ADS122U04 的特殊之处在于它把接口换成了 UART,后缀 IPWR 是 TI 的 TSSOP 封装。这个改动看起来不起眼,在实际工程里却解决了不少问题。

ADS122U04 内部是一个 24 位 ΔΣ ADC,带可编程增益放大器(PGA,增益 1 到 128),两个可以独立配置的激励电流源(IDAC),内置 2.048V 低漂移基准电压源,支持四路模拟输入。这些参数放在工业温度测量场景里是够用的。RTD 和热电偶输出的信号都很微弱,毫伏甚至微伏级别,ADC 的 PGA 和基准源决定了整个测量链路的底噪水平。

但它最特别的是 UART 接口。在工业现场,SPI 是典型的主从同步总线,SCLK 必须跟上位机同步布线,稍微拉长一点距离就容易受干扰,而且需要的 IO 数量多。UART 是异步串行,只需要 TX、RX 两根线,距离拉长后可以直接挂 RS485 电平转换芯片,或者转成 20mA 电流环,这在 HVAC 这种传感器分散的场景里非常合适。ADS122U04 还支持菊花链模式,多颗芯片共用一条 UART 总线,片选省掉了,接线大幅度简化。

1.2 STM32L162ZE 在这里扮演的角色

STM32L162ZE 是意法半导体超低功耗系列里带段码 LCD 控制器的一个型号,Cortex-M3 内核,主频 32MHz,512KB Flash,96KB RAM。对于温度采集这种工作频率不高的场景,运算资源绰绰有余。

选它有几个实际原因。第一,带温度控制面板的 HVAC 设备几乎都要显示温度、模式、时间这些信息,STM32L162ZE 内置的段码 LCD 驱动器可以直接驱动市面上常见的 LCD 玻璃屏,省掉一颗 HT1621 之类的外部 LCD 驱动芯片,对降低成本是实打实的好处。第二,低功耗能力突出,配合 ADC 的定期唤醒工作模式,整机待机功耗可以做到很低,这对两线制仪表这种全靠回路供电的设备很重要。第三,多个 USART 加上 DMA,正好匹配 ADS122U04 的 UART 接口,一套固件逻辑可以同时跑多个采集链路的轮询。

1.3 这套组合的边界条件

任何方案都有它的适用范围,不是所有场景都适合这一套。ADS122U04 的输出数据速率最高到几千 SPS,但对温度和 HVAC 应用而言,常用的区间根本用不到那么高,20 SPS 到 100 SPS 已经足够。真正要警惕的是那些需要高速同步采样的应用,比如振动分析、多相电能质量监测,那必须用并行的同步 ADC,这一点在项目选型阶段就要明确。

我个人的判断标准是:只要系统对温度采样的刷新率要求低于 50Hz、测点分散在 5 米到 50 米不等、需要高分辨率(24 位)且不想为每个测点单独布 SPI 总线,这套 UART ADC + 低功耗 MCU 的组合就非常合适。

2. 硬件链路的搭建:从 PT1000 探头到 STM32 串口

2.1 RTD 三线制接法与激励电流选择

温度测量方案里最基础也最容易出错的是传感器接线。PT1000 是铂电阻,0℃ 时标称阻值为 1000Ω,灵敏度大约 3.85Ω/℃。如果只用两根线,导线电阻会直接叠加到传感器阻值里,造成读数偏高。现场导线如果细一点、长一点,这个误差会大到没法接受。

所以在工业场景里推荐用三线制或四线制接法。ADS122U04 有四路模拟输入 AIN0 到 AIN3,可以配置成两路差分输入或四路单端输入。三线制 RTD 的标准接法是:传感器一端接 AIN0,另一端分出两根线分别接 AIN1 和 AIN2。然后配置 ADC 工作在三线制比例测量模式,两个 IDAC 提供相等的激励电流,一路流经 RTD,另一路流经导线。因为两根导线的材质、长度、温度环境都一样,导线电阻引起的压降在差分测量中会被抵消掉。这个原理理解起来不算复杂,但接线时很容易把 AIN1 和 AIN2 搞反,一旦搞反,补偿逻辑全部失效。

激励电流的选取要做个权衡,电流太小,RTD 压降太小,对 PGA 和 ADC 的失调噪声会放大;电流太大,RTD 自身发热,造成自热误差。拿 PT1000 举例,我习惯用 500µA:0℃ 时 RTD 压降是 1000Ω × 0.5mA = 500mV,这个信号量配合 8 倍增益后接近满量程但又留有余量,适合量程设计在 0 到 200℃ 的场景。如果测量范围要覆盖 -50℃ 到 850℃ 这种大范围,则建议把激励电流降到 250µA,并把 PGA 增益调整到 16 或 32,避免热端时信号饱和。

2.2 模拟输入、参考电压和去耦设计

ADS122U04 的模拟输入是差分结构的,AINN 和 AINP 之间可以直接接 RTD。这里有一个容易忽略的细节:参考电压。在 RTD 比例测量中,ADC 的转换结果是输入电压与参考电压的比值,激励电流的绝对值精度和温漂可以被系统性地抵消掉。ADS122U04 内部基准电压是 2.048V,在这个场景里完全可以用,而且省掉外部的精密基准芯片和配套外围电路,这在空间受限的控制板上非常划算。

如果非要用外部基准,要注意基准源到 AVDD 的去耦必须非常干净。提供基准的 LDO 之后再不济也要加一级 RC 低通滤波,电容选 10µF 钽电容并联 0.1µF 高频陶瓷电容。这里的原因很简单——外部基准一旦被污染,ADC 的全链路精度就会直接掉下来,24 位分辨率根本体现不出来。

电源去耦我始终遵循“三级滤波”的做法,模拟电源和数字电源分开走,模拟电源位置加 10Ω 电阻 + 10µF 钽电容 + 0.1µF 瓷片电容,DSVDD 引脚附近放 0.1µF,AVDD 和 DVDD 之间不要直接连通。现场用 24V 供电时,我会从开关电源出来连一级 LDO,把纹波压到 1mV 以内,再进 ADC。这个环节最容易被轻视,其实大量异常读数都是电源不干净造成的。

2.3 与 STM32L162ZE 的 UART 连接

ADS122U04 的 UART 接口是三线:TXD 发送数据、RXD 接收命令、加上 DRDY 数据就绪输出。DRDY 是低电平有效,每次转换完成都会拉低一段时间,MCU 可以把它接到 STM32 的 EXTI 引脚,通过中断触发读取。这里我强烈建议不要用轮询方式,原因后面固件部分会说。

具体的连线方式如下表:

ADS122U04 引脚STM32L162ZE 引脚说明
TXDUSART2_RX (PA3)ADC 回复数据到 MCU
RXDUSART2_TX (PA2)MCU 发送命令
DRDYPA0(EXTI0)转换完成中断触发
AVDD/DVDD3.3V供电
REFP/REFN内部基准/去耦电容参考电压引脚

STM32L162ZE 的 USART 不需要额外电平转换,两者都是 3.3V 逻辑,直接连就行。如果项目里 MCU 是 5V,就要在 RXD 上加电阻分压,避免超压损坏 ADC。

2.4 供电选项和传感器绝缘

ADS122U04 有单极性和双极性供电两种模式,常规正电压应用用单 3.3V 供电,负电压供电主要用于需要测量负温度或负信号的双极性配置。做 HVAC 我只用单电源,因为 RTD 在 0℃ 以上的信号都是正电压,内部 PGA 完全能处理。

传感器绝缘这块经验来自现场一次诡异故障:一批探头全部读数偏高且没有规律,后来排查发现是探头外壳和金属管道之间形成了地环路,漏电流直接串进了传感器回路。这个问题的处理方式是在探头安装位置做好绝缘处理,传感器线和屏蔽层连接遵循单端接地原则,避免多点接地形成环流。

3. 固件这一层:UART 命令、寄存器配置、DMA 接收与温度换算

3.1 ADS122U04 的串口时序与命令字

ADS122U04 的 UART 帧格式默认是 8 数据位、无校验、1 停止位,波特率默认 9600bps,可以通过配置寄存器调整。上电之后,正确做法是先发送软件复位命令(0x06),然后等大约 10ms 让内部振荡器和基准稳定,再开始配置寄存器。

常用命令字如下:

命令说明
0x20 + 寄存器地址读取寄存器
0x40 + 寄存器地址写入寄存器
0x06软件复位
0x02进入待机模式
0x00从待机模式唤醒
0x1C读取最新转换结果(返回 4 字节:状态字节 + 24 位数据)

时序上有一个关键点:在连续转换模式下,每次转换完成后 DRDY 拉低,此刻 MCU 发送 0x1C,ADC 会返回一帧数据,包含 1 字节状态和 3 字节有效数据。状态字节里的高位会标明当前配置的是内部温度传感器还是偏移校准通道,做 RTD 测量时通常忽略这个字段,但要利用它判断输入是否超范围。

3.2 实际项目里的寄存器配置

ADS122U04 的四个配置寄存器依次是 CONFIG0 到 CONFIG3,地址从 0x00 到 0x03。不同版本的数据手册对位定义可能有细微差别,具体位排列我这里不展开抄手册,而是把必须想清楚的几个参数列出来。

拿我这边 PT1000 的配置来说:

  • CONFIG0:波特率设为 19200bps、帧格式 8N1,不使能校验位;
  • CONFIG1:PGA 增益设为 8,输入模式选择差分模式,数据速率设为 20SPS;
  • CONFIG2:IDAC 电流设为 500µA,分配到 AIN0 和 AIN1 两组;
  • CONFIG3:参考电压选择内部 2.048V,温度传感器关闭。

写寄存器的时候命令格式是:先发 0x40 + 起始寄存器地址,接着发要写的寄存器数量减一,再逐一发送寄存器内容。读寄存器则是 0x20 + 起始地址,然后同样发数量减一,之后读取返回字节。这个顺序如果写反,命令会静默失败,调试时特别浪费时间。

必须提醒一点:很多新手把 ADS122U04 的 UART 当成普通串口,直接发十六进制配置时忽略了命令帧里面“寄存器地址 + 数量”这个头结构,导致寄存器根本写不进去。调试时可以先读一次寄存器,核对上电默认值和修改后的值,确认通信链路正常再进行下一步。

3.3 STM32L162ZE 端用 DMA 接收数据

USART 接收 ADS122U04 返回的数据,最省 CPU 的做法是 DMA + 空闲中断,或者直接用固定长度接收中断。温度采集数据量不大,固定 4 字节接收也可以,但用 DMA 的好处是当你要挂多个采集链路时,CPU 不会因为频繁串口中断而忙乱。

核心初始化代码大致是:

// USART2 初始化:PA2=TX, PA3=RX void USART2_Init(void) { RCC->APB1ENR |= RCC_APB1ENR_USART2EN; GPIOA->MODER |= (GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1); GPIOA->AFR[0] |= (7 << GPIO_AFRL_AFSEL2_Pos) | (7 << GPIO_AFRL_AFSEL3_Pos); USART2->BRR = SystemCoreClock / 19200; USART2->CR1 |= USART_CR1_RE | USART_CR1_TE | USART_CR1_UE; USART2->CR3 |= USART_CR3_DMAR; } // DMA1 Stream5 接收 4 字节 void DMA_ADC_Config(uint16_t *buffer) { DMA1_Stream5->CR = DMA_SxCR_CHSEL_0 | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_TCIE; DMA1_Stream5->PAR = (uint32_t)&USART2->DR; DMA1_Stream5->M0AR = (uint32_t)buffer; DMA1_Stream5->NDTR = 4; DMA1_Stream5->CR |= DMA_SxCR_EN; }

DMA 传输完成中断里解析数据帧。要注意 ADS122U04 的返回数据是刚好 4 字节对齐的,如果多了或者少了,多半是读命令发晚了或者帧格式配置不对。

3.4 从 24 位原始码到温度的换算

这是最核心的数学环节。ADS122U04 的 24 位转换结果是有符号补码格式,无符号直读会导致负温时出现巨大跳变。第一步一定要做符号扩展:

int32_t code = (int32_t)(raw24 & 0xFFFFFF); if (code & 0x800000) code |= 0xFF000000; // 24位补码转 int32

然后换算电压:满量程对应 -VREF 到 +VREF,VREF 是 2.048V,所以电压 V = code × 2.048V / 8388607。

RTD 电阻值 R = V / I_IDAC(假设激励电流 500µA)。实际上比例测量模式下,直接用 code 比值计算电阻更准确:R = R_参考 × (code / code_满量程),但这里简化处理成电压除以电流也够用,前提是 IDAC 温漂控制在可接受范围。

得到电阻后转温度,0 到 850℃ 范围内用多项式:

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

其中 R0 = 1000Ω,A = 3.9083×10⁻³,B = -5.775×10⁻⁷。反解 T 时用二次方程求根即可。为了快速响应我实际用的是查表法,把 0 到 200℃ 的 R-T 表做成 const 数组,二分查找后线性插值,精度足够且实时性好。

4. 校准与诊断:从“能读出数”变成“测得准”

4.1 两点校准与线性修正

再好的 ADC,系统级误差还是存在的。ADS122U04 本身是 24 位精度,但实际链路中传感器误差、激励电流温漂、PCB 热电动势、参考电压源偏差都会叠加进去。所以工程上不能指望直接把原始码换算成温度就交付,必须做系统校准。

标准做法是两点校准。把温度探头放进冰水混合物,稳定后记录原始温度读数 T1;再放进沸水(或恒温槽设定 100℃),记录 T2。然后计算斜率和截距:

修正值 = (实际温度 - 原始温度) 的线性拟合。

我用一个结构体保存校准系数,固化到 Flash 里,每次上电读取。校准系数在不同批次的产品中差别可能不小,最好每台设备在生产线上单独标定,至少也要每块 PCB 做一次。

4.2 断线检测和状态字节解析

现场最常遇到的故障是传感器断线和接线接触不良。RTD 断路时,IDAC 激励电流没有回路,输入电压会被拉到电源轨,ADC 输出自然满量程。这时候如果固件不加判断,显示的温度就会跳到几百上千度,这个现象在 HVAC 现场维护中太常见了。

ADS122U04 返回的状态字节中有输入超范围标志位,可以在解析时检查。我更推荐一种软件兜底:读取到异常满量程码值时,不要立即当作温度更新显示,而是连续读取多次,如果连续 5 次都是饱和码值,就判定为断线故障,显示 E-SENSOR 并报警。现场有一类故障是接头氧化导致接触电阻飘忽,读数忽高忽低,同样通过连续多次读数的一致性判断可以有效过滤掉这种毛刺。

4.3 CRC 校验与传输异常兜底

UART 在几十米长的工业线路上传输,偶尔也会出现误码。ADS122U04 支持在数据帧末尾附加 CRC 校验字节,配置使能后,MCU 端需要实现 CRC-8 计算。如果项目不希望增加固件负担,也可以使用 UART 本身的奇偶校验,配合超时重发机制。

注意一点,开启 CRC 后,每次读取的数据长度就不是 4 字节而是 5 字节。DMA 的 NDTR、协议解析的帧长度都要同步调整,否则收到的第一帧就会错位。这个坑我踩过,调试时以为 ADC 坏了,换了几颗芯片才发现是 DMA 缓冲长度少算了一字节。因此留一个协议层标志位来切换短帧/长帧解析是值得的。

5. HVAC 现场的实战教训与细节

5.1 采样率不是越高越好

ADS122U04 的数据速率有多个档位,20SPS、45SPS、90SPS、175SPS、330SPS 等等。很多人上来就选最高速率,这是误区。在工业电网环境下,90SPS 以上采样时工频 50Hz/60Hz 及其谐振会产生明显的共模噪声。而 20SPS 时 ΔΣ 调制器的数字滤波器正好把工频干扰压制到很低的水平。

温度对象的惯性非常大,管道温度变化一分钟能波动 0.5℃ 就算很快了,20SPS 完全不会影响控制效果。用 20SPS 还有一个好处:转换周期 50ms,DRDY 中断触发的节奏和 MCU 的房率处理刚好匹配,不会造成堆栈积压。

实时性要求高的场合最多用到 90SPS,此时注意在信号链前端加一阶 RC 低通滤波,截止频率设置在 10Hz 左右,有效滤除高频干扰之后再进 ADC。

5.2 长线布线与屏蔽处理

现场 40 米传感器线缆,模拟信号侧如果处理不好,精度再高的 ADC 也白搭。我前前后后布线总结出来几条原则。

传感器线用屏蔽双绞线,每根信号线尽量成对绞合,屏蔽层单端接地。这里的“单端”是指屏蔽层在控制柜一侧接地,传感器侧悬空,形成电位平衡而非环路。地线不要跟动力线捆到一起走,即使在桥架里也要隔开至少 30cm。UART 数字信号如果也要长距离传输,不要直接用 TTL 电平拉 40 米,应该加 MAX3485 之类的 RS485 收发器,差分信号在长线上的抗干扰能力远强于单端 TTL。

5.3 电源树设计与独立 LDO

ADS122U04 的模拟电源和数字电源最好独立供电,因为开关噪声串到 AVDD 后,直接表现为 ADC 输出端的高频跳码。我初次打样时图省事,AVDD 直接接 3.3V 主电源,结果 24 位分辨率只实现了前面 16 位有效,后面低位一直在跳。后来在 AVDD 前面加了一级低噪声 LDO,就是 LP5907 这类,实测跳码立刻收敛。

STM32L162ZE 的 VDDA 也要独立去耦,用 1µH 电感加 4.7µF 电容的组合是常见的做法。系统有开关电源时,还要考虑在电源入口做一级 π 型滤波,避免电源开关噪声直接耦合进模拟地。

5.4 低功耗设计与多节点扩展

做 HVAC 温控器时,大部分时间设备处于待机状态,只有用户触摸面板或定时巡检时才需要采集温度。STM32L162ZE 的 STOP 模式电流只几十微安,ADS122U04 有 STANDBY 命令,可以让 ADC 停止转换、关闭内部振荡器。两者配合可以把整机待机功耗压到很低。

多节点扩展是这套方案最大的加分项之一。ADS122U04 的菊花链结构允许多颗 ADC 通过同一个 UART 数据线串联,每颗芯片都有自己的地址位配置,主机可以轮询每颗芯片。应用到多区空调上,一个控制盒里挂 6 颗 ADS122U04,理论上可以接 24 路 RTD,只占用主控一个 UART。不过菊花链的时序管理比单颗要麻烦,DRDY 信号最好每颗分开接 MCU 的 GPIO,这样便于精准识别是哪一路转换完成。

5.5 LCD 显示与现场调试经验

STM32L162ZE 自带段码 LCD 驱动,可以直接驱动定制的段码液晶屏,显示温度值、设定值、运行模式、故障码。LCD 在低温下响应变慢,这是液晶玻璃本身的材料特性,不是固件问题,现场反馈时提前做好说明。

调试阶段,我习惯在固件里保留“原始码模式”,就是通过串口直接输出 ADS122U04 的 24 位原始码和换算后的电阻值。这样做的好处是判断问题在模拟链路还是数字链路:如果串口助手看到原始码稳定递增,说明传感器和接线正常;如果原始码乱跳,先去查电源和屏蔽;如果原始码稳定但换算温度不准,说明校准系数有问题。这个排查逻辑让我省了很多现场时间。

我个人在实际项目中的体会是,ADS122U04IPWR 这种“把 ADC 当外设串口设备”的思路,特别适合做分布式的工业采集节点,它把难搞的模拟前端和数字控制的耦合降到最低。配合 STM32L162ZE 的低功耗和 LCD 显示能力,整套系统在 HVAC 温控器、楼宇自控采集箱、工业温度变送器这些场景里都能直接落地。最后再分享一个小建议:无论你是第一次接触还是已经调完整个固件,都建议把传感器开路、短路、接触不良三种异常情况编成独立的测试用例,固件跑通之后做一遍故障注入测试,很多因为“读数异常”被叫到现场的问题,其实都源于异常处理逻辑缺失。

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

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

立即咨询