如何用4988驅動器和Arduino控制步進電機
在這個Arduino教程中,我們將學習如何控制步進電動機使用A4988步進驅動程序。您可以閱讀下面的書面教程。
概述
A4988是一個微步進驅動器,用于控制雙極步進電機,它有內置的轉換器,便于操作。這意味著我們可以用控制器的2個引腳來控制步進電機,或者一個用于控制旋轉方向,另一個用于控制步進。
驅動程序提供五種不同的步進分辨率:全步、半軸步、四分之一步、八步和十六步。此外,它還有一個電位計,用于調節(jié)電流輸出、過熱關機和交叉電流保護。
其邏輯電壓為3~5.5v,如果提供良好的附加冷卻,則每相的最大電流為2A,或者在沒有散熱器或冷卻的情況下,每相的最大電流為1A。
A4988步進驅動器引腳
現在讓我們仔細看看驅動器的引腳,并將其與步進電機和控制器連接起來。因此,我們將從按鈕右側的2個引腳開始,為驅動器供電的VDD和接地引腳,我們需要將它們連接到3到5.5 V的電源上,在我們的情況下,這將是我們的控制器,Arduino板將提供5 V電壓。以下4個引腳用于連接電機。1A和1B引腳將連接到電機的一個線圈,2A和2B引腳連接到電機的另一個線圈。為了給電機供電,我們使用接下來的2個引腳,接地和VMOT,我們需要將它們連接到8到35 V的電源上,我們還需要使用至少47μF的去耦電容器來保護驅動板免受電壓尖峰的影響。
接下來的兩個引腳:Step和Dir是我們實際用于控制電機運動的引腳。DIR引腳控制著電機的旋轉方向,我們需要把它連接到微控制器上的一個數字管腳上,或者在我們的例子中,我將把它連接到我的Arduino板的4號管腳上。
我們用Step引腳控制馬達,每發(fā)送一個脈沖到這個引腳,馬達就移動一步。所以這意味著我們不需要任何復雜的編程,相序表,頻率控制線等等,因為A4988驅動器的內置轉換器處理一切。這里我們還需要指出,這2個引腳沒有拉到任何電壓內部,所以我們的程序里不應讓這2個引腳浮空。
下一個是休眠引腳和邏輯低將電路板置于休眠模式,以便在電機不使用時將功耗降至最低。
接下來,復位引腳將轉換器設置為預定義的主狀態(tài)。從A4988數據表中的這些數據可以看出這種主狀態(tài)或主微步位置。所以這些是馬達啟動的初始位置,它們根據微步分辨率的不同而不同。如果該引腳的輸入狀態(tài)為邏輯低,則所有階躍輸入將被忽略。復位引腳是一個浮動引腳,因此如果我們不打算在我們的程序中控制它,我們需要將其連接到休眠引腳,以使其處于高位并啟用電路板。
接下來的3個引腳(MS1、MS2和MS3)用于根據上述真值表選擇五步分辨率中的一個。這些引腳有內部下拉電阻,所以如果我們讓它們斷開,電路板將以全步進模式運行。
最后一個,使能管腳用于打開或關閉FET輸出。所以邏輯高將保持輸出關閉。
本Arduino教程所需的組件
步進電機(NEMA17)
A4988步進驅動器
12V 2A適配器
電源插座
Arduino板
試驗板和跨接導線
電路原理圖
這是完整的電路圖。我將在全步進模式下使用驅動器,這樣我將保持3個MS引腳斷開連接,只需將驅動器的方向和步進引腳連接到Arduino板上的3號和4號引腳,以及接地和5伏引腳,為主板供電。此外,我將使用100μF電容器去耦,12V,1.5A適配器為電機供電。我將使用NEMA 17雙極步進電機,其導線A和C將連接到插腳1A和1B,B和D導線連接到2A和2B引腳。
限流
在我們連接馬達之前,我們應該調整驅動器的電流限制,這樣我們就可以確定電流在馬達的電流限制之內。我們可以通過使用板上的電位計調整參考電壓,并考慮以下等式:
Current Limit = VRef x 2
然而,這個等式并不總是正確的,因為A4988驅動板有不同的制造商。在這里,我的例子是,調整了電位計的參考電壓。所以電流限制值應該是0.6*2,等于1.2A。
因為我在全步進模式下使用驅動器,根據A4988數據表,在這種模式下,繞組電流只能達到電流極限的70%,1.2A*0.7等于0.84A,為了檢查這一點,我上傳了一個簡單的代碼,將連續(xù)邏輯高電平發(fā)送到步進管腳(以便我們更好地注意電流),并將我的儀表與電機的一個繞組串聯并通電。我得到的是0.5A,這意味著這個方程對我的情況是不正確的。
Arduino和A4988代碼
下面是一個示例代碼。首先,我們必須定義步進和方向引腳。在我們的例子中,它們是Arduino板上的3號和4號管腳,它們被命名為stepPin和dirPin,設置部分我們必須將它們定義為輸出。
/* Simple Stepper Motor Control Exaple Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
// defines pins numbers
constintstepPin = 3;
constintdirPin = 4;
voidsetup(){
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
}
voidloop(){
digitalWrite(dirPin,HIGH);// Enables the motor to move in a particular direction
// Makes 200 pulses for making one full cycle rotation
for(intx = 0; x<200; x++){
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
delay(1000);// One second delay
digitalWrite(dirPin,LOW);//Changes the rotations direction
// Makes 400 pulses for making two full cycle rotation
for(intx = 0; x<400; x++){
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
delay(1000);
}
在回路部分,我們首先將方向銷設置為高狀態(tài),這將使電機朝特定方向移動。現在使用這個循環(huán),我們將使電機進行一個完整的循環(huán)旋轉。由于驅動器設置為全步進模式,我們的步進電機有1.8度的步進角,即200步,我們需要發(fā)送200個脈沖到步進引腳進行一個完整周期的旋轉。因此for循環(huán)將有200次迭代,每次它都會將步進引腳設置為高,然后低狀態(tài),以產生脈沖。在每一次數字寫入之間,我們需要增加一些延遲,這將決定電動機的速度。
在這個完整循環(huán)旋轉之后,我們將延遲一秒鐘,然后通過將dirPin設置為低狀態(tài)來更改旋轉方向,現在使用400次迭代的循環(huán)進行2次完整循環(huán)旋轉。最后還有一秒鐘的延遲?,F在讓我們上傳代碼,看看它將如何工作。
我在本教程中又舉了一個例子,我用電位計控制電機的速度。以下是該示例的源代碼:
/* Simple Stepper Motor Control Exaple Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
// Defines pins numbers
constintstepPin = 3;
constintdirPin = 4;
intcustomDelay,customDelayMapped;// Defines variables
voidsetup(){
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
digitalWrite(dirPin,HIGH);//Enables the motor to move in a particular direction
}
voidloop(){
customDelayMapped =speedUp();// Gets custom delay values from the custom speedUp function
// Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
digitalWrite(stepPin, HIGH);
delayMicroseconds(customDelayMapped);
digitalWrite(stepPin, LOW);
delayMicroseconds(customDelayMapped);
}
// Function for reading the Potentiometer
intspeedUp(){
intcustomDelay =analogRead(A0);// Reads the potentiometer
intnewCustom =map(customDelay, 0, 1023, 300,4000);// Convrests the read values of the potentiometer from 0 to 1023 into desireded delay values (300 to 4000)
returnnewCustom;
}
*博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。