☰
基于ADS122U04与STM32L432的高精度PT100温度采集系统设计与实现
2026/11/5 1:06:59 网站建设 项目流程

1. 项目概述与方案选型思路

做工业温度测量这块的老工程师应该都有同感:ADS122U04IPWR这颗芯片在TI的ADC产品线里不算最出圈的,但真正用过几轮之后,你会发现它其实是性价比相当高的一颗料。最近我在一个暖通空调(HVAC)项目里,把它和STM32L432KC搭在一起做了一套温度采集系统,从硬件设计到驱动移植,再到产线校准,整个流程走下来有不少值得记录的细节,分享出来供大家参考。

先说清楚这个系统是干什么的。我们需要采集多路温度信号,包括风管内的送风温度、回水管的进出水温度、以及压缩机排气温度,测温范围从零下十度到一百二十度左右,精度要求±0.3℃以内。传感器用的是PT100铂电阻,三线制接法。主控选了STM32L432KC,这是ST的超低功耗系列芯片,Cortex-M4内核,主频80MHz,Flash 256KB,RAM 64KB,体积小、功耗低,非常适合做这种嵌入式的采集节点。而ADS122U04则承担了所有模拟信号的前端采集任务。

ADS122U04IPWR的参数值得先过一遍。这是TI的24位ΔΣ型ADC,内置4路差分输入,也可以配置成7路单端输入,有两个可编程激励电流源,一个内部温度传感器,带PGA可编程增益放大器,增益档位从1到128。它和主控之间走SPI通信,速度最高能到10Mbps。为什么选它而不是ADS1220或者ADS1248?原因有几个:首先是24位的分辨率让低温漂信号的提取变得从容,其次内置的激励电流源正好配合RTD的三线制测量,省掉了外部恒流源电路,再次它的功耗在同级别产品里属于较低水平,几微安的待机电流对供电紧张的现场很友好。另外“U”后缀代表的是增强型版本,相比不带U的版本,在滤波和稳定性上做了些优化,实测数据表现也确实更稳。

放在HVAC这个场景里,这套方案的意义在于能用一颗中低价的ADC搞定多路高精度温度采样,同时把主控的资源释放出来做PID控制、通信协议栈和故障诊断。很多做工业仪表的老工程师可能还在用MSP430加ADS1247的老方案,但如今MCU的价格和性能都在变化,STM32L432KC加上ADS122U04的搭配,在成本和性能上找到了一个比较舒服的平衡点。

接下来按硬件电路、软件驱动、校准补偿、故障排查这条线逐步展开,重点讲实操层面可复现的内容。

2. 硬件设计:从传感器到MCU的信号链路

2.1 三线制PT100的接法与激励电流配置

PT100的测温原理是电阻值随温度变化,0℃时电阻值100Ω,温度每升高1℃,电阻约增加0.385Ω。因为变化量很小,所以对测量链路里的每一个环节都有苛刻要求。

三线制接法是为了消除导线电阻带来的误差。原理是:给PT100一端接一根线,另一端接两根线,三根线的材质、长度、规格保持一致,那么两根线上的压降可以相互抵消。ADS122U04内部有两个激励电流源IDAC1和IDAC2,可以分别配置输出电流大小,可选范围是0mA、10μA、50μA、100μA、250μA、500μA、1mA、1.5mA。对于PT100来说,我实际用的是1mA。

选择1mA的原因需要展开说一下。激励电流越大,传感器两端的电压信号就越强,ADC的原始码值分辨率就越高。但电流大了之后,PT100自身发热产生的温升误差也会变大,尤其是在静止空气中,散热条件差,自热效应会比较明显。查过PT100的规格书,它的自热系数通常在0.05℃/mW到0.1℃/mW之间。用1mA电流,在PT100标称300Ω时,功耗是I² × R = (0.001)² × 300 = 0.0003W,也就是0.3mW,引起的自热温升约0.03℃,完全在误差预算之内。如果电流加到1.5mA,功耗就是0.675mW,温升接近0.07℃,虽然也不算大,但在高精度应用里没必要冒这个风险。

接线方式上,我倾向于把三根线分别标成红线R1、蓝线R2、黑线R3。其中R1和R2接PT100的两端,R3接PT100的其中一端与R1公共节点。接法上,R1接入AIN0正输入端,R2接入AIN1负输入端,R3接入AIN2作为第三个测量通道(可以做开路检测用)。IDAC1接到AIN0,IDAC2接到AIN2。当IDAC1和IDAC2的电流设置相同时,流经R1和R2上的电流相同,导线电阻引起的压降相互抵消,此时AIN0与AIN1之间的电压差就只与PT100自身的电阻有关。

2.2 参考电阻与比例测量的设计要点

要让测量结果稳定,参考基准的选择很重要。我用的方案是比例测量法。在AIN2和AIN3之间接了一个精密参考电阻Rref,阻值为3.3kΩ,精度0.1%,温漂5ppm/℃。IDAC2输出的激励电流流经Rref,产生的电压作为ADC的参考电压。这样激励电流的波动被视为参考电压和信号电压共模变化,在比例测量中会被自动抵消掉。换句话说,我的ADC参考电压不是一个固定值,而是跟随着激励电流变化。这就极大降低了对高精度基准源的要求。

这个方法的一个隐含好处是,ADC的测量范围永远不会超过参考电压,输入信号与参考电压同源,量程比始终合理。计算过程是这样的:1mA电流流经3.3kΩ电阻,产生3.3V的参考电压,正好落在ADS122U04推荐的参考电压输入范围内(最大AVDD - 1.2V左右,通常3.3V供电时取2.5V到3.0V更安全)。如果用2.5V供电,那Rref就要选2.49kΩ,保证参考电压约2.49V,留出余量给PGA的输入摆幅。

注意:参考电阻的温漂在工业现场对整机漂移的影响是决定性的。5ppm/℃看起来不错,但在环境温度从10℃变化到50℃时,Rref的阻值变化约0.02%,折合到温度读数约0.05℃,这个指标可以接受。如果预算允许,用10ppm/℃的普通电阻在HVAC场景也能凑合,但品牌件最好选Vishay或者是国产的军工级晶圆电阻,别贪便宜用贴片厚膜。

2.3 STM32L432KC侧的外围电路

STM32L432KC这颗MCU的供电范围是1.71V到3.6V,实际项目里用的是3.3V LDO供电,因为ADS122U04的模拟电源和MCU的数字电源共用一个3.3V稳压源,拓扑上简单。但这里有一个容易踩的坑:ADC的模拟电源AVDD和数字电源DVDD都是3.3V没问题,但MCU的I/O口输出的SPI信号电平也是3.3V,而ADS122U04的数字输入高电平门槛是0.7×DVDD,即约2.31V,逻辑兼容没有问题,不需要额外的电平转换电路。

硬件上务必在ADS122U04的模拟电源引脚附近放置去耦电容。我一共放了两种规格:一个10μF的钽电容滤低频分量,一个0.1μF的陶瓷电容滤高频分量,两者并联。摆放位置要尽量靠近电源引脚,走线要短,回流路径要直。AVID DVDD内部虽然有LDO,但不代表电源设计可以随意,去耦做不好的情况下,24位ADC的高位数码会变成纯噪声,你根本分不清是环境干扰还是传感器信号跳变。

SPI接口方面,我的接法比较常规:SCLK 接PB13,MOSI接PB15,MISO接PB14,片选CS接PB12。注意ADS122U04的SPI是只支持Mode 1(CPOL=0,CPHA=1)的,这个很容易配错,如果配错成Mode 0也能通信但读回来的数据偶尔会错位。这个细节后面在驱动部分会详细说明。

另外还有一个容易被忽略的引脚是DRDY,这是转换完成标志。我把它接在PB11上,启用外部中断,下降沿触发。每次转换完成,DRDY拉低,主控进中断去读数据,这样的方式比轮询省了不少CPU开销。如果你在多任务环境里跑RTOS,这个中断方式几乎是必须的,否则轮询会占掉一个任务的时间片。

3. 驱动开发与SPI通信细节

3.1 ADS122U04的寄存器配置

ADS122U04的内部寄存器一共有五个,每个8位宽。配置的重点在寄存器0、寄存器1和寄存器2。

寄存器0控制的是输入多路复用器(MUX)和PGA增益。MUX选择是4个差分输入之一。要测量AIN0和AIN1之间的差分电压,MUX配置就设为001,即AINP=AIN0,AINN=AIN1。PGA增益设为1,因为PT100在1mA激励下的满量程电压大约是300mV左右,不需要放大。如果用的是K型热电偶,那PGA就要设为32甚至64,把微伏级的信号放大后再进ADC。

寄存器1的控制位包括数据速率、工作模式、滤波器设置和激励电流源设置。数据速率我选择了20SPS,对应内部数字滤波器的截止频率大约是5Hz左右。为什么选20SPS而不是1000SPS?因为在工业HVAC应用里,温度变化本身就是一个慢变信号,时间常数通常是几十秒到几分钟的量级,20SPS已经可以完整重建信号,而且速率越低,数字滤波器的陷波效果越好。最重要的是,20SPS时ADS122U04内置的50Hz/60Hz工频干扰抑制能力最强,数字滤波器的同步采样特性会把工频干扰压到极低的水平。实测下来,在工业现场有变频器干扰的情况下,20SPS的数据跳变峰峰值只有约0.02℃,非常稳定。

激励电流源的配置在寄存器1的高两位。IDAC1和IDAC2的输出目标引脚分别在寄存器2中配置。我把IDAC1设为1000μA接到AIN0,IDAC2设为1000μA接到AIN2。注意这两路电流大小必须完全一致,否则三线制的抵消原理就不成立了。TI的寄存器配置里IDAC1和IDAC2的电流值分开设置,虽然芯片出厂时内部匹配度很高,但软件设置时两个值必须保持一致,这一点很容易被忽略。

寄存器2配置的是IDAC输出引脚和内部传感器使能。寄存器3和寄存器4用于配置低侧开关和GPIO,我在这个项目里基本用默认值。

3.2 SPI通信的时序与代码实现

ADS122U04的SPI时序有一个不太一样的地方:它的MISO线上返回的数据是在SCLK的下降沿输出的,主控必须在上升沿采集数据。这在STM32的SPI硬件外设里对应的配置是CPOL=0,CPHA=1,也就是SPI Mode 1。如果用的是STM32CubeMX生成初始化代码,默认生成的SPI配置可能是Mode 0,需要手动改掉。

另外,片选信号的管理也有讲究。ADS122U04的每个命令帧要拉低CS、发送字节、然后拉高CS。但读数据的时候,有的工程师会用CS连续拉低、读取多个字节,这个做法在ADS122U04上是可以的,但要注意读操作期间不能把CS拉高,否则数据指针会复位,你就永远只能读到第一个字节。

我贴上实际项目中用的核心代码片段,基于HAL库实现:

SPI_HandleTypeDef hspi1; // 写单字节寄存器 void ADS122U04_WriteReg(uint8_t reg_addr, uint8_t reg_data) { uint8_t cmd = 0x40 | (reg_addr << 2); // 写寄存器命令,R/W位=1 uint8_t data = reg_data; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, &cmd, 1, 10); HAL_SPI_Transmit(&hspi1, &data, 1, 10); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); }

要注意的是,ADS122U04写寄存器命令是:第一个字节高四位是命令代码0x4X,低两位是寄存器地址,也就是第二步传地址,第三步传数据。如果地址搞错了,数据会写进不对的寄存器,表现就是配置了但没反应。调试时可以先读回寄存器确认。

读数据时,发送0x20命令进入读取模式,然后连续读取三个字节,得到24位转换结果。注意ADC结果是24位有符号数,用补码表示:

int32_t ADS122U04_ReadData(void) { uint8_t cmd = 0x20; // RDATA命令 uint8_t buf[3] = {0, 0, 0}; int32_t raw = 0; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, &cmd, 1, 10); HAL_SPI_Receive(&hspi1, buf, 3, 10); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); raw = ((int32_t)buf[0] << 16) | ((int32_t)buf[1] << 8) | buf[2]; // 24位有符号数扩展 if (raw & 0x800000) { raw |= 0xFF000000; } return raw; }

如果数据一直读出来是0xFFFFFF,说明ADC在转换过程中出错(一般是SPI时序不对或DRDY没有准备好),需要检查是不是在DRDY变低之前就去读数据了。正常流程是:启动连续转换模式(0x02命令)后,等待DRDY引脚拉低,再发RDATA命令读数据。如果CS拉低太早,ADC可能还没锁存数据,返回的就是上一次或无效值。

3.3 DRDY中断与数据同步机制

很多工程师第一次调这颗ADC时,会直接在while循环里轮询DRDY引脚,发现也能读到数据。但在实际项目中我不会这么干。原因是:轮询在单任务裸机程序里问题不大,但在移植RTOS或者需要同时处理多路传感器、通信协议和显示刷新时,轮询会让时间片碎片化,无法确定能不能在DRDY有效窗口内及时读取数据。

我的做法是把DRDY接到STM32的GPIO外部中断上。配置成下降沿触发,中断回调函数里设置一个标志位,主循环检测到标志后立刻发RDATA命令读数据。这个流程的时序窗口很充裕,因为ADS122U04在DRDY拉低后的数据保持时间足够长,只要在下一个转换周期开始之前读走就行。20SPS时转换周期是50ms,读取三个字节的SPI传输时间在8MHz时钟下大约3μs不到,时间余量非常充足。

4. 温度计算、校准与滤波处理

4.1 原始码值到电阻值的换算

拿到ADC的原始码值是第一步,接下来要把码值转成电阻值再转成温度。ADS122U04是24位ADC,满量程对应二进制补码范围是-8388608到8388607。假设PGA增益为1,参考电压Vref = 3.3V(即Rref两端电压),那么输入电压Vin和码值的关系是:

[ Vin = \frac{raw}{8388607} \times Vref ]

用比例测量的关系,PT100的电阻值Rpt100就是:

[ Rpt100 = \frac{Vin}{Vref} \times Rref = \frac{raw}{8388607} \times Rref ]

有意思的地方在于,公式里Vref被消掉了,实际起作用的只是Rref的阻值和raw码值。这就是比例测量的魔力所在:就算3.3V电源电压有波动,编码值也不受影响,因为信号和参考是同一个源头。

用这段代码可以完成转换:

float Rref = 3300.0f; // 单位Ω float Rpt100 = (float)raw / 8388607.0f * Rref;

4.2 PT100线性化:查表法与多项式拟合

PT100的电阻-温度特性不是完全线性的,0℃时是100Ω,100℃时是138.51Ω,200℃时是175.86Ω。在0到100℃范围内,最大非线性误差约为0.4℃,这对高精度应用来说不可接受。因此必须做线性化处理。

处理方式有三种选择。第一种是查表法,把PT100标准分度表按1℃间隔做成一个静态数组,实测电阻值落在哪两个表项之间就用线性插值。这个方法简单可靠,查询速度快,缺点是占用Flash空间较大(如果覆盖-50℃到300℃范围,按1℃间隔需要351个点,每个点4字节就是1.4KB,完全可接受)。

第二种是多项式拟合法。IEC 60751标准给出了PT100的Callendar-Van Dusen方程,用两个方程分别处理0℃以上和0℃以下的范围:

[ R(t) = R0 \times [1 + A \times t + B \times t^2],t \ge 0℃ ] [ R(t) = R0 \times [1 + A \times t + B \times t^2 + C \times (t-100) \times t^3],t < 0℃ ]

其中R0=100Ω,A=3.9083×10⁻³,B=-5.775×10⁻⁷,C=-4.183×10⁻¹²。这个方程的拟合精度在0到850℃范围内优于0.01%,完全够用。但反推温度时需要解一元二次方程,在MCU上要计算开方,会多用一点时间。

第三种是分段线性插值法,工程上最常用。把测量范围分成几段,每段用一次线性公式拟合,误差控制在0.05℃以内。优点是查找速度快,浮点运算量小,适合在STM32L432KC这种不带硬件FPU的单片机上跑。

我实际用的是分段线性插值,因为代码量少,调试直观。分段点我取了六个点:-50℃、0℃、50℃、100℃、150℃、200℃,每一段分别计算斜率k和截距b,存放在表格里。实测下来,在-20℃到120℃这个HVAC工作的主要区间内,拟合误差不超过0.04℃。

如果是新项目并且Flash空间充裕,我会建议直接用IEC 60751的公式,省去查表的繁琐,代码也更规整。但要注意公式中用到的t是以℃为单位的,不要当作绝对温度带入。

4.3 一阶低通滤波与滑动平均的选择

ADS122U04内部数字滤波器在20SPS时已经有了不错的噪声抑制能力,但实测数据里仍然能看到约1到2个码的随机跳动,这对应的温度波动大约0.1℃左右。在输出给PID控制器之前,我习惯在外面再加一级软件滤波,把短期抖动抹平。

一阶低通滤波的表达式是:

[ y[n] = \alpha \times x[n] + (1-\alpha) \times y[n-1] ]

其中α的取值由时间常数决定。在20SPS采样率下,如果希望滤波时间常数约2秒,那么α取值约为0.05。这个滤波对温度的急剧变化会引入滞后,但温度系统本身就是一个大惯性环节,所以这个范围内没有影响。

滑动平均则是取最近N个采样点的平均值。它的好处是线性相位无滞后,坏处是内存中要保存N个历史值。在STM32L432KC这种资源充足的芯片上,用环形队列实现滑动平均很轻松,N取16到32比较合适。

我的经验是不要把两种滤波叠加使用。做一次滤波就好,叠加只会增加相位延迟,对最终控制效果没有收益。而且如果下游PID整定参数是按经验试凑的,双重滤波会让响应变钝,操作员会感觉温度“跟不上”,实际是滤波滞后造成的假象。

4.4 产线校准流程:一点法与两点法的取舍

每个ADC和每个传感器都有个体差异,尤其是PT100传感器的互换性误差(Class A为±0.15℃)和ADC的失调电压(最大可到几mV),必须在产线校准中补齐。

在校准策略上,一点法适用于零点和增益都比较准的场景。做法是:用精密电阻箱模拟PT100在0℃时的阻值(100Ω),把实测码值记录下来,算出偏移量,在算法里减去。这个方法只能校准零位,对增益误差无能为力。如果ADC的增益误差已由电阻Rref的精度保证,你希望PGA为1且TI芯片的增益误差非常小,那么一点法在HVAC应用里是够用的。

两点法可以同时校准零点和增益。做法是用两个精密电阻箱分别模拟0℃和100℃两个点,记录码值后算出一个斜率系数和一个偏移量。这两个值存入EEPROM或Flash,上电时读取。校准后的综合精度可以做到±0.1℃以内。

实际操作中要注意:在校准前必须等待系统稳定至少10分钟,让电路板上的热梯度达到平衡,否则校出来的“零点”其实是漂移途中的某个随机值。我踩过这个坑:第一版校准程序没有预热延时,产线上校出来的设备放一晚上后,第二天开机显示温度比标准温度计低了0.15℃。

4.5 内部温度传感器与冷端补偿的妙用

ADS122U04内部集成了一个温度传感器,可以用于测量芯片附近的温度。它的精度有限,但是做冷端补偿时可以派上用场。如果你测量的是热电偶而不是PT100,那么冷端温度必须知道,内部传感器能省掉一个外部NTC。即便只用PT100,内部传感器也可以用来做温度漂移补偿的辅助参考,观测整机温升对测量结果的影响。

在HVAC项目中,我把它用作自诊断功能:如果内部温度超过85℃,说明电路板环境异常高温,可能是风道堵了或者设备直晒,立刻报警。这个功能在无人值守的控制柜里很有价值,比靠ADC读数发现异常更早。

5. 长期稳定性与抗干扰工程实践

5.1 PCB布局与接地策略

ADS122U04属于高精度混合信号器件,PCB布局的合理性直接决定了最终实测的噪声水平。我在这块板上用的是四层板:顶层走信号,第二层是完整地平面,第三层走电源,底层走低速控制信号。

关键的一条规则是:模拟地和数字地必须在ADC下方单点连接,最好在芯片正下方用一个过孔或短焊盘连接。千万不要把整个地平面割成模拟地和数字地两块再来回跨越。早期试用两层板时,我把模拟地、数字地分开敷铜,结果SPI数字信号带来的噪声渗入到模拟通道,24位ADC最后只剩约18位有效精度。改成单点连接后,有效位数直接升到了21位左右。

ADC的AVDD引脚上,我并联了10μF钽电容和0.1μF陶瓷电容。参考电阻Rref是影响测量精度的最重要器件,它两端要各自打一个过孔到模拟地平面,不要和数字地共享回流路径。PT100的引线在进入PCB区域后要尽量短,走线时做差分对等长处理,因为三线制测量"导线电阻相等"是靠PCB走线对称性来保证的。如果两根走线长度不一致,抵消效果就打折扣。

5.2 屏蔽与隔离的实战取舍

在工业HVAC现场,变频器、接触器、电磁阀这类设备工作时会把高次谐波和尖峰脉冲耦合到信号链路上。为此,PT100的三根引线在机器内部要走屏蔽线,屏蔽层单端接地(在MCU板侧接地),不要两端都接。两端接地会形成地环路,反而引入更大的共模干扰。

真正遇到强干扰的场合,比如逆变器输出侧的温度采样,光耦隔离是常规手段。但在ADS122U04和STM32之间用SPI直连其实风险并不大,干扰源主要在传感器侧,不在MCU侧。我在实际项目中一开始设计了SPI隔离,后来测试发现不加隔离的SPI通信误码率极低,去掉隔离后少一个BOM物料,成本和失效率都下降了。

真正需要加的还是AVDD电源入口处的EMI滤波器:一个470Ω的磁珠加一个10μF电容,实测下30MHz到100MHz的高频干扰衰减了约40dB。这套组合在通过工业级EFT(电快速瞬变脉冲群)测试时帮了大忙。

5.3 看门狗与异常恢复策略

工业设备不能死机,这是基本要求。我在STM32L432KC上开了独立看门狗IWDG,喂狗周期1秒。但ADS122U04本身的复位策略也要考虑。如果SPI通信突然异常导致ADC进入未知状态,最粗暴的方法是硬件复位——把CS引脚拉低并保持几个毫秒,ADC就会复位。但ADC没有专门的硬件复位引脚,复位方式是通过SPI发送RESET命令0x06。

代码层面我加了一个通信超时检测:如果连续10次读数据时DRDY都不拉低,就重写所有寄存器配置,再做一次自校准。这个逻辑放在一个软件状态机里,每100ms跑一次,实测下来即使遇到极端干扰,系统恢复时间不会超过2秒。

5.4 长期漂移的实测追踪

温度测量设备最怕的是用几个月后精度掉下来。为了确认这套方案的长期稳定性,我做了个30天的连续运行测试,每天记录一次零漂数据。结果显示:在环境温度波动±5℃的情况下,零点最大漂移约0.06℃,增益漂移约0.03%。这个数据比PT100传感器本身的长期稳定性要好,说明漂移主要来自传感器老化,而不是ADC和MCU链路。

如果要进一步降低长期漂移,可以在算法层面对参考电阻Rref做温度补偿。方法是在参考电阻旁边贴一个NTC或者利用ADC内部温度传感器读出板温,查Rref的温度系数表做软件修正。这个操作不复杂,但前提是你对Rref的温度系数有准确的标定数据,不然“补偿”反而引入更大的误差。

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

6.1 典型故障现象速查表

故障现象可能原因排查步骤解决方案
SPI读回数据恒定0xFFFFFFSPI模式配置错(Mode 0/A);CS时序不对用示波器抓SCLK、MOSI、CS波形确认CPOL=0、CPHA=1;读数据期间CS不能拉高
温度读数明显偏高或偏低PT100接线顺序接错;IDAC1与IDAC2电流不相等万用表测AIN0与AIN1间电压是否在预期范围;检查寄存器2配置重新核对三线制接法;寄存器2中IDAC1/IDAC2电流值设为相同
数据跳动超过±0.5℃电源去耦不良;参考电阻位置靠近干扰源示波器测AVDD纹波,正常应<50mV加上10μF+0.1μF去耦电容;Rref远离电感类器件
读数跟随环境温度变化校准后的系数没存入Flash;EEPROM读取失败重启设备观察上电后组态值来源检查NVM读写逻辑和校验和
偶尔读到错误温度、下一帧恢复正常接触不良或SPI误码;CS被外部干扰误拉检查接插件压线质量;示波器抓CS引脚干扰尖峰线缆固定;CS下拉电阻增大抗干扰能力

6.2 排查过程实录:一次温度跳变的定位

有一次客户反映设备运行几天后温度读数偶尔跳变约5℃。一开始怀疑传感器接线松动,到现场拧了一遍接头,问题依旧。后来用存储示波器长时间监听DRDY和CS引脚,发现跳变发生时CS引脚上出现了一个宽度约2μs的毛刺。分析原因是设备内部有一路220V交流接触器,动作时振动导致线缆轻微移动,CS线和动力线并行走线,寄生电容耦合出尖峰,误触发片选。

解决方法是把CS引线改为屏蔽线并单独走线,远离动力线。同时把CS引脚的下拉电阻从100kΩ改为10kΩ,增加抗干扰能力。改完后连续运行40个工作日没有再出现跳变。

这个案例说明,排查这类问题不能只盯着芯片本身,布线、结构、振动、电磁耦合这些工程因素往往才是真正的元凶。仪器仪表开发有一半时间是和环境干扰做斗争,这个结论放到今天依然成立。

6.3 校准环节容易忽视的细节

校准工作看起来简单,实际操作中却有几个容易被忽视的细节。

第一,校准用的精密电阻箱要选四端开尔文结构,如果只是两线制的电阻箱,接触电阻几毫欧到几十毫欧的漂移,换算成温度就是不可忽略的误差。

第二,校准时电路板要盖上外壳,风道保持正常通风状态。如果裸板校准、装机后使用,因为风道对电路板散热的影响,板温和变换器内部的温度梯度会变化,校准值就“错位”了。

第三,校准系数的存储必须有冗余校验。我通常用两个备份区,每次写入交替更新,读取时先验证CRC,不一致就报错并让设备进入维护模式。这个功能在后期运维中省了很多事,毕竟设备安装到现场后,很难再安排人去拆壳校准。

7. 从方案到产品的扩展思考

这套方案目前是单板实现,但实际产品化时还能扩展很多方向。比如多通道扩展,ADS122U04本身只有4路差分输入,如果需要测8路温度,可以换用ADS122U08或者用两个ADS122U04并联,共用SPI总线,片选分开即可。这在硬件上改动很小,主要的代价是MCU要多一个GPIO做片选。

还有一个考虑是把MCU换成带CAN外设的型号。工业HVAC系统里,多个温度采集节点通过CAN总线把数据汇总到控制器是常见架构。STM32L432KC没有CAN,我在外扩CAN收发器MCP2515时占用了一个SPI接口,导致ADC和CAN共用SPI总线,仲裁逻辑复杂了不少。如果重新选型,我会考虑STM32L4系列里带FDCAN的型号,比如STM32L4A6,省掉外扩CAN控制器的钱和代码量。

从功耗角度看,ADS122U04在低功耗模式下可以做到几十微安的电流消耗,配合STM32L432KC的STOP模式,整套系统完全可以用电池供电做现场巡检工具。温度巡检仪的电池续航能做到几个月甚至一年以上。这里的关键是:测量时要等待ADC稳定后再读,读完后立刻进入低功耗,否则漏电电流会远远大于芯片自身的低功耗性能。我在开发时实测过,如果SPI引脚没有全部下拉,MCU睡眠时I/O漏电流可能达到几百微安,比正常工作消耗还大。这个坑在低功耗设计中非常常见。

我个人在实际操作中的体会是,ADS122U04这颗ADC的潜力比它的名气大得多。刚开始用它时,我也觉得TI的文档写得不是特别清晰,寄存器配置要反复对照参考手册和勘误表,但一旦把硬件和驱动跑顺了,它的稳定性和精度在同价位产品里确实是第一梯队的。尤其是比例测量加上三线制PT100,经过校准后做到±0.15℃的长期精度并不困难,这已经超过了很多HVAC行业传感器的需求。

最后再分享一个细节技巧:在PCB上预留一个两针跳线盒,把IDAC1输出到AIN0之间的走线断开,跳线帽插上时正常工作,拔掉后可以用来测试传感器断线检测功能。这个设计在产线和售后调试中都帮了大忙,检查现场布线故障时可以迅速确认到底是传感器问题还是主机问题。小小的改动,省下来的排查时间远超想象。

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

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

立即咨询