AD结果处理的疑惑int/float

2019-07-15 22:32发布

最近在改进太阳能庭院灯的时候,对上版的AD进行变更,AD处理用int处理,但是AD结果差很多
12.5V的基准,int函数处理10.2V就动作了,float处理基本正确,大家有空帮忙分析、讨论下
1.原理图






2.int处理
/*******************************************************************************
1.分项目:AD测试
2.功能:AD测试
3.设计:robin_chen559
4.日期:20130911
5.备注:
   5.1系统时钟11.0592MHz
*******************************************************************************/
#include<STC12C5410AD.H>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit LED_R = P2^1;
sbit LED_G = P2^0;
sbit LED_Y = P1^3;                         //定义R G Y指示灯端口






//子程序声明

void Init_AD(void);                           //AD初始化




int Get_AD(uchar channel);        //进行AD转换
int AD_Res_Pro(uchar channel);           //AD结果处理

void Delay_MS(uint MS);           //MS延迟程序  
void LED_ST(void);                //LED状态  

//子程序


//AD初始化
void Init_AD(void)                                  
{
  P1M0 = 0xe7;                     //1110 0111
  P1M1 = 0xff;                     //1111 1111  P1.3 P1.4为强推挽输出,其余AD开漏

  ADC_CONTR = 0x80;                                   //1000 0000  配置AD控制字,1080T转换一次
  Delay_MS(3);                                           //延时5MS,待AD电源稳定
}



//AD转换
  int Get_AD(uchar channel)
  {
           uchar AD_Finished = 0 ;
        int result ;
        ADC_DATA = 0x00;
        ADC_LOW2 = 0x00;
       
        ADC_CONTR |= channel;             //选择AD转换通道
        ADC_CONTR |= 0x08 ;               // 开始AD转换
        _nop_();
        _nop_();
        _nop_();                           //延时3个指令周期,待AD电平稳定
        while(AD_Finished == 0)                           //等待AD转化完成
        {
         AD_Finished = (ADC_CONTR&0x10);   //判断AD转换是否为完成
        }
         result = ADC_DATA*4+ADC_LOW2 ;           //读走AD转换结果

            
         ADC_CONTR &= 0x80 ;               //1000 0000 清除AD转换标志位,停止AD采样
         return(result);                   //返回AD采样结果
  }

//        AD结果处理
int AD_Res_Pro(uchar channel)                   //对AD结果求5次均值
{
  int AD_AV ;

  uchar num ;
  for(num=5;num>0;num--)
  {
   AD_AV +=Get_AD(channel);
  }
  AD_AV/=5;

  return AD_AV;
}


//MS延迟程序
void Delay_MS(uint MS)
{
  uint x,y;
  for(x=MS;x>0;x--)
  {
   for(y=876;y>0;y--);
  }
}
//LED状态
void LED_ST(void)
{
  if( AD_Res_Pro(7)>512)                           //((12.5/5)/5)*1024=512 12.5V的AD转换结果 AD7电阻1/5采样
  {
     LED_G = 0 ;
         LED_Y = 1 ;  
  }

  else
  {
      LED_G = 1 ;
          LED_Y = 0 ;   
  }

}
//主程序
void main(void)
{
  P2M0 = 0x00;
  P2M1 = 0xff;                       //P2口初始化,全部推挽输出

  Init_AD();                                                 //AD初始化

  while(1)                                                         //无限循环检测
  {
   LED_ST();                         //LED状态      
  }

}
2.float处理
/*******************************************************************************
1.分项目:AD测试
2.功能:AD测试
3.设计:robin_chen559
4.日期:20130911
5.备注:
   5.1系统时钟11.0592MHz
*******************************************************************************/
#include<STC12C5410AD.H>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit LED_R = P2^1;
sbit LED_G = P2^0;
sbit LED_Y = P1^3;                         //定义R G Y指示灯端口






//子程序声明

void Init_AD(void);                               //AD初始化




int Get_AD(uchar channel);            //进行AD转换
float AD_Res_Pro(uchar channel);           //AD结果处理

void Delay_MS(uint MS);               //MS延迟程序  
void LED_ST(void);                    //LED状态  

//子程序


//AD初始化
void Init_AD(void)                                  
{
  P1M0 = 0xe7;                     //1110 0111
  P1M1 = 0xff;                     //1111 1111  P1.3 P1.4为强推挽输出,其余AD开漏

  ADC_CONTR = 0x80;                                   //1000 0000  配置AD控制字,1080T转换一次
  Delay_MS(3);                                           //延时5MS,待AD电源稳定
}



//AD转换
  int Get_AD(uchar channel)
  {
           uchar AD_Finished = 0 ;
        int result ;
        ADC_DATA = 0x00;
        ADC_LOW2 = 0x00;
       
        ADC_CONTR |= channel;             //选择AD转换通道
        ADC_CONTR |= 0x08 ;               // 开始AD转换
        _nop_();
        _nop_();
        _nop_();                           //延时3个指令周期,待AD电平稳定
        while(AD_Finished == 0)                           //等待AD转化完成
        {
         AD_Finished = (ADC_CONTR&0x10);   //判断AD转换是否为完成
        }
         result = ADC_DATA*4+ADC_LOW2 ;           //读走AD转换结果

            
         ADC_CONTR &= 0x80 ;               //1000 0000 清除AD转换标志位,停止AD采样
         return(result);                   //返回AD采样结果
  }

//        AD结果处理
float AD_Res_Pro(uchar channel)                   //对AD结果求5次均值
{
  float AD_AV ;

  uchar num ;
  for(num=5;num>0;num--)
  {
   AD_AV +=Get_AD(channel);
  }

  AD_AV=(AD_AV*5.0)/1024 ;                    //电阻分压比列1/5        ((Vin/5)/5.0)/1024 = ADC_Res     

  return AD_AV;
}


//MS延迟程序
void Delay_MS(uint MS)
{
  uint x,y;
  for(x=MS;x>0;x--)
  {
   for(y=876;y>0;y--);
  }
}
//LED状态
void LED_ST(void)
{
  if( AD_Res_Pro(7)>12.5)                           // 12.5V的AD转换结果 AD7电阻1/5采样
  {
     LED_G = 0 ;
         LED_Y = 1 ;  
  }

  else
  {
      LED_G = 1 ;
          LED_Y = 0 ;   
  }

}
//主程序
void main(void)
{
  P2M0 = 0x00;
  P2M1 = 0xff;                       //P2口初始化,全部推挽输出

  Init_AD();                                                 //AD初始化

  while(1)                                                         //无限循环检测
  {
   LED_ST();                         //LED状态      
  }

}



12W太阳能庭院灯控制器.pdf 下载积分: 积分 -1 分
81.28 KB, 下载次数: 8, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
robin_chen559
1楼-- · 2019-07-16 00:10
感觉int正数部分30000多,10位AD结果加个5次不会超的呀,结果就是偏很多~~
3htech
2楼-- · 2019-07-16 05:58
1, AD_AV 在使用前未初化成零。这会导致在AD_AV使用前,以一个不确定的值出现。
2, int和float处理函数,对AD_AV的处理不同。
robin_chen559
3楼-- · 2019-07-16 08:21
3htech 发表于 2013-9-12 11:16
1, AD_AV 在使用前未初化成零。这会导致在AD_AV使用前,以一个不确定的值出现。
2, int和float处理函数, ...

AD_AV 初始化也初始化0过,没有什么效果的。
int和float的运算差别这个就不理不清了~~~~

一周热门 更多>