ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于ADS122U04与STM32F107VC的工业级高精度RTD温度采集方案

基于ADS122U04与STM32F107VC的工业级高精度RTD温度采集方案

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

工业现场和HVAC(暖通空调)系统里的温度测量,跟我们在实验室拿个万用表测室温完全是两码事。实验室里环境恒定、电磁干净、距离短,随便一颗MCU自带的12位ADC都能凑合。但到了工业现场,情况立刻变得复杂:传感器可能离主控板十几米远,走线要穿过变频器、接触器、电机这些强干扰源,环境温度可能从零下几十度到上百度,还要保证长期漂移小、精度稳定。这就是为什么我最终选了ADS122U04IPWR这颗24位Δ-Σ ADC,配上STM32F107VC这颗带以太网和丰富外设的Cortex-M3,来做一套能真正落地的温度采集方案。

先说清楚这套东西是干什么的、给谁用的。它本质上是一套高精度、多通道、抗干扰的RTD/热电偶温度采集前端,核心任务是把PT100、PT1000或者K型热电偶这类传感器的微弱信号,经过调理、数字化之后,通过UART或者以太网送到上位机或PLC。适合的人群包括做工业仪表、HVAC控制器、楼宇自控、过程控制的嵌入式工程师,也适合正在从8位/12位方案往高精度迁移、想搞明白Δ-Σ ADC到底怎么用的朋友。哪怕你之前没碰过24位ADC,只要懂基本的STM32开发,这篇内容里的参数计算和配置思路你都能直接抄。

为什么是ADS122U04IPWR而不是别的?这颗芯片有几个点特别打动我。第一,它内部集成了PGA(可编程增益放大器),增益从1到128可调,这意味着PT100那种满量程只有几十到一百多毫伏的信号,不用外置仪表放大器就能直接放大到ADC的合适量程,省了BOM和调试。第二,它有两路IDAC(激励电流源),可以给RTD提供恒流激励,而且电流值可编程,从10μA到1.5mA,这对消除引线电阻影响至关重要。第三,它自带内部基准,温漂典型值只有5ppm/°C,比很多外置基准都稳,做比例式测量时直接省掉一颗基准芯片。第四,24位分辨率配合内部数字滤波器,在20SPS的输出速率下能拿到接近21位的有效精度,这个动态范围对付工业温度测量绰绰有余。

STM32F107VC这边,选它的理由也很实在。它是STM32F1系列里少有的带以太网MAC和USB OTG的型号,主频72MHz,256KB Flash、64KB RAM,跑一个带协议栈的温度采集系统完全不虚。更关键的是它的互联型定位,外设资源丰富,多个USART、SPI、I2C,方便同时接ADC、接显示屏、接通信模块。用SPI跟ADS122U04通信,速率可以拉到几MHz,读一次转换结果也就几微秒的事。有人会问为什么不选更新的F4或者G4,我的考虑是:温度测量本身对算力要求不高,F107的生态成熟、资料多、价格稳定,工业项目里供货周期也相对可控,没必要为了性能过剩买单。

整套方案的信号链是这样的:RTD传感器 → 恒流激励(IDAC)→ 模拟前端滤波 → ADS122U04的PGA放大 → Δ-Σ调制 → 数字滤波 → SPI读出 → STM32F107VC做线性化和温度换算 → UART/以太网输出。这个链条里每一个环节都有讲究,后面我会逐个拆开讲。整体设计目标定在:-200°C到+850°C量程(PT100),分辨率0.01°C,绝对精度优于±0.1°C(在-50到+200°C常用区间),采样率可配置1到20SPS,支持2线/3线/4线RTD接法。这个指标放在工业现场是够用的,也是这套芯片组合能稳稳达到的。

2. 核心器件选型与关键参数计算

2.1 ADS122U04IPWR的关键特性拆解

ADS122U04IPWR是TI的24位、4通道、Δ-Σ型ADC,封装是TSSOP-16,工作电压2.3V到5.5V,模拟和数字电源可以分开供。它的四个模拟输入可以配置成两对差分输入,或者四个单端输入,做RTD测量时通常用两路差分:一路接RTD,一路接参考电阻。这里有个细节很多人会忽略——它内部有两组独立的基准输入,REF0和REF1,可以分别接不同的参考源。做比例式测量时,把参考电阻上的电压接到REF0,RTD上的电压接到AIN0/AIN1,这样激励电流的漂移会被比值抵消掉,这是高精度RTD测量的标准做法。

PGA的增益设置跟供电电压有关。当AVDD=3.3V、增益=128时,输入共模范围会变得很窄,大概在(AVDD-0.9V)/2附近,所以RTD的共模电压要设计在1.2V左右比较安全。如果增益设小一点,比如32或64,共模范围会宽一些,但分辨率会牺牲。我的经验是:PT100在0°C时约100Ω,用500μA激励,压降50mV;到850°C时约390Ω,压降195mV。如果增益设32,满量程输入是±VREF/32,假设VREF=2.048V,那满量程就是±64mV,不够覆盖195mV。所以要么降低激励电流,要么降低增益。我最终选的是IDAC=250μA,PGA增益=16,VREF=2.048V,这样RTD最大压降约97.5mV,增益16后是1.56V,在2.048V基准的76%左右,留了足够裕量,同时分辨率也够。

2.2 激励电流与参考电阻的匹配计算

比例式测量的核心是让RTD和参考电阻流过同一个电流。ADS122U04的两个IDAC可以分别输出,也可以并联输出。我通常把IDAC1接到RTD的高端,IDAC2接到参考电阻的高端,然后两者的低端都回到AGND,这样两路电流虽然独立设置,但可以设成相同值。参考电阻的选值要跟RTD的满量程接近,这样两路电压都在ADC的合适量程内。PT100满量程390Ω,那参考电阻选390Ω或者400Ω比较合适。但标准电阻里390Ω是E24系列,精度0.1%的金属膜电阻温漂大概25ppm/°C,如果要求更高,得用VISHAY的PTF系列或者更好的箔电阻。

这里有个计算:假设IDAC=250μA,参考电阻RREF=390Ω,那VREF=250μA×390Ω=97.5mV。等等,这个电压太低了,作为基准用的话,ADC的噪声会相对变大。所以实际做法是参考电阻选大一点,让VREF落在1V到2.048V之间。如果RREF=8.2kΩ,250μA×8.2kΩ=2.05V,正好接近内部基准2.048V。但这样RTD上的压降只有97.5mV,跟参考电压差了20倍,比例式测量的比值会很小,相当于浪费了ADC的动态范围。所以更合理的做法是用两路IDAC,一路给RTD,一路给参考电阻,但两路电流可以设成不同值。比如RTD那路设250μA,参考电阻那路设1mA,RREF=2kΩ,那VREF=2V,RTD压降97.5mV,比值约0.0488。这样ADC读到的码值就是0.0488×2^23≈409,000,有效位数约18.6位,对应0.01°C的分辨率是够的。

我实际用的配置是:IDAC1=250μA给RTD,IDAC2=250μA给RREF=8.2kΩ,VREF=2.05V,PGA增益=16。这样RTD信号放大后是1.56V,参考是2.05V,比值0.76,ADC码值约6.4M,有效位数约22.6位,分辨率远超需求。这个配置的好处是两路电流相同,芯片内部匹配好,温漂一致。缺点是参考电阻功耗稍大,250μA×8.2kΩ=2.05V,功耗约0.5mW,可以忽略。

2.3 STM32F107VC的外设分配与时钟规划

STM32F107VC跑72MHz,SPI1挂在APB2上,最高36MHz。ADS122U04的SPI接口最高支持到20MHz左右(取决于供电电压),所以我设SPI时钟为9MHz(72MHz/8),既够快又留了余量。SPI模式要设成CPOL=0,CPHA=1,因为ADS122U04在SCLK下降沿采样数据,上升沿输出。这个细节如果搞错,读出来的数据全是乱的,我一开始就踩过这个坑,调了半天以为是ADC配置问题,结果是SPI模式不对。

USART1用来输出调试信息和温度数据,波特率115200。如果需要以太网,F107的MAC需要外接PHY,我用的是DP83848,RMII接口,50MHz时钟从PHY提供。整个系统的时钟树:HSE用8MHz晶振,PLL倍频到72MHz,AHB=72MHz,APB1=36MHz,APB2=72MHz。SPI1在APB2上,分频8得到9MHz。定时器用TIM2做1秒定时,触发温度采集和上报。

电源部分要特别注意:ADS122U04的AVDD和DVDD都接3.3V,但模拟电源必须经过LC滤波,我用的是10μH电感加10μF和0.1μF电容组成π型滤波,把数字噪声挡在模拟域之外。基准电压引脚REF0接2.048V外部基准(如果不用内部基准的话),但我这个方案用的是内部基准,所以REF0接一个0.1μF到AGND就行。IDAC的输出引脚要串一个1kΩ电阻再接到RTD,防止浪涌电流冲击。

3. 硬件电路设计与实操要点

3.1 RTD输入端的滤波与保护电路

工业现场的传感器线缆可能长达几十米,会引入各种共模和差模干扰。ADS122U04的输入端我做了三级处理:第一级是共模扼流圈,用两个100μH的电感绕在同一个磁环上,抑制共模噪声;第二级是差分RC滤波,1kΩ电阻加100nF电容,截止频率约1.6kHz,把高频干扰滤掉;第三级是TVS二极管,用SMBJ5.0A做浪涌保护,防止雷击或感性负载切换时的高压脉冲打坏ADC。这三级的顺序不能乱,TVS要放在最前面,先钳位再滤波。

RTD的接法我推荐三线制,因为工业现场大多数PT100都是三线制,能抵消引线电阻的影响。三线制的原理是:两根引线分别接RTD的两端,第三根引线接RTD的一端作为补偿。ADS122U04的IDAC1从RTD的高端流入,IDAC2从RTD的低端流出,这样两根引线上的电流方向相反,产生的压降在差分输入里相互抵消。具体接法是:IDAC1接RTD的A端,AIN0接A端,AIN1接B端,IDAC2接B端,然后RTD的C端(补偿线)接AGND。这样A端和B端的引线电阻各流过250μA,但AIN0和AIN1测的是A端和B端的电压差,引线电阻上的压降被抵消了。如果只有两线制,引线电阻会直接加在测量结果里,每米铜线约0.02Ω,10米就是0.2Ω,对应PT100约0.5°C的误差,这在工业上是不允许的。

3.2 参考电阻的选型与布局

参考电阻RREF的精度直接决定测量精度。我选的是Vishay的PTF系列,8.2kΩ,0.05%精度,5ppm/°C温漂。这个电阻的价格不便宜,一颗要十几块钱,但比起整个系统的精度要求,这个钱不能省。如果预算有限,可以用0.1%精度、25ppm/°C的普通金属膜电阻,但要在软件里做温度补偿,或者把系统放在温度变化不大的环境里。RREF的布局要靠近ADC的REF0引脚,走线尽量短,下面铺AGND铜皮做屏蔽。RREF的两端要各接一个0.1μF的C0G电容到AGND,滤掉高频噪声。

还有一个细节:RREF的功耗不能太大,否则自身发热会导致阻值漂移。250μA×8.2kΩ=2.05V,功耗2.05V×250μA=0.51mW,对于0805封装的电阻来说温升不到1°C,可以接受。如果用1mA电流,功耗就是2mW,温升约3°C,就会引入额外的漂移。所以IDAC电流不是越大越好,要平衡信噪比和自热。

3.3 PCB布局的隔离与接地策略

这块板子我画了四层:顶层信号,第二层地,第三层电源,底层信号。模拟地和数字地要分开,在ADC下面用0Ω电阻或者磁珠单点连接。ADS122U04的AGND引脚要接到模拟地平面,DGND接到数字地平面,两个平面在ADC下方通过一个0Ω电阻连接。STM32F107VC的地是数字地,跟模拟地之间也要单点连接,位置选在ADC的DGND附近。这样数字电流不会流过模拟地平面,避免地弹干扰。

SPI走线要短,SCLK、MOSI、MISO、CS这四根线尽量等长,走线下面铺地。如果SPI线超过10cm,要串22Ω电阻做阻抗匹配,防止反射。IDAC的输出线要远离SPI线,避免数字噪声耦合到模拟输出上。RTD的输入线要用双绞线,并且跟电源线分开走,最好走不同的电缆槽。如果现场干扰特别大,可以考虑用屏蔽双绞线,屏蔽层单端接地。

电源部分,3.3V的LDO我用的是TPS7A4700,噪声只有4μVrms,PSRR在1kHz时超过70dB,给ADC供电非常干净。数字3.3V可以用普通的LDO,比如AMS1117,但模拟3.3V一定要用低噪声的。如果成本敏感,至少要在模拟电源上多加几个电容,10μF钽电容加1μF陶瓷加100nF陶瓷,覆盖不同频率的噪声。

4. 固件实现与温度换算算法

4.1 ADS122U04的寄存器配置流程

ADS122U04有四个配置寄存器,上电后要先复位,然后按顺序写。复位命令是0x06,发完等1ms。然后写寄存器0:MUX[3:0]选输入通道,GAIN[2:0]选增益,PGA_BYPASS选是否旁路PGA。我的配置是MUX=0x01(AIN0和AIN1差分),GAIN=0x04(增益16),PGA_BYPASS=0(使能PGA)。寄存器1:DR[2:0]选数据速率,MODE[1:0]选转换模式,CM选连续还是单次,TS选温度传感器,BCS选烧毁检测。我设DR=0x04(20SPS),MODE=0x00(正常模式),CM=0x01(连续转换),TS=0,BCS=0。寄存器2:VREF[1:0]选基准源,50/60Hz滤波,IDAC电流设置。我设VREF=0x00(内部基准),IDAC=0x04(250μA)。寄存器3:IDAC1和IDAC2的路由。我设IDAC1接AIN0,IDAC2接AIN2(参考电阻那路)。

配置完寄存器后,发START命令(0x08)启动转换。连续转换模式下,ADC会以20SPS的速率自动转换,DRDY引脚会在每次转换完成时拉低。STM32F107VC用一个外部中断接DRDY,下降沿触发,在中断里读数据。读数据用0x10命令,读3个字节,拼成24位有符号数。注意ADS122U04的输出是二进制补码,最高位是符号位,正数范围0到0x7FFFFF,负数范围0x800000到0xFFFFFF。温度换算时要先转成有符号整数。

4.2 比例式测量的码值到电阻换算

比例式测量的核心公式是:RRTD = RREF × (Code / 2^23) / Gain。等等,这个公式要仔细推导。ADS122U04的输出码值跟输入电压的关系是:Code = (VIN × Gain / VREF) × 2^23,其中VIN是差分输入电压,VREF是基准电压。而VIN = IDAC × RRTD,VREF = IDAC × RREF(如果参考电阻和RTD流过相同电流)。代入后:Code = (IDAC × RRTD × Gain / (IDAC × RREF)) × 2^23 = (RRTD / RREF) × Gain × 2^23。所以RRTD = RREF × Code / (Gain × 2^23)。这个公式里IDAC被消掉了,这就是比例式测量的好处——激励电流的漂移不影响结果。

但实际电路中,IDAC1和IDAC2虽然设成相同值,芯片内部会有微小失配,典型值0.1%左右。这个失配会引入增益误差,但可以通过校准消除。校准方法是:用一个高精度电阻(比如250Ω,0.01%)代替RTD,读码值,算出实际增益,然后在软件里修正。我通常在生产环节做一次两点校准:0°C(100Ω)和100°C(138.51Ω),用高精度电阻箱模拟,记录码值,算出斜率和截距。

4.3 PT100的线性化与C语言实现

PT100的阻值-温度关系不是线性的,在-200到0°C和0到850°C两个区间要用不同的公式。工业上常用的是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。这个方程是隐式的,已知R求T需要解方程。对于T≥0,可以直接用二次方程求根公式:T = (-A + sqrt(A² - 4B(1 - R/R0))) / (2B)。对于T<0,要用迭代法,一般迭代3到4次就能收敛到0.001°C。

我在STM32F107VC上用的是查表加线性插值的方法,因为F107没有硬件浮点,用浮点运算会慢。具体做法是:把-200到850°C分成1050个点,每1°C一个点,预先算好对应的ADC码值,存在Flash里。测量时先读码值,然后二分查找定位到区间,再做线性插值。这样算一次温度大概几十微秒,20SPS的速率下完全够用。表的生成可以用Python脚本离线算好,导出成C数组。如果Flash空间紧张,可以每5°C一个点,插值误差在0.01°C以内,表的大小缩小到210个点。

// 简化的查表插值示例 #define TABLE_SIZE 1050 extern const int32_t temp_table[TABLE_SIZE]; // 预存的码值表 float code_to_temperature(int32_t code) { int low = 0, high = TABLE_SIZE - 1; while (low < high - 1) { int mid = (low + high) / 2; if (temp_table[mid] > code) high = mid; else low = mid; } // 线性插值 float ratio = (float)(code - temp_table[low]) / (temp_table[high] - temp_table[low]); return -200.0f + low + ratio; // 每点1°C }

4.4 数字滤波与工频抑制

ADS122U04内部有Sinc3滤波器,在20SPS时对50Hz和60Hz都有很好的抑制,典型抑制比超过100dB。但工业现场除了工频干扰,还有变频器产生的高频噪声,这些需要额外的数字滤波。我在STM32里做了一个滑动平均滤波器,窗口大小16,对20SPS的数据做平均,等效输出速率1.25SPS,噪声进一步降低。滑动平均的代价是响应变慢,16个样本的延迟是0.8秒,对于温度这种慢变量完全可以接受。如果要求快速响应,可以把窗口缩小到4,延迟0.2秒,噪声会大一些。

还有一个技巧:在DRDY中断里读数据时,先读状态寄存器确认数据就绪,有时候DRDY会误触发,直接读数据可能读到旧值。ADS122U04的状态寄存器里有一个DRDY位,读数据前先读状态,确认DRDY=1再读。这个操作会增加几微秒的开销,但能避免数据错位。我一开始没做这个检查,偶尔会出现温度跳变,后来加了状态检查就稳定了。

5. 常见问题排查与实战避坑经验

5.1 读数跳动大、噪声高的排查思路

温度读数跳动是最常见的问题,原因可能有很多。我整理了一个排查顺序,从易到难:先看电源纹波,用示波器测AVDD,如果纹波超过1mVpp,就要加强滤波;再看基准电压,如果用的是内部基准,测REF0引脚,应该是2.048V±1mV,如果偏差大,可能是芯片坏了;然后看SPI通信,用逻辑分析仪抓SCLK和MISO,确认数据在正确时钟沿采样;最后看输入滤波,如果RTD线太长,共模干扰会耦合进来,要在输入端加共模扼流圈。

我遇到过一个典型案例:读数每隔几秒跳一次,幅度约0.5°C。查了半天,发现是变频器启动时的电磁干扰通过电源线耦合进来。解决办法是在LDO输入端加一个共模扼流圈,再把ADC的模拟地和数字地之间的0Ω电阻换成磁珠,问题就解决了。还有一个案例是读数一直偏高0.3°C,最后发现是参考电阻的温漂,板子放在密闭盒子里,内部温度比环境高5°C,RREF漂了25ppm×5=125ppm,对应0.0125%的误差,换算成温度约0.03°C,但实际偏了0.3°C,说明还有别的问题。后来发现是IDAC的失配,IDAC1和IDAC2差了0.5%,导致比例式测量的比值不准。在软件里做了增益校准后,偏差降到0.05°C以内。

5.2 SPI通信失败的几种典型情况

SPI通信失败通常表现为读出的数据全是0xFFFFFF或0x000000。第一种可能是CS片选时序不对,ADS122U04要求CS在SCLK第一个下降沿之前拉低,在最后一个上升沿之后拉高。如果CS变化跟SCLK同时,芯片可能识别不到。第二种可能是SPI模式错误,前面说过,CPOL=0、CPHA=1是必须的,如果设成CPHA=0,数据会错一位。第三种可能是时钟太快,虽然芯片标称支持20MHz,但实际跟走线长度和负载有关,如果走线超过10cm,建议降到4MHz试试。第四种可能是电源没上电,ADS122U04的DVDD和AVDD都要接,如果只接了DVDD,SPI能通信但转换结果不对。

我踩过最坑的一次是SPI的MISO引脚配置错误。STM32F107VC的SPI1_MISO默认是推挽输出,但作为输入应该设成浮空或上拉。我忘了改,结果MISO一直被MCU拉低,读出来全是0。后来在GPIO初始化里把MISO设成GPIO_Mode_IN_FLOATING,问题解决。这个细节在STM32的参考手册里有写,但很容易忽略。

5.3 温度换算中的常见计算错误

温度换算错误通常有几个来源:码值符号处理、参考电阻值代入错误、增益倍数搞错。ADS122U04的输出是24位补码,如果直接当无符号数处理,负温度会变成很大的正数。正确的做法是:先拼成32位有符号数,如果最高位是1,就减去2^24。比如读到的三个字节是0xFF、0xFF、0xFF,拼成0xFFFFFF,作为24位补码是-1,对应电压是-1×VREF/(Gain×2^23)。这个-1对应的温度可能是-200°C附近,如果当成16777215,就会算出几千度。

参考电阻值代入错误也很常见。有人用RREF=8.2kΩ,但在公式里代入了8.2,忘了乘1000,结果温度差了1000倍。增益倍数搞错的情况是:PGA增益设的是16,但公式里用了1,结果温度偏高16倍。这些错误在调试时很容易发现,因为温度值明显不合理。我的建议是:先用已知电阻代替RTD,比如100Ω,算出的温度应该是0°C左右,如果不对,就检查公式和参数。

5.4 常见问题速查表

现象可能原因排查方法解决办法
读数全0或全1SPI模式错误逻辑分析仪抓波形设CPOL=0, CPHA=1
读数跳动大电源纹波大示波器测AVDD加LC滤波,换低噪声LDO
温度偏高/偏低参考电阻温漂测量RREF实际阻值换低温漂电阻,或软件补偿
负温度显示为正码值符号处理错误检查补码转换代码用int32_t,最高位减2^24
温度跳变DRDY误触发读状态寄存器确认DRDY=1再读数据
通信不稳定SPI线太长缩短走线或降速串22Ω电阻,降时钟
精度不够增益设置不当计算满量程调整IDAC和增益
自热误差IDAC电流太大测RTD功耗降低IDAC到250μA

5.5 几个容易被忽略的实操心得

第一个心得:ADS122U04的PGA在增益大于32时,输入共模范围很窄。如果RTD的共模电压不在合适范围,PGA会饱和,读数会卡在满量程。解决办法是在RTD的低端加一个偏置电阻,把共模电压抬到AVDD/2附近。比如在RTD低端到AGND之间加一个10kΩ电阻,IDAC2的电流流过它产生偏置电压。这个电阻的精度要求不高,1%就够了,但温漂要小,否则会引入共模漂移。

第二个心得:校准比选高精度器件更重要。我用0.05%的RREF和0.01%的校准电阻,做两点校准后,系统精度能做到±0.05°C。但如果用0.1%的RREF,不做校准,精度可能只有±0.5°C。校准的成本很低,就是几个高精度电阻和一点时间,但收益很大。我通常在生产时用电阻箱模拟0°C和100°C,记录码值,算出增益和偏移,存在Flash里。现场如果条件允许,也可以用冰水混合物(0°C)和沸水(100°C,注意气压修正)做简易校准。

第三个心得:温度采集的响应速度要跟应用匹配。HVAC系统里温度变化很慢,20SPS的速率已经很快了,但如果你用滑动平均窗口16,实际输出速率只有1.25SPS,延迟0.8秒。对于空调控制,这个延迟没问题;但对于快速温度保护,比如电机绕组测温,就需要更快的响应。这时候可以把窗口缩小到4,或者直接用20SPS输出,牺牲一点噪声换速度。我的做法是提供两个输出通道:一个滤波后的慢通道给控制用,一个原始的快通道给保护用,这样两不耽误。

第四个心得:PCB上的热设计会影响精度。ADS122U04和STM32F107VC都会发热,如果板子放在密闭盒子里,内部温度可能比环境高10°C以上。RREF和RTD的补偿线如果靠近发热源,会引入额外的误差。我的做法是:把模拟部分放在板子的一角,远离MCU和电源;RREF下面铺铜但不接任何网络,只做热扩散;RTD的补偿线走粗一点,减少自身发热。如果精度要求特别高,可以用外部基准代替内部基准,把基准芯片放在恒温槽里,但成本会高很多。

第五个心得:软件上要做异常检测。如果RTD断线,ADC会读到满量程或零,温度会显示成极端值。我在软件里加了断线检测:如果码值超过满量程的95%或低于5%,就报传感器故障。ADS122U04本身有烧毁检测功能,可以输出一个小电流检测RTD是否连接,但会引入额外噪声,我一般不用,而是用软件判断。另外,如果温度变化率超过10°C/秒,也报异常,因为温度不可能变化这么快,肯定是干扰或故障。

这套方案我在几个工业项目里实际用过,包括注塑机料筒测温、HVAC风管测温、锅炉水温监测,整体表现稳定。最长的连续运行了两年多,精度漂移在0.1°C以内。关键还是把硬件滤波、比例式测量、软件校准这三件事做扎实,剩下的就是细节打磨。如果你正在做类似的项目,建议先从评估板开始,把SPI通信和寄存器配置跑通,再画自己的板子,这样能少走很多弯路。

返回列表