零基础STM32单片机编程入门(十) 28BYJ-48步进电机的控制实战含源码视频

文章目录

    • 一.概要
    • 二.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

如果链接失效,可以联系博主给最新链接

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

七.讲解视频链接地址

步进电机实验

八.小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/782805.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

102.二叉树的层序遍历——二叉树专题复习

迭代方式&#xff1a; class Solution {// 定义一个成员变量res来存储层序遍历的结果List<List<Integer>> res new ArrayList<>();// levelOrder方法是层序遍历的接口&#xff0c;它接受一个二叉树的根节点rootpublic List<List<Integer>> lev…

开展新版FMEA培训如何避免陷入形式主义?

在企业中开展新版FMEA培训&#xff0c;旨在提升员工对产品潜在故障及其影响的识别、评估和控制能力&#xff0c;从而增强产品质量和可靠性。然而&#xff0c;不少企业在开展新版FMEA培训时往往容易陷入形式主义&#xff0c;导致培训效果不佳。为了避免这种情况&#xff0c;我们…

视频压缩软件哪个压缩最小,视频用什么软件压缩最小

在数字媒体时代&#xff0c;视频内容的生产与分享已成为生活常态。但随之而来的问题就是&#xff0c;大视频文件占用过多存储空间&#xff0c;上传和分享也变得不便。本文将为你揭示如何将视频压缩到最小&#xff0c;同时保持画质清晰。让我们一起探索吧&#xff01; 下载并文件…

Java SE 9模块化系统。

JDK 9模块化介绍 介绍Java SE 9&#xff1a;拼图项目1.拼图项目将引入Java SE 9的全新概念&#xff1a;Java模块系统。2.Java模块解决了什么问题3.细节描述 Java SE 9模块系统的优点1.由于Java SE 9将把JDK&#xff0c;JRE&#xff0c;JAR等分成较小的模块&#xff0c;因此我们…

程序员必知的 89 个操作系统核心概念

1. 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系…

Spring Boot源码概述及应用案例

文章目录 Spring Boot源码关键点应用案例&#xff1a;构建一个简单的Spring Boot Web应用1. 创建项目2. 主类3. 添加用户实体4. 创建用户服务5. 创建REST控制器6. 运行和测试应用 深入与扩展1. 数据持久化2. 安全性增强 Spring Boot源码关键点 Spring Boot 的源码设计遵循模块…

SQLServer的系统数据库用别的服务器上的系统数据库替换后做跨服务器连接时出现凭证、非对称金钥或私密金钥的资料无效

出错作业背景&#xff1a; 公司的某个sqlserver服务器要做迁移&#xff0c;由于该sqlserver服务器上数据库很多&#xff0c;并且做了很多的job和维护计划&#xff0c;重新安装的sqlserver这些都是空的&#xff0c;于是就想到了把系统4个系统数据库进行替换&#xff0c;然后也把…

LeetCode热题100刷题8:54. 螺旋矩阵、73. 矩阵置零、48. 旋转图像

54. 螺旋矩阵 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> vec;if(matrix.empty())return vec;int left0;int right matrix[0].size()-1;int up0;int down matrix.size()-1;while(true) {for(i…

flask、fastapi在服务器制作接口携参访问返回参数

flask创建接口&#xff1a; 一、安装python 官网下载Download Python | Python.org 二、安装flask 在选择的文件夹路径cmd调用bash安装 pip install Flask三、创建flask应用 # app.py from flask import Flask, request, jsonify app Flask(__name__) app.route(/ech…

如何选择合适的PCB表面处理工艺?

在PCB制造中应用PCB表面处理至关重要&#xff0c;以保护铜迹线不受氧化和环境污染物的侵蚀&#xff0c;这些污染物会降低性能。这些PCB表面处理可以防止水分、灰尘、化学物质和极端温度的侵入&#xff0c;防止PCB材料的腐蚀。它们还有助于在组装过程中有效焊接和粘合&#xff0…

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类 今天基于GPT实现一个情感分类的功能&#xff0c;假设已经安装好了MindSpore环境。 # 该案例在 mindnlp 0.3.1 版本完成适配&#xff0c;如果发现案例跑不通&#xff0c;可以指定mindnlp版本&#xff0c;执行!pip…

Git 查看、新建、删除、切换分支

Git 是一个版本控制系统&#xff0c;软件开发者用它来跟踪应用程序的变化并进行项目协作。 分支的诞生便于开发人员在彼此独立的环境中进行开发工作。主分支&#xff08;通常是 main 或 master&#xff09;可以保持稳定&#xff0c;而新的功能或修复可以在单独的分支中进行开发…

STM32智能无人机控制系统教程

目录 引言环境准备智能无人机控制系统基础代码实现&#xff1a;实现智能无人机控制系统 4.1 数据采集模块 4.2 数据处理与飞行控制 4.3 通信与导航系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;无人机应用与优化问题解决方案与优化收尾与总结 1. 引言 智能无人机控…

AI工具杂谈

AI是在帮助开发者还是取代他们&#xff1f; 在软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试&#xff0c;AI工具正在成为开发者的得力助手。然而&#xff0c;这也引发了对开发者职业…

哪个牌子的护眼大路灯质量好呢?性价比高的五款护眼大路灯分享

护眼大路灯可以说是是每个有娃家庭必不可少的照明神器。但面对市场上琳琅满目的护眼落地灯品牌和型号&#xff0c;很多消费者在选购时都会犯难&#xff1a;究竟哪个牌子的护眼大路灯质量好呢&#xff1f;哪个性价比高呢&#xff1f;本文将根据市场反馈以及性价比等各方面&#…

Table 表格--分页序号自增

代码&#xff1a; import { Space, Table, Tag } from antd; import type { ColumnsType } from antd/es/table; import React, { useState } from react;interface DataType {key: string;name: string;age: number;address: string;tags: string[]; }const data: DataType[]…

6K star! 部署本地运行LLM的AI助手,零基础入门到精通超详细

AI套壳千千万万&#xff0c;你最喜欢哪一款&#xff1f;现在各种ChatGPT替代品层出不穷&#xff0c;但是大部分都是使用OpenAI的API&#xff0c;也就说离不开网络。 今天我们推荐的开源项目它就是要帮你100%在本地运行大模型&#xff0c;进而构建一个属于自己的ChatGPT&#x…

使用 Docker 部署一个文档管理系统,让宝贵文档不在丢失!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 BookStack 是一个开源的文档管理系统,非常适合用来创建和组织文档。 通过 Docker,我们可以轻松地将 BookStack 部署到本地或服务器上。 本文将详细介绍如何使用 Docker 搭建 BookStack。 项目预览 登录页面

element-plus 的form表单组件之el-radio(单选按钮组件)

单选按钮组件适用于同一组类型的选项只能互斥选择的场景&#xff0c;就是支持单选。单选组件包含以下3个组件 组件名作用el-radio-group单选组组件&#xff0c;子元素可以是el-radio或el-radio-button&#xff0c;v-mode绑定单选组的响应式属性el-radio单选组件&#xff0c;la…

如何确保工业展厅设计既专业又吸引?三原则详解!

工业是民族发展的基石&#xff0c;它为我们带来了无数的便利和进步&#xff0c;而为了让更多人了解这个至关重要的产业&#xff0c;以及其背后的技术和产品&#xff0c;许多工业性质的企业都致力于通过互动投影、虚拟现实、全息投影等多媒体技术&#xff0c;来打造独具特色的工…