一、大致介紹:
步進電機是將電脈沖信號轉變為角位移或線位移的開環控制元步進電機件。在非超載的情況下,電機的轉速、停止的位置只取決於脈沖信號的頻率和脈沖數,而不受負載變化的影響,當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度,稱為“步距角”,它的旋轉是以固定的角度一步一步運行的。可以通過控制脈沖個數來控制角位移量,從而達到准確定位的目的;同時可以通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。
圖1 常見的幾種步進電機
圖2 步進電機和ULN2003合用
二、常用術語
1、相數:產生不同對極N、S磁場的激磁線圈對數。常用m表示。
2、拍數:完成一個磁場周期性變化所需脈沖數或導電狀態用n表示,或指電機轉過一個齒距角所需脈沖數,以四相電機為例,有四相四拍運行方式即AB-BC-CD-DA-AB,四相八拍運行方式即 A-AB-B-BC-C-CD-D-DA-A。
3、步距角:對應一個脈沖信號,電機轉子轉過的角位移用θ表示。θ=360度/(轉子齒數*運行拍數),以常規二、四相,轉子齒為50齒電機為例。四拍運行時步距角為θ=360度/(50*4)=1.8度(俗稱整步),八拍運行時步距角為θ=360度/(50*8)=0.9度(俗稱半步)。

圖3 步進電機內部模型圖
三、驅動方式
1、1相勵磁法:每一瞬間只有一個線圈相通,其它休息。(優點)簡單,耗電低,精確性良好。(缺點)力矩小,振動大,每次勵磁信號走的角度都是標稱角度。
2、2相勵磁法:每一瞬間有兩個線圈導通。(優點)力矩大,震動小。(缺點)每勵磁信號走的角度都是標稱角度。
3、1-2相勵磁法:1相和2相交替導通。(優點)精度較高,運轉平滑,每送一個勵磁信號轉動1/2標稱角度,稱為半步驅動。(前兩種稱為4相4拍,這一種稱為4相8拍)

(a)1相勵磁法 (b)2相勵磁法 (c)1-2相勵磁法
圖4 3種驅動方式
三、代碼
1 /*----------------------------------------------- 2 名稱:步進電機 3 論壇:www.doflye.net 4 編寫:shifang 5 日期:2009.5 6 修改:無 7 內容:本程序用於測試4相步進電機常規驅動 使用1相勵磁 8 ------------------------------------------------*/ 9 #include <reg52.h> 10 11 sbit A1=P1^0; //定義步進電機連接端口 12 sbit B1=P1^1; 13 sbit C1=P1^2; 14 sbit D1=P1^3; 15 16 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通電,其他相斷電 17 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通電,其他相斷電 18 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通電,其他相斷電 19 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通電,其他相斷電 20 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部斷電 21 22 unsigned char Speed; 23 /*------------------------------------------------ 24 uS延時函數,含有輸入參數 unsigned char t,無返回值 25 unsigned char 是定義無符號字符變量,其值的范圍是 26 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時 27 長度如下 T=tx2+5 uS 28 ------------------------------------------------*/ 29 void DelayUs2x(unsigned char t) 30 { 31 while(--t); 32 } 33 /*------------------------------------------------ 34 mS延時函數,含有輸入參數 unsigned char t,無返回值 35 unsigned char 是定義無符號字符變量,其值的范圍是 36 0~255 這里使用晶振12M,精確延時請使用匯編 37 ------------------------------------------------*/ 38 void DelayMs(unsigned char t) 39 { 40 while(t--) 41 { 42 //大致延時1mS 43 DelayUs2x(245); 44 DelayUs2x(245); 45 } 46 } 47 /*------------------------------------------------ 48 主函數 49 ------------------------------------------------*/ 50 main() 51 { 52 Speed=5; //調整速度 53 while(1) 54 { 55 Coil_A1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替 56 DelayMs(Speed); //改變這個參數可以調整電機轉速 , 57 //數字越小,轉速越大,力矩越小 58 Coil_B1 59 DelayMs(Speed); 60 Coil_C1 61 DelayMs(Speed); 62 Coil_D1 63 DelayMs(Speed); 64 } 65 }