51微控制器控制四相步進電機

2021-04-02 01:36:57 字數 2901 閱讀 1150

接觸微控制器快兩年了,不過只是非常業餘的興趣,實踐卻不多,到現在還算是個初學者吧。這幾天給自己的任務就是搞定步進電機的微控制器控制。以前曾看過有關步進電機原理和控制的資料,畢竟自己沒有做過,對其具體原理還不是很清楚。今天從**網買了乙個epson的umx-1型步進電機,此步進電機為雙極性四相,接線共有六根,外形如下圖所示:

拿到步進電機,根據以前看書對四相步進電機的了解,我對它進行了初步的測試,就是將5伏電源的正端接上最邊上兩根褐色的線,然後用5伏電源的地線分別和另外四根線(紅、蘭、白、橙)依次接觸,發現每接觸一下,步進電機便轉動乙個角度,來回五次,電機剛好轉一圈,說明此步進電機的步進角度為360/(4×5)=18度。地線與四線接觸的順序相反,電機的轉向也相反。

如果用微控制器來控制此步進電機,則只需分別依次給四線一定時間的脈衝電流,電機便可連續轉動起來。通過改變脈衝電流的時間間隔,就可以實現對轉速的控制;通過改變給四線脈衝電流的順序,則可實現對轉向的控制。所以,設計了如下電路圖:

製作的實物圖如下:

c51程式**為:

**一

#include

static unsigned int count;

static unsigned int endcount;

void delay();

void main(void)

//定時器0中斷處理

void timeint(void) interrupt 1

void delay()

while(count

不過,上面的程式還只是實現了步進電機的初步控制,速度和方向的控制還不夠靈活,另外,由於沒有利用步進電機內線圈之間的「中間狀態」,步進電機的步進角度為18度。所以,我將程式**改進了一下,如下:

**二

#include

static unsigned int count;

static int step_index;

void delay(unsigned int endcount);

void gorun(bit turn, unsigned int speedlevel);

void main(void)

while(1);

} //定時器0中斷處理

void timeint(void) interrupt 1

void delay(unsigned int endcount)

while(count

void gorun(bit turn,unsigned int speedlevel)

delay(speedlevel);

if (turn==0)

else  }

改進的**能實現速度和方向的控制,而且,通過step_index靜態全域性變數能「記住」步進電機的步進制置,下次呼叫 gorun()函式時則可直接從上次步進制置繼續轉動,從而實現精確步進;另外,由於利用了步進電機內線圈之間的「中間狀態」,步進角度減小了一半,只為9度,低速運轉也相對穩定一些了。

但是,在**二中,步進電機的運轉控制是在主函式中,如果程式還需執行其它任務,則有可能使步進電機的運轉收到影響,另外還有其它方面的不便,總之不是很完美的控制。所以我又將**再次改進:

**三

#include

static unsigned int count; //計數

static int step_index;  //步進索引數,值為0-7

static bit turn;  //步進電機轉動方向

static bit stop_flag;  //步進電機停止標誌

static int speedlevel; //步進電機轉速引數,數值越大速度越慢,最小值為1,速度最快

static int spcount;   //步進電機轉速引數計數

void delay(unsigned int endcount);  //延時函式,延時為endcount*0.5毫秒

void gorun();          //步進電機控制步進函式

void main(void)

while(1);

} //定時器0中斷處理

void timeint(void) interrupt 1

}void delay(unsigned int endcount)

while(count

void gorun()

switch(step_index)

if (turn==0)

else

}在**三中,我將步進電機的運轉控制放在時間中斷函式之中,這樣主函式就能很方便的加入其它任務的執行,而對步進電機的運轉不產生影響。在此**中,不但實現了步進電機的轉速和轉向的控制,另外還加了乙個停止的功能,呵呵,這肯定是需要的。

步進電機從靜止到高速轉動需要乙個加速的過程,否則電機很容易被「卡住」,**

一、二實現加速不是很方便,而在**三中,加速則很容易了。在此**中,當轉速引數speedlevel 為2時,可以算出,此時步進電機的轉速為1500rpm,而當轉速引數speedlevel 1時,轉速為3000rpm。當步進電機停止,如果直接將speedlevel 設為1,此時步進電機將被「卡住」,而如果先把speedlevel 設為2,讓電機以1500rpm的轉速轉起來,幾秒種後,再把speedlevel 設為1,此時電機就能以3000rpm的轉速高速轉動,這就是「加速」的效果。

在此電路中,考慮到電流的緣故,我用的npn三極體是s8050,它的電流最大可達1500ma,而在實際運轉中,我用萬用表測了一下,當轉速為1500rpm時,步進電機的電流只有90ma左右,電機發熱量較小,當轉速為60rpm時,步進電機的電流為200ma左右,電機發熱量較大,所以npn三極體也可以選用9013,對於電機發熱量大的問題,可加乙個10歐到20歐的限流電阻,不過這樣步進電機的功率將會變小。

由於在下淺薄,錯誤和問題難免,請各位不吝賜教!

基於51微控制器步進電機控制

1 用矩陣鍵盤設定電機目標轉速及旋轉方向,範圍 100 300 轉 分 2 測量 顯示電機實際轉速和方向 正轉顯示 p 反轉顯示 n 從實現功能上分析,軟體可以分解3個功能模組 1,步進電機控制模組 2,矩陣鍵盤輸入模組 3,顯示輸出模組 步進電機通過輸入脈衝訊號進行控制,即電機的總轉動角度由輸入脈...

51微控制器紅外控制步進電機

include 定義一些特殊暫存器 typedef unsigned char u8 typedef unsigned int u16 u8 code ffw 8 轉動陣列 u8 code rev 8 u16 code smgduan 17 u8 irvalue 6 u8 time u8 read ...

51微控制器教程 二相四線步進電機驅動

第乙個問題 什麼是步進電機?步進電機就是用電脈衝訊號控制電機轉動特定角度的一種電機。比如說你給電機乙個脈衝訊號電機就轉動90度,那麼你給電機4個脈衝訊號電機就轉動了一圈。這個90度,就是步進電機的步進角,給乙個脈衝,它就轉動乙個步進角,於是它取名 步進電機 第二個問題 步進電機的特性?在非超載的情況...