步进电机的控制
参考http://t.csdn.cn/DdnmT
step_motor.h
#ifndef __STEP_MOTOR_H
#define __STEP_MOTOR_H
#include "stm32f4xx_hal.h"
extern uint8_t STEP; //定义单步计数 全局变量
#define STEP_MOTOR_PORT GPIOA //定义IO接口所在组
#define STEP_MOTOR_A GPIO_PIN_1 //定义IO接口
#define STEP_MOTOR_B GPIO_PIN_3 //定义IO接口
#define STEP_MOTOR_C GPIO_PIN_5 //定义IO接口
#define STEP_MOTOR_D GPIO_PIN_7 //定义IO接口
#define STEP_MOTOR_CLK RCC_APB2Periph_GPIOG
void STEP_MOTOR_Init(void);//初始化
void STEP_MOTOR_OFF (void);//断电状态
void STEP_MOTOR_8A (uint8_t a,uint16_t speed);
void STEP_MOTOR_NUM (uint8_t RL,uint16_t num,uint8_t speed);//电机按步数运行
void STEP_MOTOR_LOOP (uint8_t RL,uint8_t LOOP,uint8_t speed);//电机按圈数运行
#endif
step_motor.c
#include "step_motor.h"
uint8_t STEP;
void STEP_MOTOR_Init(void){ //接口初始化
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_RESET);
/*Configure GPIO pins : PA1 PA3 PA5 PA7 */
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void STEP_MOTOR_OFF (void) //电机断电 全拉低
{
HAL_GPIO_WritePin (STEP_MOTOR_PORT,STEP_MOTOR_A| STEP_MOTOR_B | STEP_MOTOR_C | STEP_MOTOR_D,GPIO_PIN_RESET );//各接口置0
}
void STEP_MOTOR_8A (uint8_t a,uint16_t speed) //电机单步8拍
{
switch (a){
case 0:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_B | STEP_MOTOR_C | STEP_MOTOR_D,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A,GPIO_PIN_SET);//1
break;
case 1:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_C | STEP_MOTOR_D,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A | STEP_MOTOR_B,GPIO_PIN_SET);//1
break;
case 2:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A | STEP_MOTOR_C | STEP_MOTOR_D,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_B,GPIO_PIN_SET);//1
break;
case 3:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A | STEP_MOTOR_D,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_B | STEP_MOTOR_C,GPIO_PIN_SET);//1
break;
case 4:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A | STEP_MOTOR_B | STEP_MOTOR_D,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_C,GPIO_PIN_SET);//1
break;
case 5:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A | STEP_MOTOR_B,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_C | STEP_MOTOR_D,GPIO_PIN_SET);//1
break;
case 6:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A | STEP_MOTOR_B | STEP_MOTOR_C,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_D,GPIO_PIN_SET);//1
break;
case 7:
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_B | STEP_MOTOR_C,GPIO_PIN_RESET);//0
HAL_GPIO_WritePin(STEP_MOTOR_PORT,STEP_MOTOR_A | STEP_MOTOR_D,GPIO_PIN_SET);//1
break;
default:
break;
}
HAL_Delay (speed); //延时
STEP_MOTOR_OFF();//进入断电状态,防电机过热
}
void STEP_MOTOR_NUM (uint8_t RL,uint16_t num,uint8_t speed) //电机按步数运行
{
uint16_t i;
for(i=0;i<num;i++)
{
if(RL==1){ //当RL=1右转,RL=0左转
STEP++;
if(STEP>7)STEP=0;
}else{
if(STEP==0)STEP=8;
STEP--;
}
STEP_MOTOR_8A(STEP,speed);
}
}
void STEP_MOTOR_LOOP (uint8_t RL,uint8_t LOOP,uint8_t speed) //电机按圈数运行
{
STEP_MOTOR_NUM(RL,LOOP*4076,speed);
}
main.c
函数第一个参数:控制正反转 1→正转 0→反转
第二个参数:控制电机转的圈数
第三个参数:延时
STEP_MOTOR_LOOP (1,1,1); //步进电机正传
STEP_MOTOR_LOOP (0,1,1); //步进电机反传