⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pt100.c.bak

📁 我的一个工程
💻 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 + -