51单片机驱动电机问题
51单片机驱动直流电机程序(用的是l298n芯片):
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define N 100
sbit s1=P1^0; //电机驱动口
sbit s2=P1^1; //电机驱动口
sbit s3=P1^2; //电机驱动口
sbit s4=P1^3; //电机驱动口
sbit en1=P1^4; //电机使能端
sbit en2=P1^5; //电机使能端
sbit LSEN=P2^0; //光电对管最左
sbit LSEN1=P2^1; //光电对管左1
sbit LSEN2=P2^2; //光电对管左2
sbit RSEN1=P2^3; //光电对管右1
sbit RSEN2=P2^4; //光电对管右2
sbit RSEN=P2^5; //光电对管最右
uint pwm1=0,pwm2=0,t=0;
void delay(uint xms)
{
uint a;
while(--xms)
{
for(a=123;a>0;a--);
}
}
void motor(uchar speed1,uchar speed2)
{
if(speed1>=-100&&speed1<=100)
{
pwm1=abs(speed1);
if(speed1>0)
{
s1=1;
s2=0;
}
if(speed1==0)
{
s1=1;
s2=1;
}
if(speed1<0)
{
s1=0;
s2=1;
}
}
if(speed2>=-100&&speed2<=100)
{
pwm2=abs(speed2);
if(speed2>0)
{
s3=1;
s4=0;
}
if(speed2==0)
{
s3=1;
s4=1;
}
if(speed2<0)
{
s3=0;
s4=1;
}
}
}
void go_forward(uint speed)
{
s1=1;
s2=0;
s3=1;
s4=0;
pwm1=speed;
pwm2=speed;
}
void go_back(uint speed)
{
s1=0;
s2=1;
s3=0;
s4=1;
pwm1=speed;
pwm2=speed;
}
void stop()
{
s1=1;
s2=1;
s3=1;
s4=1;
pwm1=0;
pwm2=0;
}
void turn_right(uint P1,uint P2) //右转函数
{
s1=1;
s2=0;
s3=0;
s4=1;
pwm1=P1;
pwm2=P2;
}
void turn_left(uint P1,uint P2) //左转函数
{
s1=0;
s2=1;
s3=1;
s4=0;
pwm1=P1;
pwm2=P2;
}
void tracking()
{
if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0)) //没有检测到
{
go_forward(100);
}
if((LSEN1==1)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0)) //左一检测到
{
turn_left(40,80); //左转 右轮 》左轮
delay(N);
}
if((LSEN1==0)&&(LSEN2==1)&&(RSEN1==0)&&(RSEN2==0)) //左二检测到
{
turn_left(40,60); //左转 右轮 》左轮
delay(N);
}
if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==1)&&(RSEN2==0)) //右一检测到
{
turn_right(60,4); //右转 左轮 》右轮
delay(N);
}
if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==1)) //右二检测到
{
turn_right(80,40); //右转 左轮 》右轮
delay(N);
}
if((LSEN1==1)&&(LSEN2==1))
{
turn_left(0,100);
delay(1000);
}
if((RSEN1==1)&&(RSEN2==1))
{
turn_right(100,0);
delay(1000);
}
}
void avoidance()
{
}
void init()
{
TMOD=0x02; //timer0 同时配置为模式2, 8自动重装计数模式
TH0=156; //定时器初值设置100us中断
TL0=156;
ET0=1;
EA=1;
TR0=1; //开启总中断
}
void main()
{
init();
while(1)
{
tracking();
}
}
void timer0() interrupt 1 //电机驱动 提供PWM信号
{
if(t<pwm1)
en1=1;
else
en1=0;
if(t<pwm2)
en2=1;
else
en2=0;
t++;
if(t>100)
t=0;
}
扩展资料
L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。
参考资料来源:百度百科-l298n
你直接设置一个变量k……四个按键分别让k等于1,2,3,4……然后主函数用一个循环,switch~k就行了
主要是用光耦的原因,因为光耦是连接单片机与直流电机的纽带,首先单片机将电平信号通过光耦变成光信号,然后光信号在转换成直流电机端端控制信号,当然,虽然单片机与直流电机的电源隔离了,但光耦需要与这两部分共地。步进电机也是一样,只要电位一致就可以了,其实隔离主要是隔离正电源。单片机板与电机板单点接地即可。不要大面积接地,否则就失去光耦的作用了这个问题首先你要明白是么是光电隔离,如果不懂得话找点光耦的资料看一下,光耦的主要作用就是电信号隔离,可以防止干扰。电机使用的电源与单片机的电源是不共地的。方法就是使用光耦。
这里有个成功的实例。
http://z.baidu.com/question/172422778.html
建议最好使用L298芯片,用来控制直流电机换向,此芯片连接电路不难
通过三极管的开关作用,网上有很多资源
单片机中继电器驱动24伏电机的原理
利用继电器改变电路的通断,从而控制电机的启动和停止。当单片机输出高电平时,继电器线圈得电,触点闭合,电机电源接通,电机开始运转;当单片机输出低电平时,继电器线圈失电,触点断开,电机电源断开,电机停止运转。
单片机控制电机驱动为什么电机只动一下就没反应了
估计是电流不够啊。学习单片机不是只要看书的,看书只是其中的一小部分。学习单片机,建议以下步骤:1 、看书大概了解一下单片机结构,大概了解就行。不用都看懂,又不让你出书。2 、弄一个吴(鉴 鹰)学习板练习编写程序,学单片机主要就是练编程序,遇到不会的再问人或查书。3 、自己网上找些小...
如何让直流电变压?我想用单片机驱动一个24v的电机,不想用双电源,必须先...
或者采用类似开关电源电路,肯定是先变交流,再升压,再整流。但实际上,行不通,那5Ⅴ电源的功率都不大,根本做不到驱动电机。其实,换个思路,问题很简单吗。就是用单电源,用一个24V的电源,功率要够驱动电机的,这好选,很容易。那单片机用的5V电压用24Ⅴ电压降压得到,这也是电压转换,但是降压...
怎样用单片机控制直流电动机
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I\/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I\/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是...
用单片机怎么通过伺服驱动器控制伺服电机
最容易控制的方式是,伺服驱动器设置为位置模式,单片机给伺服驱动器发送脉冲信号就可以控制伺服电机了。
单片机 驱动步进电机,启动就不会停
void delay(uint t)\/\/时间函数 { uint k,j;for(j=t;j>0;j--)for(k=0; k<80; k++);} void main(){ uint i=0;while(1){ if(k1==0){ for(i=0;i<8;i++){ P1=FFW[i]; \/\/用数组驱动电机,电机用P1口驱动 delay(100); \/\/延时时间与转速相关 } } } } ...
如何同步驱动57步进电机?一个驱动一个单片机?给具体方案好不?_百度知 ...
给你两个方案,你可以考虑:1、买步进驱动器,由于只要两个同步,所以只要买两个即可,调整两个的细分数,如果是完全同步,将细分数调到一样的档;同时要根据电机调节电流,这个不是好玩的,电流大了,电机很可能烧坏。2、自己做驱动器,驱动器又有模拟和数字的分别:A、如果是模拟的,单片机只负责发...
单片机驱动直流电机转只有三极管8050和若干电阻问如何实现
即使不考虑单片机的上拉电阻,则单片机输出的最大电流也仅为5\/1000=5mA,即基极电流为5mA,而8050要达到其最大输出500mA时,Hfe为50,所需基极电流应该为最小500\/50=10mA,此时Vce=1V,你的电机是多少V,启动电流是多大,这样的电流能驱动吗,我想应该是不太可行的。
各位大侠,,,能否告知如何用单片机控制一部伺服电机
同学,老实说,不用伺服驱动器基本不可能,因为单片机要直接驱动一部交流伺服电机需要大量数字信号处理(乘除,三角变换).如果系统里包含伺服驱动器,你有两个办法.一.让伺服驱动器工作在位置模式(CP脉冲\/DIR方向接口),单片机只要能用定时器产生脉冲就可以了,硬件上用光耦,集电机开路输出给伺服驱动器.二.让...
51单片机怎么驱动直流电机c语言
51单片机驱动直流电机程序(用的是l298n芯片):include<reg51.h> include<math.h> define uint unsigned int define uchar unsigned char define N 100 sbit s1=P1^0; \/\/电机驱动口 sbit s2=P1^1; \/\/电机驱动口 sbit s3=P1^2; \/\/电机驱动口 sbit s4=P1^3; \/\/电机驱动口 sbit en1=P1...
豫素赛美: 一般而言,所有单片机的端口驱动能力都有限,还有电机的额定电压也许会比单片机的供电电压高,直接驱动电机有困难.这时候要想驱动电机,就必须根据电机的额定电压和额定功率采用合适的功率器件去驱动.下边的电路图是我工程上实际使用的,可以正反转,脉宽调制的话还可以调速.
西安市18774696554: 51单片机能否直接驱动步进电机吗 - ?
豫素赛美: 直接驱动是不行的,电流不够,每个IO口最多20ma左右的电流,,步进电机一般都是几百ma的,,,,加三极管驱动,光耦驱动,或者使用驱动芯片,l298n,bd63860,等等 很多,,你可以找下资料看下
西安市18774696554: 急,用51单片机驱动直流电机,电机不工作?
豫素赛美: 原因:1. 电源供电不足,电机可能上百毫安的电流把电压拉下来了. 2. 继电器选型不对,电流太大,把电源拉下来了. 3. 电机产生的电流对电源干扰太大,电源抖动厉害,mcu不停复位或者根本不能稳定工作. 建议:51单独一个电源,电机一个电源
西安市18774696554: 用51单片机控制两个直流电机,驱动芯片是L298n.两个电机不能同时启动. - ?
豫素赛美: 同时起动,你的单片机给的信号应该是对的,但两电机同时起动,起动电流大,一定把电压拉低了,低电压,可使你的单片机工作不正常,也可使单片机复位.再加一稳压电源,地连起来,单片机用一电源,电机用一电源试一下.
西安市18774696554: 为什么不能用51单片机的I/O口驱动直流电机? 加个锁存行么? - ?
豫素赛美: 直流电机的功率再小也会比单片机的最大功耗大的多,直接驱动的后果无非是两种,1.电流不够,电机不转,2.电流够大,芯片烧啦
西安市18774696554: 51单片机驱动直流电机问题? - ?
豫素赛美: 不行. 你要能想办法在同一个时间段内,如1秒钟内,单独调整电机通电的时间和断电的时间,通电的时间长了,断电的时间短了电机速度快.如通0.8秒,断0.2秒. 通电的时间短了,断电的时间长了,电机转速就慢了.如通0.2秒,断0.8秒. 这就是脉冲宽度调制,这样的调节就叫调节占空比.这就是所谓的传说中的“PWM” PWM不是很难理解吧.
西安市18774696554: 51单片机要驱动这个电机需要什么型号的三极管 - ?
豫素赛美: 51单片机要驱动这个电机需要PNP型中功率三极管S8550. 选用PNP型中功率三极管S8550,最大电流为1A.采用拉电流方式驱动.或者把I/O设置为强推挽驱动模式使用NPN型三极管S8050驱动. 从半导体结构上看,晶体管的C极面积最大...
西安市18774696554: 为什么我用51单片机控制一个电机,引出两脚电压是4.0V,结果一接电机,两脚电压马上变为0V了,求解啊!!1 - ?
豫素赛美: io驱动电流不够了,加驱动再接电机
西安市18774696554: 51单片机是怎样驱动步进电机 - ?
豫素赛美: 你好!! 如果你的步进电机高过 5 v,那你步进电机和单片机必须采用双电源分开供电; 步进电机,有专用的驱动芯片,你可以根据需要选择; 单片机和步进电机之间,因为工作电压不同,建议采用光耦做隔离控制!
西安市18774696554: 为什么我的51单片机p1口和P3口驱动不了步进电机? - ?
豫素赛美: 单片机 的 P0 P1 P2 P3 口 高电平 驱动电流 都很小,你的单片机 板 P0 P2 能驱动 是因为 加了上拉电阻,P2 跳线帽拔掉 就把上拉电阻 断开了.P1 P3 在板上 没有上拉 所以不能.