A4988 步进电机驱动模块测试

A4988控制逻辑简单,主要分为睡眠、正反转、复位、使能、细分等模式控制。

(1)睡眠模式:Sleep管脚电平置0,进入睡眠模式,驱动器输出待机模式;Sleep管脚置1,驱动器处于正常工作状态;

(2)正反转模式:正转模式DIR管脚置0或1,反转模式置1或0;

(3)复位模式:复位模式下容易消耗能量,产生的冲击电流较大。直接RESET管脚置1,在不影响系统工作时RESET管脚置0复位。一旦驱动芯片复位,系统将回归到原始A4988 I/O端口控制状态;

(4)使能模式:使能模式控制系统是否开始工作,ENBALBE管脚置0开始工作,置1停止工作;

(5)细分模式:通过MS1、MS2、MS3控制细分系数,A4988细分为1/16细分为最小,通过计算角度值可得最小细分角度为全步进角度的1/16。A4988驱动逻辑控制如表1所示。

测试方法:

拿到一个步进电机时,首先检测步进电机两条线之间的电阻,两条线之间电阻小的(在蠕动泵上测试为33Ω左右),接4988的1A、1B端(或2A、2B端),其中调换1A、1B端(或2A、2B端)的顺序可以改变电机的旋转方向。

接线示意图

使用中,把使能脚和细分脚全部接地,即不设置细分(步进值为1),复位脚和睡眠脚用跳线帽短接。

A4988功能实验测试:

DIR=1,STEP为3.3V占空比50%,频率为500Hz的方波,电机电压Vmot=12V。


测得1A(或1B、2A、2B)波形
蠕动泵:

蠕动泵本质上也是步进电机。
电机参数:42步进24V0.4A,1.8°


蠕动泵步进电机
黑绿电阻33Ω,红蓝电阻33Ω
电机转动情况
常见问题总结:
1、4988驱动板可以驱动57电机吗?

4988可以驱动的电机跟尺寸关系不大,主要与工作电流有关,理论上电流小于2A的步进电机都是可以驱动的,不论是42还是57电机。

2、可以驱动多大的电流?

如果4988芯片上没有加散热片,电流最好在1.2A以下。如果加散热片,电流可以达到2A。

3、步进电机的连接方式是什么?

正如4988板子背面所标识的,连接方式是依次连接步进电机的1B-1A-2A-2B,或者反向为2B-2A-1A-1B,或者1A-1B-2B-2A,其它的方式一次类推。如果你的电机线是标准的红蓝绿黑的颜色,可以按照颜色连接为:红-蓝-绿-黑,或相反:黑-绿-蓝-红。

4、如何调节相电流?

相电流的大小跟步进电机的扭力有直接关系,如果感觉你的步进电机扭力不足,可以加大4988板子的电流配置。驱动板是通过一个小的电位器来实现对输出电流的配置的。可以通过用万用表测量电位器中间管脚的电位。电位和电流的关系满足下面的公式:Vref = A*0.8.也就是如果你想配置电机工作电流为1A,则电位应该配置在0.8V。默认的元件配置可以将电流调节到1.5A,如果需要更大电流需要修改电路中的R1,将30K的阻值改为20K(左右),就可以将电流调节到2A左右。

5、4988板子的细分如何配置?

4988板子细分配置需要ramps或其它相似板子的短路块来配置。ramps上对应每个4988驱动都有ms1,ms2,ms3三个短路块来调节细分(需要取下4988板子才可以看到),
ms1 | ms2 | ms3
no | no | no |全细分
yes | no | no |1/2(2细分)
no | yes | no | 1/4 (4细分)
yes | yes | no |1/8(8细分)
yes | yes | yes | 1/16(16细分)

6、接上电机后,电机不能正常运行,在左右抖动,是什么原因?

电机出现抖动一般有两个原因,
一是缺相:可能是4988板子没有焊接好或因为外力导致4988的输出端某一相断开,造成电机缺相从而抖动。也有可能是步进电机接线只用一相没有连接好;
而是两相接错:如果步进电机没有按照正确的顺序进行连接,电机也会出现抖动的情况,请按照问题3进行正确的连接。

7、4988可以驱动两相六线或两相无线的电机吗?

可以,两相连线按照问题3连接,将中间抽头悬空即可。

8、电机停止转动时会有滋滋的电流声。

首先说明的是这是正常现象。步进电机的特点是走特定的角度而不是一直转,所以步进电机都有一个参数,步距角。如果通过细分,可以最小走 步距角/细分数的角度,比如步距角为1.8度的步进电机,采用16细分,最小可以走的角度是1.8/16=0.1125度。但由于这个角度非常小,并且不一定在电机物理所在的位置(1.8度为一个物理位置),所以步进电机停止时也需要通电,从而保证电机不会自动跳到物理步距角上。因为这个特性使得步进电机在静止时会有电流声,这属于正常现象,不用担心。

#include "a4988.h"
#include "delay.h"

/*
STEP1 PDout(15)
SDIR1 PGout(2)  
STEP2 PDout(14)
SDIR2 PGout(3)  
STEP3 PDout(13)
SDIR3 PGout(4)  
STEP4 PDout(12)
SDIR4 PGout(5)  

MSTEP PDout(15) //固定芯片步进STEP
MDIR  PGout(2)  //固定芯片步进DIR
CSTEP PDout(14) //磁铁步进STEP
CDIR  PGout(3)  //磁铁步进DIR
RSTEP PDout(13) //蠕动泵STEP
RDIR  PGout(4)  //蠕动泵DIR
USTEP PDout(12) //超声步进电机STEP
UDIR  PGout(5)  //超声步进电机DIR
*/

//方向脚初始化
void Step_DIR_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);   //使能PG端口时钟
    
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;  //端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //IO口速度为50MHz
 GPIO_Init(GPIOG, &GPIO_InitStructure);                  //根据设定参数初始化
 GPIO_SetBits(GPIOG,GPIO_Pin_2);                         
 GPIO_SetBits(GPIOG,GPIO_Pin_3);    
 GPIO_SetBits(GPIOG,GPIO_Pin_4);        
 GPIO_SetBits(GPIOG,GPIO_Pin_5);    
}

//脉冲初始化,公用定时器4,重映射,4路频率会被一起改变
void Step_Pulse_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    //使能定时器4时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    
    GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4重映射   
    
   //设置该引脚为复用输出功能,输出TIM4的PWM脉冲波形
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //TIM_CH4
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO
    
    //!!!!!配置完复用功能后,此时输出为低电平,似乎难以修改
    
   //初始化TIM4
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    //初始化TIM4 Channel_1234 PWM模式     
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //关闭比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC1
    //TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器
    
    TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2
    //TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器
    
    TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC3
    //TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR3上的预装载寄存器
    
    TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC4
    //TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR4上的预装载寄存器
 
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    
    TIM_Cmd(TIM4, DISABLE);  //先不使能TIM4 
}



//芯片电机运动
void Mstep_move(u8 dir,u16 frequency)
{
    MDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare4(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);//开启TIM4通道4
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//芯片电机停止
void Mstep_stop(void)
{   
    TIM_SetCompare4(TIM4,0);    
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);
}


//磁铁电机运动
void Cstep_move(u8 dir,u16 frequency)
{
    CDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare3(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);//开启TIM4通道3
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//磁铁电机停止
void Cstep_stop(void)
{   
    TIM_SetCompare3(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);
}

//超声电机运动
void Ustep_move(u8 dir,u16 frequency)
{
    UDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare1(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Enable);//开启TIM4通道1
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//超声电机停止
void Ustep_stop(void)
{   
    TIM_SetCompare1(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);//USTEP会随波形停在高或低
}

//蠕动泵抽取
void Rstep_move(u8 dir,u16 frequency)
{
    RDIR = dir;     
    Step_Pulse_Init((u16)(100000/frequency-1),719);
    TIM_SetCompare2(TIM4,(u16)(50000/frequency));
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Enable);//开启TIM4通道2
    TIM_Cmd(TIM4, ENABLE);//必须放在最后使能

}
//蠕动泵停止
void Rstep_stop(void)
{   
    TIM_SetCompare2(TIM4,0);
    TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Disable);//关闭TIM4通道1
    TIM_CCxCmd(TIM4,TIM_Channel_2,TIM_CCx_Disable);//关闭TIM4通道2
    TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);//关闭TIM4通道3
    TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);//关闭TIM4通道4
    TIM_Cmd(TIM4, DISABLE);//RSTEP会随波形停在高或低
}
a4988.h文件
#ifndef __A4988_H
#define __A4988_H    
#include "sys.h"

#define MSTEP PDout(15) //固定芯片步进STEP
#define MDIR  PGout(2)  //固定芯片步进DIR
#define CSTEP PDout(14) //磁铁步进STEP
#define CDIR  PGout(3)  //磁铁步进DIR
#define RSTEP PDout(13) //蠕动泵STEP
#define RDIR  PGout(4)  //蠕动泵DIR
#define USTEP PDout(12) //超声步进电机STEP
#define UDIR  PGout(5)  //超声步进电机DIR

void Step_DIR_Init(void);
void Step_Pulse_Init(u16 arr,u16 psc);
void Mstep_move(u8 dir,u16 frequency);
void Mstep_stop(void);
void Rstep_move(u8 dir,u16 frequency);
void Rstep_stop(void);
void Ustep_move(u8 dir,u16 frequency);
void Ustep_stop(void);
void Cstep_move(u8 dir,u16 frequency);
void Cstep_stop(void);

#endif

参考:
基于STM32的微型步进电机驱动控制器设计
A4988步进电机驱动器驱动控制42步进电机速度,步进电机调速,调节驱动电流
编码器速度和方向检测,371电机方向与速度检测,stm32编码器接口模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容