☰
基于STM32F373RC与ADS122U04的工业及HVAC高精度温度测量方案
2026/11/5 3:11:06 网站建设 项目流程

1. 工业与HVAC温度测量方案的整体设计思路

工业现场和HVAC系统里的温度测量,跟我们在实验室用个万用表测室温完全是两码事。工业场景下,传感器可能离采集板几十米远,周围有变频器、接触器、大功率电机在疯狂开关,电磁环境极其恶劣;HVAC场景虽然干扰没那么猛,但要求长期稳定、免维护、成本敏感,而且经常要接PT100、PT1000、NTC这些阻值随温度变化的传感器。这就决定了整个信号链的设计思路必须围绕三个核心:抗干扰、高精度、长期漂移小。

我这次选的主控是STM32F373RC,这颗芯片在温度测量领域其实是个被低估的选手。它内置了16位Sigma-Delta ADC(SDADC),很多人只知道拿它做音频或者一般采样,但实际上SDADC在低速高精度场景下表现相当能打。不过这次我没有用它的内部SDADC,而是外挂了ADS122U04IPWR,原因后面会详细说。ADS122U04是TI的一颗24位、4通道、带PGA和激励电流源的Delta-Sigma ADC,专门为RTD、热电偶、热敏电阻这类温度传感器设计,内部集成了很多温度测量需要的外设,省了一大堆外围电路。

整个方案的架构是这样的:传感器(PT100/PT1000/NTC/热电偶)接到ADS122U04的模拟输入端,ADS122U04负责激励、放大、采样、量化,通过UART把数据传给STM32F373RC,STM32做线性化计算、温度换算、报警判断、显示和通信。为什么用UART而不是SPI?ADS122U04是UART接口的,这是它和ADS122S04(SPI版)的主要区别。UART的好处是走线少、隔离方便,工业现场做电气隔离的时候,光耦或者数字隔离器只需要两路信号线,比SPI的四线制省事很多。

提示:ADS122U04的UART是标准异步串口,波特率最高到115200,但实际用的时候建议不要跑满,57600或者38400更稳,尤其是在有隔离器的情况下。

选这个组合的另一个考虑是共模电压范围。工业现场传感器经常不是以地为参考的,比如PT100接成三线制或者四线制的时候,引线上会有压降,如果ADC的共模输入范围不够宽,测量直接废掉。ADS122U04的PGA可以配置成增益1到128,输入共模范围在增益较大时会收窄,但配合内部的激励电流源做比例式测量,可以巧妙地把共模问题绕过去。具体怎么绕,后面实操部分会讲。

STM32F373RC这边,我主要用它的几个外设:UART接收ADS122U04的数据,定时器做采样节拍,I2C接OLED或者LCD做本地显示,另一个UART或者CAN做上位机通信,Flash存校准系数。它的Cortex-M4内核带FPU,做温度的多项式拟合或者查表插值速度很快,不需要外挂DSP。整体BOM成本控制得不错,适合批量部署。

2. 核心器件选型背后的逻辑与关键参数

2.1 为什么是ADS122U04而不是其他ADC

市面上24位ADC不少,ADI的AD7124、MAX的MAX31865、TI自家的ADS124S08都是常见选择。我最终选ADS122U04,有几个很实际的理由。

第一,它自带双匹配激励电流源。测RTD的时候,你需要一个恒流源流过RTD,然后测RTD两端的电压。很多ADC需要外挂恒流源电路,多两颗运放和一堆电阻,不仅占板面积,还引入额外漂移。ADS122U04内部有两个匹配的10uA到1.5mA可编程电流源,可以直接配置输出到任意引脚,做比例式测量非常方便。

第二,PGA的低噪声表现。ADS122U04在增益128、数据率20SPS的时候,RMS噪声大概在70nV左右,这个水平对于PT100测到0.01度分辨率是够用的。当然实际能到多少分辨率,还要看你的参考电阻和激励电流怎么选。

第三,UART接口的隔离优势。前面提过了,工业现场做隔离,UART比SPI省光耦。而且ADS122U04的UART支持自动波特率检测,上电后不用MCU发命令去同步,它自己会侦测主机发的0x55同步字,这个功能在热插拔或者上电顺序不确定的场景下很实用。

第四,内部温度传感器和烧毁检测。它有个内部温度传感器,精度大概0.5度,可以用来做冷端补偿或者板级温度监控。还有传感器烧毁检测(burn-out current source),能检测RTD或者热敏电阻是否开路,这个在HVAC远程探头场景下很有价值,探头线断了系统能立刻报故障而不是读出一个假温度。

2.2 STM32F373RC的角色定位

STM32F373RC在这套方案里不是单纯当个MCU用,它承担了几个关键任务。首先是协议转换和数据处理,ADS122U04出来的是原始ADC码值,需要STM32做RTD的Callendar-Van Dusen方程计算或者NTC的Steinhart-Hart方程计算,这些浮点运算F373RC的FPU可以轻松搞定。

其次是系统管理,包括采样时序控制、多通道切换、报警逻辑、看门狗、低功耗管理。HVAC设备很多时候要求待机功耗低,F373RC有Stop和Standby模式,配合ADS122U04的单次转换模式,可以做到平均功耗很低。

再就是通信接口,F373RC有CAN、USB、多个UART,方便接上位机或者组网。工业现场CAN很常见,HVAC的楼宇自控里BACnet MS/TP跑在RS485上,F373RC的UART加个收发器就能支持。

2.3 关键参数的计算与选择

激励电流的选择。假设用PT100,在0度时阻值100欧,最高测到400度时阻值约247欧。如果激励电流选500uA,那么400度时RTD两端电压是247*0.0005=123.5mV。ADS122U04在PGA增益1的时候,满量程输入是±VREF/PGA,如果VREF用内部2.048V,满量程就是±2.048V,123.5mV只占很小一部分,浪费了动态范围。所以要么提高增益,要么提高激励电流。

如果激励电流选1mA,400度时电压247mV,PGA增益设8,那么等效满量程是2.048/8=256mV,247mV刚好接近满量程,利用率很高。但要注意,1mA流过PT100会产生自热,PT100的自热系数大概0.2到0.5度/mW,1mA在100欧上产生0.1mW,自热约0.02到0.05度,可以接受。如果测的是PT1000,同样1mA产生1mW,自热就大了,所以PT1000通常用100uA到250uA。

参考电阻的选择。做比例式测量时,参考电阻和RTD串联,流过同样的电流,ADC测RTD两端电压和参考电阻两端电压的比值,这样激励电流的漂移就被抵消了。参考电阻的阻值要选得让参考电压在ADC的推荐范围内,一般是1V到2.048V之间。如果激励电流1mA,参考电阻选1.5k欧,参考电压就是1.5V,比较合适。参考电阻的温漂要低,至少25ppm/度,最好10ppm/度,否则参考电阻的漂移会直接变成测量误差。

数据率的选择。ADS122U04的数据率从5SPS到2000SPS可调。工业温度测量不需要快,5SPS到20SPS就够了,数据率越低,内部数字滤波器抑制50Hz/60Hz工频干扰的效果越好。20SPS时同时抑制50Hz和60Hz,这个在工业现场很关键,因为工频干扰是最常见的。

3. 硬件设计与实操要点

3.1 模拟前端电路设计

先讲PT100的三线制接法,这是工业上最常用的,因为三线制可以在不增加太多线缆成本的前提下抵消引线电阻的影响。具体接法是:PT100一端接激励电流源输出,另一端接ADC的模拟输入正端,同时这一端还通过一根引线接到参考电阻的一端;PT100的第三根线从激励电流源那一端引到ADC的另一个输入或者参考端,用来测量引线电阻上的压降。

在ADS122U04上,我通常这样配置:AIN0和AIN1作为差分输入接PT100两端,AIN2接参考电阻高端,AIN3接参考电阻低端。内部激励电流源1从AIN0流出,经过PT100回到AIN1,再经过参考电阻到地。这样ADC测到的就是PT100电压和参考电阻电压的比例。三线制的第三根线用来补偿AIN0或AIN1引线上的电阻,具体接法要看你的布线,原则是让激励电流不流过测量引线。

注意:三线制补偿不是完美的,它假设三根引线电阻相等。实际线缆如果长度差异大或者温度梯度大,补偿效果会打折扣。要求高的场合用四线制,但四线制多一根线,成本高。

NTC的接法就简单多了,NTC和参考电阻串联,中间点接ADC输入,激励电流或者参考电压从上面加。NTC是非线性的,但成本低,HVAC里大量用10k NTC。NTC的精度一般不如PT100,但通过校准可以做到0.1度以内。

热电偶的接法需要冷端补偿。ADS122U04内部有温度传感器,但它的精度和位置不一定能准确反映冷端温度,所以高精度场合还是外挂一颗LM75或者DS18B20做冷端。热电偶的信号很小,K型热电偶在100度温差时输出约4mV,所以PGA增益要开到64或者128。

3.2 PCB布局与抗干扰

这块我踩过不少坑,说几个关键点。模拟地和数字地要分开,在ADC下面单点连接。ADS122U04的AGND和DGND引脚不要直接连在一起再接到系统地,而是各自走线到ADC下方的星点。激励电流源的走线要对称,如果两个电流源都用,走线长度和宽度要尽量一致,否则匹配度下降。

参考电阻的放置要靠近ADC,走线短而粗,不要和数字信号线平行走。输入滤波方面,ADS122U04内部有EMI滤波器,但外部还是建议加RC滤波,截止频率设在1kHz左右,电阻用10欧到100欧,电容用100nF到1uF。电阻太大会引入噪声,太小滤波效果不好。

隔离设计,如果传感器和MCU不共地,或者现场干扰特别大,建议在UART线上加数字隔离器。隔离器的电源也要隔离,用隔离DC-DC或者变压器。隔离后ADS122U04的供电要单独一路LDO,不要和MCU共用。

3.3 电源设计

ADS122U04的模拟供电范围是2.3V到5.5V,数字供电也是。我一般用3.3V给数字部分,模拟部分用一颗低噪声LDO单独供,比如TPS7A4700这种,噪声在4uVrms左右。如果成本敏感,至少也要用个普通的LDO,不要直接用开关电源,开关纹波会耦合到ADC输出。

激励电流源的供电要特别注意,因为电流源的PSRR不是无限的。如果供电有纹波,激励电流也会有纹波,直接调制到测量结果上。所以模拟供电的LDO后面要加足够的去耦,10uF钽电容加100nF陶瓷电容,靠近ADC引脚。

4. 软件实现与温度换算

4.1 ADS122U04的配置与数据读取

ADS122U04的UART协议是命令式的,主机发命令,ADC回数据。上电后先发同步字0x55,等ADC回0x55表示同步成功。然后配置寄存器,主要配置输入多路复用器、增益、数据率、工作模式、激励电流源。

配置寄存器0的典型值:MUX选AIN0和AIN1差分,增益8,PGA使能。配置寄存器1:数据率20SPS,连续转换模式,内部参考使能。配置寄存器2:激励电流源1使能,电流1mA,输出到AIN0。配置寄存器3:烧毁检测关闭,IDAC旋转关闭。

读取数据时,发0x10命令,ADC回3个字节,组成24位有符号数。注意ADS122U04的输出是二进制补码,最高位是符号位。如果PGA增益是8,满量程是±VREF/8,VREF是2.048V,那么LSB大小是22.048/(82^24)=30.5nV。这个数字看起来很小,但实际有效位数受噪声限制,20SPS时大概能到21位有效,也就是LSB约0.5uV。

4.2 RTD温度换算的代码实现

PT100的换算用Callendar-Van Dusen方程。0度以上:R=R0*(1+AT+BT^2),0度以下还要加C项。A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。反解T的时候,0度以上可以用二次方程求根公式,0度以下需要迭代。

float pt100_res_to_temp(float r) { float r0 = 100.0f; float a = 3.9083e-3f; float b = -5.775e-7f; float c = -4.183e-12f; if (r >= r0) { float disc = a*a - 4*b*(1 - r/r0); return (-a + sqrtf(disc)) / (2*b); } else { float t = (r/r0 - 1) / a; // 初值 for (int i = 0; i < 10; i++) { float f = r0*(1 + a*t + b*t*t + c*(t-100)*t*t*t) - r; float df = r0*(a + 2*b*t + c*(4*t*t*t - 300*t*t)); t -= f/df; } return t; } }

实际用的时候,我会把R0、A、B、C做成可校准的参数存在Flash里,每台设备出厂前用精密电阻箱校准几个点,拟合出实际的系数。这样可以把PT100本身的公差和电路误差一起补掉。

4.3 NTC的换算

NTC用Steinhart-Hart方程:1/T = A + Bln(R) + Cln(R)^3。T是开尔文温度。A、B、C三个系数可以从NTC的B值和25度阻值算出来,也可以实测校准。10k NTC的B值常见有3435、3950等。

float ntc_res_to_temp(float r) { float lnr = logf(r); float inv_t = 0.001129148f + 0.000234125f*lnr + 0.0000000876741f*lnr*lnr*lnr; return 1.0f/inv_t - 273.15f; }

NTC的精度在0到50度范围内可以做到0.1度,但高温段和低温段误差会变大。如果全温区要求高,建议用查表加线性插值,表用实测数据生成。

4.4 采样时序与滤波

我一般用定时器触发STM32去读ADS122U04,20SPS的话每50ms读一次。读回来的数据先做一阶低通滤波,截止频率0.5Hz左右,时间常数约0.3秒。这样既能平滑噪声,又不会让响应太慢。如果被测温度变化快,比如HVAC的送风温度,时间常数可以设小一点,1秒左右。

提示:ADS122U04内部有50Hz/60Hz抑制,但那是针对差分输入的。如果传感器引线很长,工频干扰以共模形式进来,内部滤波器效果有限,外部还是要做好屏蔽和共模滤波。

5. 常见问题与排查技巧实录

5.1 读数跳动大怎么办

这是最常见的问题。先看电源纹波,用示波器交流耦合测ADC的AVDD,纹波应该在1mV以下。如果纹波大,检查LDO和去耦电容。再看激励电流是否稳定,可以测参考电阻两端电压,用六位半表看波动。如果参考电压稳但读数跳,可能是PGA增益太高导致噪声放大,试着降低增益、提高激励电流。

还有一个容易被忽略的点:ADS122U04的UART通信误码。如果波特率太高或者隔离器延迟大,数据可能错位。表现是偶尔跳出一个离谱的值。可以在软件里加校验,比如连续读三次取中间值,或者检查数据变化率是否超过物理可能。

5.2 温度读数整体偏移

如果所有点都偏同一个方向,先检查参考电阻的实际阻值和温漂。参考电阻的精度直接影响测量精度,1%的参考电阻误差会导致1%的温度误差,在100度时就是1度。建议用0.1%甚至0.01%的电阻。再检查PT100的接线,三线制如果引线电阻不匹配,会有固定偏移。

5.3 低温段测不准

PT100在0度以下非线性增强,C项不能忽略。如果代码里只用了A和B,低温段误差会到零点几度。另外,低温时ADC的噪声相对信号更大,因为PT100阻值低,电压小。可以低温段用更大增益,或者降低数据率到5SPS。

5.4 常见问题速查表

现象可能原因排查方法解决措施
读数跳动大电源纹波大示波器测AVDD换低噪声LDO,加去耦
读数跳动大UART误码读原始码值看是否突变降波特率,加校验
整体偏移参考电阻误差万用表测参考电阻换高精度电阻,校准
整体偏移引线电阻不匹配测三根线电阻用等长线,或改四线制
低温不准缺C项检查换算公式加C项,或查表
高温不准自热效应降低激励电流换小电流,或脉冲激励
通信失败同步字错误示波器看UART波形检查上电顺序,重发同步
烧毁检测误报阈值设置不当看烧毁电流大小调整检测阈值

5.5 实操心得

我在实际项目里总结了几条:第一,校准比选器件更重要。再好的ADC和电阻,不校准也白搭。每台设备至少两点校准,0度和100度,有条件的多点校准。第二,隔离不是万能的。隔离器本身有延迟和抖动,UART隔离后波特率要降,而且隔离电源的噪声可能比不隔离还大。第三,软件滤波要适度。滤太狠响应慢,滤不够跳动大,根据应用调。第四,留测试点。板子上把激励电流、参考电压、ADC输入都引出测试点,调试的时候省一半时间。

这个方案我在几个HVAC项目里跑过,风管温度、水温、室外温度都测过,长期稳定性不错。工业场合如果干扰特别大,建议再加一级TVS和共模扼流圈。后续如果要扩展,可以加多片ADS122U04做多通道,或者换ADS122U08(8通道)省事。STM32F373RC的SDADC其实也可以用来做辅助测量,比如同时测两路NTC,分担主ADC的压力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询