文章目录
- 一、A4988模块简介
- 二、A4988引脚说明
- 三、A4988的Vref电压调节
- 四、STM32F103C8T6控制A4988驱动2相4线步进电机
- 准备工作
- 引脚接线
- 代码示例
- 效果展示
- 五、A4988电机驱动板常见问题
一、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 步进模式。
MS1 | MS2 | MS3 | 微步分辨率 |
---|---|---|---|
L | L | L | 全步 |
H | L | L | 半步 |
L | H | L | 1/4步 |
H | H | L | 1/8步 |
H | H | H | 1/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时注意:
- A4988模块的VDD引脚需要连接+5V电压
- A4988模块的GND引脚必须与电路中的其它设备共地
- A4988模块的VMOT引脚无需通电,但是通电也不影响Vref的测量。
- A4988模块的1A/1B/2A/2B引脚可以不与步进电机连接,但连接也不会影响Vref的测量
四、STM32F103C8T6控制A4988驱动2相4线步进电机
准备工作
STM32F103C8T6最小系统板,A4988驱动模块,OLED显示屏,EC11旋转编码器,按键和导线若干。
引脚接线
STM32F103C8T6 | A4988 |
---|---|
电机电源正 | VMOT |
电机电源负 | GND |
3.3V | VDD |
GND | GND |
PA0 | STEP |
PA4 | EN |
PA5 | DIR |
PB3 | MS1 |
PB4 | MS2 |
PB5 | MS3 |
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_Helse A4988_DIR_LA4988_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) / 100PWM_SetCompare1(50); //Duty = CCR / 100A4988_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度为一个物理位置)。因此步进电机在静止时会有电流声,这属于正常现象,不用担心。