#include<AT89x51.H>
#define Left_moto_pwm P3_6 //接驱动模块ENA 使能端,输入PWM信号调节速度
#define Right_moto_pwm P3_7 //接驱动模块ENB
#define k1 P1_4 //四路寻迹模块接口第一路
#define k2 P1_5 //四路寻迹模块接口第二路
#define k3 P1_6 //四路寻迹模块接口第三路
#define k4 P1_7 //四路寻迹模块接口第四路
#define Left_moto_go {P3_2=1,P3_3=0;} //P3_2 P3_3 接IN1 IN2 当 P3_2=1,P3_3=0; 时左电机正转
#define Left_moto_back {P3_2=0,P3_3=1;} //P3_2 P3_3 接IN1 IN2 当 P3_2=0,P3_3=1; 时左电机反转
#define Right_moto_go {P3_4=1,P3_5=0;} //P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=0; 时右电机正转
#define Right_moto_back {P3_4=0,P3_5=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=0,P3_5=1; 时右电机反转
unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =1;// 左电机占空比10/40
unsigned char pwm_val_right =0;
unsigned char push_val_right=1;// 右电机占空比10/40
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
/************************************************************************/
void delay(unsigned int k) //延时函数
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
void run(void) //前进函数
{
push_val_left =7; //PWM 调节参数1-10 1为最慢,10是最快
push_val_right =7; //PWM 调节参数1-10 1为最慢,10是最快
Left_moto_go ; //左电机前进
Right_moto_go ; //右电机前进
P3_2=1,P3_3=0 ;
P3_4=1,P3_5=0;
}
/************************************************************************/
void Left(void) //左转函数
{
push_val_left =4;
push_val_right =4;
Left_moto_go ;
Right_moto_go ;
P3_2=1,P3_3=1; //左电机停走 当 P3_2=1,P3_3=1;时左电机停转
P3_4=1,P3_5=0; //右电机继续
}
/************************************************************************/
void Right(void) //右转函数
{
push_val_left =4;
push_val_right =4;
Left_moto_go ;
Right_moto_go ;
P3_2=1,P3_3=0; //左电机继续
P3_4=1,P3_5=1; //右电机停止
}
/************************************************************************/
void Back(void) //反退函数
{
push_val_left =6;
push_val_right =6;
Left_moto_back ; //电子反转,即后退
Right_moto_back ;
P3_2=0,P3_3=1 ;
P3_4=0,P3_5=1;
}
/************************************************************************/
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
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>=10)
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>=10)
pwm_val_right=0;
}
else Right_moto_pwm=0;
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XF8; //1Ms定时
TL0=0X30;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*********************************************************************/
/*--主函数--*/
void main(void)
{
TMOD=0X01;
TH0= 0XF8; //1ms定时
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
delay(100);
while(1) /*无限循环*/
{
//四路寻迹传感器有信号(白线)为0 没有信号(黑线)为1
if((k1==0&&k2==0)&&(k3==0&&k4==0))//都没有检测到黑线,向前走 、
run();
else
{
if((k1==0||k2==0)&& (k3==1||k4==1)) //右边检测到黑线
{
push_val_left =4; //检测到黑线减速
push_val_right =4; //检测到黑线减速
P3_2=1,P3_3=1; //左电机停走
P3_4=1,P3_5=0; //右电机继续
}
if((k1==1||k2==1)&& (k3==0||k4==0)) //左边检测到黑线
{
push_val_left =4; //检测到黑线减速
push_val_right =4; //检测到黑线减速
P3_2=1,P3_3=0; //左电机继续
P3_4=1,P3_5=1; //右电机停止
}
if((k1==1&&k2==1)&& (k3==1&&k4==1)) //所有检测到黑线
{
P3_2=1,P3_3=1; //左电机停止
P3_4=1,P3_5=1; //右电机停止
}
}
}
}
很容易出轨啊。怎么回事。求高手指点。。。。。。 |