STM32驱动步进电机测试

今天来简单测试一下用STM32驱动步进电机。

方法是通过STM32控制A4988模块来驱动步进电机。A4988 是一款带转换器和过流保护的 DMOS 微步进电机驱动器,它用于操作双极步进 电机,在步进模式,输出驱动的能力 35V 和±2A。该 A4988 包括一个固定关断时间电流调 节它有能力在慢或混合衰减模式运作。 转换器是 A4988 易于实施的关键。只要在“步进”输入中输入一个脉冲,即可驱动电动机产生微步。

首先,先描述一下用到的A4988和A4988模块扩展板。

如下图为tb上可买的常见的步进电机驱动板,多用于3D打印,CNC雕刻机等的控制。

STM32驱动步进电机测试_第1张图片

 当我们将A4988安装到 CNC扩展板以后,它就变成了下面的样子。注意,安装A4988驱动板的时候请注意驱动板安装方向不要搞反。

STM32驱动步进电机测试_第2张图片

 如下图所示,CNC扩展板的步进模式设置插针是用来设置电机步进模式的。通过向插针安装跳线帽,我们可以改变电机的步进模式。

STM32驱动步进电机测试_第3张图片

 步进模式设置可参考下表的内容。 

STM32驱动步进电机测试_第4张图片

测试中选择型号为 17HS5413(42BYGH)的两相四线步进电机,步距角为 1.8°,200 个 脉冲转动一圈。

A4988模块中:STEP、DIR 分别连接单片机的两个控制端口,EN 可以使用单片机端口控制,也可以直接连接 GND 使能,EN=0时成功被使能;MS1、MS2、MS3 按照上表“步进模式设置”,接高低电平,设置步进模式,来选择不同的步距角。例如全模式时,一个脉冲,步进电机旋转角度 1.8°;在 1/4 模式时,一个脉冲,步进电机旋转角度为 0.45°。设置脉冲的频率,来控制旋转速度。 2B、2A、1A、1B 分别接步进电机红、蓝、黑、绿线。 VMOT、GND 接 12V 左右直流电源。 VDD、GND 接 3.3V 或 5V。A4988模块的引脚图如下。1A、1B、2A、2B引脚接步进电机的四条引线,其中1A1B为一组,2A2B为一组,可以用万用表测试一下,互相导通的两个端口是一组,本次测试用到的步进电机黑线与绿线是一组,红线与蓝线是一组。如果你的电机线是标准的红蓝绿黑的颜色,可以按照颜色连接为:红-蓝-绿-黑,或相反:黑-绿-蓝-红。本次接线为:A1——绿线、B1——黑线、A2——红线、B2——蓝线。

STM32驱动步进电机测试_第5张图片

 

步进电机控制插针如下图所示,步进电机控制插针共有两排。

STM32驱动步进电机测试_第6张图片

在插针旁印有各个引脚的名称标识。每行插针标识都使用”/”作为分割。”/”左侧的文字是图中蓝色插针的引脚标识。”/”右侧的文字是图中黄色插针的引脚标识。

以下是这组引脚的功能。

EN: 所有电机驱动板使能引脚/低电平有效。(此引脚与各端口上的A4988 EN引脚联通)
GND:接地
X.STEP: X端口步进控制引脚
X.DIR: X端口方向控制引脚
Y.STEP: Y端口步进控制引脚
Y.DIR: Y端口方向控制引脚
Z.STEP: Z端口步进控制引脚
Z.DIR: Z端口方向控制引脚
A.STEP: A端口步进控制引脚
A.DIR: A端口方向控制引脚
5V: 所有电机驱动板供电引脚(此引脚与各端口上的A4988 VDD引脚联通)

如下图所示,CNC扩展板上还配有两排很长的引脚插针。

STM32驱动步进电机测试_第7张图片

 这两排引脚中,一排是黑色的而另一排是白色的。其中黑色的引脚全都是GND引脚。白色引脚插针旁的文字标识是这些引脚的名称。下面列出这些引脚的名称。

CNC 扩展板 Z+ 引脚 
CNC 扩展板 Z- 引脚 
CNC 扩展板 Y+ 引脚
CNC 扩展板 Y- 引脚
CNC 扩展板 X+ 引脚
CNC 扩展板 X- 引脚
CNC 扩展板 SpnEN 引脚
CNC 扩展板 SpnDir引脚 
CNC 扩展板 CoolEn引脚 
CNC 扩展板 Abort 引脚
CNC 扩展板 Hold 引脚 
CNC 扩展板 Resume引脚
CNC 扩展板 E-STOP引脚 

上引脚的名称看起来十分奇怪,事实上这些名字是来自CNC扩展板的最初设计。最早CNC扩展板主要用于驱动小型数控机床。上面列表中的引脚在机床中各自承担不同的作用。比如X+/X-这两个引脚用于工件台X向限位,再比如CoolEn用于冷却液的开关控制。因此这些引脚才会有了这些”奇奇怪怪”的名字。不过如今CNC扩展板的应用已经远远超越了数控车床而成为了3D打印机,机器人等项目的热门选择。但是这些引脚的名字还是保留了下来。

如下图所示,我们可以用小改锥顺时针旋转外接电源接口上的螺钉来固定电源引线。若想移除引线,只要逆时针旋转螺钉就可以了。我这里用了12V电源适配器的转接头接到了这个部分。

 STM32驱动步进电机测试_第8张图片

本次测试用到了正点原子的STM32F103精英板。

 下面讲解一下接线。

A4988驱动板5V————————STM32   5V

A4988驱动板GND———————STM32   GND

A4988驱动板EN————————STM32   PF0

A4988驱动板XSTEP——————STM32   PF1

A4988驱动板XDIR———————STM32   PF2

A4988驱动板YSTEP——————STM32   PF3

A4988驱动板YDIR———————STM32   PF4

随便找一份正点原子的例程复制下来,然后添加以下文件,并修改主函数。下面是STM32用到的程序,下面是HARDWARE中nema.c和nema.h的内容。

---------------------------------nema.c----------------------------------------------

#include "nema.h"
#include "timer.h"
#include "led.h"
#include "usart.h"


//初始化步进电机控制端口
//STEP PFout(0)
//DIR PFout(1)
//--------------A4988驱动电路设置初始化函数-----------------------
void STEP_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);	 //使能PF端口时钟
	
	//----------------------EN初始化--------------------------------------------
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				 //EN-->PF.0 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStructure);					 //根据设定参数初始化GPIOF.2
 GPIO_ResetBits(GPIOF,GPIO_Pin_0); 	//驱动电路EN=0,使能
	//-------------------------------------------------------------------------
	
//-----------------------XSTEP、XDIR初始化-------------------------------------
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;				 //XSTEP-->PF.1 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStructure);					 //根据设定参数初始化GPIOF.1

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;				 //XDIR-->PF.2 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStructure);					 //根据设定参数初始化GPIOF.2
//-----------------------------------------------------------------------------
	
//-----------------------YSTEP、YDIR初始化-------------------------------------
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;				 //YSTEP-->PF.3 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStructure);					 //根据设定参数初始化GPIOF.3

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;				 //YDIR-->PF.4 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOF, &GPIO_InitStructure);					 //根据设定参数初始化GPIOF.4
//-----------------------------------------------------------------------------					  
}



//dir:为方向控制,TRUE:正转 FALSE:反转
//period 为周期
//steps:脉冲个数

void XStep_Control(u8 dir,u16 period,u32 steps)
{
	u32 i;
	for(i=0; i <= steps; i++)
	{
		XDIR = dir;
		XSTEP = 1;
		delay_us(1);
		XSTEP = 0;
		delay_us(period);
	}
}

void YStep_Control(u8 dir,u16 period,u32 steps)
{
	u32 i;
	for(i=0; i <= steps; i++)
	{
		YDIR = dir;
		YSTEP = 1;
		delay_us(1);
		YSTEP = 0;
		delay_us(period);
	}
}

---------------------------------nema.h----------------------------------------------

#ifndef __NEMA_H
#define __NEMA_H
#include "sys.h"


void STEP_Init(void);//step端口初始化


//dir:为方向控制,TRUE:正转 FALSE:反转
//period 为周期
//steps:脉冲个数

void XStep_Control(u8 dir,u16 period,u32 steps);//X方向步进电机控制函数
void YStep_Control(u8 dir,u16 period,u32 steps);//Y方向步进电机控制函数

#define XSTEP PFout(1)
#define XDIR PFout(2)
#define YSTEP PFout(3)
#define YDIR PFout(4)

#endif

下面是主函数中的内容。实现结果是X电机反转 1 圈,Y电机正转1圈,X电机正转 2 圈,Y电机反转两圈,Y电机的转动速度是X电机的两倍。

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "nema.h"

#define TRUE 1
#define FALSE 0
int main(void)
{
	u8 dir=1;
	delay_init(); //延时初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	STEP_Init(); //步进电机驱动端口初始化
	LED_Init(); //初始化与 LED 连接的硬件接
	while(1)
	{
		LED0 = !LED0;
		XStep_Control(FALSE,1600,200);
		delay_ms(1000);
		YStep_Control(TRUE,800,200);
		delay_ms(1000);
		XStep_Control(TRUE,1600,400);
		delay_ms(1000);
		YStep_Control(FALSE,800,400);
		delay_ms(1000);
	}
}

下面附上调试的照片。。。。。。如果有问题欢迎讨论,希望能够帮到您。。。。。。。

STM32驱动步进电机测试_第9张图片

 

你可能感兴趣的:(stm32,单片机,arm)