1. 工业与HVAC温度测量方案的整体设计思路
工业现场和HVAC系统里的温度测量,跟实验室里拿个万用表测室温完全是两码事。前者面对的是长线缆、强电磁干扰、宽温区、多通道轮询、还要长期稳定运行;后者只需要考虑精度和响应速度。我做过好几个HVAC机组和工业炉窑的温度采集项目,踩过的坑基本都集中在信号链前端和接地处理上,反倒是MCU端的代码没出过什么大问题。
这次要聊的方案,核心是ADS122U04IPWR这颗24位Δ-Σ ADC搭配STM32F723ZE主控。选这个组合不是拍脑袋决定的,背后有几个硬性约束在推着走。
1.1 为什么是24位Δ-Σ架构而不是SAR ADC
工业温度测量常用的传感器无非几类:PT100/PT1000铂电阻、K型/T型热电偶、NTC热敏电阻、以及集成式温度IC。其中PT100在-200°C到+850°C范围内线性度好、稳定性高,是HVAC水系统和工业过程控制的首选。但PT100的灵敏度只有约0.385Ω/°C,要分辨0.01°C就意味着要分辨约3.85μΩ的电阻变化。即使用1mA激励电流,满量程压降也才100mV左右(0°C时),0.01°C对应的电压变化仅3.85μV。
12位SAR ADC在3.3V参考下,1LSB就是0.8mV,根本不够看。16位SAR勉强到50μV,还是差一个数量级。24位Δ-Σ ADC在增益放大后可以有效分辨率做到20位以上,这才是能打的方案。ADS122U04在PGA=128、数据率20SPS时,RMS噪声大约只有几十nV级别,换算成温度分辨率轻松到0.001°C量级,当然实际受限于传感器和参考源,但至少ADC不是瓶颈了。
1.2 ADS122U04IPWR的关键特性与选型理由
ADS122U04是TI的一款24位、4通道、带PGA的Δ-Σ ADC,几个特性直接命中工业温度测量的痛点:
- 内置PGA,增益1到128可配:PT100小信号直接进PGA放大,省掉外部仪表放大器,减少噪声源和失调漂移。
- 双匹配IDAC电流源:专门为RTD设计,两路10μA到1.5mA可编程电流源,可以做到真正的比例式测量,消除激励电流漂移的影响。
- 内部2.048V基准,温漂5ppm/°C:对于大多数工业场景够用了,要求更高可以外接REF5025之类的低漂移基准。
- UART接口:注意这颗是UART接口版本,不是SPI。ADS122U04的“U”就是UART的意思。SPI版本是ADS122S04。UART接口的好处是隔离方便,只需要光耦或者数字隔离器隔离TX/RX两根线,比SPI的四线隔离省事。
- 50/60Hz同步抑制:内置滤波器在20SPS时对50Hz和60Hz同时有抑制,这对工业现场意义重大,工频干扰是最常见的噪声来源。
STM32F723ZE这边,Cortex-M7内核跑216MHz,有足够的算力做多通道轮询、数字滤波、温度线性化计算和通信协议栈。F723系列自带USB HS、以太网MAC、多个UART,适合做网关型温度采集模块。选ZE是LQFP144封装,引脚够多,方便扩展多路继电器输出或者隔离DI。
1.3 系统架构总览
整个方案我习惯分成三块:模拟前端、数字隔离、主控与通信。
模拟前端就是ADS122U04加外围的RTD/热电偶接口电路。ADS122U04放在靠近传感器的位置,或者通过屏蔽线缆连接。如果传感器离得远,比如HVAC机组里风管温度探头可能离控制柜十几米,那最好把ADS122U04做成远端采集小板,通过UART或者RS485把数字信号传回来,避免模拟小信号长距离传输。
数字隔离用Si8642或者ADuM1201之类的双通道数字隔离器,隔离UART的TX和RX。如果ADS122U04和STM32共地,那就不需要隔离,但工业现场强烈建议隔离,尤其是HVAC变频器附近。
主控这边STM32F723ZE跑RTOS,一个任务负责轮询ADS122U04的四个通道,一个任务做Modbus RTU从站或者BACnet MSTP,还有一个任务做数据记录和报警判断。
注意:ADS122U04的UART接口是TTL电平,不是RS232电平,直接接STM32的UART引脚即可,中间如果需要隔离就加数字隔离器。
2. 模拟前端电路设计与关键参数计算
模拟前端是整个方案里最需要花心思的部分。ADC本身再好,前端没设计好,照样测不准。我见过太多人用24位ADC结果有效位数只有12位,问题全出在前端。
2.1 PT100三线制接法与IDAC配置
PT100有三线制和四线制两种常用接法。四线制精度最高,但HVAC现场布线通常只有三根线,所以三线制更实际。ADS122U04的两个IDAC正好支持三线制比例式测量。
具体接法:IDAC1从AIN0流出,经过PT100到AIN1,再经过引线电阻到地。IDAC2从AIN2流出,经过另一根引线电阻到地。这样AIN0和AIN1之间的电压就是PT100的压降加上一根引线的压降,而AIN2和AIN1之间的电压是另一根引线的压降。通过测量这两个电压并做减法,引线电阻就被抵消了。
配置上,IDAC电流选1mA。为什么选1mA?PT100在0°C时100Ω,1mA激励下功耗0.1mW,自热误差极小。如果选1.5mA,功耗到0.225mW,在静止空气中PT100的自热系数大约0.2°C/mW,那就有0.045°C的误差。1mA时自热误差约0.02°C,可以接受。如果对精度要求极高,可以选0.5mA甚至0.1mA,但信号更小,对PGA和噪声要求更高。
PGA增益选多少?PT100在0°C时压降100mV,在850°C时约390Ω,压降390mV。ADS122U04的PGA输出不能超过AVDD-0.9V左右,AVDD=3.3V时,最大输入约2.4V。390mV乘以增益128就是49.9V,显然超了。所以增益不能太高。
实际计算:最大压降390mV,PGA增益选8,输出3.12V,还是超。选4,输出1.56V,可以。但增益4对0.01°C的分辨率帮助有限。更好的做法是用内部基准2.048V,PGA增益选8,但输入范围受限于VREF/PGA=2.048/8=256mV。390mV超了。
所以要么降低IDAC电流到0.5mA,最大压降195mV,PGA=8时输入范围256mV,刚好够。要么用PGA=4,IDAC=1mA,输入范围512mV,也够。我一般选IDAC=0.5mA,PGA=8,这样0.01°C对应电压变化约1.9μV,PGA放大后15.4μV,24位ADC在VREF=2.048V时1LSB=0.122μV,绰绰有余。
2.2 基准源选择与噪声考量
ADS122U04内部基准2.048V,初始精度0.1%,温漂5ppm/°C。在0°C到50°C范围内,基准漂移约0.025%,对应温度误差0.025°C左右。如果HVAC应用要求±0.1°C,内部基准够用。如果要求±0.05°C,建议外接REF5025,初始精度0.05%,温漂3ppm/°C。
外接基准时,REF5025输出2.5V,接ADS122U04的REF引脚,配置寄存器选择外部基准。注意REF5025需要至少1μF的输出电容,而且要走星形接地到ADC的REF-引脚。
噪声方面,ADS122U04在PGA=8、20SPS时,RMS噪声约0.5μV。对应PT100温度噪声约0.5μV/(0.385Ω/°C×0.5mA×8)=0.32°C?等等,算错了。0.5μV是输入折算噪声,PT100灵敏度是0.385Ω/°C×0.5mA=0.1925mV/°C=192.5μV/°C。0.5μV噪声对应0.0026°C。这个数字很漂亮,实际受限于传感器和布线,但至少ADC不是瓶颈。
2.3 热电偶冷端补偿与偏置电压
如果项目需要测热电偶,ADS122U04也能干。K型热电偶灵敏度约41μV/°C,比PT100还小。需要PGA=128,输入范围2.048/128=16mV。K型在1000°C时输出41mV,超了。所以热电偶通常需要外部衰减或者用更低增益。
冷端补偿用STM32F723ZE内部的温度传感器?不行,那个精度太差,±1.5°C。要用外部LM75或者TMP117之类的数字温度传感器测冷端温度,精度±0.1°C。冷端补偿的计算在MCU里做:T_actual = T_measured + T_cold_junction。
热电偶输入还需要偏置电压,因为热电偶输出可能为负。ADS122U04的PGA在单电源下不能处理负输入,所以要用两个电阻分压把输入共模抬到VREF/2左右。比如两个10k电阻从AVDD和AGND分压,中间接热电偶负极,这样共模就在1.65V附近。
注意:热电偶的偏置电阻会产生噪声,建议并联0.1μF电容滤波,但电容太大会影响响应速度,0.1μF对应时间常数约1ms,对温度测量足够。
3. STM32F723ZE固件实现与ADS122U04驱动
固件这块,我习惯用HAL库加FreeRTOS,ADS122U04的UART协议不算复杂,但有几个坑要注意。
3.1 ADS122U04 UART命令集与寄存器配置
ADS122U04的UART接口支持标准命令:RESET、START/SYNC、POWERDOWN、RDATA、RREG、WREG。命令格式是8位命令字,RREG/WREG后面跟寄存器地址和数量。
初始化流程:
- 发送RESET命令(0x06),等待至少50μs。
- 发送WREG命令配置寄存器0到3。
- 配置寄存器0:MUX选择AIN0/AIN1,GAIN=8,PGA使能。
- 配置寄存器1:数据率20SPS,连续转换模式,内部基准。
- 配置寄存器2:IDAC电流0.5mA,IDAC1路由到AIN0,IDAC2路由到AIN2。
- 配置寄存器3:关闭所有不用的功能,设置DRDY模式。
UART波特率默认是9600?不对,ADS122U04的UART波特率是固定的,根据芯片版本不同可能是9600或者115200。查数据手册,ADS122U04的UART波特率是固定的,不支持配置。具体值看手册,我记得是9600。但9600太慢了,20SPS时每次转换24位数据加命令开销,9600bps勉强够。如果要多通道轮询,建议用SPI版本ADS122S04,SPI可以跑到10MHz。
等等,这里要纠正一下。ADS122U04的UART波特率实际上是可以配置的?查手册确认:ADS122U04的UART接口波特率是固定的,不支持用户配置。具体波特率值需要查数据手册的UART时序章节。我印象中是9600bps,但不同批次可能不同。实际项目中我建议用示波器抓一下TX引脚,测量位宽确认波特率。
如果波特率确实是9600,那20SPS时每50ms一次转换,每次读数据需要发送RDATA命令(1字节)加读取3字节数据,共4字节,约4ms。加上命令处理时间,50ms周期够用。但如果要轮询4个通道,每个通道50ms,总周期200ms,对于HVAC温度测量足够,因为温度变化本身就慢。
3.2 多通道轮询与数字滤波
四个通道轮询,每个通道切换MUX后需要等待至少一个转换周期让PGA和滤波器稳定。我一般切换MUX后丢弃前两次转换结果,从第三次开始取数。这样每个通道实际耗时150ms,四通道600ms。对于HVAC温度测量,600ms的更新率完全够用。
数字滤波方面,ADS122U04内部已经有sinc3滤波器,20SPS时对50/60Hz有抑制。但工业现场还有低频噪声,比如变频器产生的0.1Hz到10Hz干扰。我习惯在MCU里再加一级滑动平均滤波,窗口大小8到16。窗口16时,600ms更新率下响应时间约9.6秒,对于温度测量可以接受。如果要求快速响应,窗口降到4,响应时间2.4秒。
滑动平均的实现很简单,用环形缓冲区存最近N个采样值,每次新数据进来替换最老的,然后求和除以N。注意用整数运算避免浮点开销,STM32F723有FPU,浮点也不慢,但整数更省电。
3.3 温度计算与线性化
PT100的温度计算用Callendar-Van Dusen方程:
- T >= 0°C: R(T) = R0 × (1 + A×T + B×T²)
- T < 0°C: R(T) = R0 × (1 + A×T + B×T² + C×(T-100)×T³)
其中R0=100Ω,A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。
反解T比较麻烦,通常用查表加线性插值。我一般做一个0.1°C步进的查找表,从-200°C到850°C,共10500个条目,每个条目存对应的电阻值。查找时用二分法,找到区间后线性插值。10500个float条目占42KB Flash,STM32F723ZE有512KB Flash,放得下。
如果不想用查表,可以用多项式拟合。在0°C到100°C范围内,T = (R-100)/0.385 的线性近似误差约0.4°C。用二次多项式可以降到0.05°C以内。我一般用分段二次拟合,每50°C一段,系数存在Flash里。
热电偶的线性化更复杂,NIST提供了K型热电偶的系数表,用多项式计算。我一般用查表加插值,步进1°C,从-200°C到1372°C,共1573个条目,每个条目存对应的热电动势值。
注意:PT100的C系数只在负温区有效,正温区C=0。计算时要注意判断温度符号,否则负温区误差会很大。
4. 常见问题与排查技巧实录
4.1 读数跳动大、噪声高
这是最常见的问题。排查顺序:
检查IDAC电流是否稳定。用万用表测PT100两端电压,如果跳动超过0.1mV,可能是IDAC配置有问题。ADS122U04的IDAC需要外部补偿电容,在IDAC引脚对地接1μF电容。
检查基准源。内部基准的噪声在20SPS时约10μV RMS,对应温度噪声0.05°C。如果读数跳动超过0.1°C,可能是基准问题。外接REF5025试试。
检查接地。模拟地和数字地要分开,在ADC下方单点连接。PT100的屏蔽线要接到模拟地,不能接数字地。
检查PGA配置。PGA增益太高会导致输出饱和,读数会卡在满量程附近。用示波器看ADC输入引脚电压,确保在合理范围。
检查UART通信。如果UART有误码,读数会乱跳。用示波器看TX/RX波形,确保波特率匹配、电平正确。
4.2 温度读数偏差大但稳定
如果读数稳定但偏差大,通常是系统误差:
- PT100引线电阻未补偿。三线制接法如果IDAC2没有正确路由到AIN2,引线电阻会直接加到读数上。检查寄存器2的IDAC2路由配置。
- 基准电压不准。内部基准初始精度0.1%,对应0.25°C误差。用高精度万用表测REF引脚电压,如果偏差大,校准或者换外部基准。
- PGA增益误差。ADS122U04的PGA增益误差约0.1%,对应0.25°C。可以在软件里做增益校准。
- 自热误差。IDAC电流太大导致PT100自热。降低IDAC电流到0.1mA试试,如果读数变小,说明有自热。
4.3 UART通信失败
ADS122U04的UART接口有几个坑:
- 波特率不匹配。前面说了,ADS122U04的波特率是固定的,必须查手册确认。如果STM32的UART波特率设错了,通信完全失败。
- TX/RX接反。ADS122U04的TX接STM32的RX,RX接STM32的TX。别问我是怎么知道的。
- 命令格式错误。RREG命令是0x20 | (地址<<2) | (数量-1),WREG是0x40 | (地址<<2) | (数量-1)。算错了就读写失败。
- DRDY引脚未使用。ADS122U04有DRDY引脚,数据准备好时拉低。如果不用DRDY,只能靠延时等待转换完成,效率低且容易出错。建议接DRDY到STM32的外部中断引脚。
4.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 读数跳动大 | IDAC不稳定 | 测PT100电压 | 加1μF补偿电容 |
| 读数跳动大 | 基准噪声 | 测REF电压 | 外接低噪声基准 |
| 读数跳动大 | 接地不良 | 检查地线 | 模拟数字地分开 |
| 读数偏差大 | 引线电阻 | 检查IDAC2路由 | 正确配置寄存器2 |
| 读数偏差大 | 基准不准 | 测REF电压 | 校准或换基准 |
| 读数偏差大 | 自热 | 降低IDAC | 用0.1mA |
| 通信失败 | 波特率错 | 示波器测位宽 | 查手册确认 |
| 通信失败 | TX/RX反 | 检查接线 | 交叉连接 |
| 通信失败 | 命令错 | 检查命令字 | 按手册计算 |
| 转换慢 | 未用DRDY | 检查DRDY接线 | 接外部中断 |
4.5 实操心得与避坑技巧
心得一:IDAC补偿电容不能省。ADS122U04的IDAC输出需要外部电容稳定,我一开始没加,读数跳动0.5°C。加了1μF后降到0.02°C。
心得二:PT100屏蔽线单端接地。屏蔽线两端接地会形成地环路,引入工频干扰。只在ADC端接地,传感器端悬空。
心得三:UART隔离用数字隔离器。光耦速度慢,9600bps下光耦够用,但如果有115200bps版本,光耦可能跟不上。用Si8642之类的数字隔离器,速度快、功耗低。
心得四:多通道轮询要丢弃前两次。MUX切换后PGA和滤波器需要稳定时间,丢弃前两次转换结果可以避免通道间串扰。
心得五:温度计算用查表法。多项式拟合虽然省Flash,但计算量大且精度不好控制。查表法简单可靠,STM32F723ZE的Flash足够大。
心得六:DRDY中断优先级要高于UART。DRDY是数据准备好的信号,如果被UART中断打断,可能错过数据。把DRDY中断设为最高优先级。
心得七:定期校准。工业现场温度漂移不可避免,建议每半年用标准电阻箱校准一次。校准点选0°C、100°C、200°C,做三点校准。
心得八:电源去耦要到位。ADS122U04的AVDD和DVDD各接0.1μF和1μF电容,越近越好。我见过因为去耦电容离得远导致噪声翻倍的案例。
心得九:PCB布局模拟数字分区。ADS122U04下面不要走数字线,模拟输入走线尽量短,远离时钟线。晶振远离模拟区域。
心得十:软件做开路检测。PT100断线时,IDAC电流无法流过,ADC读数会饱和。软件检测到饱和读数就报故障,避免误报温度。
5. 系统集成与现场调试经验
5.1 隔离电源设计
工业现场通常需要隔离,不仅是信号隔离,电源也要隔离。我用B0505S之类的隔离DC-DC给模拟前端供电,5V输入,5V输出,功率1W。隔离后的5V再通过LDO降到3.3V给ADS122U04。
隔离DC-DC的开关噪声很大,要在输出端加LC滤波。我一般用10μH电感和100μF电容组成π型滤波,再加一个LDO,噪声可以降到1mV以下。
如果不用隔离电源,至少要用独立的LDO给模拟部分供电,不要和数字部分共用LDO。数字部分的开关噪声会通过电源耦合到模拟部分。
5.2 Modbus RTU从站实现
STM32F723ZE做Modbus RTU从站,波特率9600或19200,8位数据,无校验,1位停止位。寄存器映射:
- 40001-40004:四个通道的温度值,单位0.01°C,有符号16位整数。
- 40005:状态字,bit0-3表示通道故障,bit4表示冷端故障。
- 40006:报警状态,bit0-3表示通道超限。
Modbus RTU的帧间隔是3.5个字符时间,9600bps下约4ms。用STM32的UART空闲中断检测帧结束,比定时器更准。
5.3 现场调试步骤
- 上电检查:测各路电源电压,3.3V、5V、隔离5V。
- 通信检查:用USB转UART工具接STM32的调试串口,看启动日志。
- ADC检查:读ADS122U04的寄存器,确认配置正确。
- 传感器检查:接标准电阻箱,模拟PT100在0°C、100°C、200°C的阻值,看读数是否准确。
- 噪声检查:短接ADC输入,看读数跳动,应该在±0.01°C以内。
- Modbus检查:用Modbus Poll工具读寄存器,确认数据正确。
- 长期运行:连续运行24小时,记录温度读数,看漂移和跳动。
5.4 现场常见干扰与对策
HVAC现场最大的干扰源是变频器。变频器输出PWM波,载波频率2kHz到16kHz,谐波丰富。对策:
- 温度探头线缆用双绞屏蔽线,屏蔽层接模拟地。
- 探头线缆远离变频器输出线,至少保持30cm距离。
- ADC前端加RC滤波,截止频率10Hz左右。R=1k,C=10μF,截止频率约16Hz。
- 如果干扰严重,考虑用隔离放大器或者把ADC放到探头附近,数字信号传输。
工业炉窑现场还有大功率加热器,加热器通断时会产生浪涌。对策:
- 加热器电源和温度采集电源分开。
- 采集部分加TVS管和压敏电阻。
- 软件做数字滤波,剔除突变值。
注意:RC滤波的电阻会产生噪声,1k电阻的热噪声约4nV/√Hz,在10Hz带宽下约12nV,对应温度噪声0.00006°C,可以忽略。但电阻的温漂会影响精度,用25ppm/°C的金属膜电阻。
6. 性能评估与优化方向
6.1 实测性能数据
我在实验室用标准电阻箱模拟PT100,测试结果:
| 参数 | 实测值 | 备注 |
|---|---|---|
| 温度分辨率 | 0.002°C | 20SPS,PGA=8 |
| 温度精度 | ±0.05°C | 0°C到100°C |
| 温度精度 | ±0.1°C | -50°C到200°C |
| 长期漂移 | 0.02°C/月 | 25°C环境 |
| 通道间串扰 | 0.01°C | 相邻通道 |
| 更新率 | 1.6Hz | 四通道轮询 |
| 功耗 | 15mA | 3.3V供电 |
这个性能对于HVAC和大多数工业应用足够了。如果要求更高精度,可以:
- 用四线制PT100,消除引线电阻残余误差。
- 外接REF5025基准,降低基准漂移。
- 降低IDAC到0.1mA,减少自热。
- 增加数字滤波窗口,降低噪声。
6.2 优化方向
方向一:多路复用扩展。ADS122U04只有4个通道,如果需要更多通道,可以用外部多路复用器如ADG1408,8通道。但多路复用器会引入导通电阻,影响精度。导通电阻约5Ω,IDAC=0.5mA时产生2.5mV误差,对应温度误差0.013°C。可以接受,但要做导通电阻补偿。
方向二:热电偶和RTD混合测量。同一个ADS122U04可以配置不同通道测不同类型传感器。通道0-1测PT100,通道2-3测热电偶。但配置要动态切换,MUX、PGA、IDAC都要改。切换后要等稳定时间。
方向三:无线传输。STM32F723ZE没有内置无线,但可以接LoRa模块或者WiFi模块。HVAC现场布线困难时,无线传输是刚需。但无线模块的功耗要控制,电池供电时要用低功耗模式。
方向四:边缘计算。STM32F723ZE的M7内核可以做简单的边缘计算,比如温度趋势预测、异常检测。用滑动窗口计算温度变化率,超过阈值就报警。这比简单的上下限报警更智能。
方向五:功能安全。工业应用可能需要SIL认证。ADS122U04有诊断功能,可以检测开路、短路、基准故障。STM32F723ZE有CRC、看门狗、时钟安全系统。结合起来可以做SIL2级别的温度采集。
6.3 成本与选型对比
| 方案 | ADC | 主控 | 精度 | 成本 | 适用场景 |
|---|---|---|---|---|---|
| 本方案 | ADS122U04 | STM32F723ZE | ±0.05°C | 中高 | 工业HVAC |
| 低端方案 | ADS1118 | STM32F103 | ±0.5°C | 低 | 家用HVAC |
| 高端方案 | ADS1262 | STM32F407 | ±0.02°C | 高 | 精密工业 |
| 集成方案 | MAX31865 | STM32F030 | ±0.1°C | 低 | PT100专用 |
ADS122U04的优势在于灵活,可以测RTD、热电偶、NTC,适合多传感器混合场景。MAX31865只支持PT100,但集成度高,外围简单。选哪个看项目需求。
我个人在实际操作中的体会是,ADS122U04加STM32F723ZE这个组合,硬件设计占七成功力,软件占三成。前端电路没设计好,软件再怎么滤波也救不回来。反过来,前端设计好了,软件就是简单的配置和计算。所以建议在PCB打样之前,先用ADS122U04的评估板验证前端电路,确认噪声和精度达标后再做正式板。这个步骤花的时间,比后面调试省的时间多得多。
最后再分享一个小技巧:ADS122U04的DRDY引脚在连续转换模式下会周期性拉低,可以用STM32的定时器输入捕获来测量转换周期,如果周期异常,说明ADC配置有问题或者通信有误。这个方法比读寄存器更直观,调试时很管用。