qq_43107889 2023-01-06 18:20 采纳率: 100%
浏览 93
已结题

51寻迹小车一侧车轮突然无法驱动

本人初学者,在制作寻迹小车时遇到的问题,用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;
        
    }
}


  • 写回答

2条回答 默认 最新

  • 智者知已应修善业 2023-01-06 18:38
    关注

    从描述看已经采取了排除法排除了电机与L298N,但是没看到排除单片机引脚输出,可用LED灯观察IO输出高低电平时亮熄状态判断。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月6日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程