☰
UART接口24位ADC与STM32L4S5ZI的工业温度采集方案
2026/11/5 1:06:48 网站建设 项目流程

做 HVAC 温控面板或者工业现场多点温度采集,真正让人头疼的往往不是单片机选型,而是模拟前端。很多工程师一开始想省钱直接用 MCU 内置 ADC,结果发现 12 位精度根本啃不动热电偶的 mV 级信号,工频干扰一进来数值跳得跟心跳似的。我的做法是用外置高精度 ADC 把“测”和“算”彻底分开:ADS122U04IPWR 负责把传感器电压转成可靠数字,STM32L4S5ZI 负责跑协议、做显示和控制逻辑。这套组合在工业传感器采集、HVAC 风柜温控、多路温湿度记录仪这类场景里非常能打,值得专门写一篇实操总结。

ADS122U04IPWR 是 TI 的 24 位 Δ-Σ ADC,最大亮点是它走 UART 接口而不是常见的 SPI/I2C。STM32L4S5ZI 是 ST 超低功耗 L4 家族里的大容量型号,2MB Flash 配 LCD 控制器,正好适合做带屏的温控终端。这篇我会从选型逻辑、硬件接法、寄存器配置、软件状态机、一直到现场标定和排障,按我实际调试的路子完整过一遍,适合正在做类似项目的硬件工程师和嵌入式开发。

1. 从需求倒推选型:为什么是这套组合

1.1 工业与 HVAC 温度采集的真实痛点

HVAC 和工业现场的温度采集,看着简单,实际坑不少。先说传感器类型,风管里常用 NTC 或者 PT1000,冷水机组回水温度可能用 PT100,燃烧炉、锅炉排烟温度又是 K 型热电偶,这三类信号动态范围差别极大。热电偶满量程才几十毫伏,PT100 在 0°C 附近电阻变化每度只有 0.385Ω,配合 1mA 激励电流也就是 0.385mV/°C 的电压变化。MCU 内置 ADC 在这种幅值下根本没法用,分辨率不够,内部参考电压温漂也大。

其次是传输距离和抗干扰。工业设备里传感器和主控板往往不在同一块 PCB 上,走线可能长达一两米,经过端子排、继电器区,旁边就是接触器和变频器。SPI 在这种环境里非常脆弱——SCK 上耦合一点噪声,数据就移位了。I2C 虽然只有两根线,但总线电容限制大,长线基本没戏,而且地址冲突、挂死恢复都是麻烦。UART 是异步串行,没有时钟线,抗共模干扰能力强,布线也最简单,一收一发两根线,中间想加数字隔离器也便宜。ADS122U04IPWR 把 UART 做到 ADC 上,等于把传输可靠性这个最现实的问题提前解决了。

第三个痛点才是精度。24 位 Δ-Σ ADC 的实际有效分辨率虽然到不了 24 位,但在 20 SPS 低速率下做到 20 位以上没问题,算下来温度分辨率能到 0.001°C 级别,完全够用。真正要命的不是分辨率,而是参考电压漂移、PCB 漏电、导线电阻这些系统误差。ADS122U04 内置 2.048V 参考、可编程增益放大器(PGA)、激励电流源,还带一个内部温度传感器,热电偶冷端补偿都能省掉外挂芯片,这些集成功能让硬件变得非常干净。

1.2 UART 接口 ADC:被低估的实用选择

先说结论:ADS122U04IPWR 选 UART 不是为了标新立异,而是切切实实解决了工业场景的传输可靠性问题。传统 ADC 清一色 SPI,工程师也习惯性选 SPI,但 SPI 在长线传输上有几个难以绕开的毛病:SCK 和 MOSI 并行走线,线间串扰会让时钟边沿抖动,高速时尤其明显;主从之间没有协议层纠错,偶尔来一个干扰脉冲就可能把整个命令序列打乱。I2C 呢,上拉电阻、总线电容、设备挂死恢复,每次调试都像拆盲盒。

UART 的好处是异步通信,发送方只在起始位下降沿同步一次,后面按约定波特率采样,接收端对毛刺有天然的容忍度。而且 UART 是字节流,可以自己做帧头、CRC、超时重传这套轻量协议。ADS122U04 在芯片内部就把寄存器配置、转换数据封装成串口命令,还支持 CRC 校验和应答,相当于一个带通信协议的传感器前端。我用 1 米长的普通杜邦线连过它和 STM32,跑到 115200 波特率,帧错误率极低,这在 SPI 场景下是难以想象的。

另外这个芯片支持菊花链级联。多个 ADS122U04 可以挂在同一条 UART 总线上,通过设备 ID 寻址,主控只需要一对 TX/RX 就能扩展十几个通道。做 8 路温度巡检仪的时候,两块芯片级联比用多路复用加一块 ADC 的方案更灵活——通道之间天然电气隔离,某一通道接错线也不会拖垮全局。

1.3 STM32L4S5ZI 在这个系统里的角色

STM32L4S5ZI 不是普通跑个点的 MCU,它是我这套方案的主脑。先说算力,L4 系列是 Cortex-M4F 内核带 FPU,主频 120MHz,做浮点查表、PID、滤波算法绰绰有余。热电偶测温要用 NIST 多项式或者分段查表,PT100 要用 Callendar-Van Dusen 方程反解,这些运算放 M4 上基本没有压力,跟调速器、压缩机控制逻辑一起跑都够用。

存储上它有 2MB Flash,我一般把传感器标定表、冷端补偿系数、多国语言界面字库都存在里面,不用外挂 Flash,物料清单省一项,可靠性还更高。它内部带了 TFT-LCD 控制器,可以直接推 RGB 接口屏,这对 HVAC 温控面板太友好了。别人还在用 SPI 转并口的小板子刷 LED 段码屏,L4S5ZI 已经能直接跑 480x320 的彩屏界面了。

我特别看重的是它多个 UART 外设。L4S5ZI 有两三个 USART 加 LPUART,我用一个接 ADS122U04,一个接 RS485 做上位机,一个接 WiFi/蓝牙模块做远程监控,互不干扰。低功耗模式下,L4S5ZI 可以靠 LPUART 唤醒,这样整个温度采集系统在待机时功耗能控制在微安级,电池供电的便携式巡检设备也能用这套方案。

2. ADS122U04 的核心架构与硬件配置要点

2.1 通道选择、PGA 与参考电压之间的关系

ADS122U04 内部有 4 个模拟输入,通过多路复用器组合成差分对。它不是让你简单选 AIN0 到 AIN3 就行,而是要考虑 PGA 增益、参考电压和信号幅值三者匹配。打个比方:热电偶信号在 0 到 50mV 之间,如果 PGA 增益设成 128,满量程输入就变成 0 到 6.4V,配合 2.048V 参考,对 50mV 信号来说相当于把整个 ADC 量程砸在这么一点范围上,分辨率极高。反过来,如果测的是 0 到 10V 的外部变送器输出,PGA 就得设成 1。

我在配置寄存器之前,第一件事是算清楚传感器在最极端量程下的最大输出电压。比如 K 型热电偶在 1400°C 时热电势大约 52mV,留出 20% 余量,那就是要让 PGA 增益 × 最大信号 ≤ VREF。如果内部参考用 2.048V,增益 32 倍就是 1.664V 满量程,对应最大可测信号 52mV,余量足够。如果误把增益设成 128,信号在 400°C 左右就砍顶了,测出来永远是满码。这类问题用代码调试时最容易忽略,特征很隐蔽——低温段读数正常,高温段突然一条直线。

参考电压选择还有个重要原则:测 RTD 用比率测量,测热电偶用绝对电压测量。比率测量就是把激励电流源输出的电流,先流过 RTD,再流过一颗精密基准电阻,把基准电阻上的压降当作 ADC 的参考电压。这样电源波动、温漂对激励电流的影响会同时作用于信号和参考,比例抵消掉。ADS122U04 内部专门支持这种接法,比用内部 2.048V 更稳。

2.2 PT100 三线制接入与比率测量原理

PT100 三线制是工业现场最经典的接法,目的是消除导线电阻。假设三根导线电阻都是 r,激励电流 I 从 IDAC1 流出,经过一根导线进 RTD,再从另一根导线返回地,第三根线只取电压不流电流。此时 ADC 正输入端测得的是(RTD 电阻 + 导线电阻)× I,负输入端的感测线上没有压降,两道线压在差分对里相互抵消的情况取决于硬件接法。

实操时我的接法是:IDAC1 接到 RTD 的一端,RTD 另一端分别接 AIN0(正输入)和 AIN1(通过匹配电阻到地),激励电流回路线从 RTD 另一端引出。如果担心线阻不对称,可以采用四线制,多一根线彻底消除误差,但 HVAC 现场普遍用三线制,接线成本低,配合 1mA 激励和 24 位 ADC,线阻误差可以做到忽略不计。关键是要让正负输入引脚的偏置电流尽可能相等,差分对追踪掉共模误差。

很多新手在这里栽跟头:在 AIN 引脚上并大电容滤除高频干扰。这对 24 位 Δ-Σ ADC 是致命的——PGA 输出是开关电容结构,需要输入端的电荷保持稳定,大电容会让开关电荷无法及时建立,表现出来就是读数跳变、校准值漂移。我的原则是传感器线在端子处加 1nF 到 10nF 的差模电容,再串一个小阻值电阻做 RC 滤波,电容别跨在 ADC 输入脚上。

2.3 热电偶冷端补偿:内部温度传感器的用法

热电偶测的是热端和冷端的温差电压,冷端如果不在 0°C,信号里就混入了冷端温度对应的热电势。想得到真实热端温度,必须测出冷端温度,补偿掉这部分电压。ADS122U04 内部集成了温度传感器,精度大约 ±0.5°C 左右,理论上可以当冷端参考,但芯片温度跟热电偶接线端子温度不完全一致,所以在板上靠近端子处放一颗高精度 NTC 或者 MCP9808 数字传感器会更准。

软件流程是先读 ADC 转换出来的热电偶电压,再用同样的电压-温度关系反推冷端补偿。以 K 型热电偶为例:如果冷端实测 25°C,查 NIST 表得到 25°C 对应的热电势是 1.000mV,那么真实热端电压等于 ADC 读数加上 1.000mV,再拿这个修正后的电压去查温度。ADS122U04 内置温度传感器的读数可以通过内部多路复用器切到温度模式直接读,算下来省一颗芯片,只是精度有限,要求高的场景还是建议外挂一颗 I2C 温度传感器。

开发板布局时热电偶接线端子要尽量远离发热元件,别放在 MCU 旁边。我第一版 PCB 就把端子放得离 LDO 太近,稳压器温热导致冷端读数比实际高三四度,补偿结果也跟着偏,后来把端子挪到板边,中间开了个小槽隔热处理,问题才解决。冷端补偿讲究的是“跟被测冷端等温”,而不是精度足够高就行,这个观念得先摆正。

3. 原理图到 PCB 的实操笔记

3.1 最小系统电路搭建

ADS122U04 的最小系统非常简洁。供电用 3.3V,AVDD 和 DVDD 都接 3.3V,数字地模拟地单点相接。复位引脚上拉电阻配一个 100nF 电容,确保上电可靠复位。AIN0 到 AIN3 经过 ESD 保护管和 RC 滤波后接传感器端子,参考电压引脚 VREFP/VREFN 如果悬空,则内部 2.048V 参考会启用,这是默认行为,不用额外配置。

UART 接口部分直接和 STM32L4S5ZI 的 USART 对接,TXD 接 RX,RXD 接 TX,共地。两边都是 3.3V CMOS 电平,不需要电平转换。需要长距离传输时,中间加一颗数字隔离器,比如 ISO7721,隔离后 UART 信号走双绞线或者转 RS485。建议在 TXD/RXD 上各串一个 22Ω 电阻,限制振铃,板上走线长度超过 10cm 时这个电阻能明显改善波形。

我习惯在 UART 线上加一颗 TVS 管,选结电容小的型号,免得高频分量被滤掉。工业现场的 24V 继电器、开关电源浪涌经常耦合到信号线上,TVS 可以让调试时少烧好几块板子。这个钱不能省,批量出货的每一块板子都要测 ESD,老老实实加上。

3.2 电源、参考电压与滤波电容布局

ADC 的电源质量直接决定转换结果的稳定程度。3.3V 从开关电源来的时候,我建议先过一颗 10μF 钽电容加 100nF 陶瓷电容的组合,再串一颗磁珠或者 10Ω 电阻,给模拟供电段形成一个独立的 LC 滤波。ADS122U04 功耗很低,工作电流才几百微安,所以电压降不是问题,重点是纹波。开关电源的开关噪声频率一般几十到几百 kHz,如果直接进 AVDD,Δ-Σ 调制器会把一部分高频噪声混叠到基带,表现出来就是读数在末尾几个 LSB 来回跳。

参考电压部分,如果使用内部参考,VREFP/VREFN 引脚上照数据手册放 1μF 到 10μF 的电容,靠近引脚放置。如果是比率测量外部参考,参考电阻两端也要并一个大电容,这个电容同时是 RTD 激励电流的储能电容,太小会让参考电压在每次采样时跌落。PCB 布局时,ADC、参考电容、基准电阻要尽量靠近,模拟走线附近不要走数字信号线,尤其是 UART 的 TX 线,它要是贴着 AIN0 走,每次发数据的时候 ADC 读数都会抖一下。

3.3 常见布局错误与整改心得

我踩过最典型的一个坑是把模拟地和数字地割裂成两个岛,然后只在一端用 0Ω 电阻连起来。原理上没错,但如果 ADC 跨在两个岛之间,数字信号的回流路径就得绕一大圈,环路面积过大反而成了天线。后来我把地做成完整的整块,把 ADC 放在模拟器件集中的区域,让数字部分自然远离模拟输入,效果比刻意分割好得多。高手都在做完整地平面,新手反而喜欢到处割地。

还有一个布局细节:传感器端子排到 ADC 的走线要尽量短且等长,差分正负两根线走在一起,减少环路面积。PVC 绝缘端子排的漏电也是个容易被忽略的点,潮湿环境下端子间阻抗下降,可能会在 AIN 之间形成微小的漏电流。处理办法是 PCB 上在两个 AIN 焊盘周围挖一圈隔离地,或者铺上阻焊层加开窗,让表面漏电路径拉长。我见过有同行在端子底下开槽,物理上切断爬电路径,效果最好,就是板子稍微难看点。

4. 软件驱动设计:从 UART 帧到温度值

4.1 初始化流程与寄存器写读

ADS122U04 的通信协议是字节流。主机每发一条命令,先发一个同步字节 0x00,然后跟命令字节和数据字节。上电后我习惯先发一串 0xFF,让 UART 接收端找到正确的字节边界,再发复位命令把芯片恢复到已知状态。复位命令发完要延时,内部上电复位需要一点时间,我一般等 10ms 再操作寄存器。

寄存器配置通常是写四个字节:内部有三个主配置寄存器,加上一个偏置电流/激励电流寄存器。我的典型配置举例:增益 8 倍、数据速率 20 SPS、内部参考使能、输入通道选 AIN0/1 差分。具体位段定义以数据手册为准,代码里我做成结构体,每一位都加注释,方便调参。这些寄存器的核心是这几个点:PGA 增益、数据速率、滤波模式、参考源选择、激励电流大小。

写寄存器时主机发送:同步字节、写命令字节、寄存器号、数据字节。ADS122U04 读寄存器时 MCU 发出读命令后要释放/继续接收,芯片会回一个数据字节。我把这个交互封装成两个函数,写一字节和读一字节,再加上 1ms 的超时重发机制——现场如果 UART 线上有干扰,偶尔会丢字节,重试一次就恢复了,不需要整机复位。

4.2 启动转换与读取 24 位数据的关键细节

转换发起有两种模式:连续转换和单次转换。我的习惯是 HVAC 场景用单次转换,需要时发命令触发一次,读完数据就停。这样功耗低,也方便设计多通道巡检——通道间切换时不存在连续模式下的数据错位问题。更重要的是,单次转换配合睡眠指令,整个采集系统可以进入低功耗模式,适合电池供电或者待机功耗有要求的设备。

读取转换结果时芯片返回 3 个字节,按高位到低位排列。24 位结果用二进制补码表示,负数时最高位是 1。我用一个 uint32_t 变量接收,然后左移合并,再通过符号扩展转成 int32_t。这里有个坑:直接把这 3 个字节存进 int32_t 最低 24 位,如果结果是负数,直接当无符号数用就全错了。必须判断最高位自己做符号扩展。

ADC 码值换算成电压的公式:电压 = ADC码值 / 2^23 × 满量程电压。如果 PGA 增益是 G,满量程电压就是 VREF / G。算出电压之后,RTD 用比例关系反推电阻,再查表转温度;热电偶则先加冷端补偿电压,再查 NIST 表。这一步建议直接用浮点运算,M4 有 FPU,速度和精度都有保证,不要为了省那点时间用定点缩放,调试起来太痛苦。

4.3 数据处理链路:滤波、线性化与查表实现

时间上我做了两级处理。第一级是数字滤波器,ADS122U04 内部的 SINC3 滤波器本身就带工频抑制,数据速率选 20SPS 时对 50Hz 有很强的衰减。第二级是软件滑动平均,取最近 16 次转换做均值,进一步压住随机噪声。这个组合在实际测试中效果很好——别的板子读数在 0.01°C 左右跳动,我的板子示波器看着就是一条直线,用户观感好很多。

RTD 的温度计算我用查表加线性插值,表间隔 1°C,0 到 200°C 范围一共 201 个条目,Flash 里存成 uint16_t。查表前先算电阻值,找到区间的两端端点,用线性插值求温度,误差在 0.05°C 之内。热电偶就用 NIST 的多项式拟合,K 型热电偶的系数表网上到处都是,我用的是 0 到 1370°C 分段 6 次多项式,编译进固件也就几 KB。

延时滤波的下游是控制逻辑。温度值经过 FIFO 缓冲后,超过报警阈值会触发中断,主循环检查标志位再决定要不要切继电器。我把 ADC 读取、滤波、协议处理放在优先级不同的中断里:UART 接收中断只负责往环形缓冲区填字节;一个软件定时器中断每 100ms 拉一次转换结果做滤波;主循环跑显示和控制,逻辑清晰,不会出现卡死。

5. 标定、精度分析现场与常见排障实录

5.1 出厂校准怎么做

再好的芯片也不能免校准。我给出厂前标定设计了三个步骤:零点、增益、线性。零点用精密电阻箱模拟 0°C 时的 PT100 电阻,或者直接把输入端短路,记录此时的 ADC 码值作为零点偏移;增益用标准电阻做两点校准,比如 100Ω 和 200Ω 分别对应 0°C 和 260°C 附近,算出斜率修正系数;线性就看有没有非线性误差,一般 24 位 Δ-Σ 的传递函数非常直,只要增益和零点校完,中间段的误差已经很小。

校准数据存在 STM32 的 Flash 最后几页,上电时读取,比较新的板子识别码,如果有变化就重新加载默认值。这里要注意 MCU 的 Flash 擦写次数有限,校准数据不要频繁更新,每次校准前先备份旧值,写到一半掉电了也不至于变成全 FFFF 的垃圾数据。我还把校准信息通过 UART 打到上位机,让产测工位自动记录每块板的序列号和校准系数,后面售后查问题非常方便。

5.2 实测精度与误差分配参考

整套系统实测下来,PT100 在 0 到 200°C 范围内误差能控制在 ±0.2°C 以内,K 型热电偶配合外置冷端补偿能做到 ±0.5°C,常温环境下表现更稳定。误差的主要来源不是 ADC,而是传感器本身的公差和冷端参考的精确度。PT100 的 B 级允差是 ±0.3°C,热电偶更是有 ±2°C 或更高,如果用户对精度要求苛刻,你得在选传感器等级上做文章,光靠后端算法救不回来。

我列出过一份误差分配表:ADC 非线性 0.5 LSB,PGA 增益误差 0.02%,参考电压温漂 10ppm,冷端补偿误差 0.2°C,传感器自身误差 0.3°C。想做到整体 ±0.5°C,首要任务是消除冷端误差和传感器误差,这两者在采购和结构设计上解决,别指望算法。算法能做的只是把 ADC 自身的随机噪声和量化误差压下去。

5.3 高频问题速查表与排障思路

调试和现场维护中遇到的问题我会做成速查表,方便现场工程师对照排查。表格里列问题、可能原因、处理办法,比看长篇技术手册高效得多。

现象可能原因处理办法
读数一直是满码 0x7FFFFF输入开路,或增益×信号超过满量程检查端子接线;降低 PGA 增益
读数一直是 0 或负数最小值输入短路,或参考电压没建立查参考电容、激励电流设置
数据在低电平附近跳变严重电源纹波大;或 AIN 旁路电容过大加强电源滤波;减小 AIN 电容至 1nF
UART 偶有错帧线缆过长、没加隔离降波特率;加数字隔离器;代码加重试
温度值整体偏高冷端补偿不准,或传感器靠近热源检查冷端位置;用外部高精度传感器
同一批板子一致性差参考电阻精度不够换 0.1% 精度、25ppm 温漂的电阻

阅读数据时如果发现高字节和低字节顺序错乱,优先查代码里字节拼接顺序,我犯过把低字节放前面的错误,两个字节拼出来数值差了 65536 倍。还有一个比较隐蔽的:UART 波特率两边设一样的,但时钟源不同导致误差累积,短报文没事,长命令偶尔错。STM32 的 USART 时钟来自 APB,如果 APB 分频后波特率有小数误差,就选整数分频组合,或者直接用 115200 而不用 57600 这类容易出误差的档位。

5.4 现场系统性排查流程

我的排查流程是:先看供电。拿万用表量 ADC 的 AVDD、DVDD 和参考电压,必须稳定;再看传感器接线,拿电阻档量 AIN 对地电阻,确认没有开路短路;然后读寄存器,把配置值打印出来和预期值对比,防止程序跑飞后寄存器被改;最后才怀疑 ADC 本身。这个顺序下来,90% 的问题都能在十分钟内定位。

还有一种系统性问题:多块板子接同一路电源时,地电位不统一导致 UART 误码。解决办法是明确单点接地,RS485 接线时用屏蔽双绞线,屏蔽层单端接地。我在项目里也遇到过板载 DC-DC 的开关频率正好落在采样率谐波上,产生拍频干扰,数据呈周期性抖动。后来把数据速率调高一点,让滤波器的陷波点避开骚扰频率,问题就消失了。总之,排查要有章法,不要一上来就怀疑芯片坏了。

做完这套方案,我自己最大的体会是:软件滤波做得再花哨,也救不了硬件布线的草率;参考源设计不好,再贵的 ADC 也白搭。ADS122U04 和 STM32L4S5ZI 这个组合,优势在于把模拟测量和系统控制两条线分开,各发挥各的长处。硬件上老老实实做布局,软件上稳定地把数据和协议跑通,这套温度采集方案在 HVAC 和工业现场能用到非常高的水准。后续如果要扩展更多传感器类型,还可以在 STM32 侧加更多的 UART 级联 ADS122U04,或者通过 RS485 组网做远程分布式采集,等于这套方案留出了足够的升级余地。

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

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

立即咨询