零基础国产GD32单片机编程入门(二十三)28BYJ-48步进电机的控制实战含源码

一.概要

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。

二.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…)
在这里插入图片描述

在这里插入图片描述

五.GD32单片机驱动步进电机正转反转实验

步进电机模块接GD32F103C8T6开发板
开发板PB0<->模块IN1
开发板PB1<->模块IN2
开发板PB2<->模块IN3
开发板PB5<->模块IN4
开发板+5V<->模块+
开发板GND<->模块-

在这里插入图片描述

主要程序:

/*****************************************************************************
  文件: main.c
  作者: Zhengyu https://gzwelink.taobao.com
  版本: V1.0.0
  时间: 202101201
  平台:MINI-GD32F103C8T6开发板

*******************************************************************************/
#include "gd32f10x.h"
#include "gd32f10x_libopt.h"
#include "systick.h"

#define uchar unsigned char
#define uint  unsigned int

uchar phasecw[4] ={GPIO_PIN_5,GPIO_PIN_2,GPIO_PIN_1,GPIO_PIN_0};//正转电机导通相序D-C-B-A
uchar phaseccw[4]={GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_2,GPIO_PIN_5};//反转电机导通相序A-B-C-D



//正转
void MotorCW(void)
{
//双向8拍,一个循环就是5.625/8度
	gpio_bit_write(GPIOB,phasecw[0],RESET);//输出低
	gpio_bit_write(GPIOB,phasecw[1],SET);//输出高	
	gpio_bit_write(GPIOB,phasecw[2],SET);//输出高
	gpio_bit_write(GPIOB,phasecw[3],SET);//输出高	
	delay_1ms(2);//等待2ms
	gpio_bit_write(GPIOB,phasecw[0],RESET);
	gpio_bit_write(GPIOB,phasecw[1],RESET);
	gpio_bit_write(GPIOB,phasecw[2],SET);
	gpio_bit_write(GPIOB,phasecw[3],SET);		
	delay_1ms(2);//等待2ms
	gpio_bit_write(GPIOB,phasecw[0],SET);
	gpio_bit_write(GPIOB,phasecw[1],RESET);
	gpio_bit_write(GPIOB,phasecw[2],SET);
	gpio_bit_write(GPIOB,phasecw[3],SET);	
	delay_1ms(2);//等待2ms
	gpio_bit_write(GPIOB,phasecw[0],SET);
	gpio_bit_write(GPIOB,phasecw[1],RESET);
	gpio_bit_write(GPIOB,phasecw[2],RESET);
	gpio_bit_write(GPIOB,phasecw[3],SET);	
	delay_1ms(2);//等待2ms
	gpio_bit_write(GPIOB,phasecw[0],SET);
	gpio_bit_write(GPIOB,phasecw[1],SET);
	gpio_bit_write(GPIOB,phasecw[2],RESET);
	gpio_bit_write(GPIOB,phasecw[3],SET);	
	delay_1ms(2);//等待2ms
	gpio_bit_write(GPIOB,phasecw[0],SET);
	gpio_bit_write(GPIOB,phasecw[1],SET);
	gpio_bit_write(GPIOB,phasecw[2],RESET);
	gpio_bit_write(GPIOB,phasecw[3],RESET);	
	delay_1ms(2);//等待2ms
	gpio_bit_write(GPIOB,phasecw[0],SET);
	gpio_bit_write(GPIOB,phasecw[1],SET);
	gpio_bit_write(GPIOB,phasecw[2],SET);
	gpio_bit_write(GPIOB,phasecw[3],RESET);	
	delay_1ms(2);//等待2ms
	gpio_bit_write(GPIOB,phasecw[0],RESET);
	gpio_bit_write(GPIOB,phasecw[1],SET);
	gpio_bit_write(GPIOB,phasecw[2],SET);
	gpio_bit_write(GPIOB,phasecw[3],RESET);
}

//反转
//28BYJ-48步进电机,步进角是5.625°,每个脉冲转5.625度,转动64步转一圈,转子到输出轴有齿轮减速器连接减速比为64,64*64=4096个脉冲也就是360°
//驱动采用双相8拍,一个循环有8个脉冲,所以512次循环,就是旋转360°
void MotorCCW(void)
{

	//双向8拍,一个循环就是5.625/8度
	gpio_bit_write(GPIOB,phaseccw[0],RESET);//输出低
	gpio_bit_write(GPIOB,phaseccw[1],SET);//输出高	
	gpio_bit_write(GPIOB,phaseccw[2],SET);//输出高
	gpio_bit_write(GPIOB,phaseccw[3],SET);//输出高	
	delay_1ms(5);//等待5ms
	gpio_bit_write(GPIOB,phaseccw[0],RESET);
	gpio_bit_write(GPIOB,phaseccw[1],RESET);
	gpio_bit_write(GPIOB,phaseccw[2],SET);
	gpio_bit_write(GPIOB,phaseccw[3],SET);		
	delay_1ms(5);//等待5ms
	gpio_bit_write(GPIOB,phaseccw[0],SET);
	gpio_bit_write(GPIOB,phaseccw[1],RESET);
	gpio_bit_write(GPIOB,phaseccw[2],SET);
	gpio_bit_write(GPIOB,phaseccw[3],SET);	
	delay_1ms(5);//等待5ms
	gpio_bit_write(GPIOB,phaseccw[0],SET);
	gpio_bit_write(GPIOB,phaseccw[1],RESET);
	gpio_bit_write(GPIOB,phaseccw[2],RESET);
	gpio_bit_write(GPIOB,phaseccw[3],SET);	
	delay_1ms(5);//等待5ms
	gpio_bit_write(GPIOB,phaseccw[0],SET);
	gpio_bit_write(GPIOB,phaseccw[1],SET);
	gpio_bit_write(GPIOB,phaseccw[2],RESET);
	gpio_bit_write(GPIOB,phaseccw[3],SET);	
	delay_1ms(5);//等待5ms
	gpio_bit_write(GPIOB,phaseccw[0],SET);
	gpio_bit_write(GPIOB,phaseccw[1],SET);
	gpio_bit_write(GPIOB,phaseccw[2],RESET);
	gpio_bit_write(GPIOB,phaseccw[3],RESET);	
	delay_1ms(5);//等待5ms
	gpio_bit_write(GPIOB,phaseccw[0],SET);
	gpio_bit_write(GPIOB,phaseccw[1],SET);
	gpio_bit_write(GPIOB,phaseccw[2],SET);
	gpio_bit_write(GPIOB,phaseccw[3],RESET);	
	delay_1ms(5);//等待5ms
	gpio_bit_write(GPIOB,phaseccw[0],RESET);
	gpio_bit_write(GPIOB,phaseccw[1],SET);
	gpio_bit_write(GPIOB,phaseccw[2],SET);
	gpio_bit_write(GPIOB,phaseccw[3],RESET);
}
int main(void)
{
	int i;
	rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);//设置主频108M(#define __SYSTEM_CLOCK_108M_PLL_HXTAL         (uint32_t)(108000000)),8M外部晶振  (#define HXTAL_VALUE    ((uint32_t)8000000))
  systick_config();//配置1ms SysTick
	rcu_periph_clock_enable(RCU_AF);//AF时钟使能 
	

	rcu_periph_clock_enable(RCU_GPIOB);//GPIOB时钟打开
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_5);//PB0,PB1,PB2,PB5配置成输出
	
    while(1)
    {
			
				delay_1ms(50);//等待50ms			
				for(i=0;i<512;i++)//512次循环正转360度,512=360*8/5.625				
				{
				MotorCW();   //正转
				} 
				
			gpio_bit_write(GPIOB,phaseccw[0],SET);//电平都恢复高电平
			gpio_bit_write(GPIOB,phaseccw[1],SET);//电平都恢复高电平
			gpio_bit_write(GPIOB,phaseccw[2],SET);//电平都恢复高电平
			gpio_bit_write(GPIOB,phaseccw[3],SET);//电平都恢复高电平
				delay_1ms(500);
				for(i=0;i<256;i++)//256次循环反转180度,256=180*8/5.625
				{
				MotorCCW();  //反转
				} 
				
			gpio_bit_write(GPIOB,phaseccw[0],SET);//电平都恢复高电平
			gpio_bit_write(GPIOB,phaseccw[1],SET);//电平都恢复高电平
			gpio_bit_write(GPIOB,phaseccw[2],SET);//电平都恢复高电平
			gpio_bit_write(GPIOB,phaseccw[3],SET);//电平都恢复高电平
			delay_1ms(500); //等待500ms
    }
 
}

实验效果:

上电之后,步进电机先转360度,再反转180度,一直循环

六.工程源代码下载

通过网盘分享的文件:25.5V步进电机正反转.rar
链接: https://pan.baidu.com/s/1SUVkhertza-aFKRg2lVLcg 提取码: nw8k
如果链接失效,可以联系博主给最新链接

程序下载下来之后解压就行

七.小结

步进电机应用非常广泛,打印机:步进电机移动打印头位置并送入打印纸,数码相机:控制镜头以调整焦距和拍摄对象的亮度,空调:移动室内机的百叶,从而改变气流的方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值