‘壹’ 步进电机的单片机控制
步进电机的单片机控制
通过IO口输出的具有时序的方波作为步进电机的控制信号,信号经过芯片L298N驱动步进电机;同时,用 4X4的键盘来对电机的状态进行控制,并用数码管显示电机的转速,采用74LS164作为4位单个数码管的显示驱动,从单片机输入信号;
采通过IO口输出的具有时序的方波作为步进电机的控制信号,信号经过芯片L298N驱动步进电机;同时,用 4X4的键盘来对电机的状态进行控制,并用数码管显示电机的转速,采用74LS164作为4位单个数码管的显示驱动
1、对步进电机的控制和驱动,设计中受控电机为四相六线制的步进电机(内阻33欧,步进1.8度,额定电压12V)
使用L298N芯片驱动电机
L298N芯片可以驱动两个二相电机(如图1-1),也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。 而使用L298N时,可以用L297来提供时序信号,可以节省单片机IO口的使用;也可以直接用单片机模拟出时序信号,由于控制并不复杂,故选用后者。
2、 数码管显示电路的设计
串行接法
设计中要显示4位数字,用74LS164作为显示驱动,其中带锁存,使用串行接法可以节约IO口资源,但要使用SIO,发送数据时容易控制。
二、步进电机控制原理
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。
步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本原理作用如下:
(1)控制换相顺序
通电换相这一过程称为脉冲分配。例如:三相步进电机的三拍工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。
(2)控制步进电机的转向
如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。
(3)控制步进电机的速度
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。调整单片机发出的脉冲频率,就可以对步进电机进行调速。
三、理论设计
1、步进电机驱动电路
通过L298N构成步进电机的驱动电路,电路图如图3-2所示。
通过单片机的IOB8~IOB13对L298N的IN1~IN4口和ENA、ENB口发送方波脉冲信号,2、数码管显示电路的设计
数码管的显示驱动使用74LS164,通过的IOB0和IOB1口对DATA和CLK发送数据。
3、4x4键盘电路
使用了标准的4x4键盘,单片机的A口低8位为键盘的接口。尽管设计要求中只需要4个键对步进电机的状态进行控制,但考虑到对控制功能的扩展,我们使用了4x4的键盘。
‘贰’ 步进电机用单片机控制转动
很简单,看你的意思,你应该已经有了与之配套的【步进电机驱动器】,那就可以用单片机I/O口控制了,一路输出CP脉冲信号,一路输出DIR方向信号,电源接好后,连通电路,就OK了。
简单的C51调试程序:一个大的FOR循环里包含:
【C P脉冲信号】:可以用一个有限的FOR循环(循环时间可控制在几秒钟左右),里边加个有限的FOR延时(这个要小到几分之一或几十分之一秒),然后再对CP端口取反;这样,单片机上电后,就会不断地延时,输出脉冲波了。
【DIR方向信号】:可以在上述的CP脉冲信号的有限FOR循环结束后,停几秒,再对DIR端口取反; 这样,你的步进电机通电后就会在几秒钟内正转,停转几秒钟后再反转了,如此往复不断。
‘叁’ 51单片机步进电机正反转程序
单片机控制步进电机,我想你说的是两相步进电机,一般是控制其相序分配的顺逆从而控制正反转,一般而言,步进电机相序分配你可以做成一个数组比如step[]={0x03,0x06,0x0c,0x09},这样来说可以假设P0口是步进电机控制口,那么可以按如下方式来控制: while(1) { for(i=0;i<4;i++) { if(fx==1)P0=step[i]; //正向 else P0=step[3-i]; //反向 delay(x); //x大小决定电机速度。
根据电机相数买个驱动器。然后用单片机产生脉冲来控制电机的转动以及正反转。单片机产生脉冲的方法和单片机控制流水灯是一样的。ULN2003D 是驱动步进电机的驱动芯片,主要是匹配电机所需的电流。 由于是四相电机,步进电机之所以可以转动就需要给相绕组提供连续的脉冲,所以需要4个端口来控制四相绕组的工作状态(P15应该是不需要的),具体的编码要看电机的拍数; 一旦明白这些,你就可以很容易编写代码来控制电机的转动了,还有在脉冲间你可以设置不同的延时时间来调节电机的转速。
‘肆’ 一个关于单片机控制步进电机的C语言程序 想请高人帮我把每一步都注释出来
C语言程序源代码
#include <REGX51.H> // 51寄存器定义
#include "intrins.h"
#define control P1 //P1_0:A相,P1_1:B相,P1_2:C相,P1_3:D相
#define discode P0 //显示代码控制端口
#define uchar unsigned char //定义无符号型变量
#define uint unsigned int
sbit en_dm=P3^0; //显示代码锁存控制
sbit en_wk=P3^1; //位控锁存控制
uchar code corotation[4]= {0x03,0x06,0x0c,0x09};//电机正转
uchar code rollback[4]={0x0c,0x06,0x03,0x09}; //电机反转
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示字段
uint code Levspeed[5]={500,400,300,200,100};//电机速度等级
uchar Hscan,speedcount;//Hscan行扫描,speedcount 速度等级计数
uint uu; //频率计数
uint step,setstep; //step:电机步伐计数,setstep:手动设置电机步伐
uint speed=500; //电机初始速度
uchar count;
uchar flag[5];
uchar butcount; //按键次数
//****************************************
//flag[0] 正转标志
//flag[1] 反转标志
//flag[2] 加速标志
//flag[3] 减速标志
//flag[4] 设置标志
//****************************************
Delay1mS(unsigned int tt) //延时1ms “Delay1mS”延时子程序,用循环语句延时。
{
unsigned char i;
while(tt--)
for(i=113;i>0;i--);
}
keyscan() //键盘扫描 “keyscan”键盘扫描子程序,用于寻找是否有按键按下。
{
P2=0xf0; //把oxfe赋值给P2口 //将按键控制口置于未按键的状此誉态.单片机输出//口假设不是按键按下状态.
if(P2!=0xf0) //如果P2口的值不等于0xfe //检查是否有按键按下.如果有,处理{}内的事
{ //有按键按下.
Delay1mS(150);//调用延时函数//有按键按下,避开无效读码值的时间.,或者是脉冲长度
Hscan=0xfe; //将Hscan赋值,初始拍运遥控值是要置高电平的.
P2=Hscan; //
while((Hscan&0x10)!=0) //检查X10口是否森贺段有键按下。未按下是1,
//在这显示出你的按键口是P2_4.即检查P2_4是高电平,无//键按下,低电平有键按下。
{
P2=Hscan;
if((P2&0xf0)!=0xf0) //检查按键脉冲是否是变化,
return P2;
else Hscan=(Hscan<<1)|0x01; //这里在存码值,应该是遥控输入。将码值存入Hscan
//这里是读取码值的关键,如果来的脉冲不管是高电平//还是低电平,靠左移一位保存脉冲的状态值.
}
}
else return 0;
}
key_val() //按键处理函数 //这里是读取将存好的码值进行处理.看是什么代码值
{
uchar key;
key= keyscan(); //这里是读取码值并存放在key里
switch(key) //这里是对比读取的码值
{
case 0xee: //按键‘7’ //读取的码值=0xEE,则是按键“7”的代码
//while(P2==0xee);
setstep=setstep*10+7; //步伐数 //这里是输入”setstep +7” 步伐数对比读取的码值, //setstep原来可能是有数字的。
step=setstep;
butcount++; //计数,看输入拉几个数字
if(butcount>=5) //输入的数字超过5个就置0,无效
{
butcount=0;
setstep=0;
}
break;
case 0xde: //按键‘8’ //读取的码值=0xdE,则是按键“8”的代码
//其他同”7”
//while(P2==0xde);
setstep=setstep*10+8;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xbe: //按键‘9’ //同上”7”
//while(P2==0xbe);
setstep=setstep*10+9;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0x7e: //按键‘正转 //正转按键识别
while(P2==0x7e); //等待按键松开//一值按住电机是不转的,放开后才转.有检查//P2口的状态值
flag[0]=0xff; //开启正转标志,关闭反转//置正转标志.
flag[1]=0x00; //清除反转标志.
butcount=0;
speedcount=0;
speed=500; //置电机的转速.
if(!flag[4]) step=0;
TR0=1;
break;
case 0xed: //按键‘4’ //同上”7”
while(P2==0xed);
setstep=setstep*10+4;
butcount++;
step=setstep;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;
case 0xdd: //按键‘5’ //同上”7”
//while(P2==0xdd);
setstep=setstep*10+5;
step=setstep;
butcount++;
if(butcount>=5)
{
butcount=0;
setstep=0;
}
break;