步进电机28BYJ-48(12V)介绍:
首先,我们看下步进电机28BYJ-48(12V)外观图,如下:
28BYJ-48(12V)含义如下:28表示电机直径28毫米,B表示电机 ,Y表示永磁,J表示带减速箱,48表示四相八拍。
下面解释下“4 相永磁式”的概念,28BYJ-48 的构造如下图所示。
先看里圈,它有 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芯片引脚图如下:
引脚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)驱动电路如下:
步进电机28BYJ-48(12V)控制程序源代码如下:
/******************51单片机步进电机正反转动控制********************
处理器:STC15W4K56S4
功能:步进电机正转和反转循环进行
烧写程序时,选择单片机内部时钟,频率为22.1184M
单片机型号:STC15W4K56S4。
**************************************************************************/
#include "stc15.h" //包含头文件stc15.h
#include
#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;}
}