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

有关循迹小车程序

时间:10-02 整理:3721RD 点击:
我做了个循迹小车,但是速度太快,改掉PWM数值后,小车的停顿的时间就变长了,是不是要改下定时器的数值?该怎么改?而且我的循迹小车不够灵敏,程序也容易跑飞....怎么办

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

unsigned char zkb1=0 ;    //**左边电机的占空比**//

unsigned char zkb2=0 ;    //**右边电机的占空比**//

unsigned char t=0;        //**定时器中断计数器**//

sbit RSEN1=P1^0;       // 右光对管1

sbit RSEN2=P1^1;       //右光对管2

sbit LSEN1=P1^2;        //左光对管1

sbit LSEN2=P1^3;        //左光对管2

sbit IN1=P0^0;

sbit IN2=P0^1;

sbit IN3=P0^2;

sbit IN4=P0^3;

sbit ENA=P0^4;

sbit ENB=P0^5;

//****************延时函数****************//

void delay(int z)   

{   while (z--);  }

//**********初始化定时器,中断***********//

void init()

{  TMOD=0x01;

   TH0=(65536-100)/256;

   TL0=(65536-100)%256;

   EA=1;

   ET0=1;

   TR0=1;

}

//***********中断函数+脉宽调制***********//

void timer0() interrupt 1

{ if(t<zkb1)

     ENA=1;

  else

     ENA=0;

  if(t<zkb2)

      ENB=1;

  else

      ENB=0;

        t++;

  if(t>=100)

    {t=0;}

}

//******************直行******************//

void qianjin()

{  zkb1=30;

    zkb2=30;

}

//***************左转函数1***************//

void turn_left1()

{  zkb1=0;

    zkb2=50;

}

//***************左转函数2***************//

void turn_left2()

{  zkb1=0;

    zkb2=60;

}

//***************右转函数1***************//

void turn_right1()

{  zkb1=50;

    zkb2=0;

}

//***************右转函数2***************//

void turn_right2()

{  zkb1=60;

    zkb2=0;

}

//***************循迹函数*****************//

void xunji()

{ uchar flag;

  if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))

    { flag=0; }//*******直行*******//

   else  if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))

    { flag=1;} //***左偏1,右转1***//

   else  if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))

    { flag=2;} //***左偏2,右转2***//

   else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1))

    { flag=3; }//***右偏1,左转1***//

  else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))

    { flag=4; }//***右偏2,左转2***//

switch (flag)

     {  case 0:qianjin();

              break;

        case 1:turn_right1();

              break;

        case 2:turn_right2();

              break;

        case 3:turn_left1();

              break;

        case 4:turn_left2();

              break;  

        default: break;

      }

}

//****************主程序****************//

void main()

{ init();

  zkb1=30;

  zkb2=30;

  while(1)

  {  IN1=1; //******给电机加电启动******//

     IN2=0;

     IN3=1;

     IN4=0;

     ENA=1;

     ENB=1;

    while(1)

     {  xunji(); //*********寻迹**********//

     }

    }

}


提高PWM频率,降低占空比试一下

我降低了那个占空比,但是程序容易跑飞。您能帮我检查下这个程序吗?

小编解决了没?

我试了一下你的程序,我怎么总是只有一边轮子跑,求解!

这个可能不是程序的问题吧,可能是硬件或是电机的问题,我也遇到过这种情况

我们的小车也有同样的问题,不知道现在该怎么解决了  ?哪位大神帮帮忙 !

检查下硬件 看它输出是否是对的    你的定时时间怎么取得      可以直接对IN1,2,3,4输出pwm吧,一样是两路啊

最近也在弄小车  试下用电平驱动 循迹是一边正转一边反转

最近也在搞小车  在程序出问题了

void xunji()
{ uchar flag;
  if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
    { flag=0; }//*******直行*******//
   else  if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
    { flag=1;} //***左偏1,右转1***//
   else  if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
    { flag=2;} //***左偏2,右转2***//
   else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1))
    { flag=3; }//***右偏1,左转1***//
  else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
    { flag=4; }//***右偏2,左转2***//
switch (flag)
     {  case 0:qianjin();
              break;
        case 1:turn_right1();
              break;
        case 2:turn_right2();
              break;
        case 3:turn_left1();
              break;
        case 4:turn_left2();
              break;  
        default: break;
      }
}

我也刚刚独立做了一辆 目前用涂黑了的纸测试轮子转动正常,转弯是差动转弯还没加pwm
我编写循迹时用的是总线控制 比如p1=0x01的话 车就往左转 如果P1=0x08 车就往右转 我想知道一下我这样写和你这样的区别 c语言是个二把手 不专业 麻烦小编赐教~
                                                                                     谢谢

定时器没有重新赋值哦

有红外的吗?我正在做一个红外的,需要程序

扎心了,看不懂,还在自学中

寻迹小车主程序void main()
{
init();
   zkb1=50;
   zkb2=50;
   while(1)
   {
  //******给电机加电启动******
          IN1=1;
      IN2=0;
      IN3=1;
      IN4=0;
      ENA=1;
      ENB=1;
  while(1)
      {
     xunji(); //*********寻迹******
为什么有两个while 循环  这不就一直执行循环 寻迹程序啊,上电不是加了while 也只执行一次啊,本人刚学,谢谢大神

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

网站地图

Top