標(biāo)題: 基于51單片機(jī)的步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì) 源程序 [打印本頁(yè)]
作者: Southerly 時(shí)間: 2022-3-8 15:15
標(biāo)題: 基于51單片機(jī)的步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì) 源程序
[attach]291637[/attach]本設(shè)計(jì)介紹了一種基于51單片機(jī)的步進(jìn)電機(jī)控制系統(tǒng),該設(shè)計(jì)采用STC89C51單片機(jī)為主控芯片,步進(jìn)電機(jī)由ULN2003A驅(qū)動(dòng)跟單片機(jī)相連接,LCD顯示屏實(shí)時(shí)顯示步進(jìn)電機(jī)信息。步進(jìn)電機(jī)采用八拍運(yùn)行方式,由單片機(jī)發(fā)出脈沖信號(hào)控制步進(jìn)電機(jī)的通電順序,從而達(dá)到控制步進(jìn)電機(jī)運(yùn)轉(zhuǎn)的目的。開(kāi)啟后,通過(guò)矩陣鍵盤向單片機(jī)輸入脈沖控制信號(hào),以此來(lái)實(shí)現(xiàn)步進(jìn)電機(jī)的正反轉(zhuǎn)、加減速、角度設(shè)置,最終基本達(dá)到了預(yù)期目標(biāo)。
利用單片機(jī),實(shí)現(xiàn)用鍵盤控制步進(jìn)電機(jī)的運(yùn)轉(zhuǎn),包括設(shè)定步進(jìn)電機(jī)運(yùn)轉(zhuǎn)的角度,方向及速度,并顯示其信息。
主控模塊使用STC89C51單片機(jī)來(lái)作為控制芯片。
輸入模塊的選擇中,考慮到需要設(shè)置步進(jìn)電機(jī)運(yùn)轉(zhuǎn)角度和其他的功能以及單片機(jī)接口的限制,獨(dú)立鍵盤的按鍵數(shù)量不能滿足要求,所以本設(shè)計(jì)中采用4×4矩陣鍵盤;只需占用一個(gè)I/O口,就可以提供16個(gè)按鍵。
顯示模塊的選擇,有LED和LCD兩種顯示方式可供選擇,但考慮到需要顯示的內(nèi)容較多,LED顯示需要許多的LED數(shù)碼管;這樣會(huì)占用大量的控制芯片的資源使得顯示模塊的實(shí)現(xiàn)極為復(fù)雜。考慮到這些因素,本次設(shè)計(jì)中采用LCD的顯示方式,對(duì)比了幾款LCD顯示屏,最終選擇了LCD1602作為顯示模塊。LCD1602可以顯示16×2個(gè)字符,可以滿足設(shè)計(jì)需求。
驅(qū)動(dòng)模塊的選擇,因控制芯片發(fā)出的控制信號(hào)過(guò)于微弱,無(wú)法直接驅(qū)動(dòng)被控單元;所以必須在控制芯片與被控單元之間加入一個(gè)信號(hào)放大模塊,經(jīng)過(guò)幾種信號(hào)放大方式的對(duì)比,最終決定采用最為可靠的ULN2003A作為驅(qū)動(dòng)模塊。ULN2003A具有很高的直流電流增益,可以很好的驅(qū)動(dòng)步進(jìn)電機(jī)。
被控單元的選擇,本設(shè)計(jì)采用了常見(jiàn)的28-BYJ-48步進(jìn)電機(jī)。它是一款永磁式、減速型,四相八拍步進(jìn)電機(jī),有三種工作模式可供選擇。
經(jīng)過(guò)不斷的對(duì)比選擇,最終采用了以下方案完成設(shè)計(jì);STC89C51單片機(jī)作為主控芯片,4×4矩陣鍵盤輸入步進(jìn)電機(jī)控制信息,步進(jìn)電機(jī)采用28-BYJ-48步進(jìn)電機(jī)。因單片機(jī)無(wú)法直接驅(qū)動(dòng)起電機(jī),所以我們采用ULN2003A驅(qū)動(dòng)芯片來(lái)驅(qū)動(dòng)電機(jī),步進(jìn)電機(jī)的運(yùn)行信息由最后由LCD1602液晶顯示屏顯示。
單片機(jī)最小系統(tǒng),也叫做單片機(jī)最小應(yīng)用系統(tǒng),是指用最少的原件組成單片機(jī)可以工作的系統(tǒng)。單片機(jī)最小系統(tǒng)的三要素就是電源、時(shí)鐘電路、復(fù)位電路,電源可使用外部穩(wěn)定的5V電源供電模塊供給。
復(fù)位電路分為按鍵復(fù)位和上電復(fù)位。上電復(fù)位通常在復(fù)位引腳RST上連接一個(gè)電容到VCC,再連接一個(gè)電阻到GND,由此形成一個(gè)RC充放電回路保證單片機(jī)在上電時(shí)RST腳上有足夠時(shí)間的高電平進(jìn)行復(fù)位,在RST引腳上加兩個(gè)周期的高電平即可使單片機(jī)復(fù)位,隨后回歸到低電平進(jìn)入正常工作狀態(tài),這個(gè)電阻和電容的典型值為10K和10uF。按鍵復(fù)位就是在復(fù)位電容上并聯(lián)一個(gè)開(kāi)關(guān),當(dāng)開(kāi)關(guān)按下時(shí)電容被放電、RST也被拉到高電平,而且由于電容的充電,會(huì)保持一段時(shí)間的高電平來(lái)使單片機(jī)復(fù)位。
因單片機(jī)內(nèi)部帶有振蕩電路,所以外部只要連接一個(gè)晶振和兩個(gè)電容即可,電容容量一般在15pF至30pF之間。電容的作用是幫助晶振起振,并維持振蕩信號(hào)的穩(wěn)定。
圖3.1 單片機(jī)最小系統(tǒng)原理圖
LCD1602是一種工業(yè)字符型液晶,能夠同時(shí)顯示16x2即32個(gè)字符。LCD1602液晶顯示的原理是利用液晶的物理特性,通過(guò)電壓對(duì)其顯示區(qū)域進(jìn)行控制,有電就有顯示,這樣即可以顯示出圖形。1602液晶也叫1602字符型液晶,它是一種專門用來(lái)顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。
LCD1602主要參數(shù):顯示容量16×2個(gè)字符;芯片工作電4.5—5.5V;工作電流2.0mA,模塊最佳工作電壓5.0V。
與單片機(jī)的連接:D0-D7并行連接單片機(jī)的P0口,作為數(shù)據(jù)傳輸;RS,RW,E分別連接單片機(jī)P2.5,P2.6,P2.7。RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
3.3 驅(qū)動(dòng)模塊
ULN2003A是高耐壓、大電流復(fù)合晶體管陣列,由七個(gè)硅NPN 復(fù)合晶體管組成,每一對(duì)達(dá)林頓都串聯(lián)一個(gè)2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來(lái)處理的數(shù)據(jù)。ULN2003A 具有電流增益高、工作電壓高、溫度范圍寬、帶負(fù)載能力強(qiáng)等特點(diǎn),適應(yīng)于各類要求高速大功率驅(qū)動(dòng)的系統(tǒng)。
圖3.3 ULN2003A模塊圖
3.4 矩陣鍵盤原理及電路圖矩陣鍵盤又稱行列鍵盤,如圖3.4所示,它是用四條I/O線作為行線,四條I/O線作為列線組成的鍵盤。在行線和列線的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤上按鍵的個(gè)數(shù)就為4×4個(gè)。使用矩陣鍵盤時(shí)我們用掃描法識(shí)別按鍵,按鍵按下時(shí),與此鍵相連的行線與列線導(dǎo)通,行線在無(wú)按鍵按下時(shí)處在高電平。如果

所有的列線都處在高電平,則按鍵按下與否不會(huì)引起行線電平的變化,因此必須使所有列線處在電平。這樣當(dāng)有按鍵按下時(shí),該鍵所在的行電平才會(huì)由高變低,才能判斷相應(yīng)的行有鍵按下。
圖3.4 矩陣鍵盤
表3-4矩陣鍵盤說(shuō)明表
| |
| |
| |
| |
| 設(shè)置步進(jìn)電機(jī)的正反轉(zhuǎn) |
| |
| |
4 系統(tǒng)軟件設(shè)計(jì)
4.1 系統(tǒng)軟件流程圖系統(tǒng)軟件設(shè)計(jì)是本次系統(tǒng)設(shè)計(jì)的重要組成部分,基于硬件電路條件,整個(gè)程序細(xì)分為若干個(gè)功能模塊來(lái)完成,主要有顯示程序模塊、按鍵程序模塊、步進(jìn)電機(jī)模塊。
STC89C51單片機(jī)的P1口用來(lái)連接矩陣鍵盤,P0口與P2口的P2^5、P2^6、P2^6連接LCD602、最后由P3口借助一個(gè)驅(qū)動(dòng)芯片ULN2003與步進(jìn)電機(jī)連接。單片機(jī)程序中的主函數(shù)完成對(duì)LCD1602顯示屏初始化之后,依次調(diào)用顯示函數(shù)、按鍵查詢函數(shù)、角度設(shè)置函數(shù)。主程序流程圖如圖4.1所示。
4.2 LCD1602顯示流程圖本設(shè)計(jì)用LCD1602液晶屏作為顯示,主要是將步進(jìn)電機(jī)的角度、速度、方向等信息在LCD1602上面顯示出來(lái),以便于用戶操作。如圖4.2所示為液晶屏顯示控制子程序流程圖。
測(cè)試結(jié)果及其分析
在模擬仿真階段,本設(shè)計(jì)采用了kile與proteus聯(lián)合仿真調(diào)試,確保所寫程序可以實(shí)現(xiàn)本設(shè)計(jì)所需要的功能。經(jīng)過(guò)不斷的調(diào)試和仿真,在仿真環(huán)境下實(shí)現(xiàn)了預(yù)期的功能。隨后,利用開(kāi)發(fā)板搭建了電路,經(jīng)過(guò)測(cè)試ULN2003模塊可以正常驅(qū)動(dòng)電機(jī);下載程序之后,矩陣鍵盤可以正常輸入控制信息,LCD1602液晶顯示正常,步進(jìn)電機(jī)按輸入控制信息能夠正常運(yùn)轉(zhuǎn)。但因步進(jìn)電機(jī)減速比的影響,顯示角度與電機(jī)實(shí)際角度存在誤差。
本文設(shè)計(jì)了一種基于單片機(jī)的步進(jìn)電機(jī)控制系統(tǒng),采用4×4矩陣鍵盤作為輸入,使用LCD1602顯示信息,如運(yùn)轉(zhuǎn)的角度,方向及速度。可通過(guò)鍵盤輸入讓步進(jìn)電機(jī)運(yùn)轉(zhuǎn)的角度,方向和運(yùn)轉(zhuǎn)速度。采用了ULN2003驅(qū)動(dòng)模塊,可以很好的驅(qū)動(dòng)步進(jìn)電機(jī)。實(shí)現(xiàn)了對(duì)步進(jìn)電機(jī)較為精確的控制。
單片機(jī)源程序如下:
- #include<stdio.h>
- #include<reg51.h>
- #include<lcd1602.h>
- #define Motor P3
- void SetAngle(uint angle);
- uchar keyscan();
- uchar code Motortab[]={0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x01};
- uchar flag=2;
- uint T=5;
- void main()
- {
- static int keyvalue=0;
- static int num=0;
- Init();
- printf("Angle=%5d",0);
- while(1)
- {
- keyvalue=keyscan();
- if(keyvalue)
- {
- if(keyvalue>=0&&keyvalue<=10)
- {
- if(keyvalue==10)
- keyvalue=0;
- num=num*10+keyvalue;
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," ");//角度輸入
- }
- else if(keyvalue==15)
- {
- T--;
- if(T<1)
- T=10;
- SetRowCol(1,6);
- printf("speed=%2d%s",T," ");
-
- }
- else if(keyvalue==16)
- {
- T++;
- if(T>10)
- T=0;
- SetRowCol(1,6);
- printf("speed=%2d%s",T," ");
-
- }
- else if(keyvalue==11) //開(kāi)始
- {
- if(flag==0)
- {
- SetRowCol(1,0);
- printf("STRAT");
- SetAngle(-(num)*11.5);
- SetRowCol(1,0);
- printf("END ");
- SetRowCol(1,4);
- printf("NAngle=%d%s",-num," ");
- num=0;
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," ");
- flag=2;
- }
- else if(flag==1)
- {
- SetRowCol(1,0);
- printf("STRAT");
- SetAngle(num*11.5);
- SetRowCol(1,0);
- printf("END ");
- SetRowCol(1,4);
- printf("NAngle=%s%d%s"," ",num," ");
- num=0;
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," ");
- flag=2;
- }
- else
- {
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," ");
- flag=2;
- }
- }
- else if(keyvalue==12) //輸入清零
- {
- num=0;
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," ");
- SetRowCol(1,0);
- printf(" ");
- }
- else if(keyvalue==13) //正反轉(zhuǎn)
- {
- flag=!flag;
- if(flag==0)
- {
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," FZ");
-
- }
- else if(flag==1)
- {
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," ZZ");
- }
- }
- else if(keyvalue==14)//點(diǎn)動(dòng)
- {
- if(flag==0)
- {
- num--;
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," FZ");
- SetAngle(num*11.5);
- }
- else if(flag==1)
- {
- num++;
- SetRowCol(0,0);
- printf("Angle=%5d%s",num," ZZ");
- SetAngle(num*11.5);
- }
- }
-
- }
- }
- }
- void SetAngle(uint angle)
- {
- static uint FirAngle=0;
- static uint i=0;
- int d;
- uint j;
- d=angle-FirAngle;
- if(d>0)
- {
- for(j=0;j<d;j++)
- {
- i++;
- i=(i&0x0007);
- Motor=Motortab[i];
- delay(T);
- }
- FirAngle=angle;
- }
- else
- {
- for(j=0;j<-d;j++)
- {
- i--;
- i=i&0x0007;
- Motor=Motortab[i];
- delay(T);
- }
- FirAngle=angle;
- }
- }
復(fù)制代碼
以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁(yè)上的一模一樣,方便大家保存):
基于51單片機(jī)的步進(jìn)電機(jī)控制系統(tǒng).docx
(391.54 KB, 下載次數(shù): 48)
2022-3-9 20:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
-
3.png
(54.04 KB, 下載次數(shù): 138)
下載附件
2022-3-8 15:19 上傳
作者: jovew 時(shí)間: 2022-3-9 21:23
Rebuild started: Project: Calendar
Rebuild target 'Target 1'
compiling Cal.c...
C51 FATAL-ERROR -
ACTION: PARSING SOURCE-FILE
ERROR: PREPROCESSOR: MACROS TOO NESTED
C51 TERMINATED.
Target not created.
Build Time Elapsed: 00:00:00
編譯不能通過(guò),怎么辦?
作者: Southerly 時(shí)間: 2022-3-12 13:27
每個(gè)驅(qū)動(dòng)程序看一下是否添加對(duì)
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |