打印

关于QG8的温度补偿的问题

[复制链接]
1567|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongshan|  楼主 | 2008-7-29 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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度? 

相关帖子

沙发
张明峰| | 2008-7-30 09:40 | 只看该作者

VDD换算有问题

该温度传感器是基于PN节温度特性的,这一点可以从25度时的电压约为0.7V得到印证。所以Vdd=3.3V时应该直接用表中3V的参数进行计算。至于浮点运算的精度,大可以用具体数值验证。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

1143

帖子

7

粉丝