單片機控制四相步進電機詳細(xì))_第1頁
單片機控制四相步進電機詳細(xì))_第2頁
單片機控制四相步進電機詳細(xì))_第3頁
單片機控制四相步進電機詳細(xì))_第4頁
單片機控制四相步進電機詳細(xì))_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、51單片機控制四相步進電機接觸單片機快兩年了,不過只是非常業(yè)余的興趣,實踐卻不多,到現(xiàn)在還算是個初學(xué)者吧。這幾天給自己的任務(wù)就是搞定步進電機的單片機控制。以前曾看過有關(guān)步進電機原理和控制的資料,畢竟自己沒有做過,對其具體原理還不是很清楚。今天從淘寶網(wǎng)買了一個EPSON的UMX-1型步進電機,此步進電機為雙極性四相,接線共有六根,外形如下圖所示:拿到步進電機,根據(jù)以前看書對四相步進電機的了解,我對它進行了初步的測試,就是將5伏電源的正端接上最邊上兩根褐色的線,然后用5伏電源的地線分別和另外四根線(紅、蘭、白、橙)依次接觸,發(fā)現(xiàn)每接觸一下,步進電機便轉(zhuǎn)動一個角度,來回五次,電機剛好轉(zhuǎn)一圈,說明此步

2、進電機的步進角度為360/(4×5)18度。地線與四線接觸的順序相反,電機的轉(zhuǎn)向也相反。如果用單片機來控制此步進電機,則只需分別依次給四線一定時間的脈沖電流,電機便可連續(xù)轉(zhuǎn)動起來。通過改變脈沖電流的時間間隔,就可以實現(xiàn)對轉(zhuǎn)速的控制;通過改變給四線脈沖電流的順序,則可實現(xiàn)對轉(zhuǎn)向的控制。所以,設(shè)計了如下電路圖:制作的實物圖如下:C51程序代碼為:代碼一#include <AT89X51.h> static unsigned int count;static unsigned int endcount;void delay();void main(void)   co

3、unt = 0;  P1_0 = 0;  P1_1 = 0;  P1_2 = 0;  P1_3 = 0; EA = 1;              /允許CPU中斷   TMOD = 0x11;  /設(shè)定時器0和1為16位模式1   ET0 = 1;             /定

4、時器0中斷允許TH0 = 0xFC;   TL0 = 0x18;      /設(shè)定時每隔1ms中斷一次    TR0 = 1;           /開始計數(shù)startrun:    P1_3 = 0;  P1_0 = 1;  delay();  P1_0 = 0;  P1_1 = 1;  delay();  P1_1 = 0; 

5、; P1_2 = 1;  delay();  P1_2 = 0;  P1_3 = 1;  delay();  goto startrun; /定時器0中斷處理void timeint(void) interrupt 1   TH0=0xFC;   TL0=0x18; /設(shè)定時每隔1ms中斷一次  count+;void delay()  endcount=2;  count=0;  dowhile(count<endcount);將上面的程序編譯,用ISP下載線下載至單片機運行,

6、步進電機便轉(zhuǎn)動起來了,初步告捷!不過,上面的程序還只是實現(xiàn)了步進電機的初步控制,速度和方向的控制還不夠靈活,另外,由于沒有利用步進電機內(nèi)線圈之間的“中間狀態(tài)”,步進電機的步進角度為18度。所以,我將程序代碼改進了一下,如下:代碼二#include <AT89X51.h> static unsigned int count;static int step_index;void delay(unsigned int endcount);void gorun(bit turn, unsigned int speedlevel);void main(void)   count =

7、 0;  step_index = 0;  P1_0 = 0;  P1_1 = 0;  P1_2 = 0;  P1_3 = 0;  EA = 1;             /允許CPU中斷   TMOD = 0x11; /設(shè)定時器0和1為16位模式1   ET0 = 1;          

8、0; /定時器0中斷允許TH0 = 0xFE;   TL0 = 0x0C;  /設(shè)定時每隔0.5ms中斷一次    TR0 = 1;         /開始計數(shù)  do    gorun(1,60);  while(1); /定時器0中斷處理void timeint(void) interrupt 1   TH0=0xFE;   TL0=0x0C; /設(shè)定時每隔0.5ms中斷一次  count+;

9、void delay(unsigned int endcount)  count=0;  dowhile(count<endcount);void gorun(bit turn,unsigned int speedlevel)  switch(step_index)    case 0:    P1_0 = 1;    P1_1 = 0;    P1_2 = 0;    P1_3 = 0;  

10、0; break;  case 1:    P1_0 = 1;    P1_1 = 1;    P1_2 = 0;    P1_3 = 0;    break;  case 2:    P1_0 = 0;    P1_1 = 1;    P1_2 = 0;    P1_3 = 0;  &#

11、160; break;  case 3:    P1_0 = 0;    P1_1 = 1;    P1_2 = 1;    P1_3 = 0;    break;  case 4:    P1_0 = 0;    P1_1 = 0;    P1_2 = 1;    P1_3 = 0;  

12、  break;  case 5:    P1_0 = 0;    P1_1 = 0;    P1_2 = 1;    P1_3 = 1;    break;  case 6:    P1_0 = 0;    P1_1 = 0;    P1_2 = 0;    P1_3 = 1; 

13、0;  break;  case 7:    P1_0 = 1;    P1_1 = 0;    P1_2 = 0;    P1_3 = 1;    delay(speedlevel);  if (turn=0)      step_index+;    if (step_index>7)      s

14、tep_index=0;    else      step_index-;    if (step_index<0)      step_index=7;      改進的代碼能實現(xiàn)速度和方向的控制,而且,通過step_index靜態(tài)全局變量能“記住”步進電機的步進位置,下次調(diào)用 gorun()函數(shù)時則可直接從上次步進位置繼續(xù)轉(zhuǎn)動,從而實現(xiàn)精確步進;另外,由于利用了步進電機內(nèi)線圈之間的“中間狀態(tài)”,步進角度減

15、小了一半,只為9度,低速運轉(zhuǎn)也相對穩(wěn)定一些了。但是,在代碼二中,步進電機的運轉(zhuǎn)控制是在主函數(shù)中,如果程序還需執(zhí)行其它任務(wù),則有可能使步進電機的運轉(zhuǎn)收到影響,另外還有其它方面的不便,總之不是很完美的控制。所以我又將代碼再次改進:代碼三#include <AT89X51.h> static unsigned int count;  /計數(shù)static int step_index;  /步進索引數(shù),值為07static bit turn;  /步進電機轉(zhuǎn)動方向static bit stop_flag;  /步進電機停止標(biāo)志static int s

16、peedlevel; /步進電機轉(zhuǎn)速參數(shù),數(shù)值越大速度越慢,最小值為1,速度最快static int spcount;    /步進電機轉(zhuǎn)速參數(shù)計數(shù)void delay(unsigned int endcount); /延時函數(shù),延時為endcount*0.5毫秒void gorun();          /步進電機控制步進函數(shù)void main(void)   count = 0;  step_index = 0;  spcount

17、 = 0;  stop_flag = 0;P1_0 = 0;  P1_1 = 0;  P1_2 = 0;  P1_3 = 0;EA = 1;             /允許CPU中斷   TMOD = 0x11; /設(shè)定時器0和1為16位模式1   ET0 = 1;           /定時器0中斷允許TH0 = 0

18、xFE;  TL0 = 0x0C;   /設(shè)定時每隔0.5ms中斷一次  TR0 = 1;         /開始計數(shù) turn = 0;speedlevel = 2;  delay(10000);  speedlevel = 1;  do    speedlevel = 2;    delay(10000);    speedlevel = 1;

19、    delay(10000);    stop_flag=1;    delay(10000);    stop_flag=0;  while(1); /定時器0中斷處理 void timeint(void) interrupt 1   TH0=0xFE;  TL0=0x0C; /設(shè)定時每隔0.5ms中斷一次  count+;  spcount-;  if(spcount<=0)   &

20、#160;  spcount = speedlevel;    gorun();  void delay(unsigned int endcount)  count=0;  dowhile(count<endcount);void gorun()  if (stop_flag=1)      P1_0 = 0;    P1_1 = 0;    P1_2 = 0;    P1_3 =

21、 0;    return;    switch(step_index)    case 0: /0    P1_0 = 1;    P1_1 = 0;    P1_2 = 0;    P1_3 = 0;    break;  case 1: /0、1    P1_0 = 1;    P1_1 = 1;

22、60;   P1_2 = 0;    P1_3 = 0;    break;  case 2: /1    P1_0 = 0;    P1_1 = 1;    P1_2 = 0;    P1_3 = 0;    break;  case 3: /1、2    P1_0 = 0;    P1

23、_1 = 1;    P1_2 = 1;    P1_3 = 0;    break;  case 4:  /2    P1_0 = 0;    P1_1 = 0;    P1_2 = 1;    P1_3 = 0;    break;  case 5: /2、3    P1_0 = 0; 

24、;   P1_1 = 0;    P1_2 = 1;    P1_3 = 1;    break;  case 6: /3    P1_0 = 0;    P1_1 = 0;    P1_2 = 0;    P1_3 = 1;    break;  case 7: /3、0    P1_0 = 1;    P1_1 = 0;    P1_2 = 0;    P1_3 = 1;    if (turn=0)      step_index+;    if (step_index>7)&#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論