📄 taskline_counter.c
字号:
/*********************************************************************************/
/*
任务功能说明:本任务只是负责在检测到数线完成的时候发送方向为0和在发送零之后延时1秒钟再关闭
循线任务,同时开启查找地图功能;因为循线任务的方向变量是随外部给定而改变的,所以这个任务改变
方向为0后循线任务虽然还在进行循线位置判断并发送速度,但是由于方向已经被本任务变为0,那么循线
任务这时给下位机发送的数据只有方向有效,下位机会停止.1秒钟以后在开启地图查找任务的原因是,下
位机要完全停止电机需要一段时间.
*/
/*********************************************************************************/
#include "includes.h"
#define EXT extern
#include "main.h"
#pragma CODE_SEG Task_LineCounterCode //save the TaskStart code in banked flash
void Task_LineCounter(TASKDATA* pdata);
BOOLEAN Follow_Stuts;//数线状态
uchar Line_a;//数线消抖变量,防止探测到污点算作数线
BOOLEAN FollowLine1;
uchar Time_count;
uchar Time_count1;
uchar Ptm;
void Task_LineCounter(TASKDATA* pdata) //循线任务
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U err;
Line_a=0;
FollowLine1=FALSE;
Time_count=0;
Time_count1=100;
for(;;)
{
FollowLine1=TRUE;
OSTimeDly(1);//20ms检测一次,保证循线任务执行第一次以后再判断
//#define followlinecount
#ifdef followlinecount
if(Follow_Start)
{
Midspeed=15;
do
{ //如果发现数线传感器当前在白线上则等待其出白线 AD08==高电平在白线
OSTimeDly(1);
}while(AD_bData1[0]>=150);
while(Follow_Num!=0)
{
if((Time_count<250)&&(Follow_Num!=1))//假如只数线一条则直接给定速度
{
Time_count++;
Midspeed=MidspeedC*Time_count/250;//有级升速,1秒达到给定值
if(Midspeed<15)Midspeed=15;//防止启动速度低的时候振荡厉害
}
else if(Follow_Num!=1)
{
Midspeed=MidspeedC;
Time_count=254;
}
OSTimeDly(1);
if(AD_bData1[0]>=150)Line_a++;
else Line_a=0;
if(Line_a>=4)
{
Line_a=0;
Follow_Num--;
if(Follow_Num>1)
{
do
{
OSTimeDly(1);
}while(AD_bData1[0]>=150);
}
}
if(Follow_Num==1)
{
//Midspeed=25;
if(Time_count=254)
{
if(Time_count1>50)
{
Time_count1--;
Midspeed=MidspeedC*Time_count1/100;//有级升速,1秒达到给定值
if(Midspeed<25)Midspeed=25;//防止启动速度低的时候振荡厉害
}
}
if(FollowLine1==TRUE)
{
FollowLine1=FALSE;
do
{
OSTimeDly(1);
}while(AD_bData1[0]>=150);
}
}
}
if(Follow_Num==0)
{
do
{
OSTimeDly(1);
Ptm=PTM;
}while((Ptm&0x80)!=0);
{
OS_ENTER_CRITICAL();//这些数据数要同时处理的,不能产生实时中断
RightSpeed=10;//数到白线的时候使电机速度为0
LeftSpeed=10;
if(direction==0x04)direction=0x08;//停止方向
else if(direction==0x08)direction=0x04;
if(directionL==0x04)directionL=0x08;//改变左电机方向
else if(direction==0x08)direction=0x04;
if(directionR==0x04)directionR=0x08;
else if(directionR=0x08)directionR=0x04;//改变右电机方向
Line_a=0;//清除数线变量
Follow_Start=FALSE;//循线任务关闭
Speed_Comm();
OS_EXIT_CRITICAL();//这里会产生任务调度
OSTimeDly(10);
RightSpeed=0;//数到白线的时候使电机速度为0
LeftSpeed=0;
OSTimeDlyHMSM(0,0,0,100);//数线完成延时1秒 //这里会产生任务调度
Key_TaskStart_EN=TRUE;//查找地图下一步打开
Time_count=0;
Time_count1=100;
}
}
}
#endif
}
}
#pragma CODE_SEG DEFAULT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -