微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求循迹小车思路

求循迹小车思路

时间:10-02 整理:3721RD 点击:
我参加了学校的一个迅疾小车比赛,传感器是红外的,基于AT89C52,四个直流电机驱动四个轮子,L289N驱动板
我想请教一下大家,关于过弯,大家有什么好的思路?我尝试过用PWM波控制内侧轮子减速过弯,也尝试过内侧反转过弯,效果都不是很理想。因为速度太快,总是冲出迹线。
下面是我写的PWM调制程序,大家看看有什么问题
       TR0=1;
       TH0=(65536-1000)/256;
       TL0=(65536-1000)%256;
       num++;
       if(num<ZKB)
         P2=0xe8;
       else
        {
         if(num<100)
           P2=0x00;
         else
           num=0;
         }
下面是我应经写出来的,还没有成功的程序,麻烦大家看看在那么改,我是新手,好多东西都不懂,希望大家指导。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ZKB 20
#define ZKB1 50
uint num=0,tt;
sbit gg1=P1^7;
sbit gg2=P1^6;
sbit gg3=P1^5;
sbit gg4=P1^4;
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void go_straiht();
void turn_left();
void turn_right();
void main()
{   
P0=0x48;
P2=0x48;
delay(100);
P0=0xe8;
P2=0xe8;
EA=1;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
ET0=1;
  while(1)
  {
   if((gg1&&gg2&&gg3&&gg4)==1)
    {
     go_straiht();
     delay(100);
    }   
   if(gg1==0)
    {
     turn_left();
     delay(500);
    }
   if(gg2==0)
    {
     turn_left();
     delay(500);
    }   
   if(gg3==0)
    {
     turn_right();
     delay(500);
    }
   if(gg4==0)
    {
     turn_right();
     delay(500);
    }      
  }
}
void go_straiht()
{
TR0=1;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
num++;
if(num<ZKB1)
  {
    P2=0xe8;
    P0=0xe8;
  }
else
  {
   if(num<100)
    {
      P2=0x00;
      P0=0xe8;
     }
   else
     num=0;
  }
}
void turn_left()
{
TR0=1;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
num++;
if(num<ZKB)
    P2=0xe8;
else
  {
   if(num<100)
      P2=0x00;
   else
     num=0;
  }
}
void turn_right()
{
TR0=1;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
num++;
if(num<ZKB)
    P0=0xe8;
else
  {
   if(num<100)
      P0=0x00;
   else
     num=0;
  }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top