28BYJ-48步进电机详解(五线四相 STM32)

news/2025/3/13 14:44:49/

目录

一、介绍

二、模块原理

1.工作原理介绍

2.ULN2003驱动模块原理图

3.引脚描述

三、程序设计

main.c文件

stepmotor.h文件

stepmotor.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

       步进电机(STEP MOTOR)把电脉冲信号变换成角位移以控制转子转动的执行机构。在自动控制装置中作为执行器。每输入一个脉冲信号,步进电动机前进一步,故又称脉冲电动机。步进电动机多用于数字式计算机的外部设备,以及打印机、绘图机和磁盘等装置。

以下是28BYJ48步进电机的参数:

型号

28BYJ48

工作电压

5V

直径

28mm

减速比

1:64

驱动方式

ULN2003

相电阻

50±10%

步进角度

5.625°/64

型号代表含义:

28——最大外径是28毫米

B——表示是步进电机

Y——表示是永磁式

J——表示是减速型

48——表示四相八拍

哔哩哔哩视频演示:

28BYJ-48步进电机详解(五线四相 STM32)

(资料分享见文末) 

二、模块原理

1.工作原理介绍

    步进电机通过一系列离散的步进动作来实现旋转。每个电脉冲信号驱动电机转动一个固定的角度,称为步距角。步进电机的控制通常通过一个驱动器(步进驱动器)来完成,该驱动器接受来自控制器的脉冲信号,并将其转换为步进电机的相位信号,从而驱动电机按预定的步进角度转动。

2.ULN2003驱动模块原理图

3.引脚描述

引脚名称

描述

VCC

供给电压DC 5V

IN1

驱动信号1

IN2

驱动信号2

IN3

驱动信号3

IN4

驱动信号4

三、程序设计

使用STM32F103C8T6通过ULN2003驱动板驱动步进电机使其完成正反转动作。

IN1

PA1

IN2

PA2

IN3

PA3

IN4

PA4

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "stepmotor.h"/*****************辰哥单片机设计******************STM32* 项目			:	28BYJ-48步进电机实验                     * 版本			: V1.0* 日期			: 2024.8.31* MCU			:	STM32F103C8T6* 接口			:	参看stepmotor.h							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/float co2;
u8 buff[30];//参数显示缓存数组int main(void)
{ SystemInit();//配置系统时钟为72M	delay_init(72);LED_Init();LED_On();MOTOR_Init();USART1_Config();//串口初始化OLED_Init();printf("Start \n");delay_ms(1000);OLED_Clear();while (1){MOTOR_Direction_Angle(1,0,90,1);delay_ms(1000);MOTOR_Direction_Angle(0,0,90,1);delay_ms(1000);}
}

stepmotor.h文件

#ifndef __STEPMOTOR_H
#define	__STEPMOTOR_H
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"/*****************辰哥单片机设计******************STM32* 文件			:	28BYJ-48步进电机h文件                   * 版本			: V1.0* 日期			: 2024.8.31* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************//***************根据自己需求更改****************/
// 步进电机 GPIO宏定义#define	MOTOR_CLK				RCC_APB2Periph_GPIOA#define MOTOR_A 				GPIO_Pin_1
#define MOTOR_B 				GPIO_Pin_2
#define MOTOR_C 				GPIO_Pin_3
#define MOTOR_D 				GPIO_Pin_4
#define MOTOR_PROT 			GPIOA#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)/*********************END**********************/void MOTOR_Init(void);
void MOTOR_Rhythm_4_1_4(u8 step,u8 dly);
void MOTOR_Direction(u8 dir,u8 num,u8 dly);
void MOTOR_Direction_Angle(u8 dir,u8 num,u16 angle,u8 dly);
void MOTOR_STOP(void);
#endif

stepmotor.c文件

#include "stepmotor.h"/*****************辰哥单片机设计******************STM32* 文件			:	28BYJ-48步进电机c文件                   * 版本			: V1.0* 日期			: 2024.8.31* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************/void MOTOR_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(MOTOR_CLK, ENABLE ); //配置复用时钟GPIO_InitStructure.GPIO_Pin = MOTOR_A|MOTOR_B|MOTOR_C|MOTOR_D;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(MOTOR_PROT,&GPIO_InitStructure);GPIO_ResetBits(GPIOA, MOTOR_A|MOTOR_D|MOTOR_B|MOTOR_C);
}void MOTOR_Rhythm_4_1_4(uint8_t step,uint8_t dly)
{switch(step){case 0 :;;break;case 1 :MOTOR_A_LOW;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_HIGH;	//1break;case 2 :MOTOR_A_HIGH;MOTOR_B_LOW;MOTOR_C_HIGH;MOTOR_D_HIGH;	//2break;case 3 :MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_LOW;MOTOR_D_HIGH;	//3break;case 4 :MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_LOW;	//4break;		}delay_ms(dly);
}void MOTOR_Rhythm_4_2_4(uint8_t step,uint8_t dly)
{switch(step){case 0 :;;break;case 1 :MOTOR_A_LOW;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_LOW;	//1break;case 2 :MOTOR_A_LOW;MOTOR_B_LOW;MOTOR_C_HIGH;MOTOR_D_HIGH;	//2break;case 3 :MOTOR_A_HIGH;MOTOR_B_LOW;MOTOR_C_LOW;MOTOR_D_HIGH;	//3break;case 4 :MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_LOW;MOTOR_D_LOW;	//4break;		}delay_ms(dly);
}void MOTOR_Rhythm_4_1_8(uint8_t step,uint8_t dly)
{switch(step){case 0 :;;break;case 1 :MOTOR_A_LOW;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_HIGH;	//1break;case 2 :MOTOR_A_LOW;MOTOR_B_LOW;MOTOR_C_HIGH;MOTOR_D_HIGH;	//2break;case 3 :MOTOR_A_HIGH;MOTOR_B_LOW;MOTOR_C_HIGH;MOTOR_D_HIGH;	//3break;case 4 :MOTOR_A_HIGH;MOTOR_B_LOW;MOTOR_C_LOW;MOTOR_D_HIGH;	//4break;	case 5 :MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_LOW;MOTOR_D_HIGH;	//5break;case 6 :MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_LOW;MOTOR_D_LOW;	//6break;case 7 :MOTOR_A_HIGH;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_LOW;	//7break;case 8 :MOTOR_A_LOW;MOTOR_B_HIGH;MOTOR_C_HIGH;MOTOR_D_LOW;	//8break;			}delay_ms(dly);
}void MOTOR_Direction(uint8_t dir,uint8_t num,uint8_t dly)	//方向 节拍 频率
{if(dir){switch(num){case 0:for(uint8_t i=1;i<9;i++){MOTOR_Rhythm_4_1_8(i,dly);}break;case 1:for(uint8_t i=1;i<5;i++){MOTOR_Rhythm_4_1_4(i,dly);}break;case 2:for(uint8_t i=1;i<5;i++){MOTOR_Rhythm_4_2_4(i,dly);}break;default:break;}}else{switch(num){case 0:for(uint8_t i=8;i>0;i--){MOTOR_Rhythm_4_1_8(i,dly);}break;case 1:for(uint8_t i=4;i>0;i--){MOTOR_Rhythm_4_1_4(i,dly);}break;case 2:for(uint8_t i=4;i>0;i--){MOTOR_Rhythm_4_2_4(i,dly);}break;default:break;}	}
}void MOTOR_Direction_Angle(uint8_t dir,uint8_t num,u16 angle,uint8_t dly) //方向 节拍  角度 频率
{for(u16 i=0;i<(64*angle/45);i++)	//64*64=4096 64*180=256 //512{MOTOR_Direction(dir,num,dly);	}
}void MOTOR_STOP(void)
{GPIO_ResetBits(GPIOA, MOTOR_A|MOTOR_B|MOTOR_C|MOTOR_D);
}

四、实验效果 

五、资料获取

项目分享


http://www.ppmy.cn/news/1524455.html

相关文章

[Go]通用的 MapReduce 工具函数

前言 最近在测试学习 aws s3 sdk 中的 Multi Part Upload 功能&#xff0c;其基本步骤就是 CreateMultipartUpload 后&#xff0c; 串行或并行地 UploadPart &#xff0c;最后 CompleteMultipartUpload 或 AbortMultipartUpload 收尾。为了最高效率地完成整个传输&#xff0c;…

node.js 完全卸载和下载配置

一、介绍 &#xff08;1&#xff09;node.js Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c; [1]让JavaScript 运行在服务端的开发平台&#xff0c…

【openGauss】WDR快照无法生成或执行生成不报错,但是snapshot.snapshot为空的问题

问题情况 开启enable_wdr_snapshot后再snapshot.snapshot中差不多任何快照信息 手动创建快照也还是查不到 问题原因 检查pg_log日志(/opt/software/log为自己的日志路径) vi /opt/software/log/omm/pg_log/dn_6001/postgresql-2024-03-06_144308.log可以发现报错信息为没有在…

Redis 的内存淘汰算法与原理详解

引言 Redis 是一款基于内存的高性能键值存储数据库&#xff0c;能够在多种场景下提供高效的数据存储与查询。然而&#xff0c;作为内存数据库&#xff0c;Redis 的一个关键问题是内存的限制。当 Redis 存储的数据量达到或接近内存上限时&#xff0c;为了防止系统崩溃&#xff…

【LLM大模型】大语言模型架构:LLM MoE :Switch Transformers

3.LLM MoE &#xff1a;Switch Transformers 0.前言 GPT-4远不止1万亿&#xff0c;甚至&#xff0c;还是8个2200亿参数组成的混合专家模型&#xff08;MoE&#xff09;。 2023年6月&#xff0c;美国知名骇客George Hotz在接受采访时透露&#xff0c;GPT-4由8个220B模型组成。…

整合Redis和RedisCacheManger

整合redis springboot在现在的版本中操作Redis数据库用到了lettuce&#xff0c;而不是Jedis&#xff0c;他们各有各的特点。Jedis以Redis命令作为方法名称&#xff0c;学习成本低&#xff0c;简单实用。但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使…

C语言代码练习(第十八天)

今日练习&#xff1a; 48、猴子吃桃问题。猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。第2天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时&…

湖南岳阳农商行高管更迭背后:不良率居高,盈利压力不减

撰稿|芋圆 来源|贝多财经 2024年8月末&#xff0c;湖南岳阳农商行发布了2024年半年报&#xff0c;报告显示截至2024年6月末&#xff0c;湖南岳阳农商行资产规模累计231亿元&#xff0c;较2023年末增长1.34%&#xff1b;营业收入3.1亿元&#xff0c;同比增幅6.54%&#xff1b;…