前言
1.A4988及其拓展板简介
2.接线
3.STM32_CUBEMX配置
4.代码详解
———————————————————————————————————————————
1.A4988及其拓展板简介
A4988是一款常用的步进电机驱动器,A4988驱动器采用了步进电机的微步技术,能够实现高精度的步进控制,提高了电机的运行平稳性和精度。同时,A4988驱动器还具有保护功能,如过压、欠压、过温保护等。其下方的电位调节器可用于调节参考电压,该产品可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机,输出驱动性能可达 35V ,A4988 包括一个固定关断时间电流稳压器,该稳压器可在慢或混合衰减模式下工作。
STEP、DIR 分别连接单片机的两个控制端口,EN 可以使用单片机端口控制,也可以直接连接 GND 使能,EN=0时成功被使能;MS1、MS2、MS3 按照上表“步进模式设置”,接高低电平,设置步进模式,来选择不同的步距角。例如全模式时,一个脉冲,步进电机旋转角度 1.8°;在 1/4 模式时,一个脉冲,步进电机旋转角度为 0.45°。设置脉冲的频率,来控制旋转速度。
这里我们使用A4988拓展板进行步进电机控制,该拓展板是用跳线帽进行步进模式选择,见上图。这里我们不加跳线帽,选着全模式。拓展板输入电压为12~35V,我这选择一块12V锂电池输入,电源接口上方是普通步进电机驱动引脚,详细配置如下表。板子右边是CNC拓展接口,这里我们用不到。
拓展板上一共有4个A4988排针母座,这里我们选择Y,进行控制,直接将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.实测视频
步进