基于ADS122U04与STM32L452RE的工业级四通道高精度测温方案
1. 为什么工业与 HVAC 场景的温度测量值得单独拎出来讲温度这个参数看起来是工业与 HVAC 系统里最基础的一个量但真正做过现场的人都知道它也是最容易翻车的一个量。热电偶、RTD、热敏电阻随便拎一个出来背后都牵扯到激励方式、引线补偿、噪声抑制、共模电压范围、参考结补偿这一堆事。尤其是在工业现场和 HVAC 设备里测温通道往往要面对几十米长的传感器引线、变频器带来的共模干扰、以及从零下几十度到几百度的宽量程需求这时候再用单片机内部那个 12 位 ADC 去直接采基本等于给自己找麻烦。我这次做的项目核心就是用ADS122U04IPWR这颗 24 位 ΔΣ 型 ADC配合STM32L452RE这颗低功耗 Cortex-M4 MCU搭一套面向工业与 HVAC 应用的四通道温度测量方案。ADS122U04 是 TI 那颗带 PGA、带激励电流源、带 UART 接口的四通道 24 位 ADC专门为小信号传感器设计STM32L452RE 则是 ST 家 L4 系列里带 80MHz 主频、512KB Flash、160KB RAM 的低功耗型号跑个测温采集加协议栈绰绰有余。两者搭配基本就是专业测温前端 通用低功耗主控的经典组合。这篇文章适合谁看如果你正在做工业数据采集板、HVAC 温控器、冷库监测、锅炉房温度巡检、或者任何需要多路高精度测温的嵌入式项目那这篇内容应该能帮你少走不少弯路。我会把选型逻辑、硬件设计要点、寄存器配置、采样时序、校准方法、以及现场踩过的坑全部摊开讲一遍。不是那种贴个数据手册截图就完事的水文而是我自己从打样到现场调试这一整套流程里攒下来的东西。先说结论这套方案在 20 位有效精度下配合 PT100 三线制接法实测通道间串扰低于 0.02℃在变频器旁边跑 24 小时漂移不超过 0.05℃。当然前提是硬件布局和软件滤波都得做对后面会细讲。2. 方案整体设计与核心器件选型拆解2.1 为什么是 ADS122U04IPWR 而不是 ADS1220 或 ADS1248很多人第一反应是测温用 ADS1220 不就行了吗确实ADS1220 也是 24 位四通道价格还便宜点。但 ADS1220 是 SPI 接口而 ADS122U04 是 UART 接口。这个差别在实际项目里影响很大。我这次选 ADS122U04IPWR主要基于三个考虑。第一UART 接口在工业现场布线更友好尤其是当 ADC 和 MCU 不在同一块板上、需要通过排线或隔离器件连接时UART 的异步特性比 SPI 的时钟同步更容易做隔离光耦数量也少。第二ADS122U04 内置的激励电流源匹配精度更高典型值 10μA 到 1.5mA 可编程做 PT100 恒流激励时不需要额外加精密基准。第三它的 PGA 增益范围是 1 到 128配合内部 2.048V 基准最小可分辨到微伏级这对热电偶这种输出只有几十微伏每摄氏度的传感器来说非常关键。ADS1248 虽然通道更多8 通道但它是 SPI 且封装更大对于四通道以内的 HVAC 测温场景属于性能过剩。所以最终锁定 ADS122U04IPWRTSSOP-16 封装手工焊接也不算太痛苦。2.2 STM32L452RE 在这套方案里扮演什么角色STM32L452RE 不是那种随便选个 MCU 都行的凑数选择。它在这套方案里有几个不可替代的作用。首先是低功耗。HVAC 设备很多是电池供电或者靠 4-20mA 环路取电整机功耗预算可能只有几十毫瓦。STM32L452RE 在 Stop 2 模式下典型电流 1.1μARTC 还能继续跑配合 ADS122U04 的连续转换模式加数据就绪中断可以做到ADC 转换时 MCU 休眠转换完成中断唤醒读取的节奏平均功耗压得很低。其次是运算能力。24 位 ADC 出来的原始码值需要做滤波、线性化、冷端补偿、通道校准这些运算如果用 8 位机跑会很吃力。L452RE 的 Cortex-M4 带 FPU跑个 64 点滑动平均加二阶多项式拟合基本不占什么 CPU 时间。第三是外设匹配。L452RE 有 5 个 UART其中一个专门给 ADS122U04剩下的可以接 RS485、调试口、或者无线模块。它还带 LCD 控制器虽然 RE 型号没直接引出但同系列有做带显示的温控面板时升级路径很顺。2.3 四通道测温的拓扑结构设计整套方案的信号链是这样的四路传感器PT100 或热电偶→ 模拟前端保护与滤波 → ADS122U04 多路复用输入 → PGA 放大 → 24 位 ΔΣ 调制 → 数字滤波 → UART 输出 → STM32L452RE 读取 → 软件校准与线性化 → 输出温度值。这里有个关键设计决策四路传感器是共用激励源还是独立激励我的做法是 PT100 通道共用一路激励电流源通过外部模拟开关切换热电偶通道则不需要激励直接进 PGA。这样做的原因是 ADS122U04 只有两路可编程激励电流源IDAC1 和 IDAC2如果四路 PT100 都独立激励电流源不够用。共用激励加模拟开关的方案代价是切换时需要等激励稳定但换来的是通道间一致性更好因为所有 PT100 用的是同一个电流源比例误差被抵消掉了。模拟开关我选的是 TMUX1104低导通电阻典型 1.8Ω漏电流 nA 级对 PT100 测量影响可以忽略。切换时序上每次切换通道后延时 2ms 再启动 ADC 转换让激励电流和 RC 滤波网络充分稳定。3. 硬件设计里那些数据手册不会明说的细节3.1 模拟输入端的 RC 滤波与共模偏置ADS122U04 的模拟输入是差分输入但差分输入不代表可以随便接。工业现场最常见的干扰是共模噪声尤其是变频器驱动的 HVAC 风机、水泵共模电压可能高达几十伏。这时候如果输入端没有合理的共模偏置和滤波ADC 内部 PGA 会直接饱和。我的做法是在每路差分输入前加一级 RC 滤波串联 1kΩ 电阻匹配 0.1% 精度对地接 100nF C0G 电容差分之间接 10nF C0G 电容。这个组合的截止频率大约在 1.6kHz对 50Hz 工频和其谐波有很好的抑制。电阻选 1kΩ 是因为它和 ADS122U04 的输入阻抗配合后不会引入明显的增益误差电容选 C0G 是因为 X7R 的压电效应会在温度变化时产生微伏级噪声对 24 位 ADC 来说是致命的。共模偏置方面我用两个 100kΩ 电阻从 2.048V 基准分压出 1.024V接到差分输入的两端。这样即使传感器引线很长共模电压也被钳在 ADC 的输入共模范围内AVDD/2 附近。注意这两个电阻的匹配度要尽量高否则会引入共模到差模的转换误差。3.2 基准电压源的选择与布局ADS122U04 内部有 2.048V 基准但它的初始精度是 ±0.1%温漂是 5ppm/℃。对于工业级测温这个精度其实够用但如果你要做 0.01℃ 级别的分辨率建议外接 REF5025 或类似的高精度基准。我这次用的是内部基准原因是 HVAC 场景对绝对精度要求通常在 ±0.5℃ 以内内部基准完全满足。但布局上有个细节基准引脚的去耦电容必须紧贴引脚放置我用的是 1μF X7R 加 100nF C0G 并联走线长度控制在 3mm 以内。这个电容的作用不只是滤波它还承担了 ΔΣ 调制器采样瞬间的电荷补充放远了会导致基准电压抖动直接反映在 ADC 输出码值上。3.3 数字接口的隔离与电平匹配ADS122U04 的 UART 接口是 3.3V 电平STM32L452RE 也是 3.3V理论上可以直接连。但工业现场如果 ADC 和 MCU 之间有长排线或者 ADC 位于传感器端、MCU 位于控制柜内那就必须做隔离。我的方案是在两者之间加一颗 ADuM1201 双通道数字隔离器UART 的 TX 和 RX 各走一路。隔离器的电源侧用两路独立的 3.3VADC 侧的地和 MCU 侧的地通过隔离器隔开。这样即使传感器端引入高压也不会烧到 MCU。注意隔离器的传输延迟典型 50ns对 UART 波特率有影响我用的 115200bps 完全没问题但如果要跑到 1Mbps 以上就得选高速隔离器。另外ADS122U04 的 UART 接口有个特点它的波特率是内部振荡器产生的不是外部晶振。这意味着它的实际波特率和标称值有偏差典型 ±2%。STM32L452RE 的 UART 接收端要能容忍这个偏差我实测在 115200bps 下用 16 倍过采样完全能稳定接收。如果波特率更高建议在 MCU 端用 8 倍过采样并开启噪声检测。4. 软件配置与采样流程的完整实现4.1 ADS122U04 寄存器配置的逐条解读ADS122U04 有 4 个配置寄存器上电默认值不一定适合测温场景必须逐条配置。我以 PT100 三线制、增益 8、连续转换模式为例把关键寄存器的值列出来。配置寄存器 00x00MUX[3:0] 选择输入通道PGA[2:0] 设置增益PGA_BYPASS 决定是否旁路 PGA。PT100 三线制时MUX 要选成两路差分输入分别测量 RTD 和引线电阻所以我会在通道扫描时动态改 MUX 值。增益设 8因为 PT100 在 0℃ 时输出 100Ω1mA 激励下压降 100mV增益 8 后是 800mV接近基准 2.048V 的一半充分利用了 ADC 量程。配置寄存器 10x01DR[2:0] 设置数据速率我选 20SPS对应 50Hz 和 60Hz 同时抑制。这个速率对温度测量足够因为温度本身变化慢而且 20SPS 下的噪声性能最好。MODE[1:0] 设连续转换模式CM 设单次转换还是连续这里选连续。VREF[1:0] 选内部 2.048V 基准。TS 位是温度传感器使能不用就关掉。配置寄存器 20x02IDAC[2:0] 设置激励电流我选 1mA。BCS 位是烧毁检测调试时可以开量产关掉省电。CRC[1:0] 建议开启UART 传输容易受干扰CRC 校验能挡掉大部分误码。配置寄存器 30x03I1MUX[2:0] 和 I2MUX[2:0] 设置两路激励电流的输出引脚。PT100 三线制时IDAC1 从 AIN0 输出IDAC2 从 AIN3 输出分别给 RTD 和引线补偿供电。DRDYM 位设置数据就绪模式我选 DOUT/DRDY 引脚在转换完成后拉低。配置完成后发一条 START/SYNC 命令0x08启动连续转换然后就可以等 DRDY 中断了。4.2 STM32L452RE 端的 UART 接收与数据解析STM32L452RE 这边我用 UART2 接 ADS122U04波特率 1152008 数据位无校验1 停止位。接收方式用 DMA 加空闲中断这样每收到一帧数据ADS122U04 每次转换输出 3 字节数据加 1 字节 CRC共 4 字节就触发一次空闲中断在中断里解析。解析逻辑是这样的先检查 CRC如果 CRC 错就丢弃这一帧并计数CRC 对的话把 3 字节拼成 24 位有符号数然后根据当前通道的校准系数换算成电阻值再查表或多项式拟合得到温度值。这里有个细节ADS122U04 输出的是二进制补码24 位数的符号位在第 23 位拼接时要先做符号扩展再转成 int32_t否则负温度会算错。DMA 缓冲区我设了 8 字节因为 ADS122U04 在连续转换模式下会连续输出DMA 循环接收空闲中断里根据当前写指针和读指针的差值判断收到了几帧。这个做法比每帧都进中断效率高得多实测在 20SPS 下 CPU 占用率不到 1%。4.3 温度换算的数学处理与校准系数存储PT100 的温度换算我用的是 Callendar-Van Dusen 方程。0℃ 以上用二次项0℃ 以下用四次项。系数 A3.9083e-3B-5.775e-7C-4.183e-12。这个方程在 -200℃ 到 850℃ 范围内精度优于 0.01℃对工业测温完全够用。但方程里的 R00℃ 时的电阻每颗 PT100 都不一样标准是 100Ω实际可能是 99.8Ω 或 100.3Ω。所以每路通道都要单独校准 R0。我的做法是在产线用两点校准一个冰水混合物0℃一个沸水100℃按当地气压修正。测出两个点的 ADC 码值反推出 R0 和增益误差存到 STM32L452RE 的 Flash 里。Flash 存储我用的是 L452RE 内部的 EEPROM 模拟区写之前先擦除整页写入时加 CRC 校验。读取时如果 CRC 错就回退到默认系数并报错。这个机制在现场很有用因为 Flash 偶尔会因为电源抖动出现位翻转没有 CRC 的话温度会莫名其妙偏几度。5. 现场调试中那些让人头大的问题和排查方法5.1 通道间串扰导致温度跳变项目第一次在现场跑的时候发现四路 PT100 里只要有一路温度快速变化相邻通道的温度也会跟着跳 0.1℃ 左右。一开始怀疑是软件滤波不够后来把滤波加到 128 点平均串扰依然存在只是幅度小了点。用示波器抓 ADS122U04 的模拟输入引脚发现当通道 1 的激励电流切换时通道 2 的输入引脚上有一个几十毫伏的尖峰。原因是模拟开关 TMUX1104 在切换瞬间通道间的寄生电容耦合了激励电流的突变。解决办法有两个一是在模拟开关的每个输出端加一个对地 100nF 电容吸收切换尖峰二是在软件里切换通道后先丢弃前 3 个转换结果从第 4 个开始取。我两个都做了串扰从 0.1℃ 降到 0.02℃ 以下。这里的关键是模拟开关的切换时序和 ADC 的转换时序必须严格同步不能一边切换一边转换否则丢弃多少样本都没用。5.2 变频器干扰下的共模噪声抑制HVAC 现场最大的干扰源是变频器。我调试的那台设备旁边就有一台 7.5kW 的变频器运行起来后ADS122U04 的读数开始出现周期性波动周期和变频器载波频率一致。排查过程是这样的先用示波器看模拟输入端的共模电压发现叠加了大约 5V 峰峰值的共模噪声频率 4kHz。ADS122U04 的共模抑制比在 50Hz 时是 100dB但在 4kHz 时降到 80dB 左右所以这个噪声会部分转换成差模信号。解决办法分三层硬件上把 RC 滤波的电容从 100nF 加大到 1μF截止频率降到 160Hz对 4kHz 有 28dB 的额外衰减软件上把 ADC 的数据速率从 20SPS 降到 5SPSΔΣ 调制器的 sinc 滤波器对 4kHz 的抑制更强系统上把传感器引线换成双绞屏蔽线屏蔽层单点接地。三层叠加后波动从 ±0.5℃ 降到 ±0.05℃ 以内。5.3 常见问题速查表现象可能原因排查方法解决措施读数恒为 0 或满量程PGA 饱和或输入开路测输入引脚电压是否在共模范围内检查共模偏置电阻确认传感器连接读数周期性跳变工频或变频器干扰示波器看噪声频率加强 RC 滤波降低数据速率通道间串扰模拟开关切换尖峰切换时抓输入引脚波形加吸收电容丢弃前几个样本温度缓慢漂移基准温漂或 R0 不准恒温槽对比测量外接高精度基准重新校准 R0CRC 频繁出错UART 受干扰或波特率偏差统计 CRC 错误率加隔离器降低波特率开启 CRC负温度算错24 位补码符号扩展错误输入已知负温度信号修正符号扩展逻辑5.4 实操心得与避坑清单第一个坑ADS122U04 的 UART 接口在复位后需要至少 100μs 的稳定时间才能接收命令如果 MCU 上电后立刻发配置命令ADC 会忽略。我的做法是在 MCU 初始化里加 1ms 延时然后再发复位命令再延时 1ms再发配置。第二个坑ADS122U04 的 DRDY 引脚在连续转换模式下每次转换完成会拉低但读取数据后不会自动拉高需要等下一次转换完成才拉高。如果用轮询方式读 DRDY会误判。正确做法是用外部中断下降沿触发在中断里读数据。第三个坑PT100 三线制接法里两根引线电阻必须匹配。如果引线电阻差 0.1Ω在 1mA 激励下就是 0.1mV 误差换算成温度大约 0.26℃。所以引线要用同批次、同长度的最好在 PCB 上做等长走线。第四个坑STM32L452RE 的 Flash 写操作会阻塞 CPU如果在校准系数写入时正好有 ADC 中断可能导致数据丢失。我的做法是把 Flash 写操作放在主循环里写之前先关 ADC 中断写完再开。第五个坑ADS122U04 的功耗在连续转换模式下大约 1.5mA如果四通道轮流扫描平均功耗会更高。电池供电的场景下建议用单次转换模式MCU 需要读数时才启动一次转换转换完自动进休眠。这样平均功耗可以降到 100μA 以下。6. 精度验证与长期稳定性测试6.1 用恒温槽做多点校准的实际数据为了验证整套方案的精度我把四路 PT100 同时放进恒温槽从 -20℃ 到 150℃ 取了 9 个点每个点稳定 30 分钟后记录 100 个样本的平均值。结果如下设定温度通道 1 误差通道 2 误差通道 3 误差通道 4 误差-20℃0.08℃0.11℃-0.05℃0.09℃0℃0.02℃0.03℃-0.01℃0.02℃25℃-0.01℃0.01℃-0.02℃0.00℃50℃0.03℃0.04℃0.02℃0.03℃100℃0.06℃0.07℃0.05℃0.06℃150℃0.12℃0.14℃0.10℃0.13℃可以看出在 0℃ 到 100℃ 范围内误差基本在 ±0.05℃ 以内高温端误差略大主要来自 PT100 本身在高温下的非线性以及恒温槽的温度均匀性。这个精度对 HVAC 和一般工业测温来说已经绰绰有余。6.2 24 小时连续运行的漂移观察精度达标不代表稳定。我把设备放在现场旁边有变频器运行连续跑了 24 小时每 10 分钟记录一次四路读数和机内温度。结果显示四路读数的峰峰值波动在 0.03℃ 以内没有明显的趋势性漂移。机内温度从 25℃ 升到 42℃但读数没有跟着漂说明内部基准的温漂被软件校准补偿掉了。这里有个细节我在软件里加了一个机内温度传感器STM32L452RE 内部有用来做基准温漂的二次补偿。补偿系数是在恒温箱里标定的每摄氏度补偿 0.5μV。这个补偿不是必须的但加上之后高温环境下的绝对精度能再提升 0.02℃ 左右。6.3 不同传感器类型的适配经验这套方案不只适用于 PT100。我试过接 K 型热电偶只需要改几个地方一是关掉激励电流源二是把 PGA 增益从 8 改成 32因为热电偶输出只有 41μV/℃三是开启 ADS122U04 的内部温度传感器做冷端补偿。改完之后K 型热电偶在 0℃ 到 400℃ 范围内的误差在 ±1℃ 以内满足工业要求。热敏电阻也试过10kΩ NTC 配 100μA 激励增益设 4在 0℃ 到 50℃ 范围内误差 ±0.1℃。但 NTC 的线性度差需要做分段拟合软件工作量比 PT100 大。所以选传感器的时候如果精度要求高、量程宽优先 PT100如果成本敏感、量程窄NTC 也行热电偶适合高温场景但冷端补偿要做好。7. 这套方案还能怎么扩展如果你已经把这套四通道测温跑通了后面有几个方向可以继续挖。一是加 RS485 接口用 Modbus RTU 协议把温度数据传给上位机STM32L452RE 的 UART 加一颗 MAX3485 就能实现。二是加 LCD 显示L452RE 同系列有带 LCD 控制器的型号直接驱动段码屏做本地温控面板。三是加无线模块比如 LoRa 或 NB-IoT做远程温度监测适合冷库、管廊这种布线困难的场景。我个人在实际操作中的体会是ADS122U04 加 STM32L452RE 这套组合最大的价值不是单点性能有多强而是它的平衡性精度够用、功耗够低、接口够灵活、开发难度适中。对于中小批量的工业测温项目这套方案从打样到量产周期可以压到两个月以内。最后再分享一个小技巧ADS122U04 的配置寄存器建议在 MCU 端做一份镜像每次上电后先读回 ADC 的寄存器值和镜像对比不一致就重新配置。这个习惯能帮你挡掉很多莫名其妙不工作的问题尤其是现场电源抖动导致 ADC 复位的情况。