在工业控制的众多参数中,温度的测量看似基础,但当精度要求提到小数点后一位(±0.1°C),甚至更高时,它就从一个简单的技术问题,演变成一场对稳定性、一致性和工艺细节的全面考验。
2004年,当我开发热计量表产品时,面临的正是这样的挑战。国标要求,每一台表都必须对“进、回水”温度进行独立高精度测量,精度在±0.1°C以内。今天,我就来解密这个经过近20年验证,基于MSP430F415 + PT1000铂电阻的经典方案。
一、 为什么是PT1000 + 电容充放电法?
在众多测温方案中,我们选择了可靠、也颇具挑战性的路径。
1. PT1000铂电阻:
- 优势:相比PT100,其在0°C时的1kΩ阻值更大,使得由引线电阻引起的相对误差更小,更适合精度要求高的场合。
- 挑战:其电阻变化率约为3.851Ω/°C。要分辨0.1°C的温度变化,意味着我们必须能稳定地测量出约0.385Ω的微小阻值变化。这对测量电路的精度和抗干扰能力是巨大考验。
2. 电容充放电法:化繁为简的智慧
为什么不直接用ADC?因为当时高精度、低温漂的Σ-Δ ADC成本高昂,且基准电压的微小漂移会直接影响结果。我们采用了一种更为巧妙的方法:将电阻值转化为时间进行测量。
- 核心思想:利用同一电容通过不同电阻放电,放电时间与电阻值成正比(τ=RC)。只要精确测量这个“时间”,就能反推出电阻值。
- 核心优势:测量基准是时间,而MSP430的定时器捕获精度可以轻松做到极高,且不受电压基准漂移影响。这巧妙地绕过了模拟电路的精度瓶颈。
二、 核心电路:如何设计一个“可靠电路”
下图是实现这一思想的经典电路:
电路设计精要解读:
- 电容C5:选用CBB电容至关重要。其介质损耗低,温度系数小,保证了充放电曲线的一致性。电解或钽电容因温漂大,不太适合。
- U2 (ADG704):这是电路成功的关键器件。我们放弃了通用的CD4051这类器件,因为其几百欧姆且不稳定的导通电阻会直接影响微小的PT1000阻值变化。ADG704的导通电阻仅约2Ω,且温漂极小,也可以使用4个单路开关如SN74CBT1G125等,但占用板子面积会大一些。
- 电阻:
- R5 (1kΩ):精密电阻,作为测量的基准。我们要求其精度0.1%以上,温漂15PPM以下,它的稳定性直接决定了整个系统的精度。
- R6, R7 (PT1000):被测铂电阻。
- R4 (1kΩ):充电电阻,阻值大小影响充电速度,与精度无直接关系。
工作流程:
步骤1(复位):闭合S1(通过ADG704),通过R4给电容C5充满电。
步骤2(校准):断开S1,闭合S2,让电容通过基准电阻R5放电。MSP430的捕获单元记录电压降至阈值所需时间 T_基准。
步骤3(测量1):重新充电后,闭合S3,让电容通过进水PT1000 (R6)放电,记录时间 T_进水。
步骤4(测量2):重新充电后,闭合S4,让电容通过回水PT1000 (R7)放电,记录时间 T_回水。
最终计算:根据公式 R_PT1000 ≈ R_基准 * (T_PT1000 / T_基准),即可算出电阻值,再通过PT1000分度表查得温度。
ADG704的真值表清晰地定义了如何控制这四路开关:

三、 代码实现:
MSP430F415内置的比较器A(Comparator_A)和定时器捕获功能,是实现高精度时间测量的完美组合。
#include<msp430f415.h>
#include <math.h>
// ADG704控制引脚定义 根据电路实际连接调整
#define A01 P2OUT|=BIT0 //A0=1
#define A00 P2OUT&=~BIT0 //A0=0
#define A11 P1OUT|=BIT5 //A1=1
#define A10 P1OUT&=~BIT5 //A1=0
#define EN1 P2OUT|=BIT0 //EN=1使能
#define EN0 P2OUT&=~BIT0 //EN=0 禁用
unsigned int cap_reg=0,cap_reg1=0, fangdian,bz,js,hs;
void chongdian(void) //给电容充电
{
CACTL1=CARSEL+CAREF0+CAON;
CACTL2=P2CA0;
TACTL=TASSEL1+TACLR+MC1;
CCR1=40000+TAR;
CCTL1|=CCIE;
A00;
A10;
}
void fangdian_buzhuo(void) //捕捉放电时间
{
cap_reg1=TAR;
cap_reg1-=cap_reg;
fangdian=cap_reg1;
CCTL1&=0;
TACTL&=~MC1;
TACTL|=TACLR;
CACTL1&=~CAON;
}
void dada(void)
{
CCTL1=CM1+CCIS0+CAP+CCIE;
cap_reg=TAR;
}
void bzsj(void) //1K标准精密电阻放电时间
{
chongdian();
// P2OUT|=BIT2;
LPM0;
dada();
A10;
A01;
LPM0;
fangdian_buzhuo();
}
void jssj(void) //进水PT1000电阻放电时间
{
chongdian();
// P2OUT|=BIT3;
LPM0;
dada();
A00;
A11;
LPM0;
fangdian_buzhuo();
}
void hssj(void) //回水PT1000电阻放电时间
{
chongdian();
// P2OUT|=BIT4;
LPM0;
dada();
A01;
A11;
LPM0;
fangdian_buzhuo();
}
// 定时器A中断服务程序(用于捕获)
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer0_A1(void)
{
switch(TAIV)
{
case 2:LPM0_EXIT;break;
case 4:break;
case 10:LPM0_EXIT;break;
default:break;
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
//初始化
while(1)
{
if(x) //x为采集放电时间的条件(如每10秒采集一次,可延长电池供电时间)
{
EN1;
bzsj();
bz=fangdian;
hssj();
hs=fangdian;
jssj();
js=fangdian;
EN0;
//添加计算温度程序
}
}
}
四、 从“数据”到“精度”:标定的艺术
获得精确的放电时间只是第一步。要得到±0.1°C的最终精度,每台表的标定是不可或缺的环节。
- 标定原理:我们并非直接使用PT1000的标准分度表,而是为每一对PT1000传感器建立一个专属的“时间-温度”转换模型。
- 标定过程:
- 设置三个精确温度点(通常是0°C, 50°C, 100°C)。
- 在每个温度点下,用精密电阻箱模拟该温度下PT1000的阻值(通常铂电阻厂家会给出每个PT1000几个常用温度点的阻值),替换实际传感器接入电路。
- 系统测量并记录对应的放电时间
X。
- 模型拟合:
- 将三组
(温度T,时间X)数据,代入公式T = a + bX + cX²求解出a, b, c三个系数。 - 这个二次曲线模型,完美地补偿了PT1000本身的非线性、电路参数的微小差异以及电容的微弱非线性。对于极端精度的要求,可以使用三次方
T = a + bX + cX² + dX³模型。
- 将三组
至此,这套系统才真正完成了从“通用测量电路”到“高精度测温仪器”的蜕变。
五、 经验总结与方案演进
- 核心选型决定上限:ADG704的低阻开关、CBB电容的低温漂、精密电阻的高稳定性,是达到0.1°C精度的物质基础。
- 低功耗设计的胜利:整个测量过程间歇工作,MSP430大部分时间处于低功耗模式,这使该方案在电池供电的热量表上能稳定运行十余年。
- 现代替代方案:如今,高精度、低功耗的Σ-Δ ADC 配合软件校准,同样可以很便捷地实现同等精度。但理解这个经典方案的精髓——将难以测量的微小模拟量转换为高精度可测的数字量(时间)——对设计任何高精度系统都具有根本性的启发。
结语
这个方案,是我技术生涯中一个关于“如何用有限资源达成苛刻指标”的典型答案。它没有依赖最先进的芯片,而是通过对基本原理的深刻理解和对每个元件特性的把控,搭建起了一座精度的桥梁。
在工业领域,真正的可靠性往往诞生于对基础原理的坚守与对细节的偏执。
你用过哪些温度采集方案或在温度采集方面遇到过哪些问题,欢迎关注我在评论区留言!
后续干货不断,咱们一起在单片机的世界里,共同进步。
318

被折叠的 条评论
为什么被折叠?



