这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 循迹小车求助

共10条 1/1 1 跳转至

循迹小车求助

菜鸟
2014-07-21 16:15:58     打赏

最近在做循迹小车,前面是2驱电机,后面是万向轮;使用2路红外传感器(左和右),现在遇到的问题是小车不能拐弯,我的想法是:左路检测到黑线,小车左拐;右路检测到黑线,小车右拐,同时检测到黑线则直走,同时都没检测到则让小车后退。

//引脚说明

 

sbit Left_Moto_IN1=P0^0;//左电机
sbit Left_Moto_IN2=P0^1;

sbit Right_Moto_IN3=P0^2;//右电机
sbit Right_Moto_IN4=P0^3;

sbit Left_Led=P1^6;  //左路红外
sbit Right_Led=P1^7; //右路红外

我的电机驱动是L298N,2PWM控制速度的方法如下:

uchar count = 0;

void Init_timer()
{

    //12M晶振
    TH0 = (65535-10)/256;
    TL0 = (65535-10)%256;
    TMOD = 0x01;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
}

void Timer0_int()interrupt 1
{
   TH0 = (65535-10)/256;
   TL0 = (65535-10)%256;
    count ++;
    if(count >= 100){count = 0;}  
}

//PWM控制左轮速度

void Wheel_l(uchar speed)
{
    if(count <= speed)
    {
       Left_Moto_IN1 = 1;//左电机的两个输入端

       Left_Moto_IN2 = 0;//p0.1
    } 
   else
    {
       Left_Moto_IN1 = 0;
        Left_Moto_IN2 = 0;
    }
}

 

//PWM控制右轮速度
void Wheel_r(uchar speed)
{
     if(count<= speed)
    {
         Right_Moto_IN3 = 0;//右电机的两个输入端
         Right_Moto_IN4 = 1;  
     }
    else
     {
         Right_Moto_IN3 = 0;
         Right_Moto_IN4 = 0;
     }
}

 

void main()
{
      Init_timer();
      while(1)
       {
            if((Left_Led==1)&&(Right_Led==0))//左边检测到黑线右边没检测到 小车左转
            {
                    Wheel_l(10);
                    Wheel_r(30);
             }
           if((Left_Led==0)&&(Right_Led==1))//右边检测到黑线左边没检测到 小车右转
           {
                  Wheel_l(30);
                  Wheel_r(10);
           }  
           if((Left_Led==1)&&(Right_Led==1))//两边同时检测到黑线  小车直走
           {
                    Wheel_l(30);
                    Wheel_r(30);
           }
          if((Left_Led==0)&&(Right_Led==0))//两边都没检测到黑线  小车后退
          {
                   back();//电机同时后退
                  delayms(10);
                  Stop_All();//两个电机都停止
                  delayms(10);
         }

}

请问大家,这样做对不对?现在小车在黑线边界的地方不能拐弯,直接跑出去了


工程师
2014-07-21 17:17:30     打赏
2楼
应该是你的硬件布局和代码不太符合。你看一下硬件布局和代码是不是刚好相反呢

院士
2014-07-21 22:26:53     打赏
3楼

楼主,我觉得你要是写一个软件设计流程,我想会有更多的人帮你分析。

源代码真心不会去看了。


菜鸟
2014-07-22 11:44:37     打赏
4楼

给你看下我的布局

 

 

我只有了红色框框里的两只传感器


菜鸟
2014-07-22 11:47:55     打赏
5楼

 

这是粗略的流程图, 初始化定时器是为了 PWM控制车速


院士
2014-07-22 20:45:41     打赏
6楼
清晰,这事帮定了。

院士
2014-07-22 20:52:35     打赏
7楼

楼主  现在我想了解一下。

这个边沿红外传感器能否检测出来黑线。


楼主,帖子里面有一个“插入代码”按键,将源代码以这样方式插入吧。

要不,我不知道你的代码是第几行设置断点


院士
2014-07-22 20:53:02     打赏
8楼
sbit Left_Moto_IN1=P0^0;//左电机
sbit Left_Moto_IN2=P0^1;

sbit Right_Moto_IN3=P0^2;//右电机
sbit Right_Moto_IN4=P0^3;

sbit Left_Led=P1^6;  //左路红外
sbit Right_Led=P1^7; //右路红外

我的电机驱动是L298N,2PWM控制速度的方法如下:

uchar count = 0;

void Init_timer()
{

    //12M晶振
    TH0 = (65535-10)/256;
    TL0 = (65535-10)%256;
    TMOD = 0x01;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
}

void Timer0_int()interrupt 1
{
   TH0 = (65535-10)/256;
   TL0 = (65535-10)%256;
    count ++;
    if(count >= 100){count = 0;}  
}

//PWM控制左轮速度

void Wheel_l(uchar speed)
{
    if(count <= speed)
    {
       Left_Moto_IN1 = 1;//左电机的两个输入端

       Left_Moto_IN2 = 0;//p0.1
    } 
   else
    {
       Left_Moto_IN1 = 0;
        Left_Moto_IN2 = 0;
    }
}

 


//PWM控制右轮速度
void Wheel_r(uchar speed)
{
     if(count<= speed)
    {
         Right_Moto_IN3 = 0;//右电机的两个输入端
         Right_Moto_IN4 = 1;  
     }
    else
     {
         Right_Moto_IN3 = 0;
         Right_Moto_IN4 = 0;
     }
}

 

void main()
{
      Init_timer();
      while(1)
       {
            if((Left_Led==1)&&(Right_Led==0))//左边检测到黑线右边没检测到 小车左转
            {
                    Wheel_l(10);
                    Wheel_r(30);
             }
           if((Left_Led==0)&&(Right_Led==1))//右边检测到黑线左边没检测到 小车右转
           {
                  Wheel_l(30);
                  Wheel_r(10);
           }  
           if((Left_Led==1)&&(Right_Led==1))//两边同时检测到黑线  小车直走
           {
                    Wheel_l(30);
                    Wheel_r(30);
           }
          if((Left_Led==0)&&(Right_Led==0))//两边都没检测到黑线  小车后退
          {
                   back();//电机同时后退
                  delayms(10);
                  Stop_All();//两个电机都停止
                  delayms(10);
         }

}

 


院士
2014-07-22 20:54:39     打赏
9楼
在第78行 设置断点。看看小车在“左边检测到黑线右边没检测” 时,能否进入函数。

助工
2014-08-02 22:36:15     打赏
10楼

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]