
//---------------------------------------- // P6.0 P6.1 // | | // | | | |NTC // | | | | // |_| |_| // | ____ | // | // | // P5.5---| // | // --- 104 // --- // | // | // | // _____ GND // ___ // _ //---------------------------------------- unsigned char test_temperature(void) { uchar tamp=0; Ttmp=0; RC_num=0;
//1.用基準電阻充電、放電6次,記錄6次的充電時間到test_temp[6]中; do { P6CR&=0xfc; //0-output 1-input 設置P6.0, P6.1輸出 Rp_TO_OUT; //P5.5-output Rm=0; Rc=0; Rp=0; for(dly=0xa00;dly;dly--) { WDTC(); } //3個管腳都置低,對104電容放電 Rm_t=0; P6CR|=0x02; //P6.1輸入 Rp_TO_IN; //P5.5輸入 Rm=1; //用基準電阻充電 while(1) { if(Rp) { break; } Rm_t++; } WDTC(); test_temp[RC_num]=Rm_t; RC_num++; } while(RC_num<6); //采樣6次
//2.對記錄的6個數據去掉min和max,其余的4個值求其平均值 // test_temp 0 1 2 3 4 5 // min max RC_num=0; Rmin_p=0; Rmax_p=5; Rmin_t=test_temp[0]; Rmax_t=test_temp[5]; do { if(test_temp[RC_num+1]<Rmin_t) { Rmin_t=test_temp[RC_num+1]; Rmin_p=RC_num+1; } if(test_temp[4-RC_num]>Rmax_t) { Rmax_t=test_temp[4-RC_num]; Rmax_p=4-RC_num; } RC_num++; } while(RC_num<5); //找出數組中的最大及最小值
RC_num=0; Rm_t=0; do { if(RC_num!=Rmin_p) { if(RC_num!=Rmax_p) { Rm_t+=test_temp[RC_num]; } } RC_num++; } while(RC_num<6); //去max,min,取平均值 Rm_t>>=2; //除于4 求平均值
//3.用熱敏電阻充電、放電6次,記錄6次的充電時間到test_temp[6]中; RC_num=0; do { P6CR&=0xfc; Rp_TO_OUT; Rm=0; Rc=0; Rp=0; for(dly=0xa00;dly;dly--) { WDTC(); }
Rc_t=0; P6CR|=0x01; //用NTC充電 Rp_TO_IN; Rc=1; while(1) { if(Rp) { break; } Rc_t++; } WDTC();
test_temp[RC_num]=Rc_t; RC_num++; } while(RC_num<6);
//4.對記錄的6個數據去掉min和max,其余的4個值求其平均值 RC_num=0; Rmin_p=0; Rmax_p=5; Rmin_t=test_temp[0]; Rmax_t=test_temp[5]; do { if(test_temp[RC_num+1]<Rmin_t) { Rmin_t=test_temp[RC_num+1]; Rmin_p=RC_num+1; } if(test_temp[4-RC_num]>Rmax_t) { Rmax_t=test_temp[4-RC_num]; Rmax_p=4-RC_num; } RC_num++; }while(RC_num<5);
RC_num=0; Rc_t=0; //基準電阻算出的平均值放在Rm_t中 do { if(RC_num!=Rmin_p) { if(RC_num!=Rmax_p) { Rc_t+=test_temp[RC_num]; } } RC_num++; } while(RC_num<6);//去max,min,取平均值 Rc_t>>=2;
//5.根據公式計算溫度值 //Vc = V0(1-e^(-T/RC)) ---> Trtc/Rrtc = Tm/Rm ---> Trtc = (Rrtc*Tm)/Rm Ttmp=(unsigned long)Rc_t*9950; Ttmp=Ttmp/Rm_t;//求ntc值
if(Ttmp>=32960) { return 0; } if(Ttmp<=3588) { return 0x50; }
//6.查表微調的方法? RC_num=0; Rm_t=Ttmp; do { if(Rm_t>=temp_table[RC_num+1]) //查表微調 { /*Rm_t-=temp_table[RC_num+1]; Rc_t=temp_table[RC_num]-temp_table[RC_num+1]; Rm_t*=10; Rm_t=Rm_t/Rc_t; // RC_num++;*/ break; } RC_num++; } while(RC_num<48);
tamp=Bin1toBcd(RC_num); //Rc_t<<=4; //Rm_t|=Rc_t; P6CR&=0xfC; PORT6&=0xfC;
return tamp; }
code unsigned short temp_table[49]= { 32960,30004,28526,27048,25570, 24456,23342,22228,21114, 20000,19152,18304,17456,16608, 15760,15110,14460,13810, 13160,12510,12008,11506,11004, 10502,10000,9610,9220, 8830,8050,7742,7436,7130,6824,6517,6278,6039,5800,5561, 5322,5129,4936,4743,4550,4357,4203,4050,3897,3744,3588 };
[此貼子已經被作者于2011-1-18 13:34:01編輯過]
|