28BYJ48型步进电机的控制方法

前不久弄到一只28BYJ48型步进电机,没有资料,从网上查找,搜到一些资料,但按照网上介绍的程序实验,都没有成功。后来根据资料的原理部分,试着自己编写了一段程序,经过多次实验调试,终于成功了。


  哈哈,收获不小!!!


  步进电机是一种将电脉冲转化为角位移的执行设备。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。


  28BYJ48型步进电机是四相八拍电机,电压为DC5V~DC12V。当对步进电机按一定顺序施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号使得步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A……),双(双相绕组通电)四拍(AB-BC-CD-DA-AB……),四相八拍(A-AB-B-BC-C-CD-D-DA-A……)。本例是使用四相八拍驱动方式实现的。


  下面是我写的C语言控制程序实现28BYJ48型步进电机正转五圈然后倒转五圈的效果:


//********************************************************************************
//*  标题:  步进电机正反转演示程序                                               *
//*  文件:  步进电机正反转演示.C                                                 *
//*  日期:  2011-3-13                                                            *
//*  环境:  使用自制单片机最小系统板测试通过                                     *
//********************************************************************************
//*  描述:  28BYJ-48步进电机正反转控制                                           *
//*  电机使用端口:P1.0、P1.1、P1.2、P1.3                                        *
//*  单双八拍工作方式:A-AB-B-BC-C-CD-D-DA                                       *
//********************************************************************************
#include
#include


//**********************正向旋转相序表*****************************
unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};


//**********************反向旋转相序表***************************** 


unsigned char code REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};


//***********************延时子程序******************************** 


void delay(unsigned int t)
{                          
   unsigned int k;
   while(t--)
   {
     for(k=0; k<125; k++)
     {}
   }
}


 


//**********************步进电机正转****************************** 


void  motor_ffw(unsigned int n)
 {
   unsigned char i;
   unsigned int  j;
   for (j=0; j<8*64*n; j++)
    {
      for (i=0; i<8; i++)
        {
          P1 = FFW[i];
         delay(1);
         }
    }
 }

//*********************步进电机反转******************************** 


void  motor_rev(unsigned int n)
{
    unsigned char i;
  unsigned int  j;
  for (j=0; j<8*64*n; j++)
      {
        for (i=0; i<8; i++)
        {
          P1 = REV[i];
          delay(1);
        }
      }
 }


 


//*************************主程序*********************************
main()
 {  
   while(1)                    
    { 
       motor_ffw(5);          //电机正转5圈
       delay(1000);
       motor_rev(5);          //电机反转5圈
       delay(1000);


    }

 }









//********************************************************************************
//*  标题:  步进电机制作循光转台                                          *
//*  文件:  步进电机正反转演示.C                                                 *
//*  日期:  2014-3-13                                                            *
//*  环境:  使用自制单片机最小系统板测试通过                                     *
//********************************************************************************
//*  描述:  28BYJ-48步进电机正反转控制                                           *
//*  电机使用端口:P1.0、P1.1、P1.2、P1.3                                        *
//*  单双八拍工作方式:A-AB-B-BC-C-CD-D-DA                                       *
//********************************************************************************
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P0^1;    //光敏传感器,数字量I/O口


//**********************正向旋转相序表*****************************
//电机使用端口:P1.0、P1.1、P1.2、P1.3 
//unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
//                           1000 1100 0100 0110 0010 0011 0001 1001
//电机使用端口:P2.0、P2.1、P2.2、P2.3 
unsigned char code FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
//1000 1100 0100 0110 0010 0011 0001 1001




//**********************反向旋转相序表***************************** 


unsigned char code REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};


//***********************延时子程序******************************** 


void delay(unsigned int t)
{                          
   unsigned int k;
   while(t--)
   {
     for(k=0; k<125; k++)
     {}
   }
}


/********************************************************************************
** 函数名称 : delay1(uint z)
** 函数功能 : 延时函数 ms 毫秒
********************************************************************************
*/
void delay1(uint z)
{    
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);



 


//**********************步进电机正转****************************** 


void  motor_ffw(unsigned int n)
 {
   unsigned char i;
   unsigned int  j;
   for (j=0; j<8*64*n; j++)
    {
      for (i=0; i<8; i++)
        {
          P2 = FFW[i];
          delay(1);
//模块在无光条件或者光强达不到设定阈值时,DO口输出高电平,
//当外界环境光强超过设定阈值时,模块D0输出低电平;
   if(key1==0)
   {
 delay1(10);   //消抖动  延时10ms
 if(key1==0)   //确认触发
 {
 
 }
   }
        }
    }
 }


 


//*********************步进电机反转******************************** 


void  motor_rev(unsigned int n)
{
  unsigned char i;
  unsigned int  j;
  for (j=0; j<8*64*n; j++)
      {
        for (i=0; i<8; i++)
        {
           P2 = REV[i];
           delay(1);
//模块在无光条件或者光强达不到设定阈值时,DO口输出高电平,
//当外界环境光强超过设定阈值时,模块D0输出低电平;
   if(key1==0)
   {
 delay1(10);   //消抖动
 if(key1==0)   //确认触发
 {
while(!key1); //确定检测到光源,停止转动
 }
   }   
 
        }
      }
 }


 


//*************************主程序*********************************
main()
{  
   while(1)                    
   { 
motor_ffw(1);          //电机正转1圈,处于检测状态
    delay(1000);
motor_rev(1);          //电机反转1圈
delay(1000); 
   }
 }














你可能感兴趣的:(单片机及其外设)