本文介紹的步進(jìn)電機(jī)驅(qū)動為畢設(shè)所用,學(xué)習(xí)時也借鑒了其他博主和商家的資料,介紹的都很詳細(xì)。但對于剛?cè)腴T的友友萌來說,可能還會存在的一些不解。而我就是被卡在驅(qū)動電源上。下文為我對4988驅(qū)動的一些理解,希望能幫助到剛學(xué)習(xí)步進(jìn)電機(jī)的朋友。
4988驅(qū)動IC價(jià)格便宜驅(qū)動簡單,但在驅(qū)動步進(jìn)電機(jī)時,電機(jī)會存在的明顯震動。下一篇文章將實(shí)現(xiàn)TMC2208驅(qū)動IC控制步進(jìn)電機(jī)。
一、簡介
A4988 是一款完全的微步電動機(jī)驅(qū)動器,帶有內(nèi)置轉(zhuǎn)換器,易于操作。該產(chǎn)品可在全、半、1/4、1/8 及 1/16 步進(jìn)模式時操作雙極步進(jìn)電動機(jī),輸出驅(qū)動性能可達(dá) 35 V 及 ±1 A。A4988 包括一個固定關(guān)斷時間電流穩(wěn)壓器,該穩(wěn)壓器可在慢或混合衰減模式下工作。轉(zhuǎn)換器是 A4988 易于實(shí)施的關(guān)鍵。只要在“步進(jìn)”輸入中輸入一個脈沖,即可驅(qū)動電動機(jī)產(chǎn)生微步。無須進(jìn)行相位順序表、高頻率控制行或復(fù)雜的界面編程。A4988 界面非常適合復(fù)雜的微處理器不可用或過載的應(yīng)用。在微步運(yùn)行時,A4988 內(nèi)的斬波控制可自動選擇電流衰減模式(慢或混合)。在混合衰減模式下,該器件初始設(shè)置為在部分固定停機(jī)時間內(nèi)快速衰減,然后在余下的停機(jī)時間慢速衰減?;旌纤p電流控制方案能減少可聽到的電動機(jī)噪音、增加步進(jìn)精確度并減少功耗。提供內(nèi)部同步整流控制電路,以改善脈寬調(diào)制 (PWM) 操作時的功率消耗。內(nèi)部電路保護(hù)包括:帶滯后的過熱關(guān)機(jī)、欠壓鎖定(UVLO) 及交叉電流保護(hù)。不需要特別的通電排序。
A4988 采用表面安裝 QFN 封裝 (ES),尺寸為 5 mm × 5mm, 標(biāo)稱整體封裝高度為 0.90 mm ,并帶有外露散熱板以增強(qiáng)散熱功能。該封裝為無鉛封裝(后綴–T),采用 100% 霧錫電鍍引腳框。

圖1.HR4988
如圖1所示為HR4988步進(jìn)電機(jī)驅(qū)動模塊非A4988,是一款國產(chǎn)pin to pin完全可替換A4988的驅(qū)動芯片。至于為什么選擇HR4988而不用A4988?也就是懵懂無知,買了一款綠色的驅(qū)動模塊,在學(xué)習(xí)過程中弄壞了,就想試試紅色的。但二者的配置過程一致。

圖2.4988模塊和控制板
二、主要引腳介紹

圖3.A4988典型應(yīng)用示意圖

圖4.HR4988典型應(yīng)用示意圖
VMOT – 電機(jī)電源正極(A4988可用電源電壓為8V ~ 35V,HR4988為8~32V)注:此引腳用于連接為電機(jī)供電的電源 GND – 電機(jī)電源接地 2B, 2A – 電機(jī)繞組2控制引腳 1A, 1B – 電機(jī)繞組1控制引腳 VDD – 邏輯電源正極(3 – 5.5伏)注:此引腳用于為4988電機(jī)驅(qū)動板供電 GND – 邏輯電源接地 ENABLE – 使能引腳(低電平有效) 引腳說明:此當(dāng)此引腳為低電平時,A4988才能進(jìn)行電機(jī)驅(qū)動工作,當(dāng)該引腳為高電平,A4988將不會進(jìn)行電機(jī)驅(qū)動工作。如果該引腳懸空,則A4988默認(rèn)為使能狀態(tài)。即該引腳沒有連接任何電平時,A4988可以正常工作。 MS1, MS2, MS3 – 驅(qū)動模式引腳 引腳說明:這三個引腳控制A4988微步細(xì)分驅(qū)動模式。通過這三個引腳的邏輯電平,我們可以調(diào)整A4988驅(qū)動電機(jī)模式為全、半、1/4、1/8 及 1/16 步進(jìn)模式。Table1圖中右側(cè)的表格里有具體如何調(diào)節(jié)這三個引腳電頻以及A4988在不同的電平組合下的驅(qū)動模式。表格中“L”代表低電平,“H”代表高電平?!癋ULL”為全步進(jìn),“HALF”為半步進(jìn),“QUATER”為1/4步進(jìn), “EIGHTH”為1/8步進(jìn), “SIXTEENTH”為1/16步進(jìn)。當(dāng)MS1, MS2, MS3這幾個引腳懸空時,A4988默認(rèn)為全步進(jìn)電機(jī)驅(qū)動模式。 RESET – 復(fù)位引腳 引腳說明:該引腳為低電平有效,即當(dāng)該引腳為低電平時,A4988將復(fù)位。如果該引腳懸空,則A4988默認(rèn)為高電平。即該引腳沒有連接任何電平時,A4988可以正常工作。 SLEEP – 睡眠引腳 引腳說明:當(dāng)該引腳連接電平為低電平時,A4988將進(jìn)入低能耗睡眠狀態(tài),即消耗最小的電能。如果無需使用SLeep功能,則可以將SLEEP引腳與RESET引腳連接,則A4988將持續(xù)保持正常能耗狀態(tài)而不會進(jìn)入低能耗狀態(tài)。 STEP – 步進(jìn)引腳 引腳說明:此引腳用于通過Arduino等微控制器向A4988發(fā)送脈沖控制信號,A4988接收到此信號后,會根據(jù) MS1, MS2 和 MS3引腳控制電機(jī)運(yùn)轉(zhuǎn)。占空比50%。 DIR – 方向引腳 引腳說明:通過此引腳可以調(diào)整A4988控制電機(jī)運(yùn)行方向。當(dāng)此引腳為低電平,A4988將控制電機(jī)順時針旋轉(zhuǎn)。高電平則逆時針旋轉(zhuǎn)。 |
驅(qū)動模式:

本次使用的二相步進(jìn)電機(jī)步距角為1.8°,在全步模式下,給STEP一個脈沖信號,電機(jī)轉(zhuǎn)動1.8°。半步模式下,一個脈沖信號電機(jī)的轉(zhuǎn)動角度為1.8°/2,依次類推。
三、實(shí)驗(yàn)器材
stm32f103c8t6最小系統(tǒng);
ST-Link燒錄器;
4988步進(jìn)電機(jī)驅(qū)動模塊;
步進(jìn)電機(jī)驅(qū)動控制板;
42步進(jìn)電機(jī);
12V開關(guān)電源;
導(dǎo)線若干;
開發(fā)環(huán)境:Keil_5

圖5.實(shí)驗(yàn)器材
硬件連接模擬圖:

圖6.硬件連接模擬圖
如圖6為MCU與驅(qū)動器和電機(jī)的連接示意圖,可在面包板上完成接線,外部驅(qū)動電源(8-35V)需要在電源正極與負(fù)極之間接一個47uF電容保護(hù)驅(qū)動器。而我在選擇電源的時候選擇了24V2A開關(guān)電源,接線的時候需要講開關(guān)電源的負(fù)極與開發(fā)板GND連接(共地)。也許是正負(fù)極接反了(猜測),導(dǎo)致上電后燒壞驅(qū)動器和開發(fā)板。
后續(xù)使用的驅(qū)動芯片為HR4988,將面包板換為控制板(如下圖7),控制板的電壓要求為9V,在理論上可以接8~32V,但問客服就說只能接9V。最后使用12V1A開關(guān)電源給驅(qū)動IC供電。

圖7.4988控制板
控制板兩個GND相連,SLEEP引腳也與RESET引腳連接,MS1、MS2、MS3采用撥動開關(guān)設(shè)置步進(jìn)模式。使用控制板的好處就是只需將ENABLE、STEP 、DIR與MCU的IO相連,可節(jié)約IO資源(相較于面包板)。
四、程序設(shè)計(jì)
引腳連接:
ENABLE |
PB3 |
DIR |
PB5 |
STEP |
PB8 |
控制板5V接開發(fā)板5V引腳,控制板GND接開關(guān)電源負(fù)極與開發(fā)板GND,控制板9V接12V開關(guān)電源正極。
初始化配置
將PB8設(shè)置為復(fù)用推挽輸出模式,使用定時器4通道3輸出PWM,控制電機(jī)運(yùn)轉(zhuǎn)。
void MOTOR_Init(void)
{
//1.引腳初始化
GPIO_InitTypeDef motor_gpio_init;
motor_gpio_init.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_3;
motor_gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
motor_gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&motor_gpio_init); //DIR ENABLE 通用推挽輸出模式
motor_gpio_init.GPIO_Pin = GPIO_Pin_8;
motor_gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&motor_gpio_init); //STEP 復(fù)用推挽輸出
//2.定時器初始化配置
TIM_DeInit(TIM4);
TIM_TimeBaseInitTypeDef motor_TimeInit;
motor_TimeInit.TIM_Prescaler = 31; //預(yù)分頻值
motor_TimeInit.TIM_ClockDivision = TIM_CKD_DIV1;
motor_TimeInit.TIM_CounterMode = TIM_CounterMode_Up;//向上計(jì)數(shù)模式
motor_TimeInit.TIM_Period = 3999; //重裝載值
motor_TimeInit.TIM_RepetitionCounter = 0; //重復(fù)計(jì)數(shù)值
TIM_TimeBaseInit(TIM4,&motor_TimeInit); //基本計(jì)數(shù)模式
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //配置更新中斷
TIM_ClearFlag(TIM4,TIM_FLAG_Update); //清除更新中斷位
TIM_OCInitTypeDef motor_OCInit;
TIM_OCStructInit(&motor_OCInit);
motor_OCInit.TIM_OCMode = TIM_OCMode_PWM1;
motor_OCInit.TIM_OutputState = TIM_OutputState_Enable;
motor_OCInit.TIM_Pulse = 1499;
TIM_OC3Init(TIM4,&motor_OCInit); //配置通道3PWM
//失能motor
MOTOR_STOP();
MOTOR_ENABLE;
MOTOR_DIR_CW; //順時針
//MOTOR_DIR_CCW;
}
控制電機(jī)轉(zhuǎn)動速度就是控制脈沖周期,一個脈沖電機(jī)步進(jìn)一定角度,修改脈沖周期便可控制電機(jī)轉(zhuǎn)動速度。
#define SET_MOTOR_SPEED(x) TIM_SetAutoreload(TIM4,x-1);TIM_SetCompare3(TIM2,x/2-1)
中斷服務(wù)函數(shù)
通過撥動步進(jìn)開關(guān),設(shè)置為1/16步進(jìn)模式。實(shí)現(xiàn)電機(jī)正轉(zhuǎn)一圈反轉(zhuǎn)一圈反復(fù)循環(huán)。
void TIM4_IRQHandler(void)
{
if(RESET != TIM_GetITStatus(TIM4,TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除中斷標(biāo)志位
motor_sleep++;
if(motor_sleep==3200) //改變轉(zhuǎn)向
{
MOTOR_STOP(); //停止運(yùn)轉(zhuǎn)
motor_sleep=0;
motor_dir=!motor_dir;
if(motor_dir) //順時針
{
MOTOR_DIR_CW;
MOTOR_START();
}
else
{
MOTOR_DIR_CCW;
MOTOR_START();
}
}
}
}
五、演示
4988驅(qū)動步進(jìn)電機(jī)

六、程序代碼
mian.c
#include "motor.h"
#include "systick.h"
void clock_config(void);
void nvic_config(void);
int main(void)
{
clock_config(); //配置RCC時鐘
nvic_config(); //配置中斷優(yōu)先級
MOTOR_Init(); //motor初始化
MOTOR_START();
while(1)
{
}
}
void clock_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
}
void NVIC_IQR_Confing(uint8_t nvic_IRQChannel,uint8_t nvic_PreemptionPriority, uint8_t nvic_SubPriority)
{
NVIC_InitTypeDef nvic_Init;
nvic_Init.NVIC_IRQChannel = nvic_IRQChannel;//中斷號
nvic_Init.NVIC_IRQChannelPreemptionPriority = nvic_PreemptionPriority;//搶占優(yōu)先級
nvic_Init.NVIC_IRQChannelSubPriority = nvic_SubPriority;//子優(yōu)先級
nvic_Init.NVIC_IRQChannelCmd = ENABLE;//啟用中斷優(yōu)先級
NVIC_Init(&nvic_Init);
}
void nvic_config(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中斷優(yōu)先級分組
NVIC_IQR_Confing(TIM4_IRQn,1,0);
}
motor.c文章來源:http://www.zghlxwxcb.cn/news/detail-428246.html
#include "motor.h"
/*
引腳連接:
PB5 - DIR 方向引腳
PB8 - STEP TIM4_CH3 步進(jìn)引腳
PB3 - ENABLE 使能引腳
*/
uint16_t motor_sleep;
uint8_t motor_dir=1;
void MOTOR_Init(void)
{
//1.引腳初始化
GPIO_InitTypeDef motor_gpio_init;
motor_gpio_init.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_3;
motor_gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
motor_gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&motor_gpio_init); //DIR ENABLE 通用推挽輸出模式
motor_gpio_init.GPIO_Pin = GPIO_Pin_8;
motor_gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&motor_gpio_init); //STEP 復(fù)用推挽輸出
//2.定時器初始化配置
TIM_DeInit(TIM4);
TIM_TimeBaseInitTypeDef motor_TimeInit;
motor_TimeInit.TIM_Prescaler = 31; //預(yù)分頻值
motor_TimeInit.TIM_ClockDivision = TIM_CKD_DIV1;
motor_TimeInit.TIM_CounterMode = TIM_CounterMode_Up;//向上計(jì)數(shù)模式
motor_TimeInit.TIM_Period = 3999; //重裝載值
motor_TimeInit.TIM_RepetitionCounter = 0; //重復(fù)計(jì)數(shù)值
TIM_TimeBaseInit(TIM4,&motor_TimeInit); //基本計(jì)數(shù)模式
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //配置更新中斷
TIM_ClearFlag(TIM4,TIM_FLAG_Update); //清除更新中斷位
TIM_OCInitTypeDef motor_OCInit;
TIM_OCStructInit(&motor_OCInit);
motor_OCInit.TIM_OCMode = TIM_OCMode_PWM1;
motor_OCInit.TIM_OutputState = TIM_OutputState_Enable;
motor_OCInit.TIM_Pulse = 1499;
TIM_OC3Init(TIM4,&motor_OCInit); //配置通道3PWM
//失能motor
MOTOR_STOP();
MOTOR_ENABLE;
MOTOR_DIR_CW; //順時針
//MOTOR_DIR_CCW;
}
//中斷服務(wù)函數(shù)
void TIM4_IRQHandler(void)
{
if(RESET != TIM_GetITStatus(TIM4,TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除中斷標(biāo)志位
motor_sleep++;
if(motor_sleep==3200) //改變轉(zhuǎn)向
{
MOTOR_STOP(); //停止運(yùn)轉(zhuǎn)
motor_sleep=0;
motor_dir=!motor_dir;
if(motor_dir) //順時針
{
MOTOR_DIR_CW;
MOTOR_START();
}
else
{
MOTOR_DIR_CCW;
MOTOR_START();
}
}
}
}
/*
\brief: 設(shè)置motor運(yùn)轉(zhuǎn)速度
\param: speed: 速度
速度=(1/2M) * speed * (1.8/16) 度/秒
\retval: none
*/
void MOTOR_Set_Speed(uint16_t speed)
{
TIM_SetAutoreload(TIM4,speed-1);
TIM_SetCompare3(TIM4,speed/2-1);
}
//設(shè)置步進(jìn)模式 (用于MS1、MS2、MS3與單片機(jī)IO連接時使用)
#if 0
void setMotorStepMod(uint8_t stepMod)
{
switch(StepMode)
{
case MOTOR_FULL_STEP:
MOTOR_MS1(0);
MOTOR_MS2(0);
MOTOR_MS3(0);
break;
case MOTOR_HALF_STEP:
MOTOR_MS1(1);
MOTOR_MS2(0);
MOTOR_MS3(0);
break;
case MOTOR_QUARTER_STEP:
MOTOR_MS1(0);
MOTOR_MS2(1);
MOTOR_MS3(0);
break;
case MOTOR_EIGHTH_STEP:
MOTOR_MS1(1);
MOTOR_MS2(1);
MOTOR_MS3(0);
break;
case MOTOR_SIXTEENTH_STEP:
MOTOR_MS1(1);
MOTOR_MS2(1);
MOTOR_MS3(1);
break;
default :
MOTOR_MS1(1);
MOTOR_MS2(1);
MOTOR_MS3(1);
break;
}
}
#endif
motor.h文章來源地址http://www.zghlxwxcb.cn/news/detail-428246.html
#ifndef _MOTOR_H_
#define _MOTOR_H_
#include "stm32f10x.h"
#define MOTOR_DIR_CW GPIO_ResetBits(GPIOB,GPIO_Pin_5) //順時針
#define MOTOR_DIR_CCW GPIO_SetBits(GPIOB,GPIO_Pin_5) //逆時針
#define MOTOR_ENABLE GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define MOTOR_STOP() TIM_Cmd(TIM4,DISABLE) //停止轉(zhuǎn)動
#define MOTOR_START() TIM_Cmd(TIM4,ENABLE) //開始轉(zhuǎn)動
#define MOTOR_FULL_STEP 0 //滿步
#define MOTOR_HALF_STEP 1 //二分之一步
#define MOTOR_QUARTER_STEP 2 //四分之一步
#define MOTOR_EIGHTH_STEP 3 //八分之一步
#define MOTOR_SIXTEENTH_STEP 4 //十六分之一步
extern uint8_t motor_dir;
void MOTOR_Init(void);
void MOTOR_Set_Speed(uint16_t speed);
#endif
到了這里,關(guān)于【STM32篇】4988驅(qū)動步進(jìn)電機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!