天天看點

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所示。

A4988 步進電機驅動子產品測試

測試方法:

拿到一個步進電機時,首先檢測步進電機兩條線之間的電阻,兩條線之間電阻小的(在蠕動泵上測試為33Ω左右),接4988的1A、1B端(或2A、2B端),其中調換1A、1B端(或2A、2B端)的順序可以改變電機的旋轉方向。

A4988 步進電機驅動子產品測試

接線示意圖

使用中,把使能腳和細分腳全部接地,即不設定細分(步進值為1),複位腳和睡眠腳用跳線帽短接。

A4988功能實驗測試:

DIR=1,STEP為3.3V占空比50%,頻率為500Hz的方波,電機電壓Vmot=12V。

A4988 步進電機驅動子產品測試

測得1A(或1B、2A、2B)波形

蠕動泵:

蠕動泵本質上也是步進電機。

電機參數:42步進24V0.4A,1.8°

A4988 步進電機驅動子產品測試

蠕動泵步進電機

A4988 步進電機驅動子產品測試

黑綠電阻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
           

繼續閱讀