手把手从0到1教你做STM32+FreeRTOS智能家居--第11篇之步进电机

一、硬件设计  

步进电机介绍

本项目用到的是常见的也是控制起来最简单的步进电机:五线四项的步进电机28BYJ-48。

单片机IO口输出电流太小无法直接驱动电机运行,在这里我们需要另外加一个电机驱动板。可以选择ULN2003电机驱动板。


步进电机的控制原理

给步进电机不同的项轮流进行通电,在电磁感应作用下,每次产生一个很小的角位移,连贯起来就能够带动电机的转动,进行负载的驱动。

通过单片机来实现电机的控制,需要关注以下几点:

1)通过脉冲信号进行控制。

2)电机总转动的角度由输入的脉冲数来决定。

3)电机的转速由脉冲输入的频率决定。

本项目用到的是八拍驱动的方式:A→AB→B→BC→C→CD→D→DA

 


二、软件设计

1.电机控制引脚初始化

此处可以参考手把手从0到1教你做STM32+FreeRTOS智能家居--第1篇之点亮LED灯-CSDN博客对STM32CubeMX进行引脚配置,将所用到的引脚配置为推挽输出即可。

本项目的引脚连接为电机的

蓝色A线--PA8  粉色B线--PC9  黄色C线--PC8 橙色D线--PC7,我在Motor.h文件中将控制GPIO高低电平的函数设置为宏定义,此处提一嘴,方便大家阅读。

#ifndef __MOTOR_H
#define __MOTOR_H	 #include "main.h"#define u8 uint8_t#define  YELLOW_GPIO_PORT       	GPIOC
#define  YELLOW_GPIO_PIN       	  GPIO_PIN_8#define  ORANGE_GPIO_PORT       	GPIOC
#define  ORANGE_GPIO_PIN       	  GPIO_PIN_7#define  PINK_GPIO_PORT       	  GPIOC
#define  PINK_GPIO_PIN       	    GPIO_PIN_9#define  BLUE_GPIO_PORT       	 GPIOA
#define  BLUE_GPIO_PIN       		 GPIO_PIN_8#define orange_H_D      	HAL_GPIO_WritePin(ORANGE_GPIO_PORT, ORANGE_GPIO_PIN, GPIO_PIN_SET)		
#define orange_L_D 				HAL_GPIO_WritePin(ORANGE_GPIO_PORT, ORANGE_GPIO_PIN, GPIO_PIN_RESET)	#define yellow_H_C 				HAL_GPIO_WritePin(YELLOW_GPIO_PORT, YELLOW_GPIO_PIN, GPIO_PIN_SET)	
#define yellow_L_C 				HAL_GPIO_WritePin(YELLOW_GPIO_PORT, YELLOW_GPIO_PIN, GPIO_PIN_RESET)	#define pink_H_B   				HAL_GPIO_WritePin(PINK_GPIO_PORT, PINK_GPIO_PIN, GPIO_PIN_SET)
#define pink_L_B	 				HAL_GPIO_WritePin(PINK_GPIO_PORT, PINK_GPIO_PIN, GPIO_PIN_RESET)#define blue_H_A   				HAL_GPIO_WritePin(BLUE_GPIO_PORT, BLUE_GPIO_PIN, GPIO_PIN_SET)
#define blue_L_A   				HAL_GPIO_WritePin(BLUE_GPIO_PORT, BLUE_GPIO_PIN, GPIO_PIN_RESET)void	MOTO_Stop(void);
void Open_Door(void);
void Close_Door(void);
void Set_Motor_Loop (unsigned char dirction,unsigned char loop,unsigned char speed);
void Set_Motor_Angle(unsigned char dirction, int angle, unsigned char speed);
#endif

2.电机控制函数

 void Set_Motor_Num (unsigned char dirction, unsigned int num, unsigned char speed)是控制电机转动一步的函数,用于调用Set_Motor函数,对照着步进电机的控制原理中的图,理论和实际应用完全对得上。

void Set_Motor_Loop (unsigned char dirction, unsigned char loop, unsigned char speed) 电机旋转一圈360°需要转动4096步。

void Set_Motor_Angle(unsigned char dirction, int angle, unsigned char speed) 用于控制电机旋转特定的角度,其中有计算公式的注释,实现粗略地角度控制。

#include "motor.h"//IN1: PA8  A  Blue 
//IN2: PC9  B  Pink
//IN3: PC8  C  Yellow 
//IN4: PC7  d  Orange 
uint8_t Step = 0;void Stop_Motor(void);
void Set_Motor(unsigned char InputData, unsigned int speed);//dirction = 1 正转 dirction = 0 逆转
void Set_Motor_Num (unsigned char dirction, unsigned int num, unsigned char speed)  //电机按步数运行
{unsigned int i;for(i = 0; i < num; i++){	if(dirction == 1){ Step++;if(Step > 7)Step = 0;}else{if(Step == 0) Step = 8;Step--;}Set_Motor(Step, speed);}
}//控制步进电机旋转特定圈数
void Set_Motor_Loop (unsigned char dirction, unsigned char loop, unsigned char speed)  //电机按圈数运行
{Set_Motor_Num(dirction, loop * 4096, speed); 
}//360度=4096步
//1度≈11.38步
//粗略地控制步进电机旋转特定角度
void Set_Motor_Angle(unsigned char dirction, int angle, unsigned char speed)
{unsigned int i;unsigned int step = 11.38 * angle;if(dirction == 1){for(i = 0; i < step;i++) {Set_Motor_Num(1, 1, 1);}}else{for(i = 0;i < step;i++) {Set_Motor_Num(0, 1, 1);}	}}void Stop_Motor(void)
{blue_L_A;pink_L_B;yellow_L_C;orange_L_D;
}void Set_Motor(unsigned char InputData, unsigned int speed)
{switch(InputData){case 0:blue_H_A; pink_L_B; yellow_L_C; orange_L_D;break;case 1:blue_H_A; pink_H_B; yellow_L_C; orange_L_D;break;case 2:blue_L_A; pink_H_B; yellow_L_C; orange_L_D;break;case 3:blue_L_A; pink_H_B; yellow_H_C; orange_L_D;break;case 4:blue_L_A; pink_L_B; yellow_H_C; orange_L_D;break;case 5:blue_L_A; pink_L_B; yellow_H_C; orange_H_D;break;case 6:blue_L_A; pink_L_B; yellow_L_C; orange_H_D;break;case 7:blue_H_A; pink_L_B; yellow_L_C; orange_H_D;break;default:break;}HAL_Delay(speed);Stop_Motor();
}void Open_Door(void)
{Set_Motor_Angle(1, 90, 1);
}
void Close_Door(void)
{Set_Motor_Angle(0, 90, 1);
}

3.应用代码

参数1为正传(1正,0逆),参数2为度数:90°,参数三为旋转速度。

Set_Motor_Angle(1, 90, 1);

三、实验效果 

stm32控制步进电机旋转特定角度

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter发送webserver请求和上传请求

有时候在项目中会遇到webserver接口和上传接口的请求&#xff0c;大致参考如下 一、发送webserver请求 先获取登录接口的token&#xff0c;再使用cookie管理器进行关联获取商品(webserver接口)&#xff0c;注意参数一般是写在消息体数据中&#xff0c;消息体有点像HTML格式 执…

windows 搭建 go开发环境

go语言&#xff08;或 Golang&#xff09;是Google开发的开源编程语言&#xff0c;诞生于2006年1月2日下午15点4分5秒&#xff0c;于2009年11月开源&#xff0c;2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势&#xff0c;Go语言从底层原生支持并发&#xff0c;无须…

字典的创建和删除

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;字典与列表类似&#xff0c;也是可变序列&#xff0c;不过与列表不同&#xff0c;它是无序的可变序列&#xff0c;保存的内容…

pip换源ubuntu

到THU网站上有给定的教程 https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ 方法1 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package然后在https://pypi.org/project/nvidia-cublas-cu12/#files 里面搜索你的包名 方法2 python -m pip install --upg…

决策树|随机森林 GBDT XGBoost|集成学习

文章目录 1 决策树模型1.1 决策树模型简介1.2 决策树模型核心问题1.2.1 分类划分标准1.2.1.1 信息增益1.2.1.2 增益率1.2.1.3 基尼系数 1.2.2 停止生长策略1.2.3 剪枝策略 1.3 决策树 - python代码1.3.1 结果解读1.3.2 决策树可视化1.3.3 CV - 留一法 2 集成学习2.1 Boosting2.…

cin-getline缓存区

更多资源请关注纽扣编程微信公众号 cin.sync()清除缓存区 如果需要输入如下内容 3 This is C language. This is JAVA language. This is Python language. 写如下程序 #include<bits/stdc.h> using namespace std; string str[100]; int main(){int n;cin>&…

4-主窗口

4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件&#xff0c;是许多应用程序&…

Visual Studio 下的Qt工程无法打开 “xxx.ui“ 文件和LNK1104 无法打开文件“Qt5Cored.lib”错误

一、问题&#xff1a; VS下Qt环境准备好后&#xff0c;创建了Qt工程然后点击 Form Files 下的 “xxx.ui” 文件&#xff0c;在弹出 Qt 设计师 界面后闪退并显示如下错误&#xff1a; 二、解决 1、工具栏处依次点击&#xff1a;扩展 一> Qt VS Tools 一> options 弹出选…

网络工程师---第四十二天

1、基于子网的vlan划分配置步骤是什么&#xff1f; 2、基于端口的vlan划分配置步骤是什么&#xff1f; 3、基于MAC地址的vlan划分配置步骤是什么&#xff1f; 4、请简述无线局域网的组网方式有哪几种&#xff0c;区别是什么&#xff1f; 5、请简述堆叠、级联和集群作用和区别是…

在kaggle中的notebook 如何自定义 cuda 版本以及如何使用自定义的conda或python版本运行项目(一)

问题 第一部分 当前kaggle中带有gpu的notebook 默认的cuda 是12.1版本&#xff0c;如果我要跑一个项目是11.3的&#xff0c;如何将默认的cuda 改为自己需要的cuda 11.3 方法 step1 从官网下载需要的版本cuda run 文件&#xff08;如cuda 11.3&#xff09; 在nvidia cuda 下…

基于Netty实现安全认证的WebSocket(wss)服务端

1.Netty服务端 服务端代码参考【基于Netty实现WebSocket服务端-CSDN博客】中的两种方式都可以&#xff1b;这里用的是第一种简单方式。 新增如下逻辑&#xff1a;添加SSLHandler SSLContext sslContext SslUtil.createSSLContext("JKS","D:\\workSpace\\day…

Web(数字媒体)期末作业

一.前言 1.本资源为类似于打飞机的网页游戏 2.链接如下&#xff1a;【免费】前端web或者数字媒体的期末作业&#xff08;类似于打飞机的2D网页小游戏&#xff09;资源-CSDN文库 二.介绍文档

SAP HCM 标准程序如何定位内表赋值 ABAP DEBUG SCRIPT

Complacency is the enemy of study 学习的敌人是自己的满足。 标准内表定位代码位置!!! 不知道大家有没有尝试体会过debug标准程序,debug过程中发现SAP标准的内表不知道什么时候赋值,或者类的静态属性什么时候改变的,本文通过ABAP DEBUG SCRIPT的方式快速定位内表赋值或者类…

VM中Ubuntu16.04的下载以及ROS—kinetic的版本下载

一、Ubuntu镜像地址 转载备份一下&#xff1b; 官方下载地址&#xff08;不推荐&#xff09; https://www.ubuntu.com/downloadhttps://www.ubuntu.com/download 中科大源 Index of /ubuntu-releases/16.04/http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开…

基于51单片机的电压表-数码管显示

一.硬件方案 本设计基于STC89C52单片机的一种电压测量电路&#xff0c;该电路采用ADC0832A/D转换芯片,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单, 可以测量0&#xff5e;9V的电压值,并在四位LED数码管上显示电压值。 二.设计功能 &#xff08;1&…

工业网关设备:HiWoo Box网关

在数字化、智能化的工业浪潮中&#xff0c;工业网关以其卓越的性能和广泛的应用场景&#xff0c;成为了工业互联的核心驱动力。作为一款高效、稳定、智能的工业网关设备&#xff0c;HiWoo Box网关不仅实现了工业现场设备与网络的高效连接&#xff0c;更为企业提供了智能化的数据…

【linux】linux中免交互命令expect原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

智能客服新突破:大型模型训练助力提升客户服务体验

项目场景&#xff1a;训练大模型智能客服 智能客服新方法在金融服务领域的科技前沿应用 ** 一、 引言 随着科技的飞速发展&#xff0c;智能客服作为金融服务领域的一大创新点&#xff0c;正在逐渐改变传统的客户服务模式。特别是在自然语言处理&#xff08;NLP&#xff09;等…

【C++】多态:编程中的“一人千面”艺术

目录 一、多态的概念二、多态的定义及实现1.多态的构成条件2.虚函数的重写2.1 什么是虚函数&#xff1f;2.2 虚函数的重写是什么&#xff1f;2.3 虚函数重写的两个例外2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 三、抽象类3.1 概念3.2 接口继承和实现…

重学java 47.集合 ② 迭代器

金榜题名&#xff0c;前程似锦 —— 24.5.27 一、迭代器的介绍和使用 1.概述 Iterator接口 2.主要作用 遍历集合 3.获取 Collection中的方法&#xff1a; Iterator<E> iterator() 4.方法 boolean hasNext() —> 判断集合中有没有下一个元素 E.next() —> 获取下一个…