使用STM32和A4988拓展板实现简单42步进电机驱动

 前言

1.A4988及其拓展板简介

2.接线

3.STM32_CUBEMX配置

4.代码详解

———————————————————————————————————————————

1.A4988及其拓展板简介
A4988
A4988拓展板
A4988拓展板

    A4988是一款常用的步进电机驱动器,A4988驱动器采用了步进电机的微步技术,能够实现高精度的步进控制,提高了电机的运行平稳性和精度。同时,A4988驱动器还具有保护功能,如过压、欠压、过温保护等。其下方的电位调节器可用于调节参考电压,该产品可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机,输出驱动性能可达 35V ,A4988 包括一个固定关断时间电流稳压器,该稳压器可在慢或混合衰减模式下工作。

给予MS引脚不同电平控制步进模式

    STEP、DIR 分别连接单片机的两个控制端口,EN 可以使用单片机端口控制,也可以直接连接 GND 使能,EN=0时成功被使能;MS1、MS2、MS3 按照上表“步进模式设置”,接高低电平,设置步进模式,来选择不同的步距角。例如全模式时,一个脉冲,步进电机旋转角度 1.8°;在 1/4 模式时,一个脉冲,步进电机旋转角度为 0.45°。设置脉冲的频率,来控制旋转速度。

    这里我们使用A4988拓展板进行步进电机控制,该拓展板是用跳线帽进行步进模式选择,见上图。这里我们不加跳线帽,选着全模式。拓展板输入电压为12~35V,我这选择一块12V锂电池输入,电源接口上方是普通步进电机驱动引脚,详细配置如下表。板子右边是CNC拓展接口,这里我们用不到。

    拓展板上一共有4个A4988排针母座,这里我们选择Y,进行控制,直接将A4988接上,注意方向一定不要插反,如下图。右边四个排针直接接电机四个母插,方向可以改变

A4988
A4988方向,电位器朝下

        

步进模式选择
2.接线图

        这里我随便找了一块F103ZET6板子,因为要稳定5V电压给拓展板的5V/GND引脚,所以我这找了一块L298N借他的5V输出一用,给予单片机和拓展板,最好将拓展板与单片机供电隔开。

接线

3.CUBE_MX配置

EN脚配置为推挽输出,一开始置低电平。

X.STEP 和X.DIR 引脚都配置为推挽输出OPP

为了控制电机正转反转停止,我选择了三个板载KEY来控制,都选择GPIO_EXTI模式,上拉电阻,选择下降沿触发。记得在NVIC配置中勾选这三个GPIO_EXTI.

时钟选择外部时钟,时钟树配置直接拉满。

确定文件名,选好路径,勾选必要的生成代码配置,直接生成代码!

4.代码详解

  main.c文件

/* USER CODE BEGIN 0 */


uint8_t flag = 2;   //设置一个标志位,控制电机正反转

//这里使用宏定义控制DIR STEP的极性(个人习惯)
#define XDIR_1     HAL_GPIO_WritePin(GPIOA, X_DIR_Pin, GPIO_PIN_SET);
#define XDIR_0     HAL_GPIO_WritePin(GPIOA, X_DIR_Pin, GPIO_PIN_RESET);
#define XSTEP_1    HAL_GPIO_WritePin(GPIOA, X_STEP_Pin,GPIO_PIN_SET);
#define XSTEP_0    HAL_GPIO_WritePin(GPIOA, X_STEP_Pin, GPIO_PIN_RESET);

//手动创建一个us级别延时函数,也可以用其他方法
 void delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{
		;
	}
}

void XStep_Control_Foreward(uint16_t period,uint32_t steps)  
{ 
//电机正转,step 步长,period 周期,通过调整周期步长可以控制电机旋转状态
	uint32_t i;
	for(i=0; i <= steps; i++)
	{
		XDIR_1;
		XSTEP_1;
		delay_us(1);
		XSTEP_0;
		delay_us(period);
	}
}
void XStep_Control_Backward(uint16_t period,uint32_t steps)
{
	//电机反转
	uint32_t i;
	for(i=0; i <= steps; i++)
	{
		XDIR_0;
		XSTEP_1;
		delay_us(1);
		XSTEP_0;
		delay_us(period);
	}
}

/* USER CODE END 0 */

主函数 

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(flag == 1)//当flag等于1,进行正转
					XStep_Control_Foreward(3200,1);  // 调整周期可以调整速度
		if(flag == 0)//当flag等于0,进行反转
					XStep_Control_Backward(3200,1);
		else         //当flag等于其他,停止
					XDIR_0;
  }
  /* USER CODE END 3 */
}

回调函数 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)   //按键回调函数
{
	if (GPIO_Pin == key_1_Pin)
	{
		flag = 1;  //k1按下
	}
	if (GPIO_Pin == key_2_Pin)
	{
		flag = 0;  //k2按下
		}
		if (GPIO_Pin == key_3_Pin)
	{
		flag = 2;  //k3按下
		}

}
5.实测视频

步进

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32和A4988拓展板实现简单42步进电机驱动

发表评论