打印
[电机及执行机构驱动]

程序能过但是小车就是跑错,问题在哪?

[复制链接]
859|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
嵩岳灵石|  楼主 | 2016-11-11 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是下面的程序,2.5口连的舵机上安装超声模块,舵机不断摇头,检测各个角度前方障碍物的距离,取有最远距离的那个角度,传给转向舵机让小车转向。Keil C编译通过,但就是小车跑不对。错在哪?初学请指教。

#include<at89x51.h>
#include<intrins.h>
unsigned long S=0;
unsigned long D[9];                                           //方向指示变量
unsigned char pwm_val_left_1  = 0;//变量定义
unsigned char pwm_val_left_2  = 0;//变量定义
unsigned char push_val_left_1 =14;//舵机归中,产生约,1.5MS 信号
unsigned char push_val_left_2 =14;//舵机归中,产生约,1.5MS 信号
unsigned int  time=0;                    //时间变量
unsigned int  timer=0;                        //延时基准变量1
unsigned char timer1=0;                        //延时时间变量2
sbit Sevro_moto_pwm_1 = P2^5;            //接转向舵舵机信号端
sbit Sevro_moto_pwm_2 = P2^6;                //接超声舵舵机信号端
sbit  ECHO = P1^1;                                   //超声波接口定义                P1.1
sbit  TRIG = P1^0;                                   //超声波接口定义                P1.0
/***********************************************/       
        void delay(unsigned int k)          //延时函数
{   
     unsigned int x,y;
           for(x=0;x<k;x++)
             for(y=0;y<2000;y++);
}
/************************************************************************/
     void  StartModule()                       //启动测距信号
   {
          TRIG=1;                                        
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TRIG=0;
   }
   /**************************************************/
        void Conut(void)                   //计算距离
        {
          while(!ECHO);                       //当RX为零时等待
          TR0=1;                               //开启计数
          while(ECHO);                           //当RX为1计数并等待
          TR0=0;                                   //关闭计数
          time=TH0*256+TL0;                   //读取脉宽长度
          TH0=0;
          TL0=0;
          S=(time*1.7)/100;        //算出来是CM
        }
/***************************************************/
void ShakeHead()                                                  //超声波舵机转动
{         int i=0,a=10;
   for(i=0;i<=8;i++,a++)
   {
   push_val_left_2=a;
   timer=0;
   while(timer<=1000);
   StartModule();
   Count();
   D[i]=S;
   }
}
/***************************************************/
   unsigned char Compare()                                                          //比较函数
   {
          int Smax=0,i=0,a=0;
          for(i=0;i<9;i++)
          {
                if(D[i]>Smax)
                {
                Smax=D[i];
                a=i;
                }
          }
         return(a+10);
   }
/***************************************************/
void  COMM( void )                                                                //转向函数
  {
            push_val_left_1=Compare();
          timer1=0;
          while(timer1<=2000);  
  }

/************************************************************************/
                void pwm_Servomoto_1(void)                /*转向舵机驱动函数*/
{  

    if(pwm_val_left_1<=push_val_left_1)
            { Sevro_moto_pwm_1=1;}
        else
                { Sevro_moto_pwm_1=0;}
        if(pwm_val_left_1>=200)
        pwm_val_left_1=0;

}
/************************************************************************/
                void pwm_Servomoto_2(void)                /*超声舵机驱动函数*/
{  

    if(pwm_val_left_2<=push_val_left_2)
            { Sevro_moto_pwm_2=1;}
        else
                { Sevro_moto_pwm_2=0;}
        if(pwm_val_left_2>=200)
        pwm_val_left_2=0;
}
  ///*TIMER1中断服务子函数产生PWM信号*/
        void time1()interrupt 3   using 2
{       
     TH1=(65536-100)/256;          //100US定时
         TL1=(65536-100)%256;
         timer++;                                  //定时器100US为准。在这个基础上延时
         timer1++;       
         pwm_val_left_1++;
         pwm_val_left_2++;
         pwm_Servomoto_1();
         pwm_Servomoto_2();
                       
}

/***************************************************/
  void time2()interrupt 1   using 1
  {
  }
/***************************************************/

        void main(void)
{

        TMOD=0X11;
        TH1=(65536-100)/256;          //100US定时
        TL1=(65536-100)%256;
        TH0=0;
        TL0=0;
        TR1=1;
        ET1=1;
        ET2=1;
    EA = 1;

        delay(100);
   while(1)
   {
     ShakeHead();
         delay(5000);
         COMM();
   }
   
}

相关帖子

沙发
stackdog| | 2017-2-17 11:39 | 只看该作者
坐沙发的看来是个高手

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝