首先,我们看下步进电机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。。。。。。
步进电机28BYJ-48(12V)由芯片ULN2003驱动。ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。ULN2003多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。
ULN2003芯片引脚图如下:
引脚1:CPU脉冲输入端。 引脚2:CPU脉冲输入端。
引脚3:CPU脉冲输入端。 引脚4:CPU脉冲输入端。
引脚5:CPU脉冲输入端。 引脚6:CPU脉冲输入端。
引脚7:CPU脉冲输入端。 引脚8:接地。
引脚9:该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。
引脚10:脉冲信号输出端,对应7脚信号输入端。
引脚11:脉冲信号输出端,对应6脚信号输入端。
引脚12:脉冲信号输出端,对应5脚信号输入端。
引脚13:脉冲信号输出端,对应4脚信号输入端。
引脚14:脉冲信号输出端,对应3脚信号输入端。
引脚15:脉冲信号输出端,对应2脚信号输入端。
引脚16:脉冲信号输出端,对应1脚信号输入端。
/***************步进电机按键控制速度***************
* 单片机:51单片机
* 开发环境:keil
* 功能:按下S3键进行加速
大家可以用M_LEFT_R(int spd)替代 M_RIG HT_R(int spd)看看
*****************************************************/
#include
sbit SWITCH_S3 = P3^0;
sbit phase_chen = P1^3;
sbit phase_huan = P1^2;
sbit phase_feng = P1^1;
sbit phase_lang = P1^0;
unsigned char speed_num = 0;
void M_LEFT_R(int spd);
void M_RIGHT_R(int spd);
void M_STOP(void);
void Delay1(int spd);
void delay(int In,int Out);
void phase_1(void);
void phase_2(void);
void phase_3(void);
void phase_4(void);
void phase_5(void);
void phase_6(void);
void phase_7(void);
void phase_8(void);
void Delay1(int spd){while(-- spd);}
void phase_1(void){phase_chen=1;phase_huan=0;phase_feng=0;phase_lang=0;}
void phase_2(void){phase_chen=1;phase_huan=1;phase_feng=0;phase_lang=0;}
void phase_3(void){phase_chen=0;phase_huan=1;phase_feng=0;phase_lang=0;}
void phase_4(void){phase_chen=0;phase_huan=1;phase_feng=1;phase_lang=0;}
void phase_5(void){phase_chen=0;phase_huan=0;phase_feng=1;phase_lang=0;}
void phase_6(void){phase_chen=0;phase_huan=0;phase_feng=1;phase_lang=1;}
void phase_7(void){phase_chen=0;phase_huan=0;phase_feng=0;phase_lang=1;}
void phase_8(void){phase_chen=1;phase_huan=0;phase_feng=0;phase_lang=1;}
void delay(int In,int Out) //延时函数
{
int i,j;
for(i=0;i {for(j=0;j } void M_RIGHT_R(int spd) { int speed=spd; phase_1();Delay1(speed); phase_2();Delay1(speed); phase_3();Delay1(speed); phase_4();Delay1(speed); phase_5();Delay1(speed); phase_6();Delay1(speed); phase_7();Delay1(speed); phase_8();Delay1(speed); } void M_LEFT_R(int spd) { int speed=spd; phase_8();Delay1(speed); phase_7();Delay1(speed); phase_6();Delay1(speed); phase_5();Delay1(speed); phase_4();Delay1(speed); phase_3();Delay1(speed); phase_2();Delay1(speed); phase_1();Delay1(speed); } void main(void) { while(1) { if(SWITCH_S3==0) { while(SWITCH_S3==0); if(speed_num==7){speed_num=0;} else{speed_num++;} } switch(speed_num) { case0:{M_LEFT_R(2000);}break; case1:{M_LEFT_R(1600);}break; case2:{M_LEFT_R(1200);}break; case3:{M_LEFT_R(1000);}break; case4:{M_LEFT_R(800);}break; case5:{M_LEFT_R(600);}break; case6:{M_LEFT_R(400);}break; case7:{M_LEFT_R(200);}break; } } }