📄 pt100.c.bak
字号:
process_t() /*测量温度求解函数,已知R,VREF*/
{
data float vac,vab,rt,rt1,t;
vac=ad_pro(1);
vab=ad_pro(2); /*A/D转换获得VAB和VAC*/
rt1=r*(vac-2*vab)/(vref-vac);
/*计算出热电阻当前值*/
rt=lubo(rt1); /*滑动加权滤波*/
t=(rt-100)/0.36;
/*首先按照400度量程线性估计当前温度*/
do
/*采用试差法循环计算,刚才估计的t做初始值*/
{
if(rt<100) /*摄氏零度以下处理*/
{
rt1=100+t*(0.390802-0.0000580195*t-
0.000000000427351*(t-100)*t*t);
}
else /*摄氏零度以下处理*/
{
rt1=100+t*(0.390802-0.0000580195*t);
}
t=t+(rt-rt1)/0.36;
}
while(((rt-rt1)>0.005)||(rt1-rt)>0.005);
/*计算余差最终小于0.005欧*/
return(t) /*试差结束,返回浮点数温度值*/
}
R及VREF的校准
上面求解测量温度的过程中是把R和VREF都作为已知参数来处理的,表面上看,它们都是有标称值的,不过它们的标称值都是有误差的。其中R为高稳定性的金属膜电阻,它的精度为0.1%,VREF取自LM285,它的出厂稳定值范围为1.235±0.01V,这样的误差对于高精度测量是不允许的,解决的办法就是对它们进行校准。
解决这个校准问题也不复杂,需要使用两个不同电阻值的模拟电阻来进行两次测量,然后求解出R和VREF,模拟的电阻可以使用高精度电阻箱。例如第一次接入R1=100W,第二次接入R2=200W,会得到如下的关系式4、5、6、7,根据它们,可以求解出关系式8、9、10,从而获得校准后的R和VREF,然后把获得的校准值存入系统的EEPROM,就可以作为正式测量RT时的已知参数了。
VAB1=VREF*RL/(R+R1+2*RL) (4)
VAC1=VREF*(R1+2*RL)/(R+R1+2*RL) (5)
VAB2=VREF*RL/(R+R2+2*RL) (6)
VAC2=VREF*(R2+2*RL)/(R+R2+2*RL) (7)
RL=VAB1*R1/(VAC1-2*VAB1) (8)
R=(VAB1*(R2+2*RL)*(R1+2*RL)-RL*VAC2*(R2+2*RL))/ (RL*VAC2-VAB1*(R2+2*RL)) (9)
VREF=VAC1*(R+R1+2*RL)/(R1+2*RL) (10)
下面是校准过程的C51程序,系统通过串行口发送两次校准命令完成校准。
void jiaozhun() /*R,VREF校准函数*/
{
data float vac1,vab1,vac2,vab2,v,r,vref;
if(comm_flag==1) /*每收到一次命令处理一次*/
{
comm_flag=0; /*首先清除通讯标志*/
switch(comm._dat) /*根据发来的命令具体操作*/
{
case 0:
/*校准小量程,然后必须校准大量程!!!*/
vac1=ad_pro(1);
/*R1=100;校准电阻=100欧*/
v=ad_pro(1);
vac1=(vac1+v)/2; /*求两次采样平均值*/
vab1=ad_pro(2); /*导线压降*/
v=ad_pro(2);
vab1=(vab1+v)/2;
rl=vab1*R1/(vac1-2*vab1);
break;
case 1:
/*校准大量程,之前必须基准小量程!!!*/
vac2=ad_pro(1);
/*R2=200;校准电阻=200欧*/
v=ad_pro(1);
vac2=(vac2+v)/2;
vab2=ad_pro(2);
v=ad_pro(2);
vab2=(vab2+v)/2;
r=(vab1*(R2+2*rl)*(R1+2*rl)-
rl*vac2*(R2+2*rl))/(rl*vac2-vrl1*(R2+2*rl));
vref=vac1*(r+R1+2*rl)/(R1+2*rl);
eeprom(r,vref); /*写入EEPROM*/
break;
default:
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -