步進電機基礎知識與控制

海椰人 發佈 2022-07-31T00:23:35.970646+00:00

步進電機是將脈衝信號轉換成機械運動的一種特殊電機。步進電機在使用時不需要額外的反饋,這是因為除非失步,否則步進電機每次轉動時的角度已知的,由於它的角度位置已知就能精確控制電機運動的位置。一般我們會用Arduino驅動的小型步進電機有以下兩種。

步進電機是將脈衝信號轉換成機械運動的一種特殊電機。步進電機在使用時不需要額外的反饋,這是因為除非失步,否則步進電機每次轉動時的角度已知的,由於它的角度位置已知就能精確控制電機運動的位置。一般我們會用Arduino驅動的小型步進電機有以下兩種。

步進電機內部實際上產生了一個可以旋轉的磁場,如圖所示,當旋轉磁場依次切換時,轉子(rotor)就會隨之轉動相應的角度。當磁場旋轉過快或者轉子上所帶負載的轉動慣量太大時,轉子無法跟上步伐,就會造成失步。

從步進電機的矩頻特性圖上可知,步進電機以越快的速度運行,所能輸出的轉矩越小,否則將會造成失步。每種不同規格的步進電機都有類似的矩頻特性曲線,詳細圖表需要查閱其規格書。

圖 矩頻特性

步進電機的磁極數量規格和接線規格很多,為簡化問題,我們這裡就先只以四相步進電機為例進行討論。所謂四相,就是說電機內部有4對磁極,此外還有一個公共端(COM)接電源, ABCD是四線的接頭。而四相電機的可以向外引出六條接線(兩條COM共同接入Vcc),即GND和ABCD,也可以引出五條線,如圖所示,所以有成為六線四相制和五線四相制。

六線四相制 & 五線四相制

下表中1表示高電平、0表示低電平,我們以下述最簡單的一相勵磁方式來驅動步進電機

這種方式,電機在每個瞬間只有一個線圈導通,消耗電力小但在切換瞬間沒有任何的電磁作用轉子上,容易造成振動,也容易因為慣性而失步。

二相勵磁方式

這種方式輸出的轉矩較大且振動較少,切換過程中至少有一個線圈通電作用於轉子,使得輸出的轉矩較大,振動較小,也比一相勵磁較為平穩,不易失步。

步進角是步進電機每前進一個步序所轉過的角度。在不超載也不失步的情況下,給電機加上一個脈衝信號,它就轉過一個步距角。這一簡單的線性關係,使得步進電機速度和位置的控制變得十分簡單。

綜合上述兩種驅動信號,下面提出一相勵磁和二相勵磁交替進行的方式,沒傳送一個勵磁信號,步進電機前進半個步距角。其特點是解析度高,運轉更加平滑。

一–二相勵磁方式

下面是這三種驅動方式的時序波形圖

驅動問題
不要天真的以為可以直接將Arduino的埠和ABCD分別相連,因為Arduino的數字I/O口最大只能通過約40mA的電流。因此,我們想到了使用電晶體進行放大。常用的方法有三種:

  1. 直接利用電晶體來驅動,這需要你對電機和電晶體的詳細參數有一定了解,才能選擇恰當的參數去匹配他們。此外,還必須使用二極體來處理當電機內部線圈產生感應電動勢逆向流入電晶體而對電晶體造成損害。
  2. 使用諸如ULN2003和ULN2803這樣的激勵器,它實際是內部集成好了放大功能的集成電路晶片,此外也無需額外添加二極體,因為它已經內置了。
  3. 使用光耦,在驅動晶片或者電晶體的前端再加入光耦合器,以加強隔離步進電機的反電動勢,以免損害Arduino。
  4. 使用L293D這樣的H橋的方式來驅動步進電機,詳細請參考上兩節介紹的L293 Motor Sheild官網的說明。

我們以ULN2003為例,現有的驅動板可以用來驅動步進電機,我們只需要選擇Arduino的四個輸出埠用杜邦線分別連接驅動板的IN1、IN2、IN3、IN4,再用外置電源連接驅動板的5-12V+接口,並把電源和Arduino的地(GND)與驅動板的(–)共線即可。

ULN2003採用的是達林頓管(Darlington transistor)方式來增強對大電流負載(如步進電機)的驅動,所謂達林頓管其實就是二級放大的三極體而已(如右圖所示),經過恰當的三極體型號選擇匹配後,兩次放大的三極體驅動能力比一個三極體更強。詳情請參考ULN2003的DataSheet。但無論哪種方式,記住,使用額外的外接電源來驅動電晶體和集成晶片,它才是電機的真正的能量提供者。

關於實際的步距角

前面所講述的其實是一個簡化模型,真正的步進電機步距角比較小。因為採用了圖所示的多齒結構,這種結構類似於遊標卡尺的工作原理,所以實際4相步進電機的步距角並非360°/8 = 45°。根據其規格書,本節範例所用的步進電機的步距角是5.625°,如果採用一–二相勵磁方式,則可以達到其一半的解析度。

/*
步進電機速度控制示例
本示例程序用於驅動非極性步進電機。
電機的接口連接至Arduino的8至11號埠
變阻器連接至模擬埠A0
電機將沿著順時針方向旋轉,電位器的模擬量越高,步進電機的轉速就越快。
因為setSpeed()函數將設定每一步序的時間間隔。你可能會發現當電位器模擬量太低時,電機將會停止旋轉。
*/
#include <Stepper.h>
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
int stepCount = 0;
void setup()
{
}
void loop()
{
int sensorReading = analogRead(A0);
int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
if (motorSpeed > 0)
{
myStepper.setSpeed(motorSpeed);
myStepper.step(stepsPerRevolution/100);
}
}
關鍵字: