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