手把手从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控制步进电机旋转特定角度

结尾:

对这个项目感兴趣的小伙伴,完全可以根据本项目的文章教程,一步步自己搭建属于自己的STM32-FreeRTOS智能家居项目,如果需要完整资料的可私信我领取(有偿):原理图、STM32源码、Android app源码、操作教程。


如果想要直接购买对应的硬件进行学习的话可以移步xian鱼进行购买即可【闲鱼】https://m.tb.cn/h.g49GGHy?tk=iUjCWCGie4h CZ0012 「我在闲鱼发布了【STM32物联网开发板--智能家居系统】」
点击链接直接打开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值