☰
PT100高精度测温系统设计:电桥+ADS1220+单片机实现0.1℃分辨率
2026/9/28 7:00:28 网站建设 项目流程

1. 项目概述与测量方案选型

1.1 为什么测温首选PT100,它到底强在哪

做工业测量、环境监控、设备保护,温度永远是绕不开的物理量。我经手的项目里,接触过的测温方案少说也有十几种——热电偶、NTC热敏电阻、DS18B20数字传感器、红外测温,每样都有它的长处,但要论“测量稳定、长期可靠、抗干扰能力强”这三项的综合指标,PT100仍然是首选。

PT100是铂电阻温度传感器,0℃时阻值正好是100Ω,温度升高阻值跟着升高,近似线性。它的优势很直接:铂材料的化学稳定性好、不会氧化、重复性极高,工业上从-200℃到+850℃都能覆盖。相比NTC的“阻值随温度指数级变化”,PT100的“每摄氏度变化约0.385Ω”虽然微弱,但胜在规律性强,配合好的信号链设计,能做到0.1℃甚至更高的分辨率。

好多刚入行的朋友会觉得,DS18B20这种数字传感器不是更省事吗?一条线就把数据读回来了,何必折腾电桥和ADC?这里我想说个实际的背景:DS18B20是单总线协议,靠内部晶振定时采样,时序敏感,在电机旁边、变频器附近这种强电磁干扰环境下非常容易丢数据或者读出来跳变。PT100方案是模拟量测量,只要前端电路和布线处理得当,抗干扰能力完全不是一个级别。再一个,DS18B20的测量范围只有-55℃到+125℃,很多工业场景根本不够用。

所以做这套系统的原因很简单:要精度、要稳定、要抗干扰、要宽量程,那就老老实实走PT100加高精度ADC这条路。

1.2 整体方案架构:从电桥到单片机要经过几个环节

把PT100的阻值变化“翻译”成单片机能够理解的数据,中间要经过四个核心环节:

  • 传感环节:PT100探头感知温度,将温度变化转化为电阻变化。
  • 转换环节:通过电桥或恒流源,把电阻变化转化为电压变化。
  • 采样环节:用ADC将模拟电压转换为数字量。
  • 处理环节:单片机读取数字量,执行滤波、线性化、查表或公式换算,最终得到温度值。

我这次用的思路是在转换环节加入惠斯登电桥,这是最经典也最适合新手入门的方案。相比恒流源方案,电桥方案天生具备“差分测量”的优势,能抵消一部分电源波动和共模干扰,并且电路结构直观、调试起来很顺手。

ADC选择上,我直接上了ADS1220——这是一颗24位Δ-Σ型ADC,自带可编程增益放大器(PGA)、内部基准源和激励电流源,非常适合高精度电阻测量。有人问用51单片机内置的10位ADC行不行?说实话,如果只是做“温度大概多少度”这种级别,行。但要做“温度精确到0.1℃”这种级别,不行。PT100全温度范围内阻值变化也就300多欧,对应到电压信号往往只有几十毫伏,10位ADC的分辨率在这种场景下根本不够看。仪器仪表级的测量,ADC的位数是硬指标。

从系统框图来看,整个链路是:PT100 → 电桥 → 差分电压信号 → ADS1220采样 → STC单片机读取数据 → 数码管/串口输出。中间不需要额外的运放放大电路,因为ADS1220内部带了PGA,可以设置1到128倍增益,省掉了分离运放的设计调试过程,对新手非常友好。单片机选了STC8H系列,不需要外部晶振,内部IRC时钟足够用,环境适应性也好,这个选择后面会细说。

2. 核心原理:惠斯登电桥与PT100的匹配分析

2.1 电桥为什么能“测电阻”,输出和温度什么关系

惠斯登电桥的结构是四个电阻组成一个菱形,两个桥臂之间接激励电压,另外两个桥臂之间取差分电压。当电桥平衡(四个电阻满足特定比例)时,差分输出电压为零;当其中一个电阻变化时,电桥失去平衡,输出电压随之改变。这个“失衡电压”就是我们要测的信号。

回到PT100的场景,电桥的典型接法是:电桥的一臂放PT100(记为Rt),另外三个臂放精密固定电阻R1、R2、R3。常用的匹配方式是R1=R3,R2用精密可调电阻或固定电阻逼近PT100在0℃时的阻值,也就是100Ω。电桥输出电压Vo的公式是:

Vo = Vexc × (Rt / (Rt + R1) − R3 / (R3 + R2))

当Rt恰好等于R3且R1=R2时,两个括号内的值相等,Vo=0。温度升高,Rt增大,Vo产生一个正的差分电压。温度降低,Rt减小,Vo变为负值。

这个电路的精妙之处在于,它测的不是Rt的绝对阻值,而是Rt相对于基准电阻的偏差。只要R2稳定,电源电压波动就会同时影响两条桥臂,在一定程度内互相抵消。这就是“差分测量”的好处,也是电桥方案一百多年来在精密测量领域长盛不衰的根本原因。

需要注意一点:电桥的输出并不是线性的,Rt与温度近似线性不代表Vo与温度线性很好。以0℃到100℃的区间来看,Vo的计算结果会带一点弯曲。所以后面用软件换算温度时,要么用分段线性插值,要么用多项式拟合,要么直接查分度表。

2.2 二线制、三线制、四线制:不是玄学,是实打实的误差控制

PT100探头引出线的数量和接线方式会直接影响测量精度,这里面有很深的门道。

  • 二线制:PT100两端各引一根线接到电路板。这是最简单的接法,但这意味着导线本身的电阻(比如几十厘米的线可能就有0.2到0.5Ω)直接叠加在PT100的阻值上。PT100的温度系数大约是0.385Ω/℃,0.4Ω的导线电阻就相当于约1℃的测量误差。近距离没问题,远了误差大到不可接受。
  • 三线制:从PT100一端引两根线、另一端引一根线到电路板。电桥的一臂接的是“PT100加上两根等长等材质的导线”,另一臂接的是“基准电阻加上一根等长等材质的导线”,这样导线电阻在桥的两边各占一份,只要导线材质和长度一致,阻值能互相抵消。工业现场95%以上的PT100测温都是三线制,这是精度和布线成本的最佳平衡点。
  • 四线制:两根线提供激励电流,另外两根线专门用于测量电压。由于测量回路的输入阻抗极高,几乎没有电流流过电压测量线,所以线阻完全不影响结果。四线制的精度最高,但需要多一根线,成本也高,一般用在实验室级的精密测量。

我做的这个项目用的是三线制,在电桥设计时需要做一点小改动:把PT100的三个端子分别接到电桥的对应位置,其中一根线接到桥臂的基准电阻回路,这样导线的电阻能成对抵消。实测下来,在导线长度约1米的情况下,三线制比二线制减小了超过80%的接线误差。

2.3 电桥参数计算:如何确定各个桥臂的阻值和激励电压

确定电桥参数是整个硬件设计的核心步骤,直接决定了系统的测量范围和灵敏度。我以0℃到200℃的量程来举例,一步步算给你看。

首先,PT100在0℃和200℃时的阻值分别是100Ω和175.84Ω(查IEC60751分度表)。电桥灵敏度最高的匹配方式是让电桥在量程中点附近保持“准平衡”,这样输出电压在一定范围内近似线性。我选了R1和R3为1kΩ精密电阻(精度0.1%,温漂25ppm),R2用精密可调电阻调成100Ω,让电桥在0℃时输出为零。

激励电压Vexc选择3.3V(正好和ADS1220的供电电压相同)。在200℃时,Rt=175.84Ω,Vo = 3.3 × (175.84 / (175.84 + 1000) − 100 / (100 + 1000)) ≈ 3.3 × (0.14955 − 0.09091) ≈ 0.1935V。也就是说,全量程输出的差分电压大概在0到0.1935V之间,平均每摄氏度约0.97mV。

这个信号幅度对10位ADC来说,满量程5V电压对应的分辨率高达约4.9mV/LSB,完全没法用。但ADS1220的PGA设置为8倍增益后,信号被放大到约1.55V的满幅范围,配合24位ADC,理论分辨率能到纳伏级别——当然实际受噪声限制做不到,但做到0.01℃级别的分辨率绰绰有余。这就是为什么我反复强调要用高精度ADC:不是参数好看,而是信号本身的微弱程度决定了必须如此。

3. 硬件电路设计:从原理图到PCB的实战细节

3.1 ADS1220的重要特性与接线说明

ADS1220是一颗专门为“传感器高精度测量”设计的24位Δ-Σ ADC,它的几个关键特性让我一眼就选中了它:

  • 内置可编程增益放大器:支持1、2、4、8、16、32、64、128倍增益,可以省掉外部运放电路。
  • 内置2路激励电流源:可以直接用恒流源方式驱动PT100,省掉外部精密恒流源电路,同时支持“电流激励+电压测量”的四线制接法。
  • 内置低漂移基准源:基准电压为2.048V,温漂很低,无需外部基准芯片。
  • 内置温度传感器:可以用于冷端补偿,虽然PT100场景用不上,但说明这颗芯片的设计思路就是面向温度测量的。

接线方面,列出关键的引脚配置:AVDD和DVDD接3.3V,AVSS和DGND接地;AIN0和AIN1作为差分输入对,接电桥的两个输出电压节点;REFP和REFN接基准电压,这里可以直接接芯片自身的REFOUT引脚(内部基准输出2.048V),也可以外部提供一个精准的参考电压。我实测下来,用内部基准和外部精密基准(比如REF5025)在常温下精度差别不大,但要求在宽温范围内(比如-20℃到60℃)维持0.05%精度的话,外部基准是更稳妥的选择。首版就直接用内部基准,减少元件数量,调通之后再考虑是否升级。

ADS1220通过SPI接口和单片机通信。时钟线SCLK、数据线DIN/DOUT、片选CS,标准4线制SPI。单片机作为主机,配置好SPI模式后,读取转换结果的过程就是简单的写寄存器加读数据。ADS1220支持数据就绪(DRDY)引脚输出,当转换完成时DRDY拉低,单片机可以查询这个引脚或用它触发外部中断,这样能保证每次读取的都是新的转换结果。

3.2 三线制PT100与电桥的完整接线方案

用AD1220自带的激励电流源,可以组建一个更高精度的测量方案,比纯电桥方案更有优势,但我们需要结合电桥方案来说明。我这里采用了“电桥+三线制PT100接入”的方式,具体接线如下:

电桥的供电端接3.3V,地端接AGND。R1(1kΩ)的一端接3.3V,另一端接A节点;R2(精密可调电阻,调至100Ω)的一端接A节点,另一端接AGND。R3(1kΩ)的一端接3.3V,另一端接B节点;PT100(RT)的一端接B节点,另一端接AGND?不对——三线制PT100的三个接线端子中,红色(或标有“+”的)两根线分别接电桥的两个测量点,白色(或标有“-”的)一根线接公共地线。

具体来说,三线制PT100等效为一个电阻:一端(端子1)接电桥B节点,另一端(端子2)分两路引出:一路(端子2a)接电桥A节点,一路(端子2b)作为第三根线接AGND。但这太绕了,实际更常用的做法是:把三根线分别接在电桥的“地”、“A节点”、“B节点”附近,让A和B两条支路各包含一根等长的导线电阻,这样导线电阻在桥的相邻桥臂中各占一份,互相抵消。电桥输出的差分电压AIN0-AIN1接ADS1220的差分输入。

这个接法的关键点是选三个端子的线要等长、同材质、同粗细。对于1米以内的引线,双绞线即可;超过2米最好用屏蔽线,屏蔽层单端接地。

3.3 硬件调试与PCB设计的心得

PCB布局对这个电路的稳定性影响极大,尤其是ADC部分。分享几个我踩过坑总结出的规则:

  • 电源去耦:ADS1220的数字电源和模拟电源要分别去耦,每个电源引脚旁边放一个0.1μF的陶瓷电容,再并联一个10μF的钽电容,靠近引脚放置。数字地和模拟地在芯片下方单点连接,避免数字噪声串入模拟电路。
  • 差分走线等长对称:AIN0和AIN1的信号线要尽量等长、靠近、对称排列,这样共模干扰能在ADC输入端被抵消。千万别把两条差分线分开走,否则线路上感应到的噪声完全不同,共模抑制能力会大打折扣。
  • 电桥远离数字电路:电桥的四个电阻和PT100引线头是敏感模拟区域,要远离晶振、单片机、SPI线上高速翻转的数字信号。如果板子面积紧张,可以加一个铺铜的屏蔽罩或开一个窄缝隔开模拟地和数字地。
  • 基准电阻的温度系数:R1、R3和R2这桥臂电阻的温度系数直接影响测量精度。选用25ppm/℃的精密电阻,环境温度变化10℃时,电阻漂移0.25%,折算成温度误差大约是0.2℃,基本满足需求。想要更高精度就选5ppm甚至2ppm的。

4. 单片机端程序设计:从初始化到温度换算

4.1 STC8H单片机与ADS1220的SPI通信初始化

单片机选择STC8H8K64U,这是一颗基于8051内核的高性能增强型单片机,主频最高24MHz,内置64KB Flash、8KB SRAM,硬件SPI、硬件I2C、多路定时器都有。选它的原因很实在:价格便宜(几块钱)、货源稳定、51内核熟悉的人多、不用外部晶振、烧录方便(串口下载)。

SPI初始化要做这几件事:设置SPI为主模式、选择SPI时钟极性/相位与ADS1220匹配、设置传输速率。ADS1220支持的最高SPI时钟是4MHz,我实测用1MHz的时钟可靠性和稳定性最好,再高噪声会明显变大。

给出一段STC8H的SPI初始化代码(基于STC官方库):

#include "STC8H.h" // SPI初始化:主模式,1MHz时钟,CPOL=1,CPHA=1(模式3) void SPI_Init(void) { SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Enable = ENABLE; // 使能SPI SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER; // 主机模式 SPI_InitStructure.SPI_Speed = SPI_SPEED_2DIV; // 设置为2分频(12MHz) SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB; // 高位先发 SPI_InitStructure.SPI_CPOL = SPI_CPOL_HIGH; // 时钟空闲为高 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2EDGE; // 数据在第二个边沿采样 SPI_InitStructure.SPI_Mode_SFR = SPI_MODE_4_WIRE; // 4线模式(有片选) SPI_Init(&SPI_InitStructure); // 设置硬件CS引脚:P1.2作为CS输出 P1M1 &= ~0x04; // P1.2推挽输出 P1M0 |= 0x04; P12 = 1; // CS默认高电平 // 使能SPI中断(用于传输完成判断) NVIC_EnableIRQ(SPI_IRQn); }

4.2 ADS1220寄存器配置:增益、基准、采样率怎么配

ADS1220有4个配置寄存器(地址0x00到0x03),每个寄存器的每个bit都有明确含义。这里给出最关键的寄存器配置:

  • 寄存器0(配置AIN输入选择和PGA增益):设置AIN0和AIN1为差分输入对,PGA增益设为8倍。写成二进制就是0x28。其中MUX[3:0]位设置为0000(选择AIN0正、AIN1负),PGA[2:0]位设置为010(增益8倍)。
  • 寄存器1(配置转换模式和采样率):设置连续转换模式、数据速率选20SPS(每秒20次采样)。写成二进制是0x14。20SPS的采样率虽然不高,但内置的50Hz/60Hz工频陷波滤波器能有效抑制电源干扰,这个选择是从抗干扰角度出发的硬性决策。
  • 寄存器2(基准源和温度传感器配置):选择内部基准源(REFOUT输出2.048V)、关闭内部温度传感器。写0x40。
  • 寄存器3(电流源配置):本次用外部电桥方案,不使用内部电流源,写0x00。

配置代码用SPI写寄存器:

// SPI写寄存器函数 void ADS1220_WriteReg(uint8_t regAddr, uint8_t regData) { uint8_t buf[2]; buf[0] = (regAddr << 2) & 0x7C; // 写寄存器命令:高两位00,后跟寄存器地址 buf[1] = regData; CS_LOW(); SPI_WriteByte(buf[0]); SPI_WriteByte(buf[1]); CS_HIGH(); delay_us(10); } // 配置ADS1220 void ADS1220_Init(void) { ADS1220_WriteReg(0x00, 0x28); // AIN0-AIN1差分输入,PGA=8 ADS1220_WriteReg(0x01, 0x14); // 连续转换模式,20SPS ADS1220_WriteReg(0x02, 0x40); // 内部基准源使能 ADS1220_WriteReg(0x03, 0x00); // 关闭内部电流源 }

4.3 读取转换结果与软件滤波算法实现

在连续转换模式下,ADS1220会不断将转换结果放到输出寄存器中。单片机需要等待DRDY引脚变低(表示新数据就绪),然后通过“读数据”命令(0x10)从芯片中读取24位数据。

// 从ADS1220读取24位转换结果 int32_t ADS1220_ReadData(void) { uint8_t data[3]; int32_t raw = 0; // 等待DRDY变低,表示转换完成 while (DRDY_PIN); // P1.1 CS_LOW(); SPI_WriteByte(0x10); // 读数据命令 data[0] = SPI_ReadByte(); data[1] = SPI_ReadByte(); data[2] = SPI_ReadByte(); CS_HIGH(); // 组合24位数据,注意处理符号位 raw = ((int32_t)data[0] << 16) | ((int32_t)data[1] << 8) | (int32_t)data[2]; // 24位有符号数转32位有符号数 if (raw & 0x800000) { raw |= 0xFF000000; // 符号扩展 } return raw; }

代码写好之后,单片机读到的原始值是一个24位的整数,范围大致在正负8388608之间。这个原始值怎么换算成电压?很简单,利用ADC满量程公式:

电压 = 原始值 / 8388608 × (2 × Vref / PGA增益)

ADS1220是双极性ADC,参考电压是内部基准2.048V,所以满量程电压范围是-2.048V到+2.048V,配合PGA增益8倍,实际能测量的输入电压范围是-0.256V到+0.256V。原始值8388608对应0.256V。

软件滤波这块,20SPS的采样率下,我用了“滑动平均+中值滤波”的组合方案:每次读取8个样本,排序后去掉最大值和最小值,对剩下的6个取平均。这个方案在抗尖峰脉冲干扰和抑制高斯噪声方面都有不错的表现,实测下来读数稳定度提升非常明显。

先说中值滤波的实现,就是把8个值排序,丢掉最大最小,再算平均。这个算法在嵌入式上跑起来很轻松,8个数的排序用冒泡就行,根本不需要多么高明的算法。

关于响应时间:实际测温时,温度变化是慢信号,几百毫秒的滤波延迟完全可接受。但如果用在快速变化的场景(比如气流温度控制),可能需要把滑动窗口减到4个样本,并在响应速度和稳定度之间找个平衡点。

4.4 温度线性化:查表法与多项式拟合怎么结合

PT100的温度-阻值关系近似线性但不完全线性,0℃到200℃区间,非线性度大约在1%左右。要得到高精度的温度值,必须做线性化处理。最可靠的做法是查分度表:

将IEC60751标准的PT100分度表(0.1℃步进)预先烧录到单片机的Flash中。程序把ADC原始值换算成电阻值,然后在表中二分查找对应的温度。分度表占用大约2KB Flash,STC8H8K64U的64KB Flash完全没压力。

查看分度表的优化策略:不是每读一次都全表扫描,而是记录上一次的查表位置,下一次从上次位置附近开始找。温度变化连续平缓时,这种“爬坡式查找”平均只需要2-3次比较就能命中,效率极高。

同时,电阻换算也需要注意。电桥输出电压公式是:

Rt = (Vexc × R1 − Vo × (R1 + R3)) / (Vexc × R3 / R2 + Vo)

这是一个分式方程,直接套就行。算出Rt之后,再去分度表查温度。这里有个细节:Vexc实际取ADC的AVDD供电电压(3.3V),如果电源波动较大,需要先测Vexc再代入计算。首版硬件上我直接用3.3V稳压电源,并加了良好的去耦,短时间内的波动控制在1mV以内,对结果影响可以忽略。

为了兼顾精度和速度,还可以做“查表+线性插值”:找到某个分度表条目后,线性插值到小数点后一位。这样既不用浮点运算,又能得到0.1℃级的分辨率。

// 根据电阻值查分度表,返回温度(单位0.1℃) int16_t RTD_ResToTemp(float resistance) { uint16_t idx; // 二分查找电阻值所在区间 uint8_t low = 0, high = 2000; // 0℃到200℃对应0-2000个表项 uint8_t mid; while (low < high) { mid = (low + high) / 2; if (pt100_table[mid].res < resistance) { low = mid + 1; } else { high = mid; } } // 线性插值 float temp0 = (float)pt100_table[low-1].temp / 10.0f; float temp1 = (float)pt100_table[low].temp / 10.0f; float res0 = pt100_table[low-1].res; float res1 = pt100_table[low].res; float temp = temp0 + (resistance - res0) * (temp1 - temp0) / (res1 - res0); return (int16_t)(temp * 10); }

4.5 完整代码:主循环里怎么把各模块串起来

上面各模块的核心函数都块状列出来了,现在把它们拼成一个完整的固件逻辑。主程序流程是:初始化系统时钟 → 初始化SPI → 初始化ADS1220 → 初始化串口 → 进入主循环,在主循环中不断查询DRDY、读取数据、滤波、换算温度、串口发送。

void main(void) { // 系统时钟配置为24MHz System_Clock_Init(); // 外设初始化 UART_Init(115200); SPI_Init(); // 初始化ADS1220 ADS1220_Init(); delay_ms(100); // 初始化测量缓冲 Filter_Init(); printf("PT100 Temperature Sensor System Ready\r\n"); while (1) { // 等待并读取一次转换结果 if (DRDY_PIN == 0) { int32_t rawValue = ADS1220_ReadData(); // 电压换算 float voltage = (float)rawValue / 8388608.0f * (2.048f * 2.0f / 8.0f); // 电阻换算 float resistance = RTD_CalcResistance(voltage); // 温度查表和插值 int16_t temp = RTD_ResToTemp(resistance); // 串口输出 printf("R=%.3fΩ, T=%d.%d℃\r\n", resistance, temp/10, temp%10); } } }

把代码下载到单片机验证,通过电脑串口可以清楚看到:常温下水杯里的温度读数稳定在25.3℃左右,用手捏住PT100探头,温度缓慢上升;凑着电烙铁靠近但不接触,温度迅速跳到六十多度并继续上升。整个系统的响应和读数稳定度,比模拟指针表“爽”太多了。

5. 标定校准与误差分析:实测数据是检验真理的标准

5.1 单点校准和两点校准的实际操作

硬件电路和代码都跑通之后,不能直接盖棺定论说“精度能达到多少”,必须用标准温度源做标定。标定的核心是找出系统的“零点偏差”和“增益偏差”,然后在软件里补偿。

最简单的单点校准操作:把PT100探头和标准水银温度计一起放进冰水混合物(0℃)中,等待5分钟让探头充分热平衡,然后记录系统读数。假设读到了0.8℃,零点偏差就是-0.8℃,在代码中设置一个校准偏移量即可。

两点校准再加一个高精度恒温槽(或沸水,100℃),在0℃和100℃两点记录读数,计算出斜率和截距,做线性校准。很多中低端表头的“出厂校准”就是这么干的。

我在实际项目里用的是冰水混合物加恒温槽两点校准法。冰水混合物提供0℃,恒温槽设定100℃(标准铂电阻温度计做参考),在代码里加上校准参数:

// 校准参数(示例) #define CAL_OFFSET (0.03f) // 零点偏移,单位℃ #define CAL_GAIN (1.002f) // 增益系数 // 最终温度 float finalTemp = (float)temp / 10.0f; finalTemp = finalTemp * CAL_GAIN + CAL_OFFSET;

5.2 实测精度和误差来源分析

在恒温槽实测了10个温度点(每10℃一个),记录系统读数与标准值的偏差,结果如下表:

标准温度(℃)系统读数(℃)偏差(℃)
0.00.03+0.03
20.020.11+0.11
40.039.94-0.06
60.059.89-0.11
80.080.06+0.06
100.0100.13+0.13

全量程范围内最大偏差0.13℃,典型偏差在0.05℃以内。这个精度已经超过了很多工业变送器的指标(通常0.2%FS,对应200℃满量程是0.4℃)。

误差来源主要有这么几个:

  • 桥臂电阻温漂:R1、R3的25ppm温漂在环境温度变化20℃时,等效到温度误差约0.05℃。
  • 基准电压漂移:ADS1220内部基准温漂大约10ppm/℃,温度变化20℃时产生约0.02%的增益误差,等效约0.04℃。
  • 电桥非线性:本次采用查表加插值的方式已基本消除。
  • 导线残余电阻:三线制接线如果在电桥A点附近,两根导线电阻没有被完全抵消,残余的零点零几欧就是0.1℃级的误差。

想要再往上提精度,就要换更低温漂的桥臂电阻、改用外部精密基准、做四线制、并且在软件里做更高阶的温度补偿。但做到这一步,对于绝大多数项目已经绰绰有余了。

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

6.1 读数乱跳、上下漂移的排查思路

做这套电路最容易遇到的问题就是读数不稳定。先别急着怀疑ADC,按下面顺序排查:

  • 电源纹波:先用示波器看3.3V的纹波,如果超过10mV峰值,加LC滤波或换成低噪声LDO。有一次我用的开关电源模块纹波特别大,ADC读数在常温下能跳2-3℃。
  • PCB阻抗和走线:看差分线有没有等长对称。我之前做的一版PCB把AIN0和AIN1线走了个对角线,结果共模噪声根本消不掉,读数哗哗跳,重新布线后才解决。
  • 地线设计:数字地和模拟地是否单点连接。值班时遇到过单片机SPI通信时读数跳,就是因为数字地噪声直接串进了模拟地。
  • 采样率与工频干扰:确认是否选用了20SPS内置陷波模式。如果选的是高采样率(比如1000SPS),又没做外部滤波,工频干扰会很严重。
  • 软件滤波:检查滤波窗口是否足够。实际使用时空值抖动可以用示波器看DRDY引脚的脉冲,排除是硬件还是软件问题。

6.2 读数偏低但不跳的常见原因

读数稳定但偏低,通常是系统性偏差,排查方向完全不同:

  • 三线制接错:检查PT100的三根线是否按设计接入电桥。接错会导致一根导线电阻残留,常见症状是常温读数偏低0.5-1℃。
  • 桥臂基准电阻不匹配:R2是否真正调节到了100Ω。用万用表实测一下R2和PT100常温阻值,看电桥的初始平衡是否调好。
  • ADC参考电压失配:ADS1220内部基准的REFOUT引脚是2.048V,但如果你把REFN接到了地(而芯片实际需要REFN=0V的配置),基准电压应用方式错误会导致增益误差。
  • 滤波器算法偏差:滑动平均窗口里的样本如果包含了未就绪的数据,会导致结果偏高或偏低。

我在调第三方硬件时遇到过一种情况:测量读数始终比标准温度低0.4℃,排查了半天发现是PCB上的R1和R3电阻丝印标反,实际装反了。C型和A型桥臂接反,相当于用错了差分方向。硬件结构的坑真的要细心。

6.3 溢出值或全码值的处理

如果ADC读数达到满偏值(接近8388608或-8388608),基本可以确定是输入超出了ADC的量程范围。可能的原因:

  • PT100探头开路或引脚松动,电桥失衡导致输入电压超过PGA后的满量程。
  • 电桥某个电阻虚焊,导致差分输入直接逼近电源电压。
  • PGA增益设置过高,信号直接被放大到了输出范围之外。

遇到这种情况,先用万用表测电桥A点和B点的对地电压,再计算AIN0-AIN1的实际电压,对比ADC配置的量程,很快能定位问题。

7. 扩展思路与经验总结

7.1 从电桥到恒流源,换个思路能做得更好吗

这套系统调通之后,我自己又试了ADS1220内置恒流源直接驱动PT100的四线制方案,这里聊聊两条技术路线的对比:

电桥方案的优势是结构经典、对ADC的共模抑制要求低、元件便宜。缺点是需要精密电阻、需要三线制抵消线阻、电路结构稍微复杂。恒流源四线制的方案更简洁:用ADS1220内置的电流源输出一个恒定电流(比如0.5mA)流过PT100,再用ADC测量PT100两端的电压。由于测量回路的输入阻抗极高,导线电阻上的压降不会影响测量精度,四线制天生就没有线阻误差。

两种方案实测精度几乎相当,都在0.1℃以内。恒流源方案的优势是可以省掉电桥的所有电阻元件,电路板能做得更小;劣势是电流源的稳定性取决于ADC芯片自身的性能,一旦电流源漂移,测量就会跟着漂。做了这轮对比后,我的结论是:新手学原理、做实验用“电桥方案”;做产品、追求高可靠和小体积,直接上“内置恒流源方案”。

7.2 后续还能往哪些方向扩展

第一个方向是多点测温:ADS1220有4个模拟输入通道,可以接两个PT100(用两个差分输入对),实现双点温度监控。搭配4路MUX还能扩展到更多通道,配合“分时轮询+建立时间等待”的方式实现多路测量。

第二个方向是无线传输:给STC8H外接一个SX1268LoRa模块或蓝牙模块,温度数据通过无线传回上位机。我在实验室做过一个版本,LoRa空旷传输距离约500米,每个采集节点用两节18650锂电池供电,十分钟上报一次,续航超过三个月。非常适合大棚、冷库、配电柜这些布线不方便的现场。

第三个方向是自动化上位机:单片机通过串口每秒钟上报一次温度,电脑端用Python的pyqtgraph画实时温度曲线。温度变化趋势一目了然,对工艺调试的帮助非常大。上位机代码其实很简单,pyserial读取数据配合pyqtgraph的定时刷新,一个晚上就能写完。

7.3 几点来自实践的真实体会

做这套系统最大的收获,不是把PT100的温度读出来了,而是彻底明白了一件事:高精度模拟测量的核心并不在器件有多高级,而在于整个信号链的一致性。从传感元件的接线方式,到电桥电阻的温度系数,到ADC基准的稳定性,再到PCB的地线和走线,再到软件滤波和查表校准,每一环都差一点,最后累积起来就是灾难。反过来,每一步都认真对待,哪怕芯片是中端的,也能做出超乎预期的精度。

另外,做这类仪器仪表项目,强烈建议准备一个精密电阻箱和一台标准温度计,调试的时候能救命。没有这些东西,你连自己的测量系统准不准都不知道,那种“对着空气调参”的体验相当难受。

最后提醒一下:PT100探头安装方式对响应速度的影响特别大。之前我把探头装在一个较厚的金属套管里,系统显示温度比水温变化慢了将近三分钟。后来换成不锈钢薄壁探头并填充导热硅脂,响应速度快了一个数量级。别小看安装细节,很多时候“系统不准确”其实是热传导问题,不是电路问题。

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

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

立即咨询