一开始我对于循迹和避障两个模块同时实现,想采用的办法是,利用中断的方法,将循迹模块作为主函数进行循环,然后将避障模块放进去中断里面,当判断到前方有障碍时,进行避障,无障碍时依旧进行循迹模块的进行。
但是在测试中发现,这样尝试,只有避障模块可以正常使用,不知道是我们中断配置的问题还是本身会存在矛盾问题。于是我们采用了另外的一种想法,利用逻辑分析进行判断(如果和我一样是新手可以采用这种方法,会比较简单)。
以下是我的示例代码,如果是和我一样是新手的话,可以尝试一下像这样使用逻辑判断,进行实现两个模块同时实现,但是采用这种方法有缺点,在对于循迹和避障的识别和配合上可能不是运行起来,像使用操作系统那些那么丝滑,小车的行走可能不会像那样那么流畅。
void APP_Loop2(void)
{
static unsigned char State = 0;//0-直行 1-刹车 2-后退 3-左拐
static unsigned int Time=0;
if(((Left_Flow==1) & (Right_Flow==1)) && ((Left_Flow1==1) | (Right_Flow1==1)))//没有检测到黑线同时没用检测到障碍物
{
Motor_Stop();
Left_LED = 1;
Right_LED = 1;
return;
}
if((Left_Flow==1)&&((Left_Flow1==1) | (Right_Flow1==1)))//左边循迹检测到黑线,同时没有检测到障碍物
{
Motor_Right();
Left_LED = 0;
Right_LED = 1;
return;
}
if((Right_Flow==1)&&((Left_Flow1==1) | (Right_Flow1==1)))//右边循迹检测到障碍物,同时没有检测到障碍物
{
Motor_Left();
Left_LED = 1;
Right_LED = 0;
return;
}
if(((Left_Flow1==0) | (Right_Flow1==0)) & (State == 0))//遇到障碍物
{
State = 1;
Time = 0;
}
Time++;
switch(State)
{
case 1 :
{
Motor_Stop();
if(Time > 50)
{
Time = 0;
State = 2;
}
break;
}
case 2 :
{
Motor_Back();
if(Time > 100)
{
Time = 0;
State = 3;
}
break;
}
case 3 :
{
Motor_Left();
if(Time > 200)
{
Time = 0;
State = 0;
}
break;
}
case 0 :
{
Motor_Forward();
break;
}
default:
{
;
}
}