一、认识28BYJ-48步进电机
首先我们来了解一下28BYJ-48步进电机,那就先从名字开始吧!
28:步进电机的有效最大外径是28毫米
B:表示是步进电机
Y:表示是永磁式子
J:表示是减速型(减速比:1:64)
48:表示四相八拍
“长相”上看是这样子滴...
这个步进电机需要配合着一个驱动板来使用,图片上的是一个ul 203的驱动板和一个步进电机。
驱动板具体怎么接线网上搜就有,而且没有什么难度,在这里就不介绍啦!“一直坚信百度是个好东西”。这个在某宝上搜就有,价钱的话大概10刀左右就行,这也是我为什么选择它的一个原因,哈哈。
接着来看的是步进电机的内部结构:
通过图片可以看到内部是有8个齿,每个齿上都缠上了一个线圈绕阻,正对着的2个齿上的绕阻是串联在一起的,则正对着的两个绕阻总是会同时导通或关断,这就形成了四相,即图中标记的A-B-C-D。
二、工作原理
步进电机是一种将电脉冲转化角位移的执行机构。当驱动器接收到一个脉冲信号就会驱动步进电机按设定的方向转动一个固定的角度,则可以通过脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲的频率来控制电机转动的速度和加速度,从而达到调速的目的。
三、28BYJ-48减速概念
“永磁式减速步进电机”中“减速”的概念,下图中步进电机内部拆解图中可以看到位于最中心的那个白色小齿轮是步进电机的转子输出,64个节拍只是让这个小齿轮转了一圈,之后会带动浅蓝色的大齿轮,这个就是一级减速。右上方的白色齿轮的结构除电机转子和最终输出轴外的3个传动齿轮都是这样的结构,由一层多齿和一层少齿构成,而每一个齿轮都用自己的少齿层去驱动下一个齿轮的多齿层,这样每2个齿轮都构成一级减速,一共就有了4级减速。
四、28BYJ-48时序图
五、程序
下边代码实现的是四相单四拍的,其它两种也可以根据这个进行参考并实现,如下:
(注:所需要用到的头文件已经放到 #include <stm32f10x_conf.h> )
motor.c
#include <stm32f10x_conf.h>
void MOTOR_UserConfig(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=MOTOR_A|MOTOR_B|MOTOR_C|MOTOR_D;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(MOTOR_PROT, &GPIO_InitStruct);
}
void MOTOR_Rhythm_4_1_4(u8 step,u8 dly)
{
switch(step)
{
case 0 :
;;
break;
case 1 :
MOTOR_A_LOW;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_HIGH;
break;
case 2 :
MOTOR_A_HIGH;MOTOR_B_LOW;MOTOR_C_HIGH;MOTOR_D_HIGH;
break;
case 3 :
MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_LOW;MOTOR_D_HIGH;
break;
case 4 :
MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_LOW;
break;
}
Delay_ms(dly);
}
void MOTOR_Direction(void) //反转
{
for(u8 i=1;i<5;i++)
{
MOTOR_Rhythm_4_1_4(i,3);
}
}
void MOTOR_Direction1(void) //正转
{
for(u8 i=4;i>0;i--)
{
MOTOR_Rhythm_4_1_4(i,3);
}
}
motor.h
#ifndef _MOTOR_H_
#define _MOTOR_H_
#include <stm32f10x_conf.h>
#define MOTOR_A GPIO_Pin_0
#define MOTOR_B GPIO_Pin_1
#define MOTOR_C GPIO_Pin_2
#define MOTOR_D GPIO_Pin_10
#define MOTOR_PROT GPIOB
#define MOTOR_A_HIGH GPIO_SetBits(MOTOR_PROT,MOTOR_A);
#define MOTOR_A_LOW GPIO_ResetBits(MOTOR_PROT,MOTOR_A);
#define MOTOR_B_HIGH GPIO_SetBits(MOTOR_PROT,MOTOR_B);
#define MOTOR_B_LOW GPIO_ResetBits(MOTOR_PROT,MOTOR_B);
#define MOTOR_C_HIGH GPIO_SetBits(MOTOR_PROT,MOTOR_C);
#define MOTOR_C_LOW GPIO_ResetBits(MOTOR_PROT,MOTOR_C);
#define MOTOR_D_HIGH GPIO_SetBits(MOTOR_PROT,MOTOR_D);
#define MOTOR_D_LOW GPIO_ResetBits(MOTOR_PROT,MOTOR_D);
void MOTOR_UserConfig(void);
void MOTOR_Rhythm_4_1_4(u8 step,u8 dly);
void MOTOR_Direction(void);
void MOTOR_Direction1(void);
#endif
注:连接驱动板的四个IO口在stm32板子上设置为四个相邻的GPIO口(如果电机抖动,有一个指示灯不亮的话就试试这个吧!)
采用的是stm32f103c8t6的板子,其实验结果如下:
本来想放视频,但还是新手不知道怎么操作就先放图片吧,下边图中电机其实是在转动的。
好了,这篇博文可能也没有很详细,最近也再搞这个,之后应该还会发类似相关的博文,大家看了之后如果有什么错误的或自己有更好理解的欢迎大家在下边评论分享,接受大家的批评指正~~