stm32单片机控制28BYJ48步进电机原理及代码

2023-11-16

 命名方式(以28BYJ48步进电机为例)

28BYJ48步进电机的编号

28-----步进电机的有效最大外径是28毫米

B-----表示步进电机

Y-----表示永磁式

J-----表示减速型

48-----表示四相八拍

工作原理

1、五线四相步进电机,不同相位得电会让步进电机的转子转动一个角度,按一定规律给不同的相位通电,就可以让步进电机连续转动,下表就是通电的顺序。

表里面的顺,逆时针的方向只是代表相位给电时序,

注:总共五条线,一个是VCC,剩下四条分别接上ABCD相

分别对应与ULN2003/ULN2003A驱动芯片的5V以及4个输入口对应连接

2、每走一个位置,都要给一定的延时,不然还没等转子到位,下一个脉冲就进来了,肯定会引起错误,导致电机堵转或者异常震动。

3、通过改变延时的时间,就可以控制电机的转速,不能太慢,也不要太快,不断调试到合理范围就行。

4、单片机IO口和电机四条相线连接时,一定不能错误,要按照顺序相连接。

5、调换得电的顺序,就可以控制电机的转向。

注意在51单片机中,为IO口置0相当于是高电平,而置1的时候相当于是低电平,和上面的图片一致(GND)

二、关键实验程序

在编写注释的时候用的是ANSI编码器,在这里部分注释可能会出现乱码,复制到编译器中就会正常显示(也注意一般用UTF-8编码器进行编写,ANSI编码器对中文不友好,一般一个汉字用的2个字符储存,所以在转存的时候就会出现乱码)

头文件

#ifndef __BSP_ULN2003_H__
#define __BSP_ULN2003_H__

#include <stm32f10x.h>
#include "bsp_SysTick.h"

#define STEPPER_ANGLE		0.703125   //  360/(4096/4)=360/512=0.703125

enum dir{Pos, Neg};   //Pos = 0, Neg = 1  //enumΪ¶¨ÒåΪö¾Ù

#define IN1_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET)
#define IN1_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET)

#define IN2_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET)
#define IN2_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET)

#define IN3_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET)
#define IN3_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_RESET)

#define IN4_HIGH	GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET)
#define IN4_LOW		GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_RESET)

void ULN2003_Configuration(void);
void stepper(unsigned int dir, unsigned int speed);
void angle_control(unsigned int dir, double angle, unsigned int speed);

#endif

调用函数

/*
	Á¬Ïß±í£º
	STM32								ULN2003Çý¶¯
	PA4      	<-------> 	IN1
	PA5			<-------> 	IN2
	PA6			<-------> 	IN3
	PA7			<-------> 	IN4
	
	5V 28BYJ-48²½½øµç»ú£¬ÄÚ²¿´øÓмõËÙ×°Öà ¼õËٱȣº1/64   ²½¾à½Ç£º5.625¡ã/64£¨64¸öÂö³åת¶¯5.625¡ã£©

ÕýÏòת¶¯£º
	ËÄÏà°ËÅÄ¿ØÖÆ˳Ðò£º(A-AB-B-BC-C-CD-D-DA)
				1		2		3		4		5		6		7		8
	A			-		-		+		+		+		+		+		-
	B			+		-		-		-		+		+		+		+
	C			+		+		+		-		-		-		+		+
	D			+		+		+		+		+		-		-		-
·´Ïòת¶¯£º(DA-D-CD-C-BC-B-AB-A)
*/

#include "bsp_uln2003.h"

void ULN2003_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_WriteBit(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, Bit_RESET);
}

//ËٶȿØÖÆ:
/*
dir: ˳£¬ÄæʱÕëÐýת·½Ïò
speed£º×ªËÙ£¬·¶Î§[1,100]
*/
void stepper(unsigned int dir, unsigned int speed)
{
	if(dir == Pos)
	{
		//step1:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);
		
		//step2:	
		IN1_HIGH;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step3:		
		IN1_LOW;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step4:
		IN1_LOW;
		IN2_HIGH;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step5:
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step6:
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_HIGH;
		Delay_us(speed);

		//step7:
		IN1_LOW;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);

		//step8:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);
	}
	else
	{
		//step1:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);

		//step2:		
		IN1_LOW;
		IN2_LOW;
		IN3_LOW;
		IN4_HIGH;
		Delay_us(speed);

		//step3:		
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_HIGH;
		Delay_us(speed);

		//step4:
		IN1_LOW;
		IN2_LOW;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step5:
		IN1_LOW;
		IN2_HIGH;
		IN3_HIGH;
		IN4_LOW;
		Delay_us(speed);

		//step6:
		IN1_LOW;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step7:
		IN1_HIGH;
		IN2_HIGH;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);

		//step8:
		IN1_HIGH;
		IN2_LOW;
		IN3_LOW;
		IN4_LOW;
		Delay_us(speed);
	}
}

//½Ç¶È¿ØÖÆ£º
/*
dir: ˳£¬ÄæʱÕëÐýת·½Ïò
angle£º½Ç¶È£¬·¶Î§[0,360]
speed£º×ªËÙ£¬·¶Î§[1,100]
*/

void angle_control(unsigned int dir, double angle, unsigned int speed)
{
	int i;
	
	for(i = 0; i < angle / STEPPER_ANGLE; i++) //µ÷ÓÃ(angle / STEPPER_ANGLE)¸ö°ËÅÄ
		stepper(dir, speed);
}
//µ÷ÓÃÕâ¸öº¯Êý¿ØÖƽǶÈÓнÏСµÄÎó²î»ò˵ÊÇȱÏÝ£ºÒ»ÊÇ˵stepper(dir, speed);ÊÇÒÔ°ËÅÄΪ×îС·Ö¶ÈÖµ
//Æä´ÎÊÇ£¬forº¯ÊýÖÐ×îС²½¾àΪ1£¬ºÜÏÔÈ»angle / STEPPER_ANGLE ×î¶àÓÐÒ»¸ö°ËÅĵÄÎó²î£¬
//¼´5.624/64*8=0.703¶È£¬Ò²²»ÊǺܴ󣬿ÉÒÔºöÂÔ²»¼Æ

1、步进电机的减速比为1/64,即转子转动64圈,外面的转轴才会转动1圈

2、步进电机的步距角为5.624/64 (步进电机的定子绕组每次改变一次通电状态,步进电机外面的转轴转过的角度称步距角;即步进电机的最小旋转角度)

3、所以360/(5.624/64)≈ 4096 (步进电机外面的转轴转过一圈所需要改变定子绕组的通电状态次数)

这里补充介绍一个概念:步进角

步进电机的定子绕组每次改变一次通电状态,转子转过的角度称步进角。

(可以认为是电机内部的转子的最小旋转角度)

步进角 = (360)/m * Z * C

m-----定子相数

Z-----转子磁极对数

C-----通电方式

{ C = 1 ,单相轮流通电,双相轮流通电方式

  C = 2 , 双相轮流通电方式

1,相数:是指产生不同对极N,S磁场的激磁线圈对数

2,拍数:完成一个周期性变化所需脉冲数,以四相电机为例,有单相四拍的运行方式:(A-B-C-D),有双相四拍的运行方式:(AB-BC-CD-DA),有四相八拍的运行方式:(A-AB-B-BC-C-CD-D-DA)

这里的源码用的是双相轮流通电方式,在源码中可以看到四个相位MA,MB,MC,MD使能为高电平状态的相位数为相邻2个或1个(A-AB-B-BC-C-CD-D-DA)

步进电机的相关参数:


注意事项:由于电机的制造误差,安装误差,单片机的误差还有软件延时函数误差,这些误差累加起来之后,就会导致电机的转速、转动角度出现一定的误差。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32单片机控制28BYJ48步进电机原理及代码 的相关文章

  • python常见异常类型&异常处理

    python常见异常类型 异常处理 常见异常类型 ZeroDivisionError 除 或取模 零 IndexError 序列中没有此索引 KeyError 映射中没有这个键 NameError 未声明 初始化对象 SyntaxError
  • chatgpt赋能python:如何让Python程序运行

    如何让Python程序运行 Python是一种高级编程语言 它被广泛应用于各种不同的领域 包括Web开发 数据分析 机器学习 人工智能等等 当你编写Python程序时 你需要学习如何让它们在你的计算机上运行 在本文中 我们将介绍如何让Pyt

随机推荐

  • ajax请求不能下载文件

    最近在做文件下载 后台写了个控制层 直接走进去应该就可以下载文件 各种文件图片 excel等 但是起初老是下载失败 并且弹出下面的乱码 前台请求代码 fileexcel unbind click bind click function al
  • 【随笔】年轻人的存款多少取决于个人或家庭的消费观

    近日 有调查称 大概五分之一的年轻人存款在一万元以内 10万元存款是一个 坎 存款超过10万就会超过53 7 的人 年轻人 存款 两个词碰撞在一起 引来了广泛的关注和讨论 你认为年轻人存款难吗 可以从以下几个角度发表你的看法 目录 一 灵魂
  • 脑机接口BCI技术概述

    脑机接口BCI技术概述 前言 一 脑机接口BCI是什么 二 BCI的框架 1 信号采集 2 信号处理 2 1 预处理 2 2 特征提取 2 3 模式分类 3 BCI应用 三 脑控系统中常用的BCI范式 1 基于感觉运动节律的BCI 2 基于
  • v-text的用法

    v text指令 相当于原生js中的innerText 用于将数据填充到标签中 作用于插值表达式类似 但是没有闪动问题 如果数据中有HTML标签会将html标签一并输出 注意 此处为单向绑定 数据对象上的值改变 插值会发生变化 但是当插值发
  • 安卓智能手机开发,打地鼠实例(登录页面+游戏界面+课程设计)

    主要为大家详细介绍了Android实现打地鼠小游戏 文中示例代码介绍的非常详细 具有一定的参考价值 感兴趣的小伙伴们可以参考一下 文件 url80 ctfile com f 25127180 743379579 b297fb p 55168
  • JavaSe学习日记

    前言 How to study 需求 工作需要 跳槽 对方需要 技术控 看看传统技术能否解决 能解决 不完美 解决不了 问清楚新技术到底有什么优异 引出我们学习的新技术和知识点 学习新技术或者知识点的基本原理和基本语法 先不要考虑细节 快速
  • Qt 5.9.6 配置MSVC 2017编译器

    一 安装Visual Studio 使用MSVC 2017的最低版本为Visual Studio 2017 高版本适用 我使用的是Visual Studio Community 2019 VS官网下载 选择安装通用Windows平台开发和使
  • GCC - structure/union前端解析说明

    以GCC8 2 0版本为例 介绍gcc语法解析器 parser 对声明即函数定义的解析过程以及structure union的简单解析说明 1 GCC中声明和定义的解析过程 1 1 解析入口 c parse file GCC中gcc c c
  • 双指针算法模板

    什么是同向双指针 什么是相向双指针 双指针的鼻祖题 两数之和 Two Sum 链表上的快慢指针算法 快速排序 归并排序 几乎所有 Two Sum 变种 Partition Quick Select 分成两个部分 分成三个部分 一些你没听过的
  • 关于keil中内存分配的问题,局部变量、全局变量,堆栈的分配

    看 map文件 从 map文件中可以看出 ram中的数据是如何摆放的 1 首先从0x20000000开始 放全局变量的数据 如上图2所示 0x20000000以及0x200000004 0x20000008的地方的数据 存放的是全局变量 分
  • 基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

    硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的 而且内部还自带有数字摄像头接口 DCMI 可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670简直就是绝配 我手上的这块张这个样子 图片
  • 安卓studio 配置Flutter

    1 下载Flutter SDK Flutter SDK 我的安卓studio版本是4 2 1 下载的Flutter SDK 是Dev channel Windows 2 6 0版本 2 将压缩包解压到指定目录 例如C src flutter
  • 最新如何在kali linux中安装搜狗输入法

    在安装之前我们先来更新我们的源 更新方法 leafpad etc apt sources list 在打开的文件中输入下面的源 保存退出 阿里云源 deb http mirrors aliyun com kali sana main non
  • javaFX用IDEA打包导出exe后图片不显示问题

    今天在用idea打包完成了JavaFX项目时 查到了两种方法 一种是用eclipse中的ant直接打包形成可安装的exe文件 见https code makery ch zh cn library javafx tutorial part7
  • docker-compose deploy 高可用 elasticsearch TLS

    文章目录 1 sysctl 2 swap 3 hosts 4 配置 instances yaml 5 创建证书 6 部署 7 修改 kibanna 密码 8 清理 1 sysctl root github es tls cat etc sy
  • 用canvas绘制的饼状图,颜色随机,动态生成

    想想自己平时太懒了 像jQuery一样 write less do more 但是 我决定改变了 write more do more 这里贴上我用canvas绘制的饼状图 均分6等分 颜色随机
  • 点击table表格单元格修改数据同时更新数据库

    XML HTML Code
  • matlab读取excel数据并画图

    Matlab可以使用函数 xlsread 来读取Excel数据 语法 num txt raw xlsread filename 其中 filename 是Excel文件的名称 num 是读取的数字数据 txt 是读取的文本数据 raw 是读
  • word2016页码设置(包括目录去除页码)

    word2016页码设置 包括目录去除页码 把你鼠标的光标 移到正文 最开始 点击布局 选择 分隔符 里面的 下一页 开始插入页码 然后设置页码格式 点击链接到前一节 手动删除你目录上的页码 操作流程 1 把你鼠标的光标 移到正文 最开始
  • stm32单片机控制28BYJ48步进电机原理及代码

    命名方式 以28BYJ48步进电机为例 28BYJ48步进电机的编号 28 步进电机的有效最大外径是28毫米 B 表示步进电机 Y 表示永磁式 J 表示减速型 48 表示四相八拍 工作原理 1 五线四相步进电机 不同相位得电会让步进电机的转