拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PT100高精度测温系统设计:电桥+ADS1220+单片机实现0.1℃分辨率

PT100高精度测温系统设计:电桥+ADS1220+单片机实现0.1℃分辨率 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。常用的匹配方式是R1R3R2用精密可调电阻或固定电阻逼近PT100在0℃时的阻值也就是100Ω。电桥输出电压Vo的公式是Vo Vexc × (Rt / (Rt R1) − R3 / (R3 R2))当Rt恰好等于R3且R1R2时两个括号内的值相等Vo0。温度升高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%温漂25ppmR2用精密可调电阻调成100Ω让电桥在0℃时输出为零。激励电压Vexc选择3.3V正好和ADS1220的供电电压相同。在200℃时Rt175.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.3VAVSS和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。R11kΩ的一端接3.3V另一端接A节点R2精密可调电阻调至100Ω的一端接A节点另一端接AGND。R31kΩ的一端接3.3V另一端接B节点PT100RT的一端接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时钟CPOL1CPHA1模式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差分输入PGA8 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 FlashSTC8H8K64U的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.030.0320.020.110.1140.039.94-0.0660.059.89-0.1180.080.060.06100.0100.130.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接到了地而芯片实际需要REFN0V的配置基准电压应用方式错误会导致增益误差。滤波器算法偏差滑动平均窗口里的样本如果包含了未就绪的数据会导致结果偏高或偏低。我在调第三方硬件时遇到过一种情况测量读数始终比标准温度低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探头安装方式对响应速度的影响特别大。之前我把探头装在一个较厚的金属套管里系统显示温度比水温变化慢了将近三分钟。后来换成不锈钢薄壁探头并填充导热硅脂响应速度快了一个数量级。别小看安装细节很多时候“系统不准确”其实是热传导问题不是电路问题。
返回列表