步进电机控制(仅用于作者复习)

步进电机的控制

参考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);  //步进电机反传

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值