欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 47129|回復(fù): 18
收起左側(cè)

詳解51單片機(jī)控制步進(jìn)電機(jī)

  [復(fù)制鏈接]
ID:91350 發(fā)表于 2015-10-3 01:11 | 顯示全部樓層 |閱讀模式
  接觸單片機(jī)快兩年了,不過只是非常業(yè)余的興趣,實(shí)踐卻不多,到現(xiàn)在還算是個(gè)初學(xué)者吧。這幾天給自己的任務(wù)就是搞定步進(jìn)電機(jī)的單片機(jī)控制。以前曾看過有關(guān)步進(jìn)電機(jī)原理和控制的資料,畢竟自己沒有做過,對其具體原理還不是很清楚。今天從淘寶上買了一個(gè)EPSON的UMX-1型步進(jìn)電機(jī),此步進(jìn)電機(jī)為雙極性四相(后來才知道,四相和兩相步進(jìn)沒什么區(qū)別的!!),接線共有六根,外形如下圖所示:



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


如果用單片機(jī)來控制此步進(jìn)電機(jī),則只需分別依次給四線一定時(shí)間的脈沖電流,電機(jī)便可連續(xù)轉(zhuǎn)動起來。通過改變脈沖電流的時(shí)間間隔,就可以實(shí)現(xiàn)對轉(zhuǎn)速的控制;通過改變給四線脈沖電流的順序,則可實(shí)現(xiàn)對轉(zhuǎn)向的控制。所以,設(shè)計(jì)了如下電路圖:






C51程序代碼為:
代碼一
#include <AT89X51.h>
static unsigned int count;
static unsigned int endcount;

void delay();
void main(void)
{
count = 0;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;

EA = 1;             //允許CPU中斷
TMOD = 0x11; //設(shè)定時(shí)器0和1為16位模式1
ET0 = 1;              //定時(shí)器0中斷允許

TH0 = 0xFC;
TL0 = 0x18;       //設(shè)定時(shí)每隔1ms中斷一次
TR0 = 1;            //開始計(jì)數(shù)

startrun:

P1_3 = 0;
P1_0 = 1;
delay();
P1_0 = 0;
P1_1 = 1;
delay();
P1_1 = 0;
P1_2 = 1;
delay();
P1_2 = 0;
P1_3 = 1;
delay();
goto startrun;
}

//定時(shí)器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFC;
TL0=0x18; //設(shè)定時(shí)每隔1ms中斷一次
count++;
}

void delay()
{
endcount=2;
count=0;
do{}while(count<endcount);
}


  將上面的程序編譯,用ISP下載線下載至單片機(jī)運(yùn)行,步進(jìn)電機(jī)便轉(zhuǎn)動起來了,初步告捷!
  不過,上面的程序還只是實(shí)現(xiàn)了步進(jìn)電機(jī)的初步控制,速度和方向的控制還不夠靈活,另外,由于沒有利用步進(jìn)電機(jī)內(nèi)線圈之間的“中間狀態(tài)”,步進(jìn)電機(jī)的步進(jìn)角度為18度。 二手步進(jìn)電機(jī)的要注意,有些退磁比較嚴(yán)重,這個(gè)店還是比較好的,加到12V,步進(jìn)的力氣很大,用手?jǐn)Q不住!呵呵,算是幫這個(gè)店做個(gè)廣告了O(∩_∩)O~所以,我將程序代碼改進(jìn)了一下,如下:
代碼二
#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 = 0;
step_index = 0;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;

EA = 1;              //允許CPU中斷
TMOD = 0x11; //設(shè)定時(shí)器0和1為16位模式1
ET0 = 1;             //定時(shí)器0中斷允許

TH0 = 0xFE;
TL0 = 0x0C; //設(shè)定時(shí)每隔0.5ms中斷一次
TR0 = 1;          //開始計(jì)數(shù)

do{
     gorun(1,60);
}while(1);

}
//定時(shí)器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFE;
TL0=0x0C; //設(shè)定時(shí)每隔0.5ms中斷一次
count++;
}

void delay(unsigned int endcount)
{
count=0;
do{}while(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;
     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;
     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;
     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;
     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)
       step_index=0;
}
else
{
     step_index--;
     if (step_index<0)
       step_index=7;
}
     
}

  改進(jìn)的代碼能實(shí)現(xiàn)速度和方向的控制,而且,通過step_index靜態(tài)全局變量能“記住”步進(jìn)電機(jī)的步進(jìn)位置,下次調(diào)用 gorun()函數(shù)時(shí)則可直接從上次步進(jìn)位置繼續(xù)轉(zhuǎn)動,從而實(shí)現(xiàn)精確步進(jìn);另外,由于利用了步進(jìn)電機(jī)內(nèi)線圈之間的“中間狀態(tài)”,步進(jìn)角度減小了一半,只為9度,低速運(yùn)轉(zhuǎn)也相對穩(wěn)定一些了。
  但是,在代碼二中,步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)控制是在主函數(shù)中,如果程序還需執(zhí)行其它任務(wù),則有可能使步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)收到影響,另外還有其它方面的不便,總之不是很完美的控制。所以我又將代碼再次改進(jìn):
代碼三
#include <AT89X51.h>
static unsigned int count; //計(jì)數(shù)
static int step_index; //步進(jìn)索引數(shù),值為0-7

static bit turn; //步進(jìn)電機(jī)轉(zhuǎn)動方向
static bit stop_flag; //步進(jìn)電機(jī)停止標(biāo)志
static int speedlevel; //步進(jìn)電機(jī)轉(zhuǎn)速參數(shù),數(shù)值越大速度越慢,最小值為1,速度最快
static int spcount;    //步進(jìn)電機(jī)轉(zhuǎn)速參數(shù)計(jì)數(shù)
void delay(unsigned int endcount); //延時(shí)函數(shù),延時(shí)為endcount*0.5毫秒
void gorun();           //步進(jìn)電機(jī)控制步進(jìn)函數(shù)

void main(void)
{
count = 0;
step_index = 0;
spcount = 0;
stop_flag = 0;

P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 = 0;

EA = 1;             //允許CPU中斷
TMOD = 0x11; //設(shè)定時(shí)器0和1為16位模式1
ET0 = 1;            //定時(shí)器0中斷允許

TH0 = 0xFE;
TL0 = 0x0C;    //設(shè)定時(shí)每隔0.5ms中斷一次
TR0 = 1;          //開始計(jì)數(shù)

turn = 0;
speedlevel = 2;
delay(10000);
speedlevel = 1;
do{
     speedlevel = 2;
     delay(10000);
     speedlevel = 1;
     delay(10000);
     stop_flag=1;
     delay(10000);
     stop_flag=0;
}while(1);

}
//定時(shí)器0中斷處理
void timeint(void) interrupt 1
{
TH0=0xFE;
TL0=0x0C; //設(shè)定時(shí)每隔0.5ms中斷一次

count++;
spcount--;
if(spcount<=0)
{
     spcount = speedlevel;
     gorun();
}

}
void delay(unsigned int endcount)
{
count=0;
do{}while(count<endcount);
}

void gorun()
{
if (stop_flag==1)
{
     P1_0 = 0;
     P1_1 = 0;
     P1_2 = 0;
     P1_3 = 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;
     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_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;
     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)
       step_index=0;
}
else
{
     step_index--;
     if (step_index<0)
       step_index=7;
}
     
}

  在代碼三中,我將步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)控制放在時(shí)間中斷函數(shù)之中,這樣主函數(shù)就能很方便的加入其它任務(wù)的執(zhí)行,而對步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)不產(chǎn)生影響。在此代碼中,不但實(shí)現(xiàn)了步進(jìn)電機(jī)的轉(zhuǎn)速和轉(zhuǎn)向的控制,另外還加了一個(gè)停止的功能,呵呵,這肯定是需要的。
  步進(jìn)電機(jī)從靜止到高速轉(zhuǎn)動需要一個(gè)加速的過程,否則電機(jī)很容易被“卡住”,代碼一、二實(shí)現(xiàn)加速不是很方便,而在代碼三中,加速則很容易了。在此代碼中,當(dāng)轉(zhuǎn)速參數(shù)speedlevel 為2時(shí),可以算出,此時(shí)步進(jìn)電機(jī)的轉(zhuǎn)速為1500RPM,而當(dāng)轉(zhuǎn)速參數(shù)speedlevel 1時(shí),轉(zhuǎn)速為3000RPM。當(dāng)步進(jìn)電機(jī)停止,如果直接將speedlevel 設(shè)為1,此時(shí)步進(jìn)電機(jī)將被“卡住”,而如果先把speedlevel 設(shè)為2,讓電機(jī)以1500RPM的轉(zhuǎn)速轉(zhuǎn)起來,幾秒種后,再把speedlevel 設(shè)為1,此時(shí)電機(jī)就能以3000RPM的轉(zhuǎn)速高速轉(zhuǎn)動,這就是“加速”的效果。
  在此電路中,考慮到電流的緣故,我用的NPN三極管是S8050,它的電流最大可達(dá)1500mA,而在實(shí)際運(yùn)轉(zhuǎn)中,我用萬用表測了一下,當(dāng)轉(zhuǎn)速為1500RPM時(shí),步進(jìn)電機(jī)的電流只有90mA左右,電機(jī)發(fā)熱量較小,當(dāng)轉(zhuǎn)速為60RPM時(shí),步進(jìn)電機(jī)的電流為200mA左右,電機(jī)發(fā)熱量較大,所以NPN三極管也可以選用9013,對于電機(jī)發(fā)熱量大的問題,可加一個(gè)10歐到20歐的限流電阻,不過這樣步進(jìn)電機(jī)的功率將會變小。
   
  由于在下淺薄,錯(cuò)誤和問題難免,請各位不吝賜教!

評分

參與人數(shù) 1黑幣 +3 收起 理由
JHGDHJHK + 3 贊一個(gè)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:100564 發(fā)表于 2015-12-26 09:47 | 顯示全部樓層
樓主會用匯編語言嗎?
回復(fù)

使用道具 舉報(bào)

ID:99525 發(fā)表于 2015-12-27 14:57 | 顯示全部樓層
步進(jìn)電機(jī)的控制還是需要技巧的,跟直流電機(jī)完全不一樣
回復(fù)

使用道具 舉報(bào)

ID:107524 發(fā)表于 2016-3-6 08:20 | 顯示全部樓層
樓主可以詳細(xì)解釋電機(jī)實(shí)物圖與線圖嗎
回復(fù)

使用道具 舉報(bào)

ID:128458 發(fā)表于 2016-6-29 15:05 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:127936 發(fā)表于 2016-6-30 18:13 | 顯示全部樓層
圖片有點(diǎn)不清晰哎!
回復(fù)

使用道具 舉報(bào)

ID:255421 發(fā)表于 2017-12-1 11:31 | 顯示全部樓層
51黑有你更精彩!
回復(fù)

使用道具 舉報(bào)

ID:253733 發(fā)表于 2017-12-1 12:50 | 顯示全部樓層
很好,受教了,共同學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

ID:268118 發(fā)表于 2018-1-11 02:10 | 顯示全部樓層
感謝樓主的分享。
回復(fù)

使用道具 舉報(bào)

ID:265553 發(fā)表于 2018-1-14 07:50 來自觸屏版 | 顯示全部樓層
好資料,51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

ID:269211 發(fā)表于 2018-1-26 23:26 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:74244 發(fā)表于 2018-1-28 14:32 來自觸屏版 | 顯示全部樓層
不錯(cuò)的!謝謝!
回復(fù)

使用道具 舉報(bào)

ID:279940 發(fā)表于 2018-2-5 15:22 | 顯示全部樓層
最近剛開始準(zhǔn)備做點(diǎn)小東西,初步計(jì)劃先整合步進(jìn)電機(jī)和超聲測距報(bào)警器,
1) 用步進(jìn)電機(jī)控制小車前進(jìn),
2)距離障礙物一定距離時(shí)(如10cm)停下,
3)然后向反方向運(yùn)動
4)距障礙物10cm再停下,再反方向
。。。。
所以,正在學(xué)習(xí)步進(jìn)電機(jī)相關(guān)內(nèi)容和程序。本貼對我有很大的幫助,非常感謝。

有個(gè)小問題,怎么有的教材里通過對P1的第四位賦值來實(shí)現(xiàn)角度的轉(zhuǎn)動呢?和該貼有什么不同嗎?
請大家不吝指教。謝謝啦~
回復(fù)

使用道具 舉報(bào)

ID:304162 發(fā)表于 2018-5-16 14:18 | 顯示全部樓層
受益匪淺
回復(fù)

使用道具 舉報(bào)

ID:320751 發(fā)表于 2018-6-17 19:06 | 顯示全部樓層
很詳細(xì) 謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:501595 發(fā)表于 2019-3-31 12:23 | 顯示全部樓層
非常好。試了下
回復(fù)

使用道具 舉報(bào)

ID:643751 發(fā)表于 2020-2-18 22:32 | 顯示全部樓層
很不錯(cuò) 還沒研究步進(jìn)電機(jī) 不過看完之后 有了一些印象 方便以后
回復(fù)

使用道具 舉報(bào)

ID:298008 發(fā)表于 2020-2-19 15:42 | 顯示全部樓層
謝謝樓主分享!!!!
回復(fù)

使用道具 舉報(bào)

ID:391355 發(fā)表于 2020-3-15 16:28 來自觸屏版 | 顯示全部樓層
樓主好樣的
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表