QG8数据手册中提到ADC模块的第26通道就是温度传达器,因此我针对贵公司的用户板,想测温度,并显示在数码管上。 计算温度的公式如下: T=25-(Vtemp-Vtemp25)/m
Vtemp是当前环境下的温度传感器的电压值 Vtemp是在25摄氏度,并且Vdd=3V时,其温度传感器的值,为701.2mV m是温度系数,单位为V/℃,并且还分为冷,热二个档位.冷为1.646mV/℃ ,热为:1.769mV/℃
问题是我现在为3.3V的系统,而以上数据手册中的数值是在Vdd=3V时的值,在此假定是线性关系,故对m,Vtemp25校准如下:
3/3.3=701.2/x ==> x=771.32mV m的值按此原理校准备,得到 m热=1.9239 m冷=1.8106
AD转换如下: word GetAdAvrResult(byte chanel) { byte tmp=0,i=0; word MidAd=0; word AdResult[8]={ 0,0,0,0,0,0,0,0}; //用于存放8次转换的结果 tmp=chanel&0x1f; tmp=tmp|(ADCSC1&0xe0);
ADCSC1=tmp; while(i<8) { if(ADCSC1_COCO==1) { AdResult|=ADCRH<<8; //取高2位 AdResult|=ADCRL; //取低8位 i++; } } ADCSC1=0x3f; //停止AD转换 MidAd=(AdResult[0]+ AdResult[1]+AdResult[2]+AdResult[3]+AdResult[4]+AdResult[5]+AdResult[6]+AdResult[7])/8; return (MidAd); }
程序如下: #define PERMIT_ERROR 0.0005f ...
ad=GetAdAvrResult(26); //AD转换,并平均滤波 vtemp=ad*0.0032258064516129; if((vtemp-0.7012)>=(float)PERMIT_ERROR) { temp = 25-((vtemp-0.77132)/0.0018106) ; //用m冷计算 } else { temp = 25-((vtemp-0.77132)/0.0019239) ; //用m热计算 } //以下是显示处理 itemp=(int)temp*10; buf[0]=itemp/100; buf[1]=(itemp%100)/10; buf[2]='.'; buf[3]=itemp%10;
问题是: if((vtemp-0.7012)>=(float)PERMIT_ERROR) 这句总是执行错,明明vtemp大于0.7012,却执行的是下面的 temp = 25-((vtemp-0.77132)/0.0019239) ; //用m热计算 真奇怪,看来是浮点库的问题了,此工程在新建时没有加入支持浮点库,最后人为地加上了ansifs.lib库。不知问题出在哪 另外按此种方法算出来,竟有60多度,我晕,哪有这么高啊。最后看了下数据手册,用浮点库计算时,误差竟有正负8度,误差这么大有什么用? 请教,以上我问题出在哪,怎么会有60度? |