这里使用的电机是市面上常见的 28BYJ-48驱动是2003模块,五线四相,需要使用的修改引脚即可
这里附上.c代码
#include "motor.h"
#include "delay.h"
//IN4: PF4 d
//IN3: PF3 c
//IN2: PF2 b
//IN1: PF1 a
u8 forward[4] = {0x03,0x06,0x0c,0x09}; // 正转
u8 reverse[4]= {0x03,0x09,0x0c,0x06}; // 反转
//引脚初始化
void Step_Motor_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
//引脚映射
void SetMotor(unsigned char InputData)
{
if(InputData == 0x03)
{
GPIO_SetBits(GPIOF,GPIO_Pin_1);
GPIO_SetBits(GPIOF,GPIO_Pin_2);
GPIO_ResetBits(GPIOF,GPIO_Pin_3);
GPIO_ResetBits(GPIOF,GPIO_Pin_4);
}
else if(InputData == 0x06)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_1);
GPIO_SetBits(GPIOF,GPIO_Pin_2);
GPIO_SetBits(GPIOF,GPIO_Pin_3);
GPIO_ResetBits(GPIOF,GPIO_Pin_4);
}
else if(InputData == 0x09)
{
GPIO_SetBits(GPIOF,GPIO_Pin_1);
GPIO_ResetBits(GPIOF,GPIO_Pin_2);
GPIO_ResetBits(GPIOF,GPIO_Pin_3);
GPIO_SetBits(GPIOF,GPIO_Pin_4);
}
else if(InputData == 0x0c)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_1);
GPIO_ResetBits(GPIOF,GPIO_Pin_2);
GPIO_SetBits(GPIOF,GPIO_Pin_3);
GPIO_SetBits(GPIOF,GPIO_Pin_4);
}
else if(InputData == 0x00)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_1);
GPIO_ResetBits(GPIOF,GPIO_Pin_2);
GPIO_ResetBits(GPIOF,GPIO_Pin_3);
GPIO_ResetBits(GPIOF,GPIO_Pin_4);
}
}
/*
功能:转1/64圈
步距角5.625 360/5.625=64 减速比1/64
故64*64个脉冲转一圈
n 圈数
direction 方向 1正转 非1反转
delay delay时长ms >= 2
*/
void motor_circle(int n, int direction, int delay)
{
int i, j;
for(i = 0; i < n * 8; i++)
{
for(j = 0; j < 4; j++)
{
if(1 == direction)
{
SetMotor(0x00);
SetMotor(forward[j]);
}
else
{
SetMotor(0x00);
SetMotor(reverse[j]);
}
delay_ms(delay > 2 ? delay : 2);
}
}
}
里面的延时使用的是正点原子写的延时函数
附上.h文件
#ifndef __motor_H__
#define __motor_H__
#include "stm32f10x.h"
void Step_Motor_GPIO_Init(void);
void motor_circle(int n, int direction, int delay);
#endif
在主函数中初始化后直接使用void motor_circle(int n, int direction, int delay);n代表步数, 一圈是64步,direction代表正转反转,给1正转,给其他值反转,delay代表速度,默认给2为最优
如正转一圈,则写为(64,1,2);反转一圈(64,0,2);