找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3572|回复: 3
收起左侧

循迹小车调试不出来,一直跑,用的12v的电机,怎么回事

[复制链接]
ID:510072 发表于 2019-5-25 19:00 | 显示全部楼层 |阅读模式
#ifndef _LED_H_
#define _LED_H_
        //控制板跳线帽接法

    //定义小车驱动模块输入IO口
sbit IN1=P1^0;           //  右1电机           高电平前进
sbit IN2=P1^1;           //  右1电机     高电平后退        可以改接成PWM输出
sbit IN3=P1^2;           //  右2电机     高电平后退
sbit IN4=P1^3;           //  右2电机     高电平前进        可以改接成PWM输出
sbit IN5=P1^4;           //  左1电机     高电平前进
sbit IN6=P1^5;           //  左1电机     高电平后退        可以改接成PWM输出
sbit IN7=P1^6;           //  左2电机     高电平后退
sbit IN8=P1^7;           //  左2电机     高电平前进        可以改接成PWM输出

        /***蜂鸣器接线定义*****/
    sbit BUZZ=P2^6;

        //传感器定义 R是右(right),L是左(left)          小车对着自己看时 分的左右
    //循迹传感器X 左P3.6  右P3.5
        #define Left_X_led        P3_6         //P3_6接左边 红外循迹传感器 接第3路输出信号即中控板上面标记为P3
        #define Right_X_led       P3_5         //P3_5接右边 红外循迹传感器 接第2路输出信号即中控板上面标记为P2

        //避障传感器B 左P3.7  右P3.4  
        #define Left_B_led        P3_7         //P3_7接左边 红外避障传感器 接第4路输出信号即中控板上面标记为P4
        #define Right_B_led       P3_4         //P3_4接右边 红外避障传感器 接第1路输出信号即中控板上面标记为P1
               
        //电机PWM调速度IO口定义
        #define Left_moto_pwm            P0_0         //PWM信号端
        #define Left_moto_pwm1          P0_1       
        #define Right_moto_pwm          P0_2
        #define Right_moto_pwm1          P0_3                                                                 
        //电机转向定义                                                         
        #define Left_moto_go      {IN5=1,IN6=0,IN7=0,IN8=1;}     //左边两个电机向前走
        #define Left_moto_Stop    {IN5=0,IN8=0;}    //左边两个电机停转
                                    
        #define Right_moto_go     {IN1=1,IN2=0,IN3=0,IN4=1;}        //右边两个电机向前走
        #define Right_moto_Stop   {IN1=0,IN4=0;}        //右边两个电机停转   
        //定义变量
        unsigned char pwm_val_left  =0;//变量定义
        unsigned char push_val_left =0;// 左电机占空比N/10
        unsigned char pwm_val_right =0;
        unsigned char push_val_right=0;// 右电机占空比N/10
        bit Right_moto_stop=1;
        bit Left_moto_stop =1;
        unsigned  int  time=0;

/************************************************************************/       
//延时函数       
   void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(void)
{
     push_val_left=4;         //速度调节变量 0-9。。。9最小,0最大
         push_val_right=4;
         Left_moto_go ;   //左电机往前走
         Right_moto_go ;  //右电机往前走
}



//左转
     void  leftrun(void)
{         
     push_val_left=4;
         push_val_right=4;
         Left_moto_go ;   //左电机往前走
//         Right_moto_back ;  //右电机往前走
}

//右转
     void  rightrun(void)
{
         push_val_left=4;
         push_val_right=4;
//         Left_moto_back ;   //左电机往前走
         Right_moto_go ;  //右电机往前走
}


/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
                void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
               {
                     Left_moto_pwm=1;
                     Left_moto_pwm1=1;
                   }
        else
               {
                 Left_moto_pwm=0;
                     Left_moto_pwm1=0;
                   }
        if(pwm_val_left>=10)
               pwm_val_left=0;
   }
   else   
          {
           Left_moto_pwm=0;
           Left_moto_pwm1=0;
                  }
}
/******************************************************************/
/*                    右电机调速                                  */  
   void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
              {
               Right_moto_pwm=1;
                   Right_moto_pwm1=1;
                   }
        else
              {
                   Right_moto_pwm=0;
                   Right_moto_pwm1=0;
                  }
        if(pwm_val_right>=10)
               pwm_val_right=0;
   }
   else   
          {
           Right_moto_pwm=0;
           Right_moto_pwm1=0;
              }
}

/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
        void timer0()interrupt 1   using 2
{
     TH0=0XFc;          //1Ms定时
         TL0=0X18;
         time++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}       

/*********************************************************************/       

#endif
#include<AT89X52.H>                  //包含51单片机头文件,内部有各种寄存器定义
        #include<HJ-4WD_PWM.H>                  //包含HJ-4WD蓝牙智能小车驱动IO口定义等函数

//主函数
        void main(void)
{       

        unsigned char i;
    P1=0X00;          //小车停止

                         TMOD=0X01;
                TH0= 0XFc;                  //1ms定时
                 TL0= 0X18;
                   TR0= 1;
                ET0= 1;
                EA = 1;


        while(1)        //无限循环
        {
         
                         //有信号为0  没有信号为1

              if(Left_X_led==0&&Right_X_led==0)         //白线

                          run();

                          else
                         {                          
                                               if(Left_X_led==0&&Right_X_led==1)            //左边检测到红外
                                  {
                       
                                 Left_moto_go;                                                   //左边两个电机正转
                                 Right_moto_Stop;
                                 
                             }
                          
                                                             if(Right_X_led==0&&Left_X_led==1)                //右边检测到红外
                                  {          
               
                              Right_moto_go;                                           //右边两个电机正转

                                  Left_moto_Stop;
                                  }
                        }         
         }
}

回复

使用道具 举报

ID:510072 发表于 2019-5-25 19:01 | 显示全部楼层
不知道是程序的问题还是怎么回事,速度也很快
回复

使用道具 举报

ID:418269 发表于 2019-5-26 14:16 | 显示全部楼层
本帖最后由 ≯叁界∝爵ャ 于 2019-5-26 20:58 编辑

else
                         {                          
                                               if(Left_X_led==0&&Right_X_led==1)            //左边检测到红外
                                  {
                        
                                 Left_moto_go;                                                   //左边两个电机正转
                                 Right_moto_Stop;
                                 
                             }
                           
                                                             if(Right_X_led==0&&Left_X_led==1)                //右边检测到红外
                                  {         
               
                              Right_moto_go;                                           //右边两个电机正转

                                  Left_moto_Stop;
                                  }
                        }         
是不是这里出了问题?,一直左转,或右转。当小车Irsensor检查到黑线后,本应该本侧电机停止,另一边电机转动。但这样会不会因为惯性,在调整姿态时,就已经冲出跑道了?
回复

使用道具 举报

ID:418269 发表于 2019-5-26 14:19 | 显示全部楼层
这样试试看:  else
                         {                          
                                               if(Left_X_led==0&&Right_X_led==1)            //左边检测到红外
                                  {
                        
                                 Left_moto_go;                                                   //左边两个电机正转
                                 Right_moto_Stop;
                                Delay10us();
                                 Left_moto_Stop;

                           
                             }
                           
                                                             if(Right_X_led==0&&Left_X_led==1)                //右边检测到红外
                                  {         
               
                              Right_moto_go;                                           //右边两个电机正转

                                  Left_moto_Stop;
                                  Delay10us();
                                   Right_moto_Stop;

                                  }
                        }         
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表