怎样用单片机来控制电机的方向
控制电机的方向的话,如果是用步进电机的话,可以控制它的脉序的顺序来控制它的正反转的。
但是如果是直流电机的话,是可以通过 电机控制芯片 来控制它的正反转的。
如果是步进电机的话,控制它的正反转需要自己写程序,比较麻烦一点,但是容易精确控制它转动的角度,从而控制移动的距离和速度。
如果是直流电机的话,通过电机控制芯片,只需要给相应的正反转引脚给予高低电平即可。但是控制他的速度的话,就需要通过单片机产生PWM来调速。
51单片机怎么驱动直流电机c语言
51单片机驱动直流电机程序(用的是l298n芯片):
#include<reg51.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define N 100
sbits1=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
单片机控制电机的程序
控制正反转.已通过测试
没分啊!!!唔唔!
#include<reg51.h>
#define uchar unsigned char
#define TURE 1
uchar code MOTO[4]={0x33,0xa6,0xcc,0x59};
uchar status=0;
void delay(void)
{unsigned int i;
for (i=0;i<=450;i++);
}
/*
void fanzhuan(void)
{
status--;
if (status==255)
{ status=3;}
status%=4;
P0=MOTO[status];
delay();
}
*/
void zhengzhuan(void)
{status++;
status%=4;
P0=MOTO[status];
delay();
}
void main(void)
{uchar dp1;
P0=MOTO[status];
while(1){
dp1=P1;
dp1=dp1&0x03;
zhengzhuan();
} }
四相步进电机,老大拜托你下次问题说明白点
如何用单片机驱动马达
1、首先第一步就是要马达连接到HC6800EM3单板上,注意的是要进行使用排线单片机P1端连接到马达控制芯片的输入端(4Pin口),确保P1.0~P1.3和即可。
2、接着就要将马达连接到马克控制芯片的输出端,这时候注意的是要确保马达的A+/-,B+/-连线匹配。
3、然后就是要用Keil uVision5编写步进马达控制程序,这时候要进行编译输出hex文件
#include reg52.h。
4、接着编写完成之后就要打开单片机的电源,这时候需要将USB下载线连接到电脑,注意的是使用PZ-ISP工具将马达控制编译生存的hex文件下载到单片机。
5、最后一步就是启动测试马达控制程序结果这时候就会发现步进马达按一定的时间间隔在转动说明就完成了。
单片机如何控制电机转速
如果只有一个转向的话就比较容易了,如果要有正反两个转向,就需要一个H桥,并且两个I/O口输出高低电频控制,现在就来说说一个转向的控制方式吧。
比如用P1口的P1.0,P1.1,P1.2三个I/O口接按键,P3.4口接电频输出,编个定时程序及按键程序,如果是快(全速运行),那就P3.4口直接输出高电频“1”;中(50%),那就让P3.4口0—50ms输出高电频“1”,50ms—100ms输出低电频“0”,后面就一直以50ms进行一次取反;慢(就用10%吧),0—40ns输出高电频“1”,41ns—400ns输出低电频“0”,这样为一个周期,后面就一直循环吧。如果按键P1.0按下,执行方式1,全速运行,否则以默认方式运行;按键P1.1按下,执行方式2,改变占空比,以50%的速度运行,否则,不作改变;按键P1.2按下,执行方式3,改变占空比,以10%的速度运行,否则,不作改变。当然,占空比及定时时间可以根据个人需要进行改变,这只跟定时程序有关了,定时程序跟按键程序这边就不说了,别忘了按键去抖,咔咔,不然可能会乱掉。
如何用单片机驱动马达、单片机控制电机,就介绍到这里啦!感谢大家的阅读!希望能够对大家有所帮助!