基于ADS122U04与STM32的高精度温度采集系统设计

发布时间:2026/11/5 1:01:43
基于ADS122U04与STM32的高精度温度采集系统设计 做工业设备或者HVAC的人应该都有体会测温度这件事看着简单真正较起真来全是细节。压缩机一启动、变频风机一拉起来示波器上全是毛刺主控板上那一路ADC读数跳得你怀疑人生。温度传感器输出的是毫伏级信号普通MCU内置的12位ADC在这种场景下几乎没有生存空间。我这几年来处理冷冻水管温度、风管回风温度、压缩机排气温度这些HVAC监测需求用的主力方案就是TI的ADS122U04IPWR加ST的STM32F091RC一颗24位Delta-Sigma ADC通过UART和MCU通信MCU专注做协议解析、温控逻辑和联网。这套组合最大的好处在于模拟前端和数字处理完全分离传感器信号从进ADC到出温度值整条链路都可控。这篇文章会把整个方案拆开讲覆盖硬件电路、寄存器配置、数据解析、实测排障适合正在做温度采集板、传感器变送器或者想在HVAC设备里加上高精度温度监测通道的开发者。1. 项目整体设计与方案选型1.1 到底要测什么工业和HVAC场景的温度需求先说场景。HVAC里的温度测量和实验室里用万用表测个室温完全是两码事。以我做过的几类项目为例冷冻水管供回水温度用来参与热负荷计算和阀门的PID调节精度要求通常在±0.3°C以内毕竟水的比热大温度差个0.2°C计算出来的冷量可能就是几十千瓦的偏差。风机盘管的回风温度直接参与房间温度闭环精度有±0.5°C就能过得去但响应要稳不能长时间跳来跳去。压缩机排气温度则更偏向上限保护性质量程要到150°C以上精度稍微放宽到±2°C但要求长期可靠不虚报也不漏报。这些需求叠在一起就提出三个非常具体的技术指标分辨率必须达到0.01°C量级采样率有20SPS左右就绰绰有余但抗干扰能力必须强——因为现场有变频器、接触器、电磁阀各种开关噪声随时都可能在传感器线上耦合出几十毫伏的干扰。普通MCU内置ADC根本扛不住这种环境外置的24位Delta-Sigma ADC才是正解。换句话说这个项目选型不是我要用个ADC而是我必须在工业噪声里把微伏级信号稳定地抠出来。1.2 为什么选ADS122U04IPWR加STM32F091RC这套组合ADS122U04这颗芯片说白了就是ADS1220的UART版本。它和ADS1220的内部模拟核心几乎一致都是24位Delta-Sigma架构带可编程增益放大器PGA、内部基准、两组激励电流源IDAC、内置温度传感器4路差分输入可以配置成8路单端。最大的区别在于数字接口从SPI换成了UART主机只需要两根线连TX和RX就能通信。这在工业现场是个很现实的优势SPI除了时钟和数据线还要考虑从机选择、时序抖动和长线信号完整性而UART天生就是为远距离、抗干扰设计的电平可以做得很干净甚至可以直接挂隔离器或RS-485驱动。STM32F091RC则是典型的够用且便宜的Cortex-M0主控48MHz主频256KB Flash和32KB SRAM在温度采集这个场景里绰绰有余。多路USART是它最打动我的地方一路用来和ADS122U04通信另一路可以挂RS-485做Modbus RTU把温度值上报给PLC或楼宇自控系统还能剩一路做调试打印。这个分工一旦在项目早期确定下来后面写固件会非常舒服不用像某些小封装MCU那样为引脚复用伤脑筋。对比一下替代方案就更能理解这个选型的价值。STM32内置12位ADC参考3.3V时一个LSB约0.8mV如果用500µA激励一个PT100折算成电阻就是1.6Ω对应温度约4°C完全没法用。ADS1115这类16位芯片的噪声水平和温漂指标又差了一截而且没有内置的激励电流源硬件上要多搭好几个运放和恒流源。还有专门的RTD芯片比如MAX31865确实省事但只能测电阻想同时兼容热电偶就还得另配芯片。ADS122U04是把RTD、热电偶、热敏电阻全塞进同一颗芯片硬件通用只改寄存器配置就能切换传感器类型这在做产品系列时非常划算。1.3 系统架构总览整个系统的信号链路是传感器PT100或热电偶先经过RC滤波和ESD保护进入ADS122U04的差分输入ADC内部完成放大、Delta-Sigma调制和数字滤波后通过UART把24位转换结果发给STM32STM32根据传感器类型做比例法或冷端补偿计算得到实际温度值最后再通过另一路UART走Modbus协议或者直接驱动显示、执行温控逻辑。供电上我习惯用两路LDO分开处理一路给MCU数字部分一路给ADS的模拟电源中间用电感或磁珠隔开。模拟电源的干净程度直接决定ADC底噪这一块钱的成本绝对省不得。至于具体怎么布线和选参数下一节展开讲。2. 硬件设计传感器、模拟前端与布线2.1 RTD比例测量法用一个电流源干掉温漂测PT100最经典也最稳的方法就是比例测量法这也是ADS122U04这种带IDAC的ADC存在的意义。原理说起来不复杂用片内恒流源IDAC输出一个精准电流让这个电流同时流过PT100和一颗精密基准电阻RREF。ADC的参考电压引脚直接跨接在RREF两端而输入通道则测量PT100两端的电压。因为流过两个电阻的是同一个电流所以ADC输出码值等于两个电阻的比值电流源的绝对精度和温漂在数学上被消掉了。这就是为什么这套方案能做到长期稳定电流源漂移一点VREF和输入电压同比例变化比例不变。具体参数选择上我给PT100配置的方案是IDAC电流500µARREF用4.02kΩPGA设为4。算一下这个搭配的余量500µA流过100Ω的PT1000°C时压降是50mV流过4.02kΩ的RREF基准电压是2.01V。PGA为4时满量程输入范围是2.01V/40.5025V0°C信号只占了约10%量程但这个比例是设计好的因为24位ADC的位分辨率还有巨大余量。理想情况下PT100每变化1°C产生0.385Ω变化对应电压变化192.5µV除以满量程0.5025V再乘上2^23码值大约变化3200个LSB算下来一个LSB等效0.0003°C。当然实际受噪声限制有效分辨率到不了这个数但即时只有18位有效位也能轻松分辨0.01°C。对HVAC应用来说这个精度已经过剩了过剩的目的是给系统的长期稳定性和抗干扰留足余量。IDAC电流的选择是个权衡。电流越大信号幅度越大抗噪声能力越强但流经PT100的电流会产生自热导致探头温度比被测介质高一点。500µA在100Ω电阻上的功耗是25µW在流动液体里通常可以忽略但在静止空气里如果探头封装得又小又严实自热几毫度到几十毫度也是可能的。我实测过几种常见的工业PT100探头500µA下自热基本都在0.02°C以内不影响HVAC的精度要求所以这个值可以放心用。如果做的是高精密计量设备才需要把电流降到250µA。引线方式也要说清楚。四线制是首选两根线走激励电流另外两根线做电压采样采样回路里基本没有电流导线电阻再长也不会引入误差。三线制在现场很常见因为能省一根线但需要额外用IDAC2做补偿算法和PCB都要多一层考虑精度也会吃一点亏。我做HVAC产品时凡是自己能定的传感器一律四线制遇到现场只能布三线的工况就提前在PCB上留好补偿电阻和跳线。2.2 热电偶测量电路与冷端补偿设计热电偶和RTD完全是另一套玩法。它不需要激励电流输出的是开路电压K型热电偶灵敏度约41µV/°C量程可以到上千度适合测压缩机排气温度这类高温点位。难点在于冷端补偿热电偶测的是热端和冷端的温差电势想要得到热端的绝对温度必须知道冷端的温度然后在数据处理时把冷端对应热电势加回去。ADS122U04内部有个温度传感器可以轮询测量芯片附近的温度拿它当冷端温度源。这里有一个特别容易踩的坑内部温度传感器测的是ADC芯片自身的温度不是热电偶接线端子那个点的温度。如果热电偶的冷端不在ADC芯片附近中间隔了一块铜箔或一段线缆两边温差就可能超过好几度补偿结果自然不准。我的做法是把热电偶的接线端子直接放在ADC芯片旁边PCB上保持一小片等温区域避免大功率器件和热源靠近这个区域。硬件增益的选择上热电偶输入信号非常微弱PGA必须开大。K型热电偶在500°C时输出约20.6mV如果使用内部2.048V基准PGA设为64满量程输入范围就是32mV这个量程能覆盖到400多度PGA设为32量程64mV能覆盖800度以上。我的排气温度范围通常在150°C以内用PGA64反而量程太紧所以我选择了PGA32保证量程的同时分辨率依然足够。这里提醒一句PGA越高越要关注输入偏置电流和噪声的放大效应LB这个档位的等效噪声也会变大实际项目里要根据量程和噪声做平衡。2.3 电源、参考电压和PCB布局的关键细节这部分是很多人忽视、却最容易决定成败的地方。先说参考电压比例法测量RTD时RREF就是基准它的精度直接决定了系统的初始增益误差。我选的是0.1%精度、25ppm/°C温漂的薄膜电阻常见封装下面都能买到价格也不贵。初始误差可以用软件校准消掉但温漂是消不掉的25ppm的电阻在环境变化20°C时基准会漂移0.05%对应温度误差约0.13°C勉强够用。如果项目精度要求更高可以升级到5ppm甚至更低温漂的电阻成本会明显上涨但换来的是全程无忧。RREF的布局比选料还重要因为它是ADC基准电压的来源上面一点噪声都会被ADC当成信号来转换。这颗电阻必须尽量靠近ADC的VREF引脚走线短而粗周围不要有数字信号线在旁边并行。我见过不止一块板子RREF放得离USART走线太近一通信读数就波动把电阻挪开几毫米就恢复正常。模拟地和数字地也要单点汇合最好保持完整地平面不要在地平面上开槽否则回流路径一绕噪声就进来了。电源方面如果系统里有24V转5V的DC-DCADC的供电不要直接拿开关电源的输出哪怕是经过了7805这种线性稳压也建议再加一颗低压差LDO比如TLV70033这类专门给ADS模拟部分供电。AVDD和DVDD各放0.1µF和1µF去耦电容位置要紧贴电源引脚。传感器输入端的RC滤波也不能省我一般用1kΩ串联电阻加100nF电容构成低通再把TVS管跨接在输入端和地之间防止现场的浪涌和静电把ADC打坏。3. 软件实现从UART帧到温度值3.1 STM32F091RC的USART初始化与通信协议软件的第一步是把STM32的USART配置好。ADS122U04默认波特率96008数据位、无校验、1停止位这也是工业环境里最保守可靠的配置。我用STM32CubeMX生成工程USART1接ADS的TXD和RXD波特率9600打开UART中断接收用DMA或者直接在中断里把字节塞进环形缓冲区。9600波特率下每个字节耗时约1.04ms而我们读取温度的频率是每秒20次也就是50ms读一次通信时间完全够用一点都不紧张。ADS122U04的通信方式是典型的主从模式主机发一个命令字节从机根据命令类型返回数据。最基本的三个命令写入寄存器命令、读取寄存器命令、读取转换结果命令。以读数据为例主机发送0x10ADS就会在之后的几个字节里把最新的24位转换结果发出来。如果是连续转换模式主机可以在任何时刻发起读取如果使用的是单次转换模式则需要先发启动命令再按DRDY状态或者延时去读结果。为了不让通信卡死我习惯在驱动层加一个报文超时机制每次发命令前把接收缓冲区清空等待数据的时间超过10ms就视为失败重新发一次读命令。温度采集的中断优先级不要设得太高否则会和USART接收互相干扰实测下来把定时器优先级设为最高USART设为次高问题就消失了。3.2 寄存器配置实战PT100与热电偶两套配置ADS122U04的寄存器配置是整个软件的关键一共8个寄存器但真正每次初始化都要碰的其实是前4个。寄存器0负责输入多路复用选择、PGA增益和双极性/单极性模式寄存器1负责数据速率、转换模式和比较器配置寄存器2负责基准源选择和两个IDAC的电流大小寄存器3负责内部温度传感器使能和IDAC的输出引脚路由。以PT100比例测量为例我的初始化顺序是先对芯片发RESET命令等待稳定然后依次写入寄存器。输入通道选AIN0-AIN1差分对PGA设为4双极性模式数据速率设为20SPS这是因为20SPS下Delta-Sigma的SINC滤波器刚好可以把50Hz和60Hz工频干扰压到很低的水平基准源选择外部基准也就是RREF上的电压IDAC1设为500µA并把IDAC1路由到AIN0让电流从AIN0流出流过PT100再从AIN1流回同时RREF串接在这个电流路径里跨接在VREF引脚两端。热电偶的配置则是另一套PGA调到32基准源选内部2.048VIDAC全部关闭内部温度传感器设为每次转换后读取一次用于冷端补偿。输入通道选另外一对比如AIN2-AIN3热电偶的正负极分别接入。这两套配置在代码里用宏隔开产品通过拨码或者软件指令切换传感器类型时只需要重新执行一遍初始化函数非常方便。有个细节值得提醒写寄存器的时候寄存器值一定要先在自己脑子里或者纸上过一遍字段对应关系不要拿着别人工程里的代码直接抄。同一颗芯片在不同MUX配置、不同IDAC路由下寄存器值是千差万别的。我自己的代码注释里会把每个寄存器的位字段含义写全免得三个星期之后回来看代码还要翻手册。3.3 从原始码值到温度值计算与代码实现ADS122U04输出的24位数据在双极性模式下是一个有符号数范围从-8388608到8388607。比例法计算电阻的公式很简单实际电阻等于原始码值除以满量程码值再乘以基准电阻除以PGA增益。写成C代码就是int32_t raw_code read_adc(); // 24-bit signed value float r_ref 4020.0f; // RREF 4.02kOhm float pga 4.0f; // PGA gain float rtd (float)raw_code / 8388608.0f * r_ref / pga;拿到电阻值后PT100在0°C以上的温度可以用简化公式近似温度等于电阻减去100再除以0.385。这个公式在0到100°C范围内误差不超过0.1°C对HVAC大多数场景够用。如果想把精度再推一步可以用Callendar-Van Dusen方程的一次项和二次项float r0 100.0f; float a 3.9083e-3f; float b -5.775e-7f; float delta a*a - 4.0f*b*(1.0f - rtd/r0); float temp (-a sqrtf(delta)) / (2.0f*b);这个方程在0到200°C范围内精度能到0.01°C量级代价是多一个开根号运算对M0来说完全不是负担。热电偶的计算则是查表路线。K型热电偶的热电势和温度是非线性关系工业上普遍用NIST分度表。我的做法是在Flash里存放一张1°C间隔的热电势表温度范围-50°C到500°C对应551个浮点数占用2.2KBSTM32F091RC完全装得下。计算时先根据冷端温度查出对应的热电势加上实测的ADC热电势再反向查表做线性插值就能得到热端温度。查表插值法的速度远快于多项式迭代而且精度完全够float cold_junction_temp read_internal_ts(); // 读取内部温度传感器 float e_cj thermocouple_lookup(cold_junction_temp); // 冷端热电势 float e_total e_cj thermocouple_voltage; // 总热电势 float hot_temp thermocouple_reverse_lookup(e_total); // 反查得温度3.4 工程健壮性通信重试与数据有效性检查温度采集系统最容易翻车的往往不是算法而是通信或数据异常。我在写完基本功能之后一定会加三样东西通信重试机制、数据范围检查、软件看门狗喂狗逻辑。通信重试的核心是任何一笔读操作如果超时或者返回的字节数不对就重新发命令连续失败超过三次才对ADC做一次软复位。这样能把偶发的干扰吞掉不让系统状态机卡死。数据范围检查则是每读到一笔码值就判断是否处于合理区间比如PT100在-50°C时电阻约80.3Ω码值应该在某个范围内如果码值冲到接近满幅那几乎肯定是传感器断线或者短路了这时候应该上报告警而不是把一个荒谬的温度送去参与控制逻辑。喂狗逻辑比较简单每成功完成一次温度计算就喂一次IWDG如果某个环节卡住系统能自动复位恢复。4. 实测问题与排查经验4.1 读数跳变和噪声超标这是我遇到过最多的一个问题。现象是温度值在正常值附近来回跳幅度有时候能到0.2°C甚至更高。处理思路按优先级来先看电源用示波器量ADC的AVDD纹波如果开关电源的毛刺直接耦合进来了换LDO或者加大电容问题通常立刻缓解。再看RREF布局VREF引脚附近有没有数字信号线。有的板子空间紧张USART的TX线贴着RREF走一通信就开始跳这就是典型的串扰把走线拉开或者用地线隔离就好。排除掉硬件问题后软件滤波是最后的兜底。我在工程里常用两段式滤波先做一个中值滤波去掉偶发的尖峰毛刺再做移动平均把残余的高频噪声压掉。移动窗口大小根据响应时间要求调整HVAC应用一般允许1到2秒的响应延迟20SPS采样率下窗口取10到20点没有问题。4.2 温度漂移与自热问题有朋友遇到过读数随开机时间缓慢上升半小时后稳定但比正常值高一截的情况。排除其他因素后基本可以锁定是IDAC自热。解决办法是降低激励电流或者给探头加导热硅脂、改善探头与被测介质的接触。另一类漂移来自RREF的温漂如果RREF离发热器件太近温度升高导致基准电压变化读数就会跟着漂。我的经验是RREF周围留出点距离不要挨着LDO或MCU这类发热源。4.3 UART通信不稳定通信异常的表象往往是在线率低数据偶尔有缺帧或者整包乱七八糟。排查第一步是用示波器抓TXD/RXD波形看电平是否干净、波特率是否对齐。如果STM32用的是内部RC时钟9600波特率勉强能用但拉到更高就危险了。我所有涉及UART通信的项目一律用外部晶振或者晶振输出的HSE时钟误差控制在0.5%以内通信非常稳定。还有一种情况是TTL电平不匹配ADS是3.3V或5V兼容MCU是3.3V两者之间直接用没问题但如果是5V的MCU就可能需要电平转换。4.4 传感器断线检测与故障识别传感器断线在工业现场是会真实发生的而且如果不做处理断线后ADC往往会输出满量程或者接近0的码值系统可能误认为是超高温或者超低温引发错误报警。我在软件里做了一个比较通用的检测逻辑如果连续3个采样周期的码值都达到满量程的95%以上判定为传感器开路如果码值接近0且增益为最大判定为短路。判定后直接进入故障状态不参与PID计算并在Modbus寄存器里上报故障码。ADS122U04内置比较器功能可以做类似的事但我更喜欢软件判断逻辑直观也好调试。4.5 排查速查表症状可能原因排查步骤解决建议读数无规律跳变电源噪声、VREF串扰示波器量AVDD、VREF查RREF走线换LDO、调整布局、加RC滤波读数整体偏高IDAC自热、RREF温漂断电摸探头温度记录RREF温升降低激励电流、隔离热源、换低温漂电阻通信偶发失败时钟误差、电平不匹配抓UART波形核对晶振配置使用外部晶振、校验波特率数据接近满量程传感器开路测传感器两端电阻软件判故上报断线故障热电偶温度漂移冷端温度不准检查冷端位置、TS读数冷端靠近芯片、外部冷端传感器校准5. 优化方向与扩展思考5.1 精度提升软件校准与数字滤波如果你的产品对精度有更高要求软件校准是绕不开的一步。比例法已经消掉了电流源误差剩下的主要是RREF的初始精度和ADC的偏移误差。偏移校准的方法是把差分输入短接读到的码值作为零点偏移每次计算时先减掉这个偏移。增益校准则需要一个精密电阻箱或者标准电阻把它当成传感器接入测出实际码值计算出增益校正系数。经过这两步校准PT100通道在全量程内做到±0.1°C是完全可以期待的。数字滤波方面移动平均能压噪声但响应会变慢要不要上更高级的滤波取决于控制系统的要求。我试过一阶低通滤波效果也不错参数调起来比移动平均直观。唯一要提醒的是滤波不要滤掉真实的温度变化尤其是做压缩机保护时排气温度快速上升的信号如果被滤波器平滑掉保护就容易延迟。所以保护用的通道我一般只用中值滤波不做长期平滑。5.2 多通道和系统级扩展单个ADS122U04有4路差分输入如果只测一个点有点浪费。通过MUX切换可以在同一时刻只测一路轮询四路传感器代价是每个通道的更新率降到原来四分之一。对于HVAC这种对轮询不敏感的场景四通道轮询完全可行20SPS的采样率依然能保证每路5SPS的刷新响应足够。如果点位更多我的建议是板级扩展每块采集板用一颗ADS板上用STM32做Modbus从机多块板通过RS-485挂到同一总线上由主控制器统一读取。这种方式结构清晰故障隔离也好是工业HVAC比较成熟的做法。5.3 个人体会这几个项目做下来我最大的体会是高精度温度采集的瓶颈往往不在ADC本身而在外围的每一个环节——基准电阻的温漂、PCB的布局、冷端的位置、电源的干净程度。ADS122U04是一颗上限很高的芯片但能不能发挥出24位的性能就看硬件底子打得怎么样。我现在的习惯是画原理图时先画供电和基准再画输入链路最后才是MCU布局上的优先级从一开始就定好后期少走很多弯路。另外一个习惯是每次写配置寄存器的代码我会把芯片手册里对应的表格截图放进设计文档里方便自己和同事后续查。别高估自己的记忆力过一个季度再回头谁还记得那个0x05是PGA等于几把参考依据留在代码旁边比什么都强。这套方案后续如果想升级可以考虑在STM32侧加上简单的RTOS把采集、通信和控制逻辑拆成独立任务让整个系统更容易维护。但就大多数HVAC温度采集的需求而言一个裸机状态机已经足够稳定和高效了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询