2026/11/5 1:06:06

UART接口24位ADC+STM32F410RB的工业温度采集方案

UART接口24位ADC+STM32F410RB的工业温度采集方案 做工业测控这几年我打交道最多的传感器就是温度。空调风管里的送风温度、机房配电柜的进线温度、冷冻水供回水温度看起来都是同一个动作把温度变成电信号再变成数字量。但真到了项目现场你会发现信号从几十米长的线缆传到控制板之后怎么从“差不多准”变成“精确到 0.2℃”中间的坑比想象中多得多。ADS122U04IPWR 这颗 24 位 Δ-Σ ADC配合 STM32F410RB 这颗 Cortex-M4 主控是我在 HVAC 和工业温度采集项目里反复用过两轮之后沉淀下来的一套组合方案。项目标题里那个 IPWR 后缀说明封装是 TSSOP、卷带包装市面上很常见。这套组合最吸引我的地方在于它是少见的“UART 接口高精度 ADC”方案——温度传感器信号经模拟前端调理后直接进 ADCMCU 用串口就能读数据和写配置不用像 SPI 那样频繁对齐时钟和引脚时序在工业布线和抗干扰上也更有优势。这篇文章适合正在做温度采集、仪器仪表、HVAC 控制器或者工业数据采集网关的朋友。我会把选型逻辑、模拟前端接法、STM32 驱动框架和实际调试经验一次讲透你照着搭一套可用的温度测量节点问题不大。1. 方案拆解为什么是“24 位 ADC UART 主控”这个组合1.1 工业和 HVAC 场景对温度测量的真实要求先说一个经常被忽略的事实HVAC 里的温度测量目标不是“测到多少度”而是“在恶劣条件下稳定测到多少度”。风管里风机一开传输线上就可能串进变频器的干扰冷冻水管道旁边湿度整天很高配电柜里温度梯度非常大传感器线和电源线经常要平行走几米。温度变化本身很慢一两秒采一次样完全够用但每次采样都要求数据可信、不漂、不跳。这种场景下ADC 的分辨率、输入噪声、基准温漂和通信可靠性优先级远高于采样速率。12 位或 16 位 ADC 在实验室环境里精度尚可一旦传感器线拉长、电磁环境变复杂低位数的量化噪声和电流源噪声都会被放大温度读数可能偏差半度甚至一度。所以项目选型时我只考虑 20 位以上的 Δ-Σ ADC最后定在 ADS122U04IPWR 这类 24 位器件上本质上是用高分辨率来给整个测量链路留足裕量。另一个容易被低估的点是接口。传统 SPI 接口 ADC 在主控板上画起来简单但工业传感器板往往和主控板物理分离SPI 时钟线对线路阻抗和信号完整性的要求很高走长了容易反射还必须连很多根线。UART 接口不一样哪怕用 TTL 电平也能传几十厘米加上 RS485 驱动器就能传上百米这对 HVAC 这种“一个控制柜管多个传感器节点”的分布式结构特别友好。1.2 ADS122U04IPWR 这颗芯片强在哪ADS122U04 的本质是一颗低噪声、低漂移的 24 位 Δ-Σ ADC内置可编程增益放大器PGA、内部基准电压、内部振荡器和完整的 UART 物理层。它把模拟采集前端的大部分工作都做完了传感器信号进来先经过输入多路复用器再到 PGA 放大最后由 Δ-Σ 调制器加数字滤波器输出 24 位补码数据MCU 完全不用管模拟时序。PGA 增益可以从 1 倍调到 128 倍这个特性对热电偶尤其关键。K 型热电偶在 0℃ 附近输出只有几十微伏到几毫伏如果想直接读到 0.1℃ 的分辨率就必须先把毫伏级信号放大到 ADC 的满量程范围内。增益 64 或 128 倍配合 24 位分辨率理论上能分辨微伏级别的电压变化。片内基准电压的设计目标是低漂移虽然不能和外部基准分庭抗礼但在 HVAC 这种温度变化较温和的场合完全够用。如果你做的是高精度计量设备可以改用外部基准这是后话。UART 通信接口的价值我前面提过一部分这里再补充一点它天然适合隔离。工业节点为了保护主控经常需要把传感器侧和 MCU 侧做电气隔离UART 只需两颗数字隔离器隔离 TX 和 RX就能搞定成本低且时序容错高。而 SPI 隔离需要隔离时钟、数据输入、数据输出三根线如果还有片选就四根隔离器数量和成本直接翻倍时序也更容易被隔离器延迟搞出问题。1.3 STM32F410RB 在系统里扮演什么角色STM32F410RB 是 ST 公司一颗基于 Cortex-M4F 内核的 MCU主频 100MHz带浮点运算单元和 DSP 指令Flash 128KB、RAM 32KB。拿来做温度采集节点主控性能绰绰有余但它的筋道之处在于外设布局很均衡3 路 USART其中一路接 ADC另一路可以接上位机或 RS485 网关丰富的定时器和 DMA 可以让我在不占用 CPU 的情况下连续接收 ADC 数据支持低功耗模式如果做电池供电的无线温度标签它也可以胜任。我选这颗 MCU 还有一个私心它内部有温度传感器虽然绝对精度一般但在做热电偶冷端补偿时可以作为粗略参考配合外部 NTC 校准能省一路独立的冷端测量通道。Cortex-M4 的 FPU 对温度查表、插值和 Steinhart-Hart 公式计算帮助很大浮点运算的实时性完全不是问题这在后续软件部分会体现出来。选型阶段我也比较过 STM32G0 和 STM32L4 系列最终用 F410 的主要原因是项目早先代码基于标准外设库迁移成本低。如果你的项目新起灶G0 或 L4 也都合适核心逻辑完全一样。关键不是换 MCU而是 ADC 和 MCU 之间的通信链路设计是否正确。2. 硬件搭建从传感器到 STM32F410RB 的数据链路2.1 传感器选型与模拟前端接法HVAC 现场最常见的温度传感器无非三种PT100/PT1000 铂电阻、NTC 热敏电阻、热电偶。它们各有各的脾气接法也不一样。铂电阻线性度好、长期稳定适合做高精度温度测量。我常用的激励方式是恒流源。给 PT100 通一个 500μA 或者 1mA 的恒流电流流过电阻产生电压再用 ADC 测量。选 500μA 是为了把自热效应降到最低100Ω 的铂电阻通 1mA 电流会产生约 0.25mW 的功耗虽然对精度影响很小但在密闭风管里长时间工作我倾向于更保守。PT100 在 0℃ 时阻值 100Ω通 500μA 电流只产生 50mV 电压这个量级直接给 PGA 增益 4 到 16 倍后ADC 可以轻松分辨 0.01℃。如果你做的是 4 线制 PT100直接用两条线激励、两条线采样能完全消除引线电阻误差。但工业现场为了省线经常用 3 线制这就需要并联或桥式接法。另一个技巧是比例测量让 ADC 的参考电压同时作为传感器电桥的激励电压这样基准电压的绝对值变化不会影响最终的电阻比值计算基准温漂的影响能被抵消一大部分。这个技巧我强烈建议用上比单纯堆器件精度划算得多。NTC 热敏电阻价格低、灵敏度高在 HVAC 里大量用于风管温度、回风温度和表冷器温度测量。它的问题是非线性非常严重0℃ 到 50℃ 的阻值变化能差出四五倍但好在 Steinhart-Hart 公式能很好拟合。接法上通常是 NTC 串一个精密电阻做分压然后测分压电压。要注意的是 NTC 的自热系数一般在 1mW/℃ 到 5mW/℃ 之间分压电流不能太大10kΩ 的 NTC 用 3.3V 电源测量时分压电阻也选 10kΩ 左右比较合适这样功耗能控制在零点几个毫瓦。热电偶在 HVAC 里用得少一些供热锅炉烟道温度、燃气燃烧器温度会用到 K 型或 J 型。热电偶输出的是毫伏级电压必须用高增益 PGA同时必须做冷端补偿因为热电偶测量的是测量端和冷端的温差冷端温度一变读数就会跟着漂。冷端补偿的执行方式是测量电路板冷端的实际温度通常是接一个 NTC 或利用 MCU 内部温度传感器然后在代码里补一个电压偏移。2.2 ADS122U04 引脚配置与主控连接ADS122U04 是 TSSOP-16 封装引脚不多但模拟和数字功能混在一起接线时要分清区域。下面是我在实际电路里用到的连接关系ADS122U04 引脚功能区域作用连接目标AVDD / DVDD模拟电源 / 数字电源3.3V LDO 输出各接 0.1μF 10μF 去耦电容到地AVSS模拟地模拟地平面单点连接数字地AIN0 / AIN1差分输入通道 1接 PT100/热电偶正负端AIN2 / AIN3差分输入通道 2接 NTC 分压点或备用通道DINUART 数据输入接收 MCU 发来的命令STM32F410RB 的 USART TX 引脚DOUTUART 数据输出向 MCU 发送 ADC 数据和应答STM32F410RB 的 USART RX 引脚DRDY数据就绪输出下降沿表示转换数据可读STM32F410RB 的任意 EXTI 引脚RESET复位输入低电平有效MCU GPIO 控制或上拉到 VDD这里我特别说明一下UART 的 DIN 和 DOUT 是相对于 ADC 器件方向定义的DIN 是 ADC 的接收端接 MCU 的发送端DOUT 是 ADC 的发送端接 MCU 的接收端。初次接线的人容易把方向搞反建议拿到数据手册后先核对引脚编号再对照上表逐一确认。STM32F410RB 这一侧我习惯把 ADC 接在 USART2 上因为 USART1 往往要留给板载调试打印或 Bootloader。DRDY 引脚可以接到 PA1 并配置为下降沿外部中断数据就绪时中断里直接置一个标志位主循环发现标志后立刻发出读取数据命令。这里有个细节ADS122U04 在连续转换模式下DRDY 会周期性地变低MCU 的中断频率等于采样频率。如果你把采样率设成 20SPS那么 1 秒进 20 次中断完全可接受不建议设成几百 SPS因为 HVAC 温度变化慢高速采样只会让 MCU 忙于应付中断还引入额外噪声。2.3 数字隔离、RS485 与长距离传输工业项目里主控板和传感器板之间如果距离超过几十厘米TTL 电平就不太稳了。ADS122U04 的 UART 接口最大的优势就是可以无缝接入 RS485 总线。传感器板上放一个 RS485 收发器把 UART TX 和 RX 转成差分信号主控板用同样的收发器接回来传输距离可以达到几百米甚至上千米。RS485 节点要注意终端电阻匹配一般总线两端各接一个 120Ω 电阻。如果环境电磁干扰严重总线还应该用屏蔽双绞线屏蔽层单点接地。电气隔离方面我在传感器板端用数字隔离器把 ADC 的 DIN、DOUT、DRDY 三根信号线全部隔离开这样传感器侧的模拟地不会和主控数字地形成环路地环路往往是工业现场温漂和读数跳变的隐形杀手。热电偶线本身是毫伏信号容易受电机启动、变频器 PWM 干扰。这种情况下我建议在热电偶进入 ADC 之前加一级低通滤波器用 100Ω 电阻串 100nF 电容截止频率约 16kHz虽然对后级 Δ-Σ 数字滤波器形不成等效替代但能有效抑制高频共模干扰。RC 滤波的电阻不宜太大否则和 ADS122U04 的内阻一起影响 PGA 输入偏置电流误差。信号线如果经过室外或者管道沿途还建议加 TVS 管做浪涌防护否则雷击感应电压打进来ADC 很容易报废。3. 软件实现让 STM32F410RB 顺利读出温度3.1 USART 初始化与 DMA 接收配置STM32F410RB 和 ADS122U04 之间的通信本质就是一个普通的串口读写。但为了不让 CPU 在每次接收都陷入中断我建议把 USART 接收配置成 DMA 模式。温度采集节点经常有多路传感器数据要轮询处理CPU 如果一直被串口中断打断实时调度会变得很难看。初始化流程可以这样先用 STM32CubeMX 生成工程时把 USART2 设为异步模式波特率我常用 115200 或 230400。ADS122U04 对波特率误差的容忍度取决于它内部振荡器的精度通常是 ±2% 左右STM32 的主时钟经过 PLL 后很容易满足我实测默认配置从未因为波特率失配而出过问题。DMA 配置上接收方向用 DMA1 Channel 的 USART2_RX环形缓冲区长度可以设 16 字节接收数据按字节流方式处理。发送方向也可以用 DMA但命令帧通常只有几个字节用普通阻塞发送就够了没必要为了几个字节引入 DMA 响应延迟。DRDY 引脚用 GPIO 外部中断下降沿触发在中断服务函数里只做一个动作把“数据就绪”标志位置 1。主循环检测到标志后发送读取数据命令再等待 DMA 收到 4 字节数据3 字节有效数据 1 字节 CRC解析得到温度原始码。3.2 配置 ADS122U04 的寄存器要点ADS122U04 的配置寄存器在芯片内部有 4 到 5 个通过 UART 命令读写。具体寄存器地址和位定义手边要放一份数据手册因为不同批次的手册可能对保留位的描述有细节差异我用过的项目里配置逻辑集中在下面几个方面。第一个是输入多路复用器选择。ADS122U04 的 AIN0 到 AIN3 四个输入引脚可以被组合成两组差分信号或四路单端信号。在 HVAC 场景我通常做成两路差分一路接 PT100 或热电偶一路接 NTC。第一路差分接法抗共模干扰能力强第二路单端接法简化布线。第二个是 PGA 增益和旁路选择。如果传感器输出是 50mV 量级增益设为 4 或 8 比较合适如果传感器输出只有几毫伏热电偶增益要设到 64 或 128。但增益调高会让可测输入范围变小PGA 输出如果接近电源轨数据会失真配置前要先估算最大输入电压。第三个是采样速率和数据滤波器。ADS122U04 内部是 Δ-Σ 调制器加数字滤波器采样速率决定了滤波器的抽取窗口。对于工频 50Hz 的环境选择 20SPS 或 50SPS 可以让数字滤波器的零点落在干扰频率附近这是最简单也是最有效的工频抑制手段。我通常选 20SPS数据慢一点没关系温度变化本来就慢抗干扰好才是王道。配置寄存器的写入代码我用下面的框架注意这里以逻辑流程为主寄存器地址常量需要按你实际芯片版本在头文件里定义void ads122u04_write_config(void) { const ads122u04_cfg_t cfg { .mux ADS_MUX_AIN0_AIN1, /* 差分输入 1 */ .pga_gain ADS_PGA_GAIN_8, /* PT100 场景 */ .data_rate ADS_DR_20_SPS, /* 抑制 50Hz */ .ref_sel ADS_REF_INTERNAL, /* 内部基准 */ .conv_mode ADS_MODE_CONTINUOUS }; uint8_t raw[4]; ads122u04_pack_cfg(cfg, raw); /* 将配置结构体打包为寄存器值 */ ads122u04_send_wreg(0, raw, sizeof(raw)); /* 写命令 */ }我的驱动框架里ads122u04_send_wreg(addr, data, len)会按照数据手册的命令格式把命令首字节、寄存器地址、数据字节通过 USART 发出去。发送完成后原则上还要读回来校验一遍防止线缆干扰导致配置错误。每次上电我都习惯先回读寄存器值并和期望值对比这一步能在现场省下大量排查时间。3.3 原始数据解析与温度换算流程ADS122U04 输出的 24 位数据是有符号补码格式满量程对应于输入电压等于正负基准电压除以 PGA 增益。刚才步骤里回归电压。首先要把三个字节拼接成 32 位有符号数然后换算电压/* 3 字节原始数据按大端拼接 */ int32_t raw (buf[0] 16) | (buf[1] 8) | buf[2]; if (raw (1 23)) { raw - (1 24); /* 转为有符号数 */ } float vref 2.5f; /* 内部基准具体值以手册为准 */ float gain 8.0f; /* 前面配置的 PGA 增益 */ float input_voltage ((float)raw / 8388608.0f) * (vref / gain);得到输入电压后不同传感器走不同的换算路径。如果是 PT100 恒流源方案先用欧姆定律算出当前电阻值r_pt input_voltage / i_excite然后用 IEC 60751 标准电阻表查温度查表之外再用线性插值把精度补到 0.01℃。查表的好处是避免了 Callendar-Van Dusen 多项式的计算开销用二分查找从 100 个标准点里定位比按公式算还快而且不存在多项式拟合在低温段的误差。如果是 NTC 方案直接套用 Steinhart-Hart 公式float inv_t c1 c2 * logf(r_ntc) c3 * powf(logf(r_ntc), 3.0f); float temp_k 1.0f / inv_t; float temp_c temp_k - 273.15f;三个系数 c1、c2、c3 可以在 0℃、25℃、50℃ 三个温度点上实测阻值反解得到这个方法比厂商给的 B 值公式更准尤其是温度跨度大的场合。如果是热电偶代码里要先做冷端补偿用 NTC 或 MCU 内部温度传感器测出冷端温度查冷端对应的热电势然后加到测量端读到的热电势上最后再反查热电势-温度表得到真实温度。整个过程用浮点运算Cortex-M4 的 FPU 跑这几个数学函数毫秒级就完成了速度没有任何压力。4. 调试实录我遇到过的三个硬骨头问题4.1 串口帧错位与乱码第一次把 ADS122U04 焊到板上后回读寄存器值始终不对数据完全是乱的。我用逻辑分析仪抓 DIN 和 DOUT 波形发现发送命令帧时电平规律正常但 DOUT 上回过来的数据总是滞后一个字节。排查后确认是帧同步问题。UART 本身是异步协议没有时钟线接收方必须靠起始位对齐字节边界。如果 MCU 上电瞬间ADC 内部已经有数据准备好并主动往 DOUT 上发了一个字节刚好 MCU 的 DMA 已经在接收状态就会把这个多余的字节当作命令帧的第一个字节后面所有数据整体偏移自然全部错位。解决办法有两个。一是每次上电后主机先发一个多字节的 NOP 命令或者复位命令让 ADC 把 UART 状态机复位到确定状态再开始正常读写。二是在配置寄存器和读取数据命令帧里加上固定帧头或者返回字节数的校验一旦发现帧长不对就重新同步。我在驱动里加了一个简单的状态机检测到 CRC 校验失败就自动连续读 3 个字节丢掉强制重新对齐这在现场调试中非常管用。还有一个经验不要让 ADC 的 UART 波特率和 MCU 的调试串口波特率用同一个值。调试串口经常插拔 USB 转串口工具波特率一旦配置错两根线又分别是不同的收发器很难第一时间区分是哪个环节乱码。我把 ADC 的 USART 波特率固定为 115200调试口固定为 9600排查问题的时候一眼能分辨数据流来源。4.2 50Hz 工频干扰在数据里“画波浪”接入真实传感器后我发现温度读数在 ±0.5℃ 范围内以大约 10 秒周期缓慢波动。起初怀疑是空调风管气流温度本身在变化但用一块高精度仪表对比测试确认是我这套采集链路引入的测量噪声。检查重点落在两个位置。第一是传感器线缆屏蔽层没有单点接地屏蔽层形成了环流共模干扰转换成差模干扰进入 ADC 输入。我把屏蔽层改为只在传感器端接地后波动立刻减小了一截。第二是 ADS122U04 的数据速率设置。之前为了调试方便我不小心把数据速率设置成了高速档而不是 20SPS此时数字滤波器并没有把 50Hz 干扰抑制掉。改回 20SPS 后工频分量被滤波器零点压制读数波动降到了 ±0.05℃ 以内。这个经历让我养成了习惯每次改完 ADC 配置都要先读回寄存器做确认尤其要看数据速率和滤波配置位是否和预期一致。很多你看似“莫名奇妙”的读数跳动根源就是某个配置位没有写进去或者被线缆干扰改写了。4.3 温度整体偏高的校准与零点处理有一次系统显示温度比实际高 0.3℃持续存在且量值基本固定。我先怀疑基准电压精度于是把内部基准切换到外部精密基准做对比试验结果偏差没有明显变化说明基准不是主因。最后查到是 PGA 的输入偏置电流在作怪。ADS122U04 的 PGA 输入端存在微安量级的偏置电流当我用大阻值的传感器例如 10kΩ NTC时偏置电流在传感器内阻上产生了几百微伏的压降经过增益放大后等效成 0.2-0.3℃ 的温度偏置。这类系统性偏差靠 PCB 布局很难完全消除但可以用软件校准。我在驱动里加了两个校准寄存器零点偏移校准值和高低温增益校准值。先把 AIN 引脚短接到地记录原始码平均值作为零点偏移再接入一个精密电阻箱模拟 100℃ 对应的标准电阻计算出增益修正系数。写入这两个校准量后测量精度可以达到 ±0.1℃足以满足 HVAC 温度控制的指标要求。另外现场校准不要只校准一个温度点。温度传感器在 0℃ 和 80℃ 的误差趋势不完全一致我至少做两个温度点的校准通常用标准电阻箱模拟这样才能把增益误差和偏移误差解耦。如果你现场没有标准温度源用精密电阻箱替代是最快捷的办法因为 ADC 测的本来就是电阻或电压。5. 最后分享几个省时间的实操习惯这套 ADS122U04 STM32F410RB 方案我实际用了两轮以后总结出一个最大的感受UART 接口的高精度 ADC 确实比 SPI 方案更适合工业温度节点因为软件调试的焦点可以集中在串口帧格式和温度换算上不用反复和时序波形较劲。但这不代表没有坑前提是必须先静下心把模拟前端做好把接地处理好否则后面所有问题都会伪装成“软件 bug”让你白忙半天。习惯之一是在画板初期就把测试点留足。AIN0-AIN3、AVDD、VREF、DIN、DOUT、DRDY 这几个关键信号都引出 TP 焊盘调试时万用表和示波器探针直接能勾住不用把探头怼在 TSSOP 引脚上那个间距太痛苦了。习惯之二是上电调试顺序永远从最短链路开始先是 MCU 自发自收验证串口然后 ADC 回读配置寄存器验证通信链路最后才接传感器验证全链路。顺序反了的话出了问题你根本不知道是传感器坏了、接线错了还是配置没生效。如果只是做样机验证可以去买一块 TI 官方的 ADS122U04 评估板把底层驱动跑通再移植到自己做的板子上。但如果已经决定投产我更建议直接在自己板上把驱动写扎实毕竟评估板和外设的应用场景还是和实际项目差着十万八千里。数据手册里串行接口那几十页真到调不通的时候就是最好的救命文档。