Arduino nano使用A4988驅(qū)動(dòng)步進(jìn)電機(jī)
A4988是一款十分普及且價(jià)格實(shí)惠的步進(jìn)電機(jī)驅(qū)動(dòng)板。尤其是在3D打印以及數(shù)控機(jī)床領(lǐng)域,A4988十分常見(jiàn)。在使用Arduino通過(guò)A4988控制步進(jìn)電機(jī)時(shí),我們還需要一個(gè)額外的電子元件,那就是電解電容。該電容作用是為了保護(hù)A4988控制板。
首先讓我們來(lái)看一下A4988電機(jī)驅(qū)動(dòng)板的引腳功能:


VMOT?– 電機(jī)電源正極(可用電源電壓為8V ~ 35V)注:此引腳用于連接為電機(jī)供電的電源
GND?– 電機(jī)電源接地
2B, 2A?– 電機(jī)繞組2控制引腳
1A, 1B?– 電機(jī)繞組1控制引腳
VDD?– 邏輯電源正極(3 – 5.5伏)注:此引腳用于為A4988電機(jī)驅(qū)動(dòng)板供電
GND?– 邏輯電源接地
ENABLE?– 使能引腳(低電平有效)
引腳說(shuō)明:此當(dāng)此引腳為低電平時(shí),A4988才能進(jìn)行電機(jī)驅(qū)動(dòng)工作,當(dāng)該引腳為高電平,A4988將不會(huì)進(jìn)行電機(jī)驅(qū)動(dòng)工作。
如果該引腳懸空,則A4988默認(rèn)為使能狀態(tài)。
MS1, MS2, MS3?– 驅(qū)動(dòng)模式引腳
引腳說(shuō)明:這三個(gè)引腳控制A4988微步細(xì)分驅(qū)動(dòng)模式。通過(guò)這三個(gè)引腳的邏輯電平,我們可以調(diào)整A4988驅(qū)動(dòng)電機(jī)模式為全、半、1/4、1/8 及 1/16 步進(jìn)模式。上圖中右側(cè)的表格里有具體如何調(diào)節(jié)這三個(gè)引腳電頻以及A4988在不同的電平組合下的驅(qū)動(dòng)模式。表格中“L”代表低電平,“H”代表高電平。“FULL”為全步進(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這幾個(gè)引腳懸空時(shí),A4988默認(rèn)為全步進(jìn)電機(jī)驅(qū)動(dòng)模式。
RESET?– 復(fù)位引腳
引腳說(shuō)明:該引腳為低電平有效,即當(dāng)該引腳為低電平時(shí),A4988將復(fù)位。如果該引腳懸空,則A4988默認(rèn)為高電平。即該引腳沒(méi)有連接任何電平時(shí),A4988可以正常工作。
SLEEP?– 睡眠引腳
引腳說(shuō)明:當(dāng)該引腳連接電平為低電平時(shí),A4988將進(jìn)入低能耗睡眠狀態(tài),即消耗最小的電能。如果無(wú)需使用SLeep功能,則可以將SLEEP引腳與RESET引腳連接,則A4988將持續(xù)保持正常能耗狀態(tài)而不會(huì)進(jìn)入低能耗狀態(tài)。
STEP?– 步進(jìn)引腳
引腳說(shuō)明:此引腳用于通過(guò)Arduino等微控制器向A4988發(fā)送脈沖控制信號(hào),A4988接收到此信號(hào)后,會(huì)根據(jù) MS1, MS2 和 MS3引腳控制電機(jī)運(yùn)轉(zhuǎn)。
DIR?– 方向引腳
引腳說(shuō)明:通過(guò)此引腳可以調(diào)整A4988控制電機(jī)運(yùn)行方向。當(dāng)此引腳為低電平,A4988將控制電機(jī)順時(shí)針旋轉(zhuǎn)。高電平則逆時(shí)針旋轉(zhuǎn)。
材料如下:
Arduino nano *1
A4988 ? ? ??? ? ?*1
42步進(jìn)電機(jī)?? ?*1
12V外接電源 ? ?*1
導(dǎo)線 ? ? ? ? ? ??? 若干

1A 1B 2A 2B分別接電機(jī)的兩組線圈
代碼如下
int x;??
void setup()??
{ ?
? pinMode(6,OUTPUT); // Enable ?
? pinMode(5,OUTPUT); // Step ?
? pinMode(4,OUTPUT); // Dir ?
? digitalWrite(6,LOW); // Set Enable low ?
} ?
?
?
void loop() ?
{ ?
? ?
? digitalWrite(4,HIGH); // Set Dir high ?
? ?
? for(x = 0; x < 10; x++) // Loop 200 times ?
? { ?
? ? ? digitalWrite(5,HIGH); // Output high ?
? ? ? delayMicroseconds(800); // Wait 1/2 a ms ?
? ? ? digitalWrite(5,LOW); // Output low ?
? ? ? delayMicroseconds(800); // Wait 1/2 a ms ?
? ? } ?
? delay(2); // pause one second ?
? ?
? digitalWrite(4,LOW); // Set Dir low ?
? ?
?for(x = 0; x < 10; x++) // Loop 2000 times ?
? { ?
? ? ? digitalWrite(5,HIGH); // Output high ?
? ? ?delayMicroseconds(800); // Wait 1/2 a ms ?
? ? ? digitalWrite(5,LOW); // Output low ?
? ? ?delayMicroseconds(800); // Wait 1/2 a ms ?
? ? } ?
?delay(2); // pause one second ?
} ?