本人初学者,在制作寻迹小车时遇到的问题,用51单片机最小模块为主体,L298N驱动电机,本来程序已经测试正常开始调试寻迹速度了,但是在改动了寻迹部分的代码,增加了几种检测情况之后,右侧两电机突然不驱动了,测试发现左侧两车轮完全正常,最小模块,L298N,寻迹模块指示灯也都正常反应,直接在L298N右侧两OUT口接电源右侧电机也均正常工作,判断电机应该没有问题。
怀疑L298N或者与最小模块间的连线有问题,但是更换尝试了3个模块均是一样的结果,左侧完全正常,右侧没法驱动,只用最简单的测试代码驱动(去除寻迹仅指令OUT口输出)也是一样的结果, 排查了一下午还是想不通怎么回事,想请教各位,万分感谢。
以下为主程序:
#include <REGX52.H>
sbit IN1=P3^2;
sbit IN2=P3^3;
sbit ENA=P1^7;
sbit IN3=P1^0;
sbit IN4=P1^1;
sbit ENB=P3^6;
sbit LEFT1=P2^4;
sbit LEFT2=P2^3;
sbit RIGHT2=P2^2;
sbit RIGHT1=P2^1;
//连接电机与单片机,定义传感器接口
unsigned char PWM_RIGHT=0;
unsigned char PWM_LEFT=0;
unsigned int time=0;//定义PWM变量
void timer0()
{
TMOD |=0x01; //设置定时器0模式,工作方式1,仅用TR0打开启动
TH0=(65536-10)/256;//时间基准0.01ms
TL0=(65536-10)&256;
EA = 1;
ET0 = 1;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void go()//IN1.IN2控制左侧电机,IN3,IN4控制右侧电机,ENA为左侧,ENB为右侧
{
IN1=1;
IN2=0;//in1=1,in2=0时左电机正转
IN3=1;
IN4=0;//in3=1,in4=0时右电机正转
PWM_LEFT=10;//以8为正常行驶,15为慢行驶,17为拐弯驱动轮/待测试
PWM_RIGHT=10;
}
void left1()//直角转弯
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
PWM_LEFT=15;
PWM_RIGHT=17;
}
void right1()//直角转弯
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
PWM_LEFT=17;
PWM_RIGHT=15;
}
void right2()//右平滑转
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
PWM_LEFT=17;
PWM_RIGHT=10;
}
void left2()//左平滑转
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
PWM_LEFT=10;
PWM_RIGHT=17;
}
void stop()//配置直行,转弯,停止的电机参数
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
PWM_LEFT=0;
PWM_RIGHT=0;
}
void xingshi()
{
if(LEFT1==0&&LEFT2==0&&RIGHT1==0&&RIGHT2==0)//全部未检测到黑线
go();
else if(LEFT1==0&&LEFT2==1&&RIGHT1==0&&RIGHT2==1)//中央双检测到黑线
go();
else if(LEFT1==1&&LEFT2==1&&RIGHT1==1&&RIGHT2==1)//停车,全部检测到黑线
stop();
else if(LEFT1==0&&LEFT2==1&&RIGHT1==0&&RIGHT2==0)//左侧平滑小弯,中央左侧检测到黑线
left2();
else if(LEFT1==1&&LEFT2==0&&RIGHT1==0&&RIGHT2==0)//左侧检测到黑线
left2();
else if(LEFT1==1&&LEFT2==1&&RIGHT1==0&&RIGHT2==0)//左侧直角,左侧双检测到黑线
left1();
else if(LEFT1==1&&LEFT2==1&&RIGHT1==0&&RIGHT2==1)//左侧直角,左侧,中央左侧检测到黑线
left1();
else if(LEFT1==0&&LEFT2==0&&RIGHT1==0&&RIGHT2==1)//右侧平滑小弯,中央右侧检测到黑线
right2();
else if(LEFT1==0&&LEFT2==0&&RIGHT1==1&&RIGHT2==0)//右侧检测到黑线
right1();
else if(LEFT1==0&&LEFT2==0&&RIGHT1==1&&RIGHT2==1)//右侧直角,右侧均检测到黑线
right1();
else if(LEFT1==0&&LEFT2==1&&RIGHT1==1&&RIGHT2==1)//右侧直角,中央右侧,右侧均检测到黑线
right1();
}
void main()
{
timer0();
while(1)
{
xingshi();
}
}
void time1() interrupt 1
{
TH0=(65536-10)/256;//时间基准0.01ms,循环100次,此时频率1khz
TL0=(65536-10)&256;
time++;
if(time>100){
time=0;
}
if(time<=PWM_RIGHT)//配置右侧电机
{
ENB=1;
}
else{
ENB=0;
}
if(time<=PWM_LEFT)//配置左侧电机
{
ENA=1;
}
else{
ENA=0;
}
}
以下为测试时使用的简单驱动代码,因为之前也测试过别的部分所以有部分定义是多余的,使用该段代码测试时结果依然是左侧正常,右侧没反应。
#include <REGX52.H>
sbit IN1=P3^2;
sbit IN2=P3^3;
sbit ENA=P1^7;
sbit IN3=P1^0;
sbit IN4=P1^1;
sbit ENB=P3^6;
sbit LEFT1=P2^4;
sbit LEFT2=P2^3;
sbit RIGHT2=P2^2;
sbit RIGHT1=P2^1;
//连接电机与单片机,定义传感器接口
unsigned char PWM_RIGHT=0;
unsigned char PWM_LEFT=0;
unsigned int time=0;//定义PWM变量
void timer0()
{
TMOD |=0x01; //设置定时器0模式,工作方式1,仅用TR0打开启动
TH0=(65536-10)/256;//时间基准0.01ms
TL0=(65536-10)&256;
EA = 1;
ET0 = 1;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void time1() interrupt 1
{
TH0=(65536-10)/256;//时间基准0.01ms,循环100次,此时频率1khz
TL0=(65536-10)&256;
time++;
if(time>100){
time=0;
}
if(time<=PWM_RIGHT)//配置右侧电机
{
ENB=1;
}
else{
ENB=0;
}
if(time<=PWM_LEFT)//配置左侧电机
{
ENA=1;
}
else{
ENA=0;
}
}
void stop()//配置直行,转弯,停止的电机参数
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
PWM_LEFT=0;
PWM_RIGHT=0;}
void go()//IN1.IN2控制左侧电机,IN3,IN4控制右侧电机,ENA为左侧,ENB为右侧
{
IN1=1;
IN2=0;//in1=1,in2=0时左电机正转
IN3=1;
IN4=0;//in3=1,in4=0时右电机正转
PWM_LEFT=10;//以13为正常行驶,9为慢行驶,
PWM_RIGHT=10;
}
void main()
{
timer0();
while(1)
{
PWM_RIGHT=10;
IN3=1;
IN4=0;
PWM_LEFT=10;
IN1=1;
IN2=0;
}
}