一、硬件设计
步进电机介绍
本项目用到的是常见的也是控制起来最简单的步进电机:五线四项的步进电机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物联网开发板--智能家居系统】」
点击链接直接打开。