STM32F4步进电机驱动代码

在这里插入图片描述

电机使用的是28BYJ-48步进电机:

//stepping motor 步进电机

//sm.h

#ifndef __STEP_MOTOR_H
#define __STEP_MOTOR_H
#include “sys.h”
#include “delay.h”

#define MA PEout(0)
#define MB PEout(1)
#define MC PEout(2)
#define MD PEout(3)
#define uchar unsigned char

void sm_Init(void);
void MotorRun(uint angle,uint drct,uint speed);

#endif

//sm.c

#include “sm.h”

void sm_Init(void)
{

GPIO_InitTypeDef GPIO_InitStructur;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

GPIO_InitStructur.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;
GPIO_InitStructur.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructur.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructur.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructur.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStructur);

}

//angle:角度,范围[0,360]
//drct:旋转方向,0:顺时针,1:逆时针
//speed:转速,范围[1,100]

void MotorRun(uint angle,uint drct,uint speed)
{
uint step,nangle;
step=0;
nangle=512*angle/45;//将角度换算成拍数,计算结果自动取整
if(drct0)
{
while(nangle–)
{
switch(step)//8拍方式驱动,每拍转(5.265/64)度
{
case 0:MA=1;MB=0;MC=0;MD=0;break;
case 1:MA=1;MB=1;MC=0;MD=0;break;
case 2:MA=0;MB=1;MC=0;MD=0;break;
case 3:MA=0;MB=1;MC=1;MD=0;break;
case 4:MA=0;MB=0;MC=1;MD=0;break;
case 5:MA=0;MB=0;MC=1;MD=1;break;
case 6:MA=0;MB=0;MC=0;MD=1;break;
case 7:MA=1;MB=0;MC=0;MD=1;break;
}
if(step
7)step=0;
else step++;

		if(speed>100)speed=100;
		delay_ms(110-speed);//这里可以适当改动,延时时间短则转速快
		,但是时间太短会造成电机堵转(不转了)
	}
}
else
{
	while(nangle--)
	{
		switch(step)
		{
			case 0:MA=1;MB=0;MC=0;MD=1;break;
			case 1:MA=0;MB=0;MC=0;MD=1;break;
			case 2:MA=0;MB=0;MC=1;MD=1;break;
			case 3:MA=0;MB=0;MC=1;MD=0;break;
			case 4:MA=0;MB=1;MC=1;MD=0;break;
			case 5:MA=0;MB=1;MC=0;MD=0;break;
			case 6:MA=1;MB=1;MC=0;MD=0;break;
			case 7:MA=1;MB=0;MC=0;MD=0;break;
		}
		if(step==7)step=0;
		else step++;
		if(speed>100)speed=100;
		delay_ms(110-speed);//这里可以适当改动,延时时间短则转速快,
		但是时间太短会造成电机堵转(不转了)
	}
}
MA=0;MB=0;MC=0;MD=0;

}

//main

#include “sys.h”
#include “delay.h”
#include “usart.h”
#include “led.h”
#include “sm.h”

int main(void)
{
delay_init(168);
sm_Init();
while(1)
{
MotorRun(90,1,100);
delay_ms(500);
}
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值