基于stm32的步进电机使用详解

前言

这是仅仅只是一篇关于步进电机如何使用的文章,仅仅能让电机实现正反转。内容很浅。关于步进电机原理以及其他高级运用方式的教学可以参考其他大佬的文章。如果只是想让步进电机转起来,真的很简单。

设备

1、步进电机:型号:28BYJ-48(电机)+ULN2003(驱动芯片)
2、开发板是普中科技的PZ6808L-F4 (stm32F407ZG芯片)
基于stm32的步进电机使用详解_第1张图片

管脚介绍

简单到都没什么好介绍的。步进电机连接驱动芯片,芯片除了VCC和GND,就只剩四个并排的管脚了,任意连接stm32的四个IO口就行

原理

本文只教如何使用,所以不过多的介绍。一句话说明白:给四个管脚一定频率的脉冲即可使其转动,脉冲频率越快,转动越快。反之转动越慢,脉冲次数越多,转动角度越大。

驱动步骤

依次给四个管脚一定的脉冲即可

具体代码实现

接线:
我代码中,接在了PF0,PF1,PF2,PF3管脚
VCC:5V
代码:
在stm32f4的库函数模板工程以后
首先向工程中新建两个步进电机的文件elec.h和elec.c并添加到工程中。(不会的自己面壁去)
ultr.h中的代码

elec.h中的代码

#ifndef _elec_H
#define _elec_H

#include "system.h"

//函数声明
void elec_Init(void);//初始化函数
void elec_RightRotate(u16 i);//右转
void elec_LeftRotate(u16 i);//左转




#endif

elec.c中的代码

# include "elec.h"
# include "SysTick.h"



void elec_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能端口F时钟
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_9|GPIO_Pin_10;//管脚设置F9
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100M
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化结构体
}

void elec_RightRotate(u16 i)
{
	while(i)
	{
		
		GPIO_SetBits(GPIOF,GPIO_Pin_0);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_0);
		delay_us(2000);  //精确延时500ms
		
		GPIO_SetBits(GPIOF,GPIO_Pin_1);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		delay_us(2000);  //精确延时500ms
		
		GPIO_SetBits(GPIOF,GPIO_Pin_2);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		delay_us(2000);  //精确延时500ms
		
		GPIO_SetBits(GPIOF,GPIO_Pin_3);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		delay_us(2000);  //精确延时500ms
		i--;
	}
}

void elec_LeftRotate(u16 i)
{
	while(i)
	{
		
			GPIO_SetBits(GPIOF,GPIO_Pin_3);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		delay_us(2000);  //精确延时500ms
		
				GPIO_SetBits(GPIOF,GPIO_Pin_2);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		delay_us(2000);  //精确延时500ms
		
		GPIO_SetBits(GPIOF,GPIO_Pin_1);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		delay_us(2000);  //精确延时500ms
		
		GPIO_SetBits(GPIOF,GPIO_Pin_0);
		delay_us(2000);  //精确延时500ms
		GPIO_ResetBits(GPIOF,GPIO_Pin_0);
		delay_us(2000);  //精确延时500ms
		
		
		

		
	
		i--;
	}
}

结尾

main中的代码我就不放了,初始化以后直接调用旋转的函数即可,参数是脉冲次数。脉冲频率我通过延时函数调整的。经过我的测量,100次脉冲可以旋转67度,一次脉冲旋转0.67度(当然脉冲太少驱动不了,为了计算360度需要多少的脉冲)
我的智能车库的项目先告一段落,想了解超声波测距和红外解码的教学可以看我的其他博客。都是面向新手的教学,基本上所有代码都有注释。后续没想好写什么教学,随缘吧。或者你们有想了解的可以给我留言。我也是新手,大家一起进步。

你可能感兴趣的:(嵌入式,stm32,stm32,单片机,物联网)