Note-15.使用A4988控制步進電機
如果需要控制一堆步進電機,那麼只使用一個Arduino來控制,就會佔用大量的處理時間,而無法處理其他事情,除非使用一個獨立的專用步進電機驅動器:A4988。
A4988只需兩個引腳就可以控制雙極步進電機(如NEMA 17)的速度和旋轉方向。
步進電機使用一個齒輪和電磁鐵旋轉,透過脈衝控制電機的行為,一次“一步”。
脈衝的順序決定了電機的旋轉方向。
脈衝的頻率決定了電機的速度。
脈衝的數量決定了電機轉多遠。
A4988步進電機驅動晶片
該模組的核心是來自Allegro - A4988的微步驅動器,其體型只有0。8″× 0。6″。
A4988步進電機驅動器的輸出驅動能力高達35V和±2A。這可以控制雙極步進電機(NEMA 17)每個線圈高達2A的輸出電流。
A4988驅動自帶控制程式,能簡化操作,只需2個引腳就能完成控制
一個是控制步數
另一個用來控制旋轉方向。
A4988驅動提供五種不同的步進細分
全步、
半步、
四分之一步、
八分之一步
十六分之一步。
技術規格
A4988驅動引腳圖
A4988實際上需要兩個電源連線。
VDD和GND用於驅動內部邏輯電路,範圍從3V到5。5 V。
VMOT和GND為電機提供電源,範圍從8V到35V。
根據資料表,電機電源需要一個合適的去耦電容,以能夠維持4A電流。
該驅動板上有low-ESR陶瓷電容器,這使它容易受到電壓峰值的影響。在某些情況下,這些峰值可能超過35V (A4988的最大電壓額定值),這有可能永久損壞電路板甚至電機。保護驅動器不受這種峰值影響的一種方法是在電機電源引腳上放置一個大的100μF(至少47μF)電解電容。
微步選擇引腳
A4988驅動允許透過將單個步進劃分為更小的步進來實現微步。這是透過使用中間值電流激勵線圈來實現的。
例如,如果選擇驅動NEMA 17(1。8°步進角度或200步/轉)工作在四分之一步模式,電機每轉一圈將需要800微步。
A4988驅動有三個步長(解析度)設定引腳,即MS1, MS2和MS3。透過將這些引腳設定為適當的邏輯電平,可以將電機設定為五種不通的細分模式。
這三個微步選擇引腳被內部下拉電阻拉低,所以如果三個引腳都懸空則將在全步進模式下執行。
控制輸入引腳:A4988有兩個控制輸入- STEP和DIR
STEP步進輸入控制電機的微步。每個傳送到該引腳的HIGH脈衝根據由微步選擇引腳決定的微步數驅動電機。脈衝越快,電機轉得越快。
DIR輸入控制電機的旋轉方向。高電平驅動電機順時針方向,低電平驅動電機逆時針方向。
如果希望電機只在一個方向上旋轉,可以將DIR直接連線到VCC或GND。
STEP和DIR引腳在內部不會被拉到任何特定的電壓,所以應用中不應該讓懸空。
用於控制電源狀態的引腳
A4988有三個獨立的輸入控制其電源狀態:EN, RST和SLP。
EN是低電平觸發引腳。當這個引腳被拉低時,A4988驅動被啟用。預設情況下,這個引腳被拉低,所以驅動總是啟用的,除非拉高則禁用。
SLP是低電平觸發引腳。把這個引腳拉低,驅動器進入睡眠模式,最大限度地降低功耗。當電機不使用的時候可以使用這個,以節省電力。
RST是低電平觸發引腳。當這個引腳被拉為LOW時,所有的STEP輸入都被忽略。它還透過將內部轉換器設定為預定義的home狀態來重置驅動。home狀態是電機啟動的初始位置,它取決於微步解析度設定。
如果不使用RST這個引腳,可以把它連線到相鄰的SLP/SLEEP引腳上,使它為高電平並啟用驅動。
輸出引腳
A4988電機驅動器的輸出通道在模組的一側,包括1B, 1A, 2A和2B。
可以連線任何中小型雙極步進電機(如NEMA 17)。
模組上的每個輸出引腳可以向電機輸出高達2A的電流。然而,提供給電機的電流取決於系統的電源、冷卻系統和限流設定。
冷卻系統-散熱器
A4988驅動IC的過度功耗會導致溫度升高,如果超過其容量可能會損壞IC。
儘管A4988驅動IC每線圈的最大額定電流為2A,但在沒有散熱器的情況下,該晶片每線圈只能提供大約1A電流而不會過熱。如果每個線圈要得到超過1A電流,散熱器或其他冷卻方法是必需的。
A4988驅動通常帶有散熱器。建議在使用前先安裝。
電流限制
在驅動電動機之前,需要調整A4988限制透過步進線圈的最大電流量,防止超過電機的額定電流。
為了設定電流限制,A4988驅動器上提供了一個小型微調電位器。
方法1:透過測量“ref”引腳上的電壓(Vref)來確定電流限制。
檢視步進電機的資料表。記下它的額定電流。如NEMA 17 200 steps/rev, 12V 350mA。
斷開三個微步選擇引腳,將驅動置於全步模式。
保持電機在一個固定的位置,不考慮STEP輸入。
測量可調電阻電壓(Vref),並調整它。
參考電壓計算公式
比如電機額定電流350mA,則參考電壓=0。35/2。5=0。14V。
一種簡單的方法是使用鱷魚夾夾在金屬螺絲刀柄上,並將其連線到萬用表上,這樣就可以同時測量和調整電壓。
方法2:透過測量流過線圈的電流來確定電流限制。
步驟同方法1
如果更改了邏輯電壓(VDD),則需要重新進行此調整。
將A4988步進電機驅動器連線到Arduino
將VDD和GND (VDD旁邊)連線到Arduino上的5V和接地引腳。
將DIR和STEP輸入引腳連線到Arduino上的#2和#3數字輸出引腳。
將步進電機連線到2B, 2A, 1A和1B引腳上
注意:在驅動器執行時連線或斷開步進電機可能損壞驅動器。
將RST引腳連線到相鄰的SLP/SLEEP引腳,以保持驅動器為啟用狀態。
要在全步進模式下操作電機,請保持三個微步選擇引腳斷開連線。
將電機電源連線到VMOT和GND引腳上。電機電源接入100μF去耦電解電容,以避免大的電壓峰值。
Arduino程式碼--不使用庫
// Define pin connections & motor‘s steps per revolution
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;
void setup()
{
// Declare pins as Outputs
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop()
{
// Set motor direction clockwise
digitalWrite(dirPin, HIGH);
// Spin motor slowly
for(int x = 0; x < stepsPerRevolution; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
delay(1000); // Wait a second
// Set motor direction counterclockwise
digitalWrite(dirPin, LOW);
// Spin motor quickly
for(int x = 0; x < stepsPerRevolution; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
delay(1000); // Wait a second
}
在loop中,電機先緩慢順時針旋轉,間隔1秒後再快速逆時針旋轉。
控制電機方向:DIR引腳設定為HIGH或LOW,以控制電機的旋轉方向。HIGH高電平將使電機順時針方向轉動,LOW低電平將使電機逆時針方向轉動。
控制速度:電機的速度是由傳送到STEP引腳的脈衝頻率決定的。脈衝頻率越高,電機執行越快。脈衝就是把輸出拉高,等待一小會兒,然後拉低,再等待。透過改變兩個脈衝之間的延遲,可以改變了這些脈衝的頻率以及電機的速度。
Arduino程式碼:使用accelstepper庫
對於簡單的、單一的電機應用來說,控制步進器不需要庫是完全沒問題的。但是當想要控制多個步進時,就需要一個庫。
accelerstepper步進電機庫
加減速
多個同步步進器,每個步進器都有獨立的同步步進。
安裝accelerstepper庫
arduino程式碼
// Include the AccelStepper Library
#include
// Define pin connections
const int dirPin = 2;
const int stepPin = 3;
// Define motor interface type
#define motorInterfaceType 1
// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// set the maximum speed, acceleration factor,
// initial speed and the target position
myStepper。setMaxSpeed(1000);
myStepper。setAcceleration(50);
myStepper。setSpeed(200);
myStepper。moveTo(200);
}
void loop() {
// Change direction once the motor reaches target position
if (myStepper。distanceToGo() == 0)
myStepper。moveTo(-myStepper。currentPosition());
// Move the motor one step
myStepper。run();
}
motorInterfaceType設定為1,1表示帶有步進和方向引腳的外部步進驅動器。
由於NEMA 17每轉200步,電機的步數也被設定為200步。
在loop函式中,使用If語句檢查電機需要移動多遠(透過讀取distanceToGo屬性),直到它到達目標位置(透過moveTo設定)。一旦distanceToGo達到零,透過改變moveTo位置為其當前位置的負數,電機向相反的方向旋轉。
run()函式啟動電機運轉。