文章目录
- 一.概要
- 二.28BYJ-48步进电机介绍
- 三.步进电机的主要特性
- 四.步进电机驱动
- 1.驱动硬件介绍
- 2.四相八拍程序控制介绍
- 五.STM32单片机驱动步进电机正转反转实验
- 六.CubeMX工程源代码下载
- 七.讲解视频链接地址
- 八.小结
一.概要
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况
下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影
响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步
进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电
机来控制变的非常的简单。
二.28BYJ-48步进电机介绍
28BYJ-48步进电机是最常见的实验用的步进电机,电机主要说明如下:
28: 指电机外经28mm;
B: 步进电机“步”字汉语拼音首字母;
Y:永磁式, “Yong”;
J:减速型;
48: 4相, 8拍;
主要参数如下:
这种电动机的转子上有六个凸齿,但没有线圈缠绕,而定子上有八个凸齿,每一个凸齿上均绕有一组线圈。定子线圈的连接方式是在对称齿上的两个线圈进行反相连接,八个齿构成四对,所以称为四相步进电动机。
三.步进电机的主要特性
1.步进电机必须加驱动才可以运转, 驱动信号必须为脉冲信号,没有脉冲的时候,
步进电机静止, 如果加入适当的脉冲信号, 就会以一定的角度(称为步角)转动。转
动的速度和脉冲的频率成正比。
2.28BYJ48 5V驱动的4相5线的步进电机,而且是减速步进电机,减速比为 1:64,步进角为 5.625/64 度。如果需要转动 1 圈,那么需要360/5.625*64=4096 个脉冲信号。如果转180度,那就是2048个脉冲信号。
3.改变脉冲的顺序, 可以改变转动的方向。
四.步进电机驱动
由于MCU的端口的电流很小对于驱动电流大的外设需要驱动板(放大电流)
1.驱动硬件介绍
一般28BYJ48采用ULN2003驱动板,跟电机的接线实物以及原理如下:
ULN2003是大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。ULN2003A由7组达林顿晶体管阵列和相应的电阻网络以及钳位二极管网络构成,具有同时驱动7组负载的能力,为单片双极型大功率高速集成电路。ULN2003可用于小型步进电机驱动。
2.四相八拍程序控制介绍
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,八拍的控制角度精度比较好,控制顺序就是(A-AB-B-BC-C-CD-D-DA-A…)
五.STM32单片机驱动步进电机正转反转实验
步进电机模块接STM32F103C8T6小系统板
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置GPIO输出
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
主要程序:
#define uchar unsigned char
#define uint unsigned int
uint phasecw[4] ={GPIO_PIN_11,GPIO_PIN_10,GPIO_PIN_1,GPIO_PIN_0};//正转电机导通相序D-C-B-A
uint phaseccw[4]={GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_10,GPIO_PIN_11};//反转电机导通相序A-B-C-D
//正转
void MotorCW(void)
{
//双向8拍,一个循环就是5.625/8度
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_RESET);//输出低
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_SET);//输出高
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_SET);//输出高
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_SET);//输出高
HAL_Delay(2);//等待2ms
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_SET);
HAL_Delay(2);//等待2ms
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_SET);
HAL_Delay(2);//等待2ms
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_SET);
HAL_Delay(2);//等待2ms
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_SET);
HAL_Delay(2);//等待2ms
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_RESET);
HAL_Delay(2);//等待2ms
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_RESET);
HAL_Delay(2);//等待2ms
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_RESET);
}
//反转
//28BYJ-48步进电机,步进角是5.625°,每个脉冲转5.625度,转动64步转一圈,转子到输出轴有齿轮减速器连接减速比为64,64*64=4096个脉冲也就是360°
//驱动采用双相8拍,一个循环有8个脉冲,所以512次循环,就是旋转360°
void MotorCCW(void)
{
//双向8拍,一个循环就是5.625/8度
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_RESET);//输出低
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_SET);//输出高
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_SET);//输出高
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_SET);//输出高
HAL_Delay(5);//等待5ms
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_SET);
HAL_Delay(5);//等待5ms
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_SET);
HAL_Delay(5);//等待5ms
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_SET);
HAL_Delay(5);//等待5ms
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_SET);
HAL_Delay(5);//等待5ms
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_RESET);
HAL_Delay(5);//等待5ms
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_RESET);
HAL_Delay(5);//等待5ms
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_RESET);
}
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t i;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//72M主频,8M外部晶振
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();//PB0,PB1,PB10,PB11配置成推挽输出
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(i=0;i<512;i++)//512次循环反转360度,512=360*8/5.625
{
MotorCCW(); //反转
}
HAL_GPIO_WritePin(GPIOB,phaseccw[0],GPIO_PIN_SET);//电平都恢复高电平
HAL_GPIO_WritePin(GPIOB,phaseccw[1],GPIO_PIN_SET);//电平都恢复高电平
HAL_GPIO_WritePin(GPIOB,phaseccw[2],GPIO_PIN_SET);//电平都恢复高电平
HAL_GPIO_WritePin(GPIOB,phaseccw[3],GPIO_PIN_SET);//电平都恢复高电平
HAL_Delay(1000); //等待1000ms
for(i=0;i<256;i++)//256次循环正转180度,256=180*8/5.625
{
MotorCW(); //正转
}
HAL_GPIO_WritePin(GPIOB,phasecw[0],GPIO_PIN_SET);//电平都恢复高电平
HAL_GPIO_WritePin(GPIOB,phasecw[1],GPIO_PIN_SET);//电平都恢复高电平
HAL_GPIO_WritePin(GPIOB,phasecw[2],GPIO_PIN_SET);//电平都恢复高电平
HAL_GPIO_WritePin(GPIOB,phasecw[3],GPIO_PIN_SET);//电平都恢复高电平
HAL_Delay(500); //等待500ms
}
/* USER CODE END 3 */
}
六.CubeMX工程源代码下载
链接:https://pan.baidu.com/s/1Wsve-x_nqA5dAp69ICkcPw
提取码:epsu
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
七.讲解视频链接地址
步进电机实验
八.小结
步进电机应用非常广泛,打印机:步进电机移动打印头位置并送入打印纸,数码相机:控制镜头以调整焦距和拍摄对象的亮度,空调:移动室内机的百叶,从而改变气流的方向。