首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]帮忙看看问题出在哪里?

[求助]帮忙看看问题出在哪里?

/*
 多通道AD转换,通道i转换的值保存在对应的变量i里面,保存变量i的值,
 用于与下一次转换的值进行比较,转换值发生变化,置位变换标志位flag,
 判断变化后的值为何值,从而进行相应的操作,没有变化保持上次状态。
 检查下一通道,重复此过程。
*/


其中AtoD 函数与DelaySub函数不存在问题,我感觉好像是for循环出现了问题,或者是一次操作里面的数组出现了问题。


请各位帮忙看看。


void main()               
 { 
   int j=0,i=0,flag;              //j=循环条件flag=AD转换是否变化的标志位
   unsigned long s=0;             //s=累加和
   unsigned long a[3]={0,0,0};     //AD转换中间变量
   int channel[2]={3,4};        //AD通道选择变量
   unsigned long ad[2]={0,0};    //AD转换结果
 
   ADCLK=0x44;         //初始化A/D转换为4分频,外部总线  Right justifide mode
 
   DDRB_DDRB2=0;        //PTB2输入 通道3
   PTB_PTB2=0;
  
   DDRB_DDRB1=0;        //PTB1输入 通道2
   PTB_PTB1=0;
  
   DDRF=0xff;            //PTF输出
   PTF=0xff;
  
   while(1)
  
    {
      for(i=0;i<2;i++)
       {
        
         while(j<3)
          {
         AtoD(channel);       //通道i
         a[j]=ADBUF;
         s=s+a[j];        //取3次转换平均值
         ++j;
          }
      ad=s/3;  
       s=0;
    
     
      if(labs(temp-ad)<10)  //消除小范围的电压波动
        flag=0;           //变化标志位
      else
        {
          flag=1;         //有变化,置位flag
          temp=ad;
        }
                        


       if(flag==1)
         {



          if(i==0)                //通道3
            channel1(temp);   //调用相应的执行程序
          else
            if(i==1)           //通道2
              channel2(temp);
         }  //if


       } //for
    }//while   
 } //main
 
 void channel1(unsigned long ad_tmp1)
  {
 
   if(ad_tmp1>738)       //3.6   判断电压应该是一个范围
      PTF_PTF6=0;               //此处替换相应的操作,下面的相同
     else
      if(ad_tmp1>512)        //2.5V
       PTF_PTF5=0;
      else
        if(ad_tmp1>492)      //2.4V
          PTF_PTF4=0;
        else
          if(ad_tmp1>472)     //2.3V
            PTF_PTF3=0;
          else
            if(ad_tmp1>10)    //0.05V
              PTF_PTF2=0;
   DelaySub(2);
          
   }


 void channel2(unsigned long ad_tmp2)
  {
 
   if(ad_tmp2>10)   //3.6   判断电压应该是一个范围
      PTF_PTF1=0;  //此处替换相应的操作,下面的相同
     else
       PTF_PTF7=0;
  
   DelaySub(2);
 
          
  }   

希望能和大家多多交流。
你现在问题的现象是什么?
海纳百川  有容乃大
那很显然你只检测了第一个通道而没有检测第二个通道。仔细检查一下程序。看不出问题的话,就仿真一下。

[此贴子已经被strongchen于2006-2-28 10:33:27编辑过]

海纳百川  有容乃大
现在的情况是:channel[]数组中,我在初始化定义把channel数组初始化为channel[2]={3,4}的时候程序能检测通道3的操作,并在通道3处循环而没有监测通道4。初始化为channel[2]={4,3}的时候程序输出的显示就乱了。

我在通道3上面加了电压,而通道4上面没加。

单通道的时候都是正确的
希望能和大家多多交流。
我感觉也是这样,但是没有找到问题所在,仿真是一直在进行的。

版主,我要把数组替换掉用什么比较好,请指教。
希望能和大家多多交流。
数组本身没问题。还是要仔细仿真调试一下,单步走走看。
海纳百川  有容乃大
好的 我多试试
希望能和大家多多交流。
好像是没有进入for的i=1的循环,这是怎么回事啊?
希望能和大家多多交流。
在此加j=0试试


while(j<3)
{
AtoD(channel); //通道i
a[j]=ADBUF;
s=s+a[j]; //取3次转换平均值
++j;
}
我刚才试过了 初步没有问题了

谢谢你!
希望能和大家多多交流。
返回列表