當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀] 接觸單片機快兩年了,不過只是非常業(yè)余的興趣,實踐卻不多,到現(xiàn)在還算是個初學(xué)者吧。這幾天給自己的任務(wù)就是搞定步進(jìn)電機的單片機控制。以前曾看過有關(guān)步進(jìn)電機原理和控制的資料,畢竟自己沒有做過,對其具體原理還

 接觸單片機快兩年了,不過只是非常業(yè)余的興趣,實踐卻不多,到現(xiàn)在還算是個初學(xué)者吧。這幾天給自己的任務(wù)就是搞定步進(jìn)電機的單片機控制。以前曾看過有關(guān)步進(jìn)電機原理和控制的資料,畢竟自己沒有做過,對其具體原理還不是很清楚。今天從淘寶網(wǎng)買了一個EPSON的UMX-1型步進(jìn)電機,此步進(jìn)電機為雙極性四相,接線共有六根,外形如下圖所示:

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

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

C51程序代碼為:

代碼一

#include

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è)定時器0和1為16位模式1

ET0 = 1; //定時器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;

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;

do{}while(count

}

將上面的程序編譯,用ISP下載線下載至單片機運行,步進(jìn)電機便轉(zhuǎn)動起來了,初步告捷!

不過,上面的程序還只是實現(xiàn)了步進(jìn)電機的初步控制,速度和方向的控制還不夠靈活,另外,由于沒有利用步進(jìn)電機內(nèi)線圈之間的“中間狀態(tài)”,步進(jìn)電機的步進(jìn)角度為18度。所以,我將程序代碼改進(jìn)了一下,如下:

代碼二

#include

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è)定時器0和1為16位模式1

ET0 = 1; //定時器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++;

}

void delay(unsigned int endcount)

{

count=0;

do{}while(count

}

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)的代碼能實現(xiàn)速度和方向的控制,而且,通過step_index靜態(tài)全局變量能“記住”步進(jìn)電機的步進(jìn)位置,下次調(diào)用 gorun()函數(shù)時則可直接從上次步進(jìn)位置繼續(xù)轉(zhuǎn)動,從而實現(xiàn)精確步進(jìn);另外,由于利用了步進(jìn)電機內(nèi)線圈之間的“中間狀態(tài)”,步進(jìn)角度減小了一半,只為9度,低速運轉(zhuǎn)也相對穩(wěn)定一些了。

但是,在代碼二中,步進(jìn)電機的運轉(zhuǎn)控制是在主函數(shù)中,如果程序還需執(zhí)行其它任務(wù),則有可能使步進(jìn)電機的運轉(zhuǎn)收到影響,另外還有其它方面的不便,總之不是很完美的控制。所以我又將代碼再次改進(jìn):

代碼三

#include

static unsigned int count; //計數(shù)

static int step_index; //步進(jìn)索引數(shù),值為0-7

static bit turn; //步進(jìn)電機轉(zhuǎn)動方向

static bit stop_flag; //步進(jìn)電機停止標(biāo)志

static int speedlevel; //步進(jìn)電機轉(zhuǎn)速參數(shù),數(shù)值越大速度越慢,最小值為1,速度最快

static int spcount; //步進(jìn)電機轉(zhuǎn)速參數(shù)計數(shù)

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

void gorun(); //步進(jìn)電機控制步進(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è)定時器0和1為16位模式1

ET0 = 1; //定時器0中斷允許

TH0 = 0xFE;

TL0 = 0x0C; //設(shè)定時每隔0.5ms中斷一次

TR0 = 1; //開始計數(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);

}

//定時器0中斷處理

void timeint(void) interrupt 1

{

TH0=0xFE;

TL0=0x0C; //設(shè)定時每隔0.5ms中斷一次

count++;

spcount--;

if(spcount<=0)

{

spcount = speedlevel;

gorun();

}

}

void delay(unsigned int endcount)

{

count=0;

do{}while(count

}

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)電機的運轉(zhuǎn)控制放在時間中斷函數(shù)之中,這樣主函數(shù)就能很方便的加入其它任務(wù)的執(zhí)行,而對步進(jìn)電機的運轉(zhuǎn)不產(chǎn)生影響。在此代碼中,不但實現(xiàn)了步進(jìn)電機的轉(zhuǎn)速和轉(zhuǎn)向的控制,另外還加了一個停止的功能,呵呵,這肯定是需要的。

步進(jìn)電機從靜止到高速轉(zhuǎn)動需要一個加速的過程,否則電機很容易被“卡住”,代碼一、二實現(xiàn)加速不是很方便,而在代碼三中,加速則很容易了。在此代碼中,當(dāng)轉(zhuǎn)速參數(shù)speedlevel 為2時,可以算出,此時步進(jìn)電機的轉(zhuǎn)速為1500RPM,而當(dāng)轉(zhuǎn)速參數(shù)speedlevel 1時,轉(zhuǎn)速為3000RPM。當(dāng)步進(jìn)電機停止,如果直接將speedlevel 設(shè)為1,此時步進(jìn)電機將被“卡住”,而如果先把speedlevel 設(shè)為2,讓電機以1500RPM的轉(zhuǎn)速轉(zhuǎn)起來,幾秒種后,再把speedlevel 設(shè)為1,此時電機就能以3000RPM的轉(zhuǎn)速高速轉(zhuǎn)動,這就是“加速”的效果。

在此電路中,考慮到電流的緣故,我用的NPN三極管是S8050,它的電流最大可達(dá)1500mA,而在實際運轉(zhuǎn)中,我用萬用表測了一下,當(dāng)轉(zhuǎn)速為1500RPM時,步進(jìn)電機的電流只有90mA左右,電機發(fā)熱量較小,當(dāng)轉(zhuǎn)速為60RPM時,步進(jìn)電機的電流為200mA左右,電機發(fā)熱量較大,所以NPN三極管也可以選用9013,對于電機發(fā)熱量大的問題,可加一個10歐到20歐的限流電阻,不過這樣步進(jìn)電機的功率將會變小。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉