关于51智能循迹小车的电机驱动问题

[复制链接]
查看11 | 回复5 | 2021-1-27 05:42:59 | 显示全部楼层 |阅读模式
各位大神请教一下小车的驱动问题:程序烧录进单片机,电源启动后,L298N有嗡嗡嗡的声音,小车的轮子不转,用手拨动一下会极小的速度转动(像功率不足,而且只有一侧转),占空比也调得比较高,不知道是哪里出问题了,请各位大神批评指教(用的是4节1.5伏的电池,驱动5个红外对管,超声波模块,电机,不知道是不是输入电压不足的问题,也可能是我理解错了pwm原理),下面是小车的代码,新手第一次写,请多包涵。(如有其他问题能帮忙一起指出吗,麻烦各位了)

#include
#include
sbitIN1=P0^1;//左电机//
sbitIN2=P0^2;
sbitENA=P0^0;
sbitIN3=P0^3;//右电机//
sbitIN4=P0^4;
sbitENB=P0^5;
sbitTrig=P1^1;//超声波模块的TRIG,具体接口需要改变//
sbitEcho=P1^2;//超声波模块的ECHO
#defineucunsignedchar
#defineuiunsignedint
#definejuli25//距离障碍物的距离//
#defineleftgo{IN1=1,IN2=0;}//左电机正传
#defineleftback{IN1=0,IN2=1;}//左电机反转
#definerightgo{IN3=0,IN4=1;}//右电机正传
#definerightback{IN3=1,IN4=0;}//右电机反转
ucZKBR=0;
ucZKBL=0;
uct=0;//定时器计数次数//
ucFLAG;//超声波超出测量范围的标志
uisum;//超声波模块中定时器1所计的总数//
floatL;//L为超声波模块中计算的与障碍物之间的距离//
sbitL1=P2^0;//五个红外循迹模块//
sbitL2=P1^2;
sbitM=P1^3;
sbitR2=P1^4;
sbitR1=P1^5;
voidt0go()//定时器0开始工作的函数//
{
TMOD=0x01;//定时器t0工作方式为1//
TH0=(65536-100)/256;//定时器计时108.5微秒//
TL0=(65536-100)%256;
EA=1;//开总中断//
ET0=1;//打开定时器0中断//
TR0=1;//开启定时器//
}
voidt1go()//定时器1马上开始工作的函数//
{
TMOD=0x10;
EA=1;//可能出错//
ET1=1;
}
voidt0()interrupt1//t0的中断函数//
{
TH0=(65536-100)/256;//重装定时器的初值//
TL0=(65536-100)%256;
if(t=50)
{
t=0;
}
}
voidt1()interrupt3//超声波超出测量范围//
{
FLAG=1;
}
voidturnleft1()//左转小转弯//
{
ZKBL=30;
ZKBR=10;
}
voidturnleft2()//左转大转弯//
{
ZKBL=50;
ZKBR=10;
}
voidturnright1()//右转小转弯//
{
ZKBL=10;
ZKBR=30;
}
voidturnright2()//右转大转弯//
{
ZKBL=10;
ZKBR=50;
}
voidgo()
{
ZKBL=40;
ZKBR=40;
leftgo;
rightgo;
}
voidback()
{
ZKBL=10;
ZKBR=10;
leftback;
rightback;
}
voidstop()
{
ZKBL=0;
ZKBL=0;
}
voidxunji()
{
ucflag;
if((R2==0)&&(L1==1)&&(L2==1)&&(R1==1))//小右转//
{
flag=1;
}
elseif((R1==0)&&(R2==0)&&(L1==1)&&(L2==1))//大右转//
{
flag=2;
}
elseif((R2==0)&&(L2==1))//停车
{
flag=3;
}
elseif((R2==1)&&(R1==1)&&(L1==1)&&(L2==0))//小左转//
{
flag=4;
}
elseif((R1==1)&&(R2==1)&&(L1==0)&&(L2==0))//大左转//
{
flag=5;
}
elseif((L1==0)&&(L2==1)&&(M==1)&&(R1==1)&&(R2==1))
{
flag=5;
}
elseif((L1==1)&&(L2==1)&&(M==1)&&(R1==0)&&(R2==1))
{
flag=2;
}
elseif((L1==1)&&(L2==1)&&(M==1)&&(R1==1)&&(R2==1))//特殊情况,当小车无法扫描到黑线时,小车后退//
{
flag=6;
}
switch(flag)
{
case1:turnright1();break;
case2:turnright2();break;
case3:stop();break;
case4:turnleft1();break;
case5:turnleft2();break;
case6:back();break;
default:go();break;
}
}
voidsend()//使模块开始发送8个方波//
{
Trig=1;
_nop_();//单片机延后一个机器周期//
_nop_();//设置目的在于使Trig口开始发送方波//。
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
voiddistance()
{
TH1=0;//使定时器1计数归位//
TL1=0;
send();
while(!Echo);//!echo=0,既echo=1输出高电平时跳出while,实质是等待输出开始后便打开计时器//
TR1=1;
while(Echo);//等待echo口输出高电平结束后(即输出低电平时)后便关闭计时器//
TR1=1;
sum=TH1*256+TL1;//得到计时器在过程中计的总数//
L=(sum*1.87)/100;//已得到的公式1.87为在20度温度下的声速取值344,L的单位是厘米//
if(L -->
回复

使用道具 举报

千问 | 2021-1-27 05:42:59 | 显示全部楼层
代码没看,但是可以用示波器测量L298N输出的PWM波形是否想要的波形。
假如波形正确,看看电机和L298N是否匹配,如果电机过大,L298N是肯定带不动电机的

回复

使用道具 举报

千问 | 2021-1-27 05:42:59 | 显示全部楼层
楼上有道理,应该提高电机驱动电压或L298供电电压。有声音和转的趋势,说明没有问题
回复

使用道具 举报

千问 | 2021-1-27 05:42:59 | 显示全部楼层
看下驱动频率,先试用一下单纯的IO驱动,高低电平,若是行,考虑PWM驱动问题!
回复

使用道具 举报

千问 | 2021-1-27 05:42:59 | 显示全部楼层
我看了下,好像是定时器记时频率太高引起的
回复

使用道具 举报

千问 | 2021-1-27 05:42:59 | 显示全部楼层
电机都有驱动频率范围,这个是常识
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行