☛ 功能說明

利用 Arduino UNO 開發板與 A4988 驅動模塊控制一個四線二相步進電機轉動,步進電機順時針轉動三圈後,接着逆時針轉動二圈。

A4988 驅動模塊簡介

該模塊的核心是 Allegro 的 Microstepping 驅動器 – A4988。它的體積很小 ( 只有 0.8 英寸 × 0.6 英寸 ),但仍然有力氣。

A4988 步進電機驅動器具有高達 35V 的輸出驅動能力和± 2A 的輸出能力,使您可以像 NEMA 17 一樣,以每個線圈高達 2A 的輸出電流控制一個雙極步進電機。

該驅動程序具有內置轉換器,易於操作。這樣可以將控制針的數量減少到僅僅二個,一個用於控制步進,另一個用於控制旋轉方向。

驅動程序提供五種不同的步進分辨率。分別爲全步、半步、¼ 步、八步和十六步。

A4988 驅動模塊引腳排列

VDD和 GND 用於驅動 3V – 5.5V 的內部邏輯電路。VMOT 和 GND 爲電動機提供電源,該電源可以爲 8V – 35V。

根據數據表,電動機電源,需要在靠近電路板的地方使用適當的去耦電容器,以維持 4A 的電流。

注意:

該驅動器板上裝有 ESR 陶瓷電容器,因此容易受到電壓尖峯的影響。在某些情況下,這些峯值可能會超過 35V ( A4988 的最大額定電壓 ),可能會永久損壞電路板甚至電動機。保護驅動器免受此類尖峯影響的一種方法是在電動機電源引腳之間放置一個較大的 100μF ( 至少 47μF ) 的電解電容器。

微步選擇引腳

A4988 驅動器通過允許中間步進位置來允許微步進。這是通過以中等電流水平向線圈通電來實現的。例如:選擇 ¼ 步模式驅動每轉 1.8°或 200 步的 NEMA 17,則電動機將給每轉 800 微步。

A4988 驅動器有三個步長 ( 分辨率 ) 選擇器輸入,分別爲 MS1、MS2 及 MS3。通過這三個引腳設置適當的邏輯電位,可以將電動機設置爲五步分辨率之一。

這三個微步選擇引腳被內部下拉電阻拉至低電位。因此,如果將其斷開,電動機將以全步模式運行。

控制輸入引腳

A4988 有兩個控制輸入。即 STEP 及 DIR。

STEP 輸入控制電機的微步。發送到此引腳的每個 HIGH 脈衝都會通過微步選擇引腳設置的微步數來步進電動機。脈衝越快,電機旋轉的越快。

DIR 輸入控制電機的旋轉方向。將其拉高電平將驅動電動機順時針旋轉。將其拉低電平將驅動電動機逆時針旋轉。

注意:

由於內部沒有將 STEP 和 DIR 引腳拉至任何特定電壓,因此您不應在應用中將其懸空。

控制電源狀態的引腳

 

A4988 具有三個不同的輸入,由於控制其電源狀態。分別爲 EN、RST 及 SLP。

EN 引腳爲低電位有效輸入,當拉至低電位 ( 邏輯 0 ) 時,A4988 驅動器使能。默認情況下,該引腳被拉低,因此驅動器始終處於使能狀態,除非將其拉高。

SLP 引腳爲低電位有效輸入。這意味着將該引腳拉至低電位可將驅動器置於睡眠模式,從而將功耗降至最低。特別是在不使用電動機以節省功率時,可以調用此方法。

RST 也是低電位有效輸入。將其拉低時,將忽略所有 STEP 輸入,直到將其拉高。它還通過將內部轉換器設置爲預定義的 HOME 狀態來重置驅動程序。原始狀態基本上是電動機啓動的初始位置,並且根據微步分辨率而不同。

注意:

RST 引腳懸空。如果不使用該引腳,則可以將其連接到相鄰的 SLP / SLEEP 引腳以將其拉高並啓用驅動器。

輸出引腳

A4988 電機驅動器的輸出通道通過以下方式分解到模塊的邊緣:1B、1A、2A 和 2B 針腳。

您可以將電壓在 8V – 35V 之間的任何雙極步進電機連接到這些引腳。

模塊上的每個輸出引腳都可以爲電機提供高達 2A 的電流。但是,提供給電動機的電流取決於系統的電源、冷卻系統和電流限制設置。

限流

在使用電動機之前,需要進行一些小的調整。我們需要限制流經步進線圈的最大電流,並防止其超過電機的額定電流。A4988 驅動器上有一個微調電位器,可用於限制電流設置。您應將電流限制設置爲等於或小於電動機的額定電流。

要進行此調整,有兩種方法:

方法㈠

在這種方法中,我們將通過測量 ” ref ” 引腳上的電壓 ( Vref ) 來設置限制電流。

① 查看步進電機的數據表,記下它的額定電流。

② 斷開三個選擇微步引腳,使驅動器進入全步模式。

③ 不給 STEP 輸入計時,將電動機固定在固定位置。

④ 調整時,請測量金屬微調電位器本身的電壓 ( Vref )。

⑤ 使用公式調整 Vref 電壓電流限制 = Vref × 2.5。例如:電動機的額定電流爲 350mA,則可將參考電壓調整爲 0.14V。

方法㈡

在這種方法中,我們將通過測量流經線圈的電流來設置電流極限。

① 查看步進電機的數據表,記下它的額定電流。

② 斷開三個微步選擇引腳,使驅動器進入全步模式。

③ 不給 STEP 輸入計時,將電動機固定在固定位置,不要將 STEP 輸入懸空,將其連接到邏輯電源 ( 5V )。

④ 將電流表與步進電機上的線圈之一串連,然後測量實際電流。

⑤ 調節電流限制電位器,直到達到額定電流。

☛ 使用材料

Arduino UNO R3  開發板 × 1、A4988 步進馬達控制模塊 × 1、電解電容 47μF × 1、四線二相步進馬達  × 1。

☛ 電路圖及麪包板接線圖

☛ 程式碼

const int dirPin = 2;                          // 驅動模塊的 DIR 引腳連接至數位引腳 2
const int stepPin = 3;                         // 驅動模塊的 STEP 引腳連接至數位引腳 3
const int stepsPerRevolution = 200;            // 旋轉一圈 200 步
int x;
void setup()
{
     pinMode(dirPin,OUTPUT);                   // 數位引腳 2 爲輸出模式
     pinMode(stepPin,OUTPUT);                  // 數位引腳 3 爲輸出模式
}

void loop()
{
     digitalWrite(dirPin,HIGH);                // 順時針旋轉
     for(x=0;x < stepsPerRevolution*3; x++)    // 旋轉三圈
     {
         digitalWrite(stepPin,HIGH);           // 對 STEP 引腳輸出信號
         delayMicroseconds(2000);              // 延遲 2 秒
         digitalWrite(stepPin,LOW);            // 停止 STEP 引腳輸出信號
         delayMicroseconds(2000);              // 延遲 2 秒
     }
     delay(1000);

     digitalWrite(dirPin,LOW);                 // 逆時針旋轉
     for(x=0; x < stepsPerRevolution*2 ; x++)  // 旋轉二圈
     {
         digitalWrite(stepPin,HIGH);           // 對 STEP 引腳輸出信號
         delayMicroseconds(2000);              // 延遲 2 秒
         digitalWrite(stepPin,LOW);            // 停止 STEP 引腳輸出信號
         delayMicroseconds(2000);              // 延遲 2 秒
     }
     delay(1000);                              // 延遲 1 秒

}

 

☛ 練習

⑴ 利用 Arduino UNO 開發板與 AccelStepper 函式庫控制四線二相步進電機的轉動。步進電機沿一個方向加速,然後減速以使其靜止。旋轉一圈後,它將改變旋轉方向。而且它將不斷重複這樣的動作。

#include<AccelStepper.h>                                   //調用 AccelStepper.h 函式庫

#define motorInterfaceType 1
const int dirPin = 2;                                      // 驅動模塊的 DIR 引腳連接至數位引腳 2
const int stepPin = 3;                                     // 驅動模塊的 STEP 引腳連接至數位引腳 3

AccelStepper myStepper(motorInterfaceType,stepPin,dirPin); // 創建 myStepper 物件

void setup()
{
     myStepper.setMaxSpeed(1000);                          // 設定步進馬達最大速度爲 1000
     myStepper.setAcceleration(50);
     myStepper.setSpeed(200);                              // 設定步進馬達恆定速度爲 200
     myStepper.moveTo(200);                                // 目標位置設爲 200 步
}

void loop()
{
     if(myStepper.distanceToGo()==0)                       // 是否到達目標位置?
        myStepper.moveTo(-myStepper.currentPosition());    // 將當前位置設爲負值,使步進馬達反向轉動
     myStepper.run();
}