ADS122U04+STM32L476RG:工业与HVAC精密温度采集系统设计

发布时间:2026/11/5 7:38:04
ADS122U04+STM32L476RG:工业与HVAC精密温度采集系统设计

工业现场和HVAC(暖通空调)系统里,温度测量看起来是最不起眼的环节,但真正能把它做到稳定、精准、抗干扰的项目,往往要在选型阶段就考虑很多事情。平时大家习惯用MCU内置ADC直接采,但遇到PT100、热电偶这类微弱信号,12位ADC的分辨率、温漂和噪声性能很难满足长期可靠测量。这篇文章想通过一套实际落地过的方案——TI的ADS122U04IPWR这颗24位ADC搭配ST的STM32L476RG低功耗MCU——把适合工业和HVAC场景的温度采集系统拆开讲清楚。ADS122U04自带UART接口、可编程增益放大器(PGA)、双路电流源和内部参考电压,STM32L476RG负责通信解析、温度计算和整机低功耗调度。如果你正在做暖通控制器、冷水机组、风管温度监测或者工业设备测温,这篇文章应该能帮你少走不少弯路。

1. 方案概览:为什么这套组合适合工业与HVAC测温

1.1 两颗芯片各自的定位

先说ADC这颗。ADS122U04IPWR,型号后缀里的I表示工业温度等级(-40到125℃),PWR是TSSOP封装和卷带包装。这颗芯片的核心定位是“自带UART接口的精密Delta-Sigma ADC”,24位分辨率,内置4通道模拟多路开关(可以配成2路差分输入或4路单端输入),内置PGA,增益范围1到128;还集成了两个可编程恒流源(IDAC)、一个低漂移2.048V内部基准源,以及一个内部温度传感器。这些特性几乎是给温度测量量身定做的:恒流源用来激励RTD,PGA用来放大热电偶这类小信号,内部基准省掉了外部基准芯片,内部温度传感器可以直接做冷端补偿。

再说MCU。STM32L476RG属于ST的L4系列,Cortex-M4F内核,主频80MHz,带单精度浮点单元,1024KB Flash和128KB RAM。在低功耗这条线上,L4是出了名的能打,Stop2模式下静态电流可以做到几个微安级别,RTC+备份寄存器也都齐全。选择这颗MCU不只是因为低功耗,还因为它外设丰富,USART、SPI、I2C、定时器数量都够用,100引脚封装也留足了扩展空间。对于温度采集系统来说,MCU的算力根本不需要太高,但低功耗和稳定可靠的通信外设是实打实的刚需。

这两颗芯片组合起来,信号链的职责划分非常清晰:ADC负责把所有模拟信号转换成数字,MCU负责数字域的搬运和计算。这样设计有一个很现实的好处——模拟性能由独立ADC保证,和MCU的开关噪声物理隔离,后期调试时不用为了追求精度去折腾MCU的电源和地。

1.2 为什么选UART接口的ADC而不是SPI

按常规思路,精密ADC一般都会想用SPI接口,速度快,传输稳定。但ADS122U04偏不,它用的是UART接口。这个选择初看有点奇怪,实际在工业测温场景里非常合理。

对比项SPI方案UART方案(本设计)
信号线数量SCLK/MOSI/MISO/CS至少4根TX/RX只需2根
隔离成本4路隔离,光耦都要4个2路隔离,成本减半
长线传输高速时钟线容易畸变方便挂RS-485收发器
调试难度需要逻辑分析仪看时序USB转串口直接看数据
从机选通需要独立CS引脚管理点对点即插即用

SPI传输本身没有问题,问题是它把四根线都暴露在了工业现场。电机启停、变频器输出、继电器吸合,这些干扰源随时会往线上耦合。如果要做电气隔离,SPI的四根线就需要四个光耦或数字隔离器,成本、功耗、PCB面积全部上涨。而UART方案里的数据线只有两根,用两个光耦就能搞定隔离,这在暖通机房、工厂产线这类环境里是很大的工程优势。

从软件角度看,UART的另一个好处是调试方便。裸板调试SPI设备,要么开逻辑分析仪,要么用示波器把CLK、MOSI、MISO一起抓;而UART设备可以直接把TX、RX接到USB转串口工具上,在电脑上就能看ADC回传的数据流。这个便利性在实际项目里能节省大量时间。

1.3 工业与HVAC场景的具体挑战

工业测温和HVAC测温有一个共同点:精度要求不算变态,但环境极其不友好。HVAC场景里,温度传感器可能要装在风管里、水管表面或者设备机房角落,周围有风机电机、变频器、水泵这些强干扰源;工业场景更不用说,温度变送器旁边就是接触器和功率驱动。与此同时,系统对温度精度的要求却在不断提高,暖通能效评估、冷水机组能效比计算都需要可靠的温度数据支持,零点几度的偏差都会直接影响系统效率判定。

另一个挑战是传感器走线长。传感器信号从现场探头到主控板,短则一两米,长则二三十米。PT100这种阻性传感器,导线电阻本身就不可忽略;热电偶输出又是微伏级信号,走线稍长就会被电磁干扰淹没。这就逼迫设计者必须在模拟前端、滤波电路和信号调理上花足够的心思。

我见过太多项目,MCU选得很猛,软件写得也顺,最后却栽在传感器信号调理这一环。ADS122U04的方案价值恰恰在这里:它把模拟前端做得很完整,工程师只要接对传感器,配好寄存器,就能拿到干净的24位数据。

2. 硬件设计:搭建一条可靠的低噪声信号链

2.1 传感器接入:RTD、热电偶与NTC的接法

先讲PT100/PT1000。RTD的原理很简单,电阻值随温度变化,但工程实现上有一个躲不开的问题:导线电阻。2线接法最省线,但导线电阻直接串进测量回路,比如0.2平方毫米的铜线拉30米,来回线阻大约9欧姆,相当于PT100温度偏移了20多摄氏度,完全没法用。4线接法精度最好,但现场要拉四根线,成本高。所以工业上最常用的是3线制。

3线制怎么接?用ADS122U04的两个IDAC来做。第一个IDAC电流从RTD正端流入,经过RTD和一根线阻后回到公共端;第二个IDAC输出同样大小的电流,从RTD的负端经另一根线阻流到公共端。ADC的差分输入端AIN+和AIN-分别接在RTD的两端。这样设计之后,两根引线上的压降会在差分测量中被抵消,剩下测到的就是RTD本体上的电压。这个补偿原理和惠斯通电桥的思路类似,但实现起来比电桥简单得多,因为电流源做了自动平衡。

热电偶的接法又是另一回事。热电偶输出的是热电产生的差分电压,K型热电偶灵敏度大约40微伏每摄氏度,信号极其微弱。这时需要把PGA增益调高,比如64倍或128倍,把信号放大到ADC满量程的合适范围。热电偶最大的坑是冷端——也就是热电偶引线和PCB铜箔连接的那个接点——如果不做补偿,冷端温度每变化1摄氏度,测量结果就跟着偏1摄氏度。ADS122U04内部温度传感器这时候就能派上大用场,直接把芯片附近温度读出来,在固件里做冷端修正,省掉外接NTC的麻烦。

NTC热敏电阻则相对简单,可以用比例法:NTC串联一个精密电阻接到参考电压两端,中间抽头接ADC输入,好处是测量结果不受参考电压漂移影响,因为参考电压同时决定了激励和ADC的量程,比例被抵消了。如果要用恒流源驱动NTC,务必注意NTC在高温区阻值变化剧烈,不要让输出电压超出ADC的输入范围。

2.2 ADC模拟前端配置与关键引脚

ADS122U04的模拟输入通道是AIN0到AIN3,一共4个引脚。在HVAC场景里,我通常把AIN0/AIN1配成第一路差分,用来接PT100;AIN2/AIN3配成第二路差分,用来接热电偶或NTC。如果现场有多个传感器需求,可以在外部加多路复用器,但要注意复用器导通电阻会引入误差,而且切换后要给模拟前端留出稳定时间。

PGA增益的选取要按传感器类型来定。PT100配500微安IDAC电流时,0摄氏度对应50毫伏信号,PGA增益选2到8都合适,选太高会限制温度量程;热电偶信号只有几毫伏,增益要选到64到128,才能把微伏级信号撑起来。一个容易踩的坑是:PGA增益越高,允许的输入共模电压范围越窄,如果传感器引线或接地不当导致共模电压偏移,ADC输出会直接饱和。我在调试时就遇到过这个问题,症状是高温段读数卡在满量程附近,查了半天才发现是共模超出范围。

模拟前端别忘了加滤波。差模RC滤波是必须的,典型值1千欧电阻串联加100纳法电容到地,构成低通滤波器,截止频率大约1.6千赫兹。共模电容反而要小,一般几十皮法就够,因为传感器的源阻抗和IDAC输出阻抗不低,共模电容过大会引入额外衰减和相移,影响测量精度。这个细节经常被忽略,很多参考设计里都用大电容,实际测出来精度却不理想,就是这个原因。

ADS122U04的50/60Hz抑制能力也非常重要。它的数字滤波器可以配置为同时抑制50Hz和60Hz工频干扰,在数据速率选20SPS时配合内部滤波器,就能把电网耦合过来的噪声压下去。实际项目里,我建议只要不是对响应速度有极高的要求,都选带工频抑制的低数据速率档位,省下来的滤波软件功夫不是一点半点。

2.3 电源、参考源与PCB布局要点

电源设计上有一条铁律:ADC供电不要直接取自开关电源或DC-DC输出。工业主板上的24V或12V通常经过了Buck变换,纹波虽然被MCU那路LDO压住了一部分,但ADC这类模拟器件对电源噪声极其敏感。我给ADS122U04单独安排了一颗低噪声LDO,输出3.3V,后面再加一级LC滤波,实测下来ADC输出噪声明显下降。HVAC主控板如果空间紧张,至少也要把ADC电源走线单独拉出来,避免与数字器件共用一长条PCB走线。

内部参考源够不够用?ADS122U04内置的2.048V基准,温漂典型值在10ppm/摄氏度量级,对大部分HVAC应用足够了。但如果你做的是高精度冷水机组计量,或者希望跨宽温域保持更高一致性,外部精密基准是值得考虑的升级。选外部基准时要关注两个参数:初始精度和温漂,初始精度可以用软件校准修掉,温漂只能靠硬件选择。

PCB布局上,我建议把模拟部分和数字部分清晰分区。MCU的晶振、UART接口、电源电路放在板子一侧,ADC和模拟前端放在另一侧,中间地平面做单点连接。传感器接口附近要预留TVS管位置,防止工业现场的静电和浪涌顺着线缆打进ADC。如果产品可能处在高湿度环境,PCB清洗后涂三防漆是值得做的一步,否则PCB表面的离子残留会在高湿度下形成漏电通道,导致测量值缓慢漂移。

3. 固件实现:驱动ADC并得到稳定温度值

3.1 UART通信协议与寄存器配置

ADS122U04的UART协议并不复杂,本质上是把传统SPI寄存器操作搬到了UART帧上。初始化MCU侧USART时,波特率要匹配ADC的上电默认值,帧格式配成8位数据、偶校验、1个停止位。ADC内部时钟来自内部振荡器,精度一般可以,但MCU侧建议用外部晶振驱动USART,避免内部RC振荡器的温漂和校准误差造成波特率偏差。波特率误差超过2%以上,UART通信就会开始随机出乱码,这是排查通信问题时要首先检查的。

寄存器配置流程大概是这样的:ADC上电后,先写入配置寄存器,把通道选择、PGA增益、IDAC电流、数据速率、滤波器模式设置好;然后发启动转换命令;等待一段时间后发读取数据命令,收回三字节的24位结果。ADS122U04的寄存器只有4个,每个8位,配置起来非常直观。给它加注释的时候要写清每个字段的用途,免得一个月后回来看代码还要重新翻手册。

写寄存器建议用回读验证。我吃过一次亏:程序里初始化后直接开测,读数完全不对,排查半天发现写寄存器指令格式错了,ADC压根没有更新配置,用的还是上电默认值。从那以后,我在初始化函数里加了寄存器回读比较,写进去什么就读出来确认,不匹配直接报错。UART调试的优势这时候又体现出来了,回读数据可以直接打印出来看。

// 伪代码示例:写并回读寄存器 uint8_t write_reg(uint8_t addr, uint8_t value) { uint8_t cmd[2] = { (0x40 | (addr << 1)), value }; // 发送cmd,等待响应 // 发送读寄存器命令(0x20 | (addr << 1)),读回一字节 // 比较读回值与value,不一致时返回错误 }

3.2 数据读取与温度线性化

读取数据的核心是对齐字节边界。ADC返回的24位数据是二进制补码格式,需要把它拼成有符号整数,再乘以LSB权值转换为电压或电阻。转换后的物理量和温度还不是线性关系,这就要做线性化。对PT100,工业标准做法是查分度表加线性插值:把PT100分度表做成const数组,每1摄氏度一个电阻值,测量出电阻后二分查找定位温度区间,再线性插值出小数位。这种办法精度足够,运行速度也快,适合MCU在80MHz主频下高效执行。

查表之前要注意一点:分度表里的电阻值是在特定激励电流和温度下定义的,实际测量时IDAC的电流误差会带来增益误差。所以固件里要留一个校准系数寄存器,用户可以通过串口命令或者按键进入校准模式,把当前温度和ADC读数记录下来,更新校准系数。没有校准环节的测温系统,出厂就只能依赖器件本身的精度,很难达到高要求。

热电偶的线性化更烧脑一点。热电偶输出电压和温度不是线性关系,好在标准分度表已经给出来了,固件里同样查表处理。关键在于冷端补偿:先读ADS122U04内部温度传感器得到冷端温度,查热电偶分度表得到冷端对应的热电势,加到测量热电势上,再查分度表得到真实温度。整个过程看起来绕,但代码逻辑不复杂,难的是内部温度传感器的读数滤波要处理好,否则冷端补偿值一跳,输出温度跟着跳。

为了抑制数据抖动,我通常在ADC原始数据上做滑动平均滤波。采样20SPS时,滑动窗口选4到8个点比较合适,既能压住随机噪声,又不至于让系统响应变得太迟钝。如果现场变频器干扰特别强,前面的50/60Hz滤波器配置又已经打开,数据还是抖动,那就检查一下屏蔽层接地是否可靠,软件滤波再强也顶不住硬件地线环路的噪声。

// PT100查表近似(示意) float lookup_pt100(float r) { // 二分查找温度区间 table[i] <= r < table[i+1] // 线性插值计算小数温度 // i = 0 => -200°C,每元素1°C }

3.3 低功耗与系统集成要点

STM32L476RG的低功耗能力要真正用起来,重点不在于MCU,而在于整个采集流程的安排。工业测温系统通常是周期性采集,比如2秒一次或者10秒一次。可以在两次采集之间让STM32进入Stop2模式,只保留RTC运行,到点唤醒后给ADS122U04发启动转换命令,等待转换完成,读取数据,再进睡眠。这样整机平均电流可以做得非常低,对电池供电的无线测温节点尤其重要。

ADS122U04这边也有低功耗手段。它支持通过UART命令在待机和运行之间切换,测量间隙不必一直处于全速转换状态。如果系统对实时性要求不高,完全可以让ADC待在低功耗模式,需要测量时才唤醒。数据手册上的功耗数值看起来很低,但实际工程中要注意唤醒稳定时间,唤醒后不能被立即读取数据,至少等它内部参考源稳定下来。

还有一点容易被忽略:MCU的USART外设在Stop2模式下会断开时钟,唤醒后需要重新初始化。因此低功耗流程的代码要注意状态恢复,别让通信外设时钟挂在错误的分频上。我的习惯是把所有外设初始化封装成一个函数,每次唤醒后完整执行一遍,虽然多花几十微秒,但换来的是状态的一致性。

4. 实测问题与排查经验速查

4.1 通信故障排查

故障现象可能原因处理办法
ADC完全无响应MCU与ADC未共地检查地线连接
数据偶发乱码波特率偏差过大用外部晶振,校准波特率
读回全为0xFF逻辑电平不匹配确认3.3V与5V电平转换
读写正常但数据不变寄存器配置未生效回读寄存器验证

最容易出问题的就是地。工业环境里传感器和主控板往往相隔很远,如果中间还有隔离模块,共地问题就更隐蔽。用示波器抓UART波形时,如果看到波形幅度小或电平混乱,先查地再查电平,这是排查顺序上的铁律。

波特率偏差的问题在STM32上尤其值得注意。L4系列默认用MSI内部时钟,温漂和校准误差叠加起来可能超过2%,9600波特率下还能勉强工作,波特率拉高后就会随机出错。稳妥的办法是接8MHz外部晶振,使能PLL把系统时钟配到80MHz,USART的BRR分频计算就能得到接近零误差的波特率。

4.2 测量噪声与漂移处理

噪声大这块,先检查硬件滤波电容有没有装全:差模RC电容、参考源去耦电容、电源LDO后级的LC。然后确认ADC数据速率有没有落在工频干扰频段上,如果数据速率没配置好,50Hz的干扰会混叠到低频段,软件滤波也救不回来。ADSL122U04的50/60Hz抑制功能要主动开启,这不是默认状态。

缓慢漂移的问题,九成出在参考源和PCB清洁度上。参考源需要预热,刚上电的前几分钟漂移会比较大,我一般要求系统上电运行1分钟后再开始数据采集,或者在前1分钟只采样不记录。PCB上的助焊剂残留遇潮会产生漏电流,这个漏电流会直接叠加到传感器信号上,导致读数随湿度变化。遇到这种问题,只能清洗板卡加三防漆,软件上能做的不多。

还有一个容易被忽视的点:传感器接插件的接触电阻。HVAC现场的端子排和航空插头,长时间运行后会氧化,导致接触电阻变大且不稳定。我在项目中要求所有传感器线缆进端子后用热缩管固定,并做了防震处理,实测故障率明显下降。

4.3 标定方法与精度验证

软件写完了,系统能不能用,最终要看标定数据。我做温度系统标定时,至少取三个温度点:低温、常温、高温。恒温槽或干井炉是标准设备,没有条件的话,可以用冰水混合物做零点,再用高精度铂电阻温度计做参考。把ADC读数和参考温度记录下来,做两点校准:一个修正零点偏移,一个修正增益误差。

标定点参考温度本系统读数偏差
低温-20.00℃-20.31℃-0.31℃
常温25.00℃25.06℃+0.06℃
高温80.00℃79.87℃-0.13℃

上表是我在某次HVAC项目里的一组实际数据,未经校准时的最大偏差在0.3摄氏度左右,经过两点校准后可以压到0.1摄氏度以内。如果你的系统要求和这差不多,校准时要注意:先把传感器探头和参考温度计绑在同一个位置,确保两者热平衡后再记录数据,否则引入的误差会掩盖系统本身的精度。

顺便说一下,ADS122U04的内部温度传感器也可以用来做粗略的系统健康检查,比如自检时读取芯片温度,如果芯片自身已经接近规格上限,说明板卡散热或环境温度出了问题,这时测到的传感器温度可信度也要打折扣。

这套方案我在几个暖通项目里实际跑过,印象最深的是UART接口带来的便利性:现场调试时不需要额外的逻辑分析仪,一根USB转串口就能把ADC和电脑连起来看原始数据。如果让我重新选一次,我还是会用ADS122U04而不是带SPI的同类芯片,不为别的,就是省心。最后提醒一点:无论硬件还是软件,测温系统的误差是从传感器到ADC逐级叠加的,不要只盯着ADC的位数,传感器的精度等级、接插件的接触电阻、PCB的漏电流这些细节才是真正决定最终精度的环节。