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 测温场景属于性能过剩。所以最终锁定 ADS122U04IPWR,TSSOP-16 封装,手工焊接也不算太痛苦。
2.2 STM32L452RE 在这套方案里扮演什么角色
STM32L452RE 不是那种"随便选个 MCU 都行"的凑数选择。它在这套方案里有几个不可替代的作用。
首先是低功耗。HVAC 设备很多是电池供电或者靠 4-20mA 环路取电,整机功耗预算可能只有几十毫瓦。STM32L452RE 在 Stop 2 模式下典型电流 1.1μA,RTC 还能继续跑,配合 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.3V,ADC 侧的地和 MCU 侧的地通过隔离器隔开。这样即使传感器端引入高压,也不会烧到 MCU。注意隔离器的传输延迟(典型 50ns)对 UART 波特率有影响,我用的 115200bps 完全没问题,但如果要跑到 1Mbps 以上,就得选高速隔离器。
另外,ADS122U04 的 UART 接口有个特点:它的波特率是内部振荡器产生的,不是外部晶振。这意味着它的实际波特率和标称值有偏差,典型 ±2%。STM32L452RE 的 UART 接收端要能容忍这个偏差,我实测在 115200bps 下,用 16 倍过采样完全能稳定接收。如果波特率更高,建议在 MCU 端用 8 倍过采样并开启噪声检测。
4. 软件配置与采样流程的完整实现
4.1 ADS122U04 寄存器配置的逐条解读
ADS122U04 有 4 个配置寄存器,上电默认值不一定适合测温场景,必须逐条配置。我以 PT100 三线制、增益 8、连续转换模式为例,把关键寄存器的值列出来。
配置寄存器 0(0x00):MUX[3:0] 选择输入通道,PGA[2:0] 设置增益,PGA_BYPASS 决定是否旁路 PGA。PT100 三线制时,MUX 要选成两路差分输入分别测量 RTD 和引线电阻,所以我会在通道扫描时动态改 MUX 值。增益设 8,因为 PT100 在 0℃ 时输出 100Ω,1mA 激励下压降 100mV,增益 8 后是 800mV,接近基准 2.048V 的一半,充分利用了 ADC 量程。
配置寄存器 1(0x01):DR[2:0] 设置数据速率,我选 20SPS,对应 50Hz 和 60Hz 同时抑制。这个速率对温度测量足够,因为温度本身变化慢,而且 20SPS 下的噪声性能最好。MODE[1:0] 设连续转换模式,CM 设单次转换还是连续,这里选连续。VREF[1:0] 选内部 2.048V 基准。TS 位是温度传感器使能,不用就关掉。
配置寄存器 2(0x02):IDAC[2:0] 设置激励电流,我选 1mA。BCS 位是烧毁检测,调试时可以开,量产关掉省电。CRC[1:0] 建议开启,UART 传输容易受干扰,CRC 校验能挡掉大部分误码。
配置寄存器 3(0x03):I1MUX[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,波特率 115200,8 数据位,无校验,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℃ 以下用四次项。系数 A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。这个方程在 -200℃ 到 850℃ 范围内精度优于 0.01℃,对工业测温完全够用。
但方程里的 R0(0℃ 时的电阻)每颗 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 不准 | 恒温槽对比测量 | 外接高精度基准,重新校准 R0 |
| CRC 频繁出错 | 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 复位的情况。