51循迹小车试行

代码原理:

借用四个红外传感器来判断小车的运动状态(直行、转弯角度等)从而调节左右电机的转速以达到循迹的效果。

	unsigned char pwm_val_left  =0,push_val_left =0,pwm_val_right =0,push_val_right=0;

 	void timer0()interrupt 1   
{
     TH0=0XFc;	  
	 TL0=0X18;
	 time++;
	 pwm_val_left++;
	 pwm_val_right++;
	 pwm_out_left_moto();
	 pwm_out_right_moto();
 }	

		void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
	       {
		     Left_moto_pwm=1; 
		   }
	else 
	       {
	         Left_moto_pwm=0;
		   }
	if(pwm_val_left>=20)
	       pwm_val_left=0;
   }
   else    
          {
           Left_moto_pwm=0;
		  }

   void pwm_out_right_moto(void)
{ 
  if(Right_moto_stop)
   { 
    if(pwm_val_right<=push_val_right)
	      {
	       Right_moto_pwm=1; 
		   }
	else 
	      {
		   Right_moto_pwm=0;
		  }
	if(pwm_val_right>=20)
	       pwm_val_right=0;
   }
   else    
          {
           Right_moto_pwm=0;
	      }
}

调速思路:

        定义pwm_val_left和right用作定时器的自加参数,push_val_left和right用作左右电机的控速,当push_val的值大于pwm_val时电机运行,反之停止来达到控制电机的pwm波的效果,电机速度最大为20.

      #define Left_1_led        P3_7     

      #define Right_1_led       P3_6    

      #define Left_2_led        P2_0  

      #define Right_2_led        P2_1     

12为左右两个传感器系统,left和right为传感器系统中的左右红外传感器

	#define Left_moto_go      {P1_2=1,P1_3=0;}  
	#define Left_moto_back    {P1_2=0,P1_3=1;} 	
	#define Left_moto_Stop    {P1_2=0,P1_3=0;}                          
	#define Right_moto_go     {P1_4=1,P1_5=0;}	
	#define Right_moto_back   {P1_4=0,P1_5=1;}	
	#define Right_moto_Stop   {P1_4=0,P1_5=0;}      

这几个定义了左右电机的状态:前进、后退、停止

下边是L298N的原理图

这里的讲解以Left_moto_go为例:

ENA=1时 左电机启动;

P1_2=1即IN1=1,经过IN1上边的与门后T1左端为高电平,T1右端导通。而经过IN1下边的非门之后为低电平,再经过与门T2为低电平,T2右端无法导通。

P1_3=0即IN2=0,同理,从中间竖直对称过去的T3经过与门后为低电平,T3左端断开,T4右端为高电平,T4左端导通

以上为左电机正转的示例,其他情况同理

ENA与ENB控制左右电机的启动,IN1 IN2和IN3 IN4分别控制左右电机的正转反转和停止

     void  run(void)
{
     push_val_left=10;	 
	 push_val_right=10;
	 Left_moto_go ;   
	 Right_moto_go ;  
}


     void  backrun(void)
{
     push_val_left=10;	
	 push_val_right=10;
	 Left_moto_back;   
	 Right_moto_back; 
 }

     void  stop(void)
{	 
     
	 Right_moto_Stop ;  
     Left_moto_Stop  ;  
}

此为左右电机共同前进后退停止的情况(速度为10以防小车速度过快转弯出现问题)

//左转全速
     void  leftrunmax(void)
{	 
     push_val_left=5;
	 push_val_right=15;
	 Right_moto_go ;  
     Left_moto_back   ;
}

//左转中速
     void  leftrun(void)
{	 
     push_val_left=1;
	 push_val_right=10;
	 Right_moto_go ;  
     Left_moto_back   ;  
}

//左转低速
     void  leftrunlow(void)
{	 
     push_val_left=5;
	 push_val_right=10;
	 Right_moto_go ;  
     Left_moto_go   ; 
}


//右转全速
     void  rightrunmax(void)
{ 
	 push_val_left=15;
	 push_val_right=5;
     Left_moto_go  ;  
	 Right_moto_back    ;  
}

//右转中速
     void  rightrun(void)
{ 
	 push_val_left=10;
	 push_val_right=1;
     Left_moto_go  ;   
	 Right_moto_back    ;  
}


//右转低速
     void  rightrunlow(void)
{ 
	 push_val_left=10;
	 push_val_right=5;
     Left_moto_go  ;   
	 Right_moto_go    ;  
}

以上为调节左右电机转速(push_val)与方向(moto_go/back)从而改变转弯的速度以应对不同角度弯道的代码

接下来为主函数

#include <REGX52.H>
#include "pwm.h"

void main()
{
			P1=0X00;  
			TMOD=0X01;
        	TH0= 0XFc;		
         	TL0= 0X18;
         	TR0= 1;
        	ET0= 1;
	        EA = 1;			  

	while(1)
	{
	//直线
		if(Left_1_led==1&&Right_1_led==0&&Left_2_led==0&&Right_2_led==1)
			run();
		else
		{
			//钝角左转
			if(Left_1_led==0&&Right_1_led==0&&Left_2_led==0&&Right_2_led==1)
				leftrunlow();
			//钝角右转
			if(Left_1_led==1&&Right_1_led==0&&Left_2_led==0&&Right_2_led==0)
				rightrunlow();
			//直角左转
			if(Left_1_led==0&&Right_1_led==0&&Left_2_led==1&&Right_2_led==1)
				leftrun();
			//直角右转
			if(Left_1_led==1&&Right_1_led==1&&Left_2_led==0&&Right_2_led==0)
				rightrun();
			//锐角左转
			if(Left_1_led==0&&Right_1_led==1&&Left_2_led==1&&Right_2_led==1)
				leftrunmax();
			//锐角右转
			if(Left_1_led==1&&Right_1_led==1&&Left_2_led==1&&Right_2_led==0)
				rightrunmax();
			//停止
			if(Left_1_led==1&&Right_1_led==1&&Left_2_led==1&&Right_2_led==1)
				stop();

		}
	}
}

四个传感器的使用增加了小车转弯时灵敏度,可以使循迹小车适应更多的弯道

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
51循迹小车CSND是一种基于51单片机循迹小车循迹小车是一种可以根据预设的路径自主行驶的机器人。它通过感应地面上的黑色线条或其他特定标记来确定移动方向,从而实现自动导航功能。 51循迹小车CSND的设计通过使用51系列单片机为核心控制器,结合红外线传感器和电机驱动模块等硬件装置实现车辆的循迹功能。红外线传感器能够感知黑色线条的存在,从而根据线条的位置调整车辆的方向。电机驱动模块则负责控制车辆的前进、后退、左转和右转等动作。 在程序设计方面,51循迹小车CSND需要编写相应的代码来实现循迹功能。通过编程,将红外线传感器读取的信息与预设的路径进行比对,从而判断车辆应该做出的动作。在循迹过程中,还可以加入一些避障功能以确保车辆安全行驶。 51循迹小车CSND具有一定的应用价值。它可以用于教育培训、科学实验以及娱乐等领域。在教育方面,它可以用于教学示范,帮助学生了解电子设备的工作原理和基本编程知识。在科学实验中,可以利用循迹小车研究机器人感知和导航等相关技术。在娱乐方面,可以通过自主行驶的循迹小车搭建迷宫等游戏场景,增加娱乐性和趣味性。 总之,51循迹小车CSND是一种基于51单片机循迹小车,通过硬件装置和程序设计实现车辆自主行驶的功能。该产品具有广泛的应用价值,为教育、科学实验和娱乐等领域提供了便利和创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hhh3708

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值