www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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

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

不過,上面的程序還只是實現(xiàn)了步進電機的初步控制,速度和方向的控制還不夠靈活,另外,由于沒有利用步進電機內(nèi)線圈之間的“中間狀態(tài)”,步進電機的步進角度為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)

{

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;

}

}

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

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

代碼三

#include

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

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

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

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

static int speedlevel; //步進電機轉(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 = 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;

}

}

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

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

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

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

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉