搜档网
当前位置:搜档网 › 循迹小车程序

循迹小车程序

/*pwm 调制控制电机转速*/
void pwm(unsigned char xx,unsigned char yy)
{
CMOD = 0x02; // Setup PCA timer
CL = 0x00;
CH = 0x00;
CCAP0L = xx; // Set the initial value same as CCAP0H
CCAP0H = xx; // Duty Cycle
CCAPM0 = 0x42; // 0100,0010 Setup PCA module 0 in PWM mode
CCAP1L = yy;
CCAP1H = yy;
CCAPM1 = 0x42;
CR = 1; // start timer
}
之后就可以这么写了:
pwm(0xff,0x00) 表示右轮全速,左轮停止。定义为CarTurnLeft_H 函数
Pwm(0x00,0xff) 表示左轮全速,右轮停止。定义为CarTurnRight_H 函数
pwm(0x20,0x00) 表示右轮全速,左轮稍慢。定义为CarTurnLeft 函数
Pwm(0x00,0x20) 表示左轮全速,右轮稍慢。定义为CarTurnRight 函数
可以看出来CarTurnLeft_H是较大幅度的左转而CarTurnLeft是小幅度的左转。/*普通循迹*/
void CarGoLine() //小车沿黑线走
{
if(SS2==0)
{
CarTurnLeft();
flag = 1;
}
if(SS4==0)
{
CarTurnRight();
flag = 0;
}
if(SS3==0)
{
if(flag==0) CarTurnLeft();
else CarTurnRight();
}
}
我是利用SS3-SS4 或者SS3-SS2 来完成普通寻线的。Flag 其实就是标志
着上次黑线碰到的是SS4 还是SS2,例如如果是SS4 那就向左转使得下一次
还能让SS4 碰到黑线。相当于SS3-SS4 和SS3-SS2 是两个轨道挂在哪个上面
都可以。
这里用的全都是轻微的左转或右转,很多同学所有的左转右转都是一个
轮子挺一个轮子,那样扭动就很大。
/*外部中断初始化*/
void INT_init()
{
EA = 1; // 开总中断
EX1 = 1; // 允许外部中断1
EX0 = 1; // 允许外部中断0
IT1 = 1; // 下降沿触发
IT0 = 1; // 下降沿触发
}
/*中断服务程序*/
void INT_0(void) interrupt 0
{
CarTurnLeft_H();
while(SS3);
}
void INT_1(void) interrupt 2
{
CarTurnRight_H();
while(SS3);
}
这里所有的左转右转都是一边停止一边全速的转动,并且都要求转到SS3 探
测到黑线才恢复正常的普通巡线。
到这里,一般的赛道都没有问题了!!!即便是直角弯道也是不在话下,竟然
连十字路口也畅通无阻(这点自己考虑为什么)!!!就靠这么多程序已经能
void main()
{
Time0_Init();
INT_init();
CarGo();
while(1)
{
CarGoLine();
}
}

相关主题