51单片机STC15W4K56S4控制步进电机28BYJ-48正反转

步进电机28BYJ-48(12V)介绍:

      首先,我们看下步进电机28BYJ-48(12V)外观图,如下:

51单片机STC15W4K56S4控制步进电机28BYJ-48正反转_第1张图片51单片机STC15W4K56S4控制步进电机28BYJ-48正反转_第2张图片

       28BYJ-48(12V)含义如下:28表示电机直径28毫米,B表示电机 ,Y表示永磁,J表示带减速箱,48表示四相八拍。

      下面解释下“4 相永磁式”的概念,28BYJ-48 的构造如下图所示。

51单片机STC15W4K56S4控制步进电机28BYJ-48正反转_第3张图片

       先看里圈,它有 6 个齿,辨别标注为 0~5,这个叫做转子,它是要转动的,转子的每一个齿都是一块永磁体,这就是“永磁式”的概念。再看外圈,这个就是定子,它是固定不动的,实践上它是跟电机的外壳固定在一同的,它有 8个齿,而每一个齿上都缠上了一个线圈绕组,正对着的 2 个齿上的绕组又是串联在一同的,也就是说正对着的2 个绕组老是会同时导通或关断的,如此就构成了4相,在图平分别标注为 A-B-C-D,这就是“4 相”的概念。   

      对于电机电机28BYJ-48(12V)是64个脉冲为一圈(注意是电机本身),得到电机28BYJ-48(12V)的步进角是5.625度(注意是电机本身)。而因为这个电机28BYJ-48(12V)是带减速齿轮的,所以最后在输出轴上的步进角是5.625/64=0.08789度(因为减速比是1/64)。最后推导出对于输出轴,是4096个脉冲为一圈(64×64)。电机转64圈,输出轴转1圈。

      对电机施加一系列连续不断的控制脉冲时,它可以连续不断的转动。电机启动和停转平稳,可以精确控制转动角度。步进电机转动是需要按照一定的组合以一定的频率给步进电机的4“相”输入脉冲信号,将4个相分别称为A、B、C、D。在这里我们采用4相8拍的方式控制电机的转动,即A-AB-B-BC-C-CD-D-DA-A。。。。。。

步进电机驱动芯片ULN2003:

      步进电机28BYJ-48(12V)由芯片ULN2003驱动。ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 基极电阻,在5V 工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。ULN2003多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。

ULN2003芯片引脚图如下:

51单片机STC15W4K56S4控制步进电机28BYJ-48正反转_第4张图片51单片机STC15W4K56S4控制步进电机28BYJ-48正反转_第5张图片

引脚1:脉冲输入端。    引脚2:脉冲输入端。

引脚3:脉冲输入端。    引脚4:脉冲输入端。

引脚5:脉冲输入端。    引脚6:脉冲输入端。

引脚7:脉冲输入端。    引脚8:接地。

引脚9:该脚是内部7个续流二极管负极公共端,各二极管正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。

引脚10:脉冲信号输出端,对应7脚输入端。

引脚11:脉冲信号输出端,对应6脚输入端。

引脚12:脉冲信号输出端,对应5脚输入端。

引脚13:脉冲信号输出端,对应4脚输入端。

引脚14:脉冲信号输出端,对应3脚输入端。

引脚15:脉冲信号输出端,对应2脚输入端。

引脚16:脉冲信号输出端,对应1脚输入端。

51单片机STC15W4K56S4控制步进电机28BYJ-48实例:

步进电机28BYJ-48(12V)驱动电路如下:

51单片机STC15W4K56S4控制步进电机28BYJ-48正反转_第6张图片

 步进电机28BYJ-48(12V)控制程序源代码如下: 

/******************51单片机步进电机正反转动控制********************    

处理器:STC15W4K56S4

功能:步进电机正转和反转循环进行

烧写程序时,选择单片机内部时钟,频率为22.1184M

单片机型号:STC15W4K56S4。 

**************************************************************************/

#include "stc15.h"                                         //包含头文件stc15.h

#include                                       //包含头文件intrins.h

#define MOTOR_STOP 0                            //步进电机停转标志

#define MOTOR_ZZ 1                                 //步进电机正转标志                 

#define MOTOR_FZ 2                                 //步进电机反转标志

sbit M_CHENG=P2^6;                                //步进电机橙线

sbit M_HUAN=P2^7;                                   //步进电机黄线

sbit M_FENG=P4^5;                                   //步进电机粉线

sbit M_LANG=P4^6;                                   //步进电机蓝线

void delay(unsigned int t);                          //delay延时函数

void delay_us(unsigned int t);                    //delay_us延时函数

void delay_ms(unsigned int t);                   //delay_ms延时函数

void GPIO_MOTOR_Configuration(void); //步进电机控制IO口初始化

void M_STOP(void);                                  //步进电机停转

void M_PHASE1(void);                             //步进电机相位1

void M_PHASE2(void);                             //步进电机相位2

void M_PHASE3(void);                             //步进电机相位3

void M_PHASE4(void);                             //步进电机相位4

void M_PHASE5(void);                             //步进电机相位5

void M_PHASE6(void);                             //步进电机相位6

void M_PHASE7(void);                             //步进电机相位7

void M_PHASE8(void);                             //步进电机相位8

void Timer0_Init(void);                              //定时器0初始化

unsigned char MOTOR_STATE=0;          //步进电机状态

unsigned char Bj_Counter=1;                  //计数变量

/*******************************延时函数******************************/

void delay(unsigned int t){while(t--);}       //delay延时函数

void delay_us(unsigned int t)                  //delay_us延时函数

{unsigned char i;while(t--){i=3;while(i--)delay(1);}}

void delay_ms(unsigned int t)                 //delay_ms延时函数

{while(t--){delay_us(t);}}

/*************************电机控制相关函数**************************/

void GPIO_MOTOR_Configuration(void)    //步进电机控制IO口初始化

{

 P2M1=P2M1&0x3f;P2M0=P2M0&0x3f;

 P4M1=P4M1&0x9f;P4M0=P4M0&0x9f;

}

void M_STOP(void)                                   //步进电机停转

{M_CHENG=0;M_HUAN=0;M_FENG=0;M_LANG=0;}

void M_PHASE1(void)                              //步进电机相位1

{M_CHENG=1;M_HUAN=0;M_FENG=0;M_LANG=0;}

void M_PHASE2(void)                             //步进电机相位2

{M_CHENG=1;M_HUAN=1;M_FENG=0;M_LANG=0;}

void M_PHASE3(void)                             //步进电机相位3

{M_CHENG=0;M_HUAN=1;M_FENG=0;M_LANG=0;}

void M_PHASE4(void)                             //步进电机相位4

{M_CHENG=0;M_HUAN=1;M_FENG=1;M_LANG=0;}

void M_PHASE5(void)                             //步进电机相位5

{M_CHENG=0;M_HUAN=0;M_FENG=1;M_LANG=0;}

void M_PHASE6(void)                             //步进电机相位6

{M_CHENG=0;M_HUAN=0;M_FENG=1;M_LANG=1;}

void M_PHASE7(void)                             //步进电机相位7

{M_CHENG=0;M_HUAN=0;M_FENG=0;M_LANG=1;}

void M_PHASE8(void)                             //步进电机相位8

{M_CHENG=1;M_HUAN=0;M_FENG=0;M_LANG=1;}

/************************定时器0初始化函数*************************/

void Timer0_Init(void)                          //定时器0初始化

{TMOD=0x01;TH0=0xea;TL0=0x66;TR0=1;ET0=1;EA=1;}

//改变定时时间可以改变步进电机转动速度

/********************************主函数*******************************/ 

void main(void)

{

 GPIO_MOTOR_Configuration();                    //步进电机控制IO口初始化

 Timer0_Init();                                                  //定时器0初始化

 while(1)

 {

  MOTOR_STATE=MOTOR_ZZ;                    //步进电机正转

  delay_ms(500);delay_ms(500);                   //delay_ms延时函数

  MOTOR_STATE=MOTOR_STOP;              //步进电机停转

  delay_ms(500);delay_ms(500);                   //delay_ms延时函数

  MOTOR_STATE=MOTOR_FZ;                   //步进电机反转

  delay_ms(500);delay_ms(500);                  //delay_ms延时函数

  MOTOR_STATE=MOTOR_STOP;             //步进电机停转

  delay_ms(500);delay_ms(500);                  //delay_ms延时函数

 }

}

/***********************定时器0中断处理函数***********************/

void timer0()interrupt 1 using 2                  //定时器0中断处理

{

 TH0=0xea;TL0=0x66;                               //3Ms定时     

 switch(MOTOR_STATE)

 {

  case MOTOR_STOP:                              //步进电机停转

  {M_STOP();}break; 

  case MOTOR_ZZ:                                   //步进电机正转

  {    

   if(Bj_Counter==1){M_PHASE1();}          

   else if(Bj_Counter==2){M_PHASE2();}         

   else if(Bj_Counter==3){M_PHASE3();;}        

   else if(Bj_Counter==4){M_PHASE4();}         

   else if(Bj_Counter==5){M_PHASE5();} 

   else if(Bj_Counter==6){M_PHASE6();} 

   else if(Bj_Counter==7){M_PHASE7();}         

   else if(Bj_Counter==8){M_PHASE8();}        

  }break;  

  case MOTOR_FZ:                                   //步进电机反转

  {

   if(Bj_Counter==1){M_PHASE8();}          

   else if(Bj_Counter==2){M_PHASE7();}         

   else if(Bj_Counter==3){M_PHASE6();}         

   else if(Bj_Counter==4){M_PHASE5();}         

   else if(Bj_Counter==5){M_PHASE4();} 

   else if(Bj_Counter==6){M_PHASE3();} 

   else if(Bj_Counter==7){M_PHASE2();}         

   else if(Bj_Counter==8){M_PHASE1();}         

  }break;  

  default:{;}  

 }

 Bj_Counter++;

 if(Bj_Counter==9){Bj_Counter=1;}

}

你可能感兴趣的:(51单片机,嵌入式硬件,驱动开发)