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

2024-05-27 15:20

本文主要是介绍手把手从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控制步进电机旋转特定角度

这篇关于手把手从0到1教你做STM32+FreeRTOS智能家居--第11篇之步进电机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007848

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控制设备,用户可以轻松实现对灯光、空调、门锁等家电的控制,提升生活的便捷性和舒适性。本文将介绍如何构建一个基于人工智能的智能家居语音控制系统,包括环境准备

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2