51小车寻铁丝(左中右三个传感器)

该博客探讨了基于微控制器的电机控制策略,包括左轮和右轮的独立控制,用于实现精确的转弯和直线行驶。通过使用金属传感器进行路径检测,系统能够根据传感器反馈调整电机占空比,优化转弯和直线行驶的表现。当传感器检测到特定模式时,如左大转、左小转、右大转和右小转,系统相应地调整电机速度,提高循迹效率。
摘要由CSDN通过智能技术生成
/
//
//2.2引脚坏的
	#include<reg52.h>
	#define uchar unsigned char
	#define uint unsigned int
	sbit IN11=P2^0;//左轮
  sbit IN12=P2^1;
  sbit IN21=P2^7;//右轮
  sbit IN22=P2^6;
  sbit ENA=P2^4;//left使能
  sbit ENB=P2^5; //right使能
	sbit P15 = P1^5;	  //金属传感器检测器	 //左
	sbit P16 = P1^6;							// 中
	sbit P17 = P1^7;							//右
	#define Left_moto_go      {IN11=0,IN12=1;} //  左电机前进
	#define Left_moto_back    {IN11=1,IN12=0;} // 左电机后退	              
	#define Right_moto_go     {IN21=0,IN22=1;} //右电机前进	 
	#define Right_moto_back   {IN21=1,IN22=0;} //右电机后退	 	
   	unsigned char pwm_val_left  =0;//变量定义
	unsigned char push_val_left =0;// 左电机占空比N/100	 推动			   //计算占空比时N的值(人工改变值)
	unsigned char pwm_val_right =0;								   		   //通过它来实现PWM的改变(通过FOR循环)
	unsigned char push_val_right=0;// 右电机占空比N/100

	enum Status
	{
	 turn_left,
	 turn_right,
	 straight }
	st ;
    void pwm_out_left_moto(void)			//   左电机调速 
{ 
   pwm_val_left%=100;
   if(pwm_val_left<push_val_left)	
   ENA=1;
   else {  ENA=0; }	
}	                         
  void pwm_out_right_moto(void)		  // 右电机调速  
{ 
   pwm_val_right%=100;
   if(pwm_val_right<push_val_right)	
   ENB=1;
   else   {ENB=0;}
}
	void timer0() interrupt 1   using 2		//TIMER0中断服务子函数产生PWM信号
{
     TH0=0XFe;	  //0.1Ms定时
	 TL0=0Xa3;
	 pwm_val_left++;
	 pwm_val_right++;
	 pwm_out_left_moto();
	 pwm_out_right_moto();
 }
	void main(void)
{

   TMOD =0X01;  //定时器T0,方式1
   TL0=0Xa3;//初值
   TH0=0XFe;
   TF0=0;
   TR0=1;//定时器0开始计时
   EA=1;//定时器总开关
   ET0=1;
   PT0=0;//中断优先级
   st=straight;
	while(1)							    
	{   
	 switch (st)
	 {
	 case turn_left:
	 {push_val_left  =10;push_val_right =10;Right_moto_go;Left_moto_back;} break;
	 
	 case turn_right:
	 {push_val_left  =10;  push_val_right =10;Right_moto_back;Left_moto_go;}break;
	        
	 case straight:
	 {push_val_left  =23;  push_val_right =23;Right_moto_go;Left_moto_go;} break;//17
	 }
	 if(P15==0&&P17==1&&P16==1) st=turn_left;
	 else if(P15==1&&P17==0&&P16==1)st=turn_right;
	 else if(P15==1&&P17==1&&P16==0)
	 {
	 if(st==turn_left||st==turn_right)st=straight;
	 }
	 }
	}
			

转弯状态到直线状态的转变,三个传感器会有些乏力,可以用四个传感器,左大转,左小转,右大转,右小转,转弯时候是大转,直线时候是小转,可能会循迹寻得更快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值