基于STM32F103C8T6控制A4988模块驱动2相4线步进电机


一、A4988模块简介

  A4988 是一款功能齐全的微步进电机驱动器,内置转换器,操作简便。它设计用于在全步进、半步进、四分之一步进、八分之一步进和十六分之一步进模式下驱动双极步进电机,输出驱动能力高达 35 V 和 ±2 A。A4988 内置一个固定关断时间电流调节器,可在慢速或混合衰减模式下工作。转换器是 A4988 轻松实现的关键。只需在 STEP 输入端输入一个脉冲,即可驱动电机进行一个微步。无需相序表、高频控制线或复杂的编程接口。A4988 接口非常适合无法使用复杂微处理器或微处理器负担过重的应用。在步进操作期间,A4988 中的斩波控制会自动选择电流衰减模式:慢速或混合。在混合衰减模式下,设备初始设置为在固定关断时间内以快速衰减,然后在剩余关断时间内以慢速衰减。混合衰减电流控制可降低电机可听噪声,提高步进精度,并降低功耗。内置同步整流控制电路,用于改善 PWM 工作期间的功耗。内部电路保护包括:带滞后的热关断、欠压锁定 (UVLO) 和交叉电流保护。
特性
 ▪ 低导通电阻 (RDS(ON)) 输出
 ▪ 自动电流衰减模式检测/选择
 ▪ 混合和慢速电流衰减模式
 ▪ 同步整流,低功耗
 ▪ 内部欠压锁定 (UVLO)
 ▪ 交叉电流保护
 ▪ 3.3 V 和 5 V 兼容逻辑电源
 ▪ 热关断电路
 ▪ 接地短路保护
 ▪ 负载短路保护
 ▪ 五种可选步进模式:全步进、1/2、1/4、1/8 和 1/16
在这里插入图片描述

二、A4988引脚说明

在这里插入图片描述

EN:使能引脚(低电平有效),该引脚悬空或接低电平,A4988都可以正常工作;接高电平则不工作。

MS1,MS2,MS3:微步细分驱动控制,通过这三个引脚的逻辑电平,调整A4988驱动电机模式为全、半、1/4、1/8 及 1/16 步进模式。

MS1MS2MS3微步分辨率
LLL全步
HLL半步
LHL1/4步
HHL1/8步
HHH1/16步

RST:复位引脚(低电平有效),该引脚悬空,则默认为高电平。即该引脚没有连接任何电平时,A4988可以正常工作。

SLP:睡眠引脚,该引脚连接电平为低电平时,A4988将进入低能耗睡眠状态,即消耗最小的电能。如果无需使用SLeep功能,则可以将SLEEP引脚与RESET引脚连接,则A4988将持续保持正常能耗状态而不会进入低能耗状态。

STEP:步进引脚,通过MCU控制器向A4988发送脉冲控制信号,A4988接收到此信号后,会根据 MS1, MS2 和 MS3引脚控制电机运转。

DIR:方向引脚,通过此引脚可以调整A4988控制电机运行方向。当此引脚为低电平,A4988将控制电机顺时针旋转。高电平则逆时针旋转。

1A,1B:电机绕组1控制引脚。

2A,2B:电机绕组2控制引脚。

VMOT:电机电源正极(可用电源电压为8V ~ 35V)注:此引脚用于连接为电机供电的电源。

VDD:逻辑电源正极(3 – 5.5伏)注:此引脚用于为A4988电机驱动板供电。

GND:电机电源接地和逻辑电源接地。

三、A4988的Vref电压调节

  Vref电压调节是通过A4988上的电位器旋钮调节Vref参考电压。该电压将直接影响到步进电机在工作时流过线圈的电流强度。请注意,这一步操作非常重要,如果忽略这一步有可能会产生电机损坏的后果。
A4988 Vref参考电压计算公式:

Rs: 市面上A4988模块上的Rs电阻值一般有3种类型,0.05 欧姆, 0.1 欧姆或0.2 欧姆。店铺的A4988模块上的Rs电阻值为0.1欧姆,大部分A4988模块顺时针旋转电位器可调大Vref,逆时针旋转电位器调小Vref。

Vref: 电位器金属旋钮和GND之间的电压即为Vref。可使用小改锥旋转电位器旋钮从而改变Vref。(如下图所示)。

Imax:步进电机工作时,线圈允许流过的最大电流。

  例:Rs为0.1欧姆,电机Imax为1.5A,通过以上公式计算,Vref参考电压为1.2V。即将通过调节电位器旋钮 将Vref调节为1.2伏特左右。

测量Vref时注意:

  1. A4988模块的VDD引脚需要连接+5V电压
  2. A4988模块的GND引脚必须与电路中的其它设备共地
  3. A4988模块的VMOT引脚无需通电,但是通电也不影响Vref的测量。
  4. A4988模块的1A/1B/2A/2B引脚可以不与步进电机连接,但连接也不会影响Vref的测量

四、STM32F103C8T6控制A4988驱动2相4线步进电机

准备工作

  STM32F103C8T6最小系统板,A4988驱动模块,OLED显示屏,EC11旋转编码器,按键和导线若干。

引脚接线

STM32F103C8T6A4988
电机电源正VMOT
电机电源负GND
3.3VVDD
GNDGND
PA0STEP
PA4EN
PA5DIR
PB3MS1
PB4MS2
PB5MS3
PA1编码器的A ,控制频率和占空比的调节
PA2编码器的B,控制频率和占空比的调节
PA3编码器的S,切换调节频率还是调节占空比
PA6与PA0短接,捕获PWM
PB10按键1,控制细分切换
PB11按键2,控制方向切换

代码示例

A4988.c

#include "A4988.h"
#include "Delay.h"

void A4988_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5);
	GPIO_ResetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
}

void A4988_SetStep(uint8_t step)
{
	switch(step)
	{
		case 1:		//1细分
			A4988_MS1_L;
			A4988_MS2_L;
			A4988_MS3_L;
			break;
		case 2:		//1/2细分
			A4988_MS1_H;
			A4988_MS2_L;
			A4988_MS3_L;
			break;
		case 3:		//1/4细分
			A4988_MS1_L;
			A4988_MS2_H;
			A4988_MS3_L;
			break;
		case 4:		//1/8细分
			A4988_MS1_H;
			A4988_MS2_H;
			A4988_MS3_L;
			break;
		case 5:		//1/16细分
			A4988_MS1_H;
			A4988_MS2_H;
			A4988_MS3_H;
			break;
	}
}

void A4988_SetDir(uint8_t dir)
{	
	A4988_EN_H;
	Delay_ms(20);
	
	if(dir == 1) A4988_DIR_H
	else A4988_DIR_L
	
	A4988_EN_L;
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "KEY.h"
#include "A4988.h"
#include "PWM.h"
#include "IC.h"
#include "Encoder.h"

uint8_t step = 0;
uint8_t dir = 0;

int main(void)
{
	OLED_Init();
    PWM_Init();
    A4988_Init();
    Key_Init();
    Encoder_Init();
	
	OLED_ShowString(1, 5, "A4988");
	OLED_ShowString(1, 12, "F");  //F:调节频率,D:调节占空比
	OLED_ShowString(2, 4, "0000Hz");
	OLED_ShowString(2, 11, "000%");
	OLED_ShowString(3, 4, "1   ");
	OLED_ShowString(3, 11, "+");
	
	PWM_SetPrescaler(720 - 1);			//Freq = 72M / (PSC + 1) / 100
	PWM_SetCompare1(50);				//Duty = CCR / 100
	
	A4988_SetDir(1);
	A4988_SetStep(1);
	
	Update_Display();
	
	while (1)
	{
		int16_t encoder_change = Encoder_GetValue();

        if(encoder_change != 0)
        {
            if(setting_mode == 0)  // 调频率
            {
                pwm_freq += encoder_change * 10;
                if(pwm_freq > 2000) pwm_freq = 2000;
                if(pwm_freq < 10) pwm_freq = 10;
				PWM_SetPrescaler(pwm_freq - 1);
            }
            else  // 调占空比
            {
                pwm_duty += encoder_change;
                if(pwm_duty > 100) pwm_duty = 100;
                if(pwm_duty < 0) pwm_duty = 0;
				PWM_SetCompare1(pwm_duty);
            }
            Update_PWM();
            Update_Display();
        }

        if(Encoder_GetKey())  // 按下编码器按键切换调节模式
        {
            setting_mode ^= 1;  // 0/1切换
            Update_Display();
        }

		Delay_ms(20);
		
		KeyEvent_TypeDef key_event = Key_Scan();
		
		switch (key_event)
		{
			case KEY_MODE_CLICK:
				// Mode键短按事件
				step++;
				if (step > 5) step = 1;
				switch(step)
				{
					case 1: 
						A4988_SetStep(1); OLED_ShowString(3,4,"1   "); break;
					case 2: 
						A4988_SetStep(2); OLED_ShowString(3,4,"1/2 "); break;
					case 3: 
						A4988_SetStep(3); OLED_ShowString(3,4,"1/4 "); break;
					case 4: 
						A4988_SetStep(4); OLED_ShowString(3,4,"1/8 "); break;
					case 5: 
						A4988_SetStep(5); OLED_ShowString(3,4,"1/16"); break;
				}
				break;
			case KEY_DIR_CLICK:
				dir++;
				if(dir > 2) dir = 1;
				if(dir == 1) 
				{
					A4988_SetDir(1); 
					OLED_ShowString(3, 11, "+"); //正转
				}
				else
				{
					A4988_SetDir(0);
					OLED_ShowString(3, 11, "-"); //反转
				}
				break;
		}
		Delay_ms(20);
	}
}

效果展示

五、A4988电机驱动板常见问题

 1)4988驱动板可以驱动多大的电流?
  如果4988芯片上没有加散热片,电流最好在1A以下。如果加散热片,电流可以达到2A。

 2)步进电机的连接方式是什么?
  先判断哪两根线为同一相,短接两两线有明显阻力的为同一相,A相和B相可以不区分,只有是同一相接在同一个电机绕组控制引脚即可。

 3)接上电后,电机左右抖动不能正常运行是什么原因?
  电机出现抖动一般有两个原因,一是缺相:可能是4988与电机没有接好导致4988的输出端某一相断开,造成电机缺相从而抖动。也有可能是步进电机接线接错:如果步进电机没有正确的进行连接,电机会出现抖动的情况。二是驱动电流过大或过小导致的,调节板载上的电位器调到电机正常平稳运行就可。

 4)电机丢步如何解决?
  相电流的大小跟步进电机的扭力有直接关系,如果感觉你的步进电机扭力不足、丢步,可能是4988输出的电流太小。您可以调节A4988模块上的电位器调节A4988模块的输出电流强度。具体调节方法请参考上面的Vref电压的调节方法。请注意:如A4988输出电流强度大于电机工作电流强可能会烧毁您的步进电机。请小心调节。

 5)4988可以驱动两相六线或两相五线的电机吗?
  可以,两相连线按照问题2连接,将中间抽头悬空即可。

 6)电机停止转动时会有滋滋的电流声。
  这是正常现象。步进电机有一个参数-步距角。通过细分驱动可以缩小步进角度,比如步距角为1.8度的步进电机,采用16细分,最小可以走的角度是1.8/16=0.1125度。由于这个角度非常小,当电机停止时,可能处于非电机物理位置(1.8度为一个物理位置)。因此步进电机在静止时会有电流声,这属于正常现象,不用担心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值