單片機課程設(shè)計---步進電機正反轉(zhuǎn)設(shè)計_第1頁
已閱讀1頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  單片機課程設(shè)計</b></p><p>  課題:步進電機正反轉(zhuǎn)設(shè)計</p><p>  系 別: 電氣與電子工程系</p><p><b>  專 業(yè): </b></p><p><b>  姓 名: </b></p&

2、gt;<p><b>  學(xué) 號</b></p><p><b>  指導(dǎo)老師: </b></p><p>  2013年01月09日</p><p><b>  一 設(shè)計目的</b></p><p>  1、增進對單片機的感性認識,加深對單片機理論方面

3、的理解;</p><p>  2、掌握單片機的內(nèi)部功能模塊的應(yīng)用,如定時器/計數(shù)器、中斷、片內(nèi)外存貯器、I/O口、A/D、D/A、串行口通訊等;</p><p>  3、了解和掌握單片機應(yīng)用系統(tǒng)的軟硬件設(shè)計過程、方法及實現(xiàn);</p><p>  4、了解步進電機控制的基本原理,能實現(xiàn)電機正反轉(zhuǎn)驅(qū)動控制,掌握控制步進電機轉(zhuǎn)動的編程方法。 </p><

4、;p><b>  二 設(shè)計要求</b></p><p>  1、具有速度和轉(zhuǎn)向設(shè)定功能;</p><p>  2、設(shè)置開始、停止以及正反轉(zhuǎn)健;</p><p>  3、轉(zhuǎn)速以及轉(zhuǎn)向有數(shù)碼管顯示(本設(shè)計使用的為LCD12864)。</p><p><b>  三 、總體設(shè)計</b></p

5、><p>  步進電機是一種將電脈沖轉(zhuǎn)化為角位移的數(shù)字控制執(zhí)行機構(gòu)。它將電脈沖信號轉(zhuǎn)變成角位移,即給一個脈沖信號,步進電機就轉(zhuǎn)動一個角度,因此非常適合于單片機控制。 步進電機具有控制簡便、定位準確等特點。隨著科學(xué)技術(shù)的發(fā)展,在許多領(lǐng)域?qū)⒌玫綇V泛的應(yīng)用。鑒于傳統(tǒng)的脈沖系統(tǒng)移植性不好,本文提出微機控制系統(tǒng)代替脈沖發(fā)生器和脈沖分配器,用軟件的方法產(chǎn)生控制脈沖,通過軟件編程可以任意設(shè)定步進電機的轉(zhuǎn)速、旋轉(zhuǎn)角度、轉(zhuǎn)動次

6、數(shù)和控制步進電機的運行狀態(tài)。以簡化控制電路,降低生產(chǎn)成本,提高系統(tǒng)的運行效率和靈活性。</p><p>  步進電機的角位移與輸入脈沖數(shù)嚴格成正比,因此,當(dāng)它轉(zhuǎn)動一周后,沒有累計誤差,具有良好的跟隨性。由步進電機與驅(qū)動電路組成的開環(huán)數(shù)控系統(tǒng),既非常簡單、 廉價,又非??煽?。同時,它也可以與角度反饋環(huán)節(jié)組成高性能的閉環(huán)數(shù)控系統(tǒng)。步進電機的動態(tài)響應(yīng)快,易于起停、正反轉(zhuǎn)及變速。速度可在相當(dāng)寬的范圍內(nèi)平滑 調(diào)節(jié),低速下仍

7、能保證獲得大轉(zhuǎn)矩。步進電機只能通過脈沖電源供電才能運行,它不能直接使用交流電源和直流電源。 步進電機存在振蕩和失步現(xiàn)象,必須對控制系統(tǒng)和機械負載采取相應(yīng)的措施。步進電機自身的噪聲和振動較大,帶慣性負載的能力較差。</p><p>  步進電機是自動控制系統(tǒng)中常用的執(zhí)行部件。步進電機的輸入信號為脈沖電流,它能將輸入的脈沖信號轉(zhuǎn)換為階躍型的角位移或直線位移,因而步進電機可看作是一個串行的數(shù)/模轉(zhuǎn)換器。由于步進電機能夠

8、直接接受數(shù)字信號,而不需數(shù)/模轉(zhuǎn)換,所以使用微機控制步進電機顯得非常方便。</p><p>  步進電機有以下優(yōu)點:</p><p>  (1)通常不需要反饋就能對位置和速度進行控制;</p><p>  (2)位置誤差不會積累;</p><p>  (3)與數(shù)組設(shè)備兼容,能夠直接接收數(shù)字信號;</p><p>  (

9、4)可以快速啟停。</p><p>  步進電機的品種規(guī)格很多,按照它們的結(jié)構(gòu)和工作原理可以劃分為磁阻式(也稱反應(yīng)式或變磁阻式)電機、混合式電機、永磁式電機和特種電機等四種主要型式。步進電機不需位移傳感器就可精確定位,所以在精確定位系統(tǒng)中應(yīng)用廣泛。目前打字機、計算機外部設(shè)備、數(shù)控機床、傳真機等設(shè)備中都使用了步進電機。隨著電子計算機技術(shù)的發(fā)展,步進電機必將發(fā)揮它的控制方便、控制準確的特點,在工業(yè)控制等領(lǐng)域取得更為廣

10、泛的應(yīng)用。</p><p>  本設(shè)計采用16 位單片機AT89C51對步進電機進行控制,通過I/O口輸出的具有時序的方波作為步進電機的控制信號,信號經(jīng)過驅(qū)動芯片驅(qū)動步進電機;同時,用觸發(fā)按鍵來對電機的狀態(tài)進行控制,并用128X64LCD顯示電機的狀態(tài)及轉(zhuǎn)速。</p><p>  因為步進電機的控制是通過脈沖信號來控制的,將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。所以怎樣產(chǎn)生這個脈沖

11、信號和產(chǎn)生怎樣的信號是電機控制的關(guān)鍵。</p><p>  用軟件控制單片機產(chǎn)生脈沖信號,通過單片機的P1口輸出脈沖信號,因為所選電機是兩相的,所以只需要P0口的低四位P0.0-P0.3分別通過ULN2003A接到電機的五根電線上??梢酝ㄟ^調(diào)整輸出脈沖的頻率來調(diào)整電機的轉(zhuǎn)速,通過改變輸入脈沖的順序來改變轉(zhuǎn)動方向,P2口和P3口接128X64LCD,可以顯示當(dāng)前的電機轉(zhuǎn)速和轉(zhuǎn)向,設(shè)置復(fù)位鍵可使正在轉(zhuǎn)動的電機停止轉(zhuǎn)動

12、,大概可分為如下圖所示的幾部分。</p><p>  注:由于此設(shè)計程序較復(fù)雜,在此沒有列出程序的框圖,程序框圖詳見軟件設(shè)計。</p><p>  四 、主要器件介紹及電路設(shè)計</p><p><b>  4.1、步進電機</b></p><p>  4.1.1 步進電機概述</p><p>  

13、步進電機是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。在非超載的情況下,電機的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負載變化的影響,當(dāng)步進驅(qū)動器接收到一個脈沖信號,它就驅(qū)動步進電機按設(shè)定的方向轉(zhuǎn)動一個固定的角度,稱為“步距角”,它的旋轉(zhuǎn)是以固定的角度一步一步運行的??梢酝ㄟ^控制脈沖個數(shù)來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,從而達到調(diào)速的目的。由于脈沖信號數(shù)與步距

14、角的線性關(guān)系,加上步進電機只有周期性的誤差而無累積誤差等特點,使得在速度、位置等控制領(lǐng)域用步進電機來控制變的非常的簡單。 步進電機是一種感應(yīng)電機,它的工作原理是利用電子電路,將直流電變成分時供電的,多相時序控制電流,用這種電流為步進電機供電,步進電機才能正常工作,驅(qū)動器就是為步進電機分時供電的,多相時序控制器 </p><p>  雖然步進電機已被廣泛地應(yīng)用,但步進電機并不能象普通的直流電機,交流電機在常規(guī)

15、下使用。它必須由雙環(huán)形脈沖信號、功率驅(qū)動電路等組成控制系統(tǒng)方可使用。因此用好步進電機卻非易事,它涉及到機械、電機、電子及計算機等許多專業(yè)知識。 </p><p>  步進電機作為執(zhí)行元件,是機電一體化的關(guān)鍵產(chǎn)品之一, 廣泛應(yīng)用在各種自動化控制系統(tǒng)中。隨著微電子和計算機技術(shù)的發(fā)展,步進電機的需求量與日俱增,在各個國民經(jīng)濟領(lǐng)域都有應(yīng)用。</p><p>  4.1.2 步進電機的工作原理<

16、;/p><p>  通常電機的轉(zhuǎn)子為永磁體,當(dāng)電流流過定子繞組時,定子繞組產(chǎn)生一矢量磁場。該磁場會帶動轉(zhuǎn)子旋轉(zhuǎn)一角度,使得轉(zhuǎn)子的一對磁場方向與定子的磁場方向一致。當(dāng)定子的矢量磁場旋轉(zhuǎn)一個角度。轉(zhuǎn)子也隨著該磁場轉(zhuǎn)一個角度。每輸入一個電脈沖,電動機轉(zhuǎn)動一個角度前進一步。它輸出的角位移與輸入的脈沖數(shù)成正比、轉(zhuǎn)速與脈沖頻率成正比。改變繞組通電的順序,電機就會反轉(zhuǎn)。所以可用控制脈沖數(shù)量、頻率及電動機各相繞組的通電順序來控制步進

17、電機的轉(zhuǎn)動</p><p>  四相步進電機,采用單極性直流電源供電。只要對步進電機的各相繞組按合適的時序通電,就能使步進電機步進轉(zhuǎn)動。圖1是該四相</p><p>  反應(yīng)式步進電機工作原理圖。</p><p>  圖2 四相反應(yīng)式步進電機工作原理圖</p><p>  開始時,開關(guān)SB接通電源,SA、SC、SD斷開,B相磁極和轉(zhuǎn)子0、3號

18、齒對齊,同時,轉(zhuǎn)子的1、4號齒就和C、D相 繞組磁極產(chǎn)生錯齒,2、5號齒就和D、A相繞組磁極產(chǎn)生錯齒。當(dāng)開關(guān)SC接通電源,SB、SA、SD斷開時,由于C相繞組的磁力線和1、4號齒之間磁力線的作用,使轉(zhuǎn)子轉(zhuǎn)動,1、4號齒和C相繞組的磁極對齊。而0、3號齒和A、B相繞組產(chǎn)生錯齒,2、5號齒就和A、D相繞組磁極產(chǎn)生錯齒。依次類推,A、B、C、D四相繞組輪流供電,則轉(zhuǎn)子會沿著A、B、C、D方向轉(zhuǎn)動。</p><p>  

19、四相步進電機按照通電順序的不同,可分為單四拍、雙四拍、八拍三種工作方式。單四拍與雙四拍的步距角相等,但單四拍的轉(zhuǎn)動力矩小。八拍工作方式的步距角是單四拍與雙四拍的一半,因此,八拍工作方式既可以保持較高的轉(zhuǎn)動力矩又可以提高控制精度。</p><p>  單四拍、雙四拍與八拍工作方式的電源通電時序與波形分別如圖2.a、b、c所示:</p><p>  a單四拍 b雙四拍

20、 c八拍</p><p>  圖3.步進電機工作時序波形圖</p><p>  4.2 ULN2003</p><p>  ULN是集成達林頓管IC,內(nèi)部還集成了一個消線圈反電動勢的二極管,可用來驅(qū)動繼電器。它是雙列16腳封裝,NPN晶體管矩陣,最大驅(qū)動電壓=50V,電流=500mA,輸入電壓=5V,適用于TTL COMS,由達林頓管組成驅(qū)

21、動電路。 ULN是集成達林頓管IC,內(nèi)部還集成了一個消線圈反電動勢的二極管,它的輸出端允許通過電流為200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。用戶輸出口的外接負載可根據(jù)以上參數(shù)估算。采用集電極開路輸出,輸出電流大,故可直接驅(qū)動繼電器或固體繼電器,也可直接驅(qū)動低壓燈泡。通常單片機驅(qū)動ULN2003時,上拉2K的電阻較為合適,同時,COM引腳應(yīng)該懸空或接電源。</p><p>  ULN20

22、03是一個非門電路,包含7個單元,但獨每個單元驅(qū)動電流最大可達350mA.資料的最后有引用電路,9腳可以懸空。 比如1腳輸入,16腳輸出,你的負載接在VCC與16腳之間,不用9腳。 </p><p>  ULN2003的作用:ULN2003是大電流驅(qū)動陣列,多用于單片機、智能儀表、PLC、數(shù)字量輸出卡等控制電路中??芍苯域?qū)動繼電器等負載。輸入5VTTL電平,輸出可達500mA/50V。</p>&l

23、t;p>  ULN2003是高耐壓、大電流達林頓陳列,由七個硅NPN達林頓管組成。 該電路的特點如是: ULN2003的每一對達林頓都串聯(lián)一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標(biāo)準邏輯緩沖器。</p><p>  ULN2003 是高壓大電流達林頓晶體管陣列系列產(chǎn)品,具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應(yīng)于各類要求高速大

24、功率驅(qū)動的系統(tǒng)。 </p><p>  ULN2003A引腳圖及功能如下:</p><p>  圖4 ULN2003A引腳圖</p><p>  ULN2003 是高耐壓、大電流、內(nèi)部由七個硅NPN達林頓管組成的驅(qū)動芯片。 </p><p>  經(jīng)常在以下電路中使用,作為: </p><p>&

25、lt;b>  1、顯示驅(qū)動</b></p><p><b>  2、繼電器驅(qū)動</b></p><p><b>  3、照明燈驅(qū)動</b></p><p><b>  4、電磁閥驅(qū)動</b></p><p>  5、伺服電機、步進電機驅(qū)動等電路中。</p

26、><p>  ULN2003的每一對達林頓都串聯(lián)一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標(biāo)準邏輯緩沖器來處理的數(shù)據(jù)。ULN2003 工作電壓高,工作電流大,灌電流可達500mA,并且能夠在關(guān)態(tài)時承受50V 的電壓,輸出還可以在高負載電流并行運行。ULN2003 的封裝采用DIP—16 或SOP—16 </p><p>  ULN

27、2003A在各種控制電路中常用它作為驅(qū)動繼電器的芯片,其芯片內(nèi)部做了一個消線圈反電動勢的二極管。ULN2003的輸出端允許通過IC 電流200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。輸出電流大,故可以直接驅(qū)動繼電器或固體繼電器(SSR)等外接控制器件,也可直接驅(qū)動低壓燈泡。</p><p>  ULN2003可以驅(qū)動7個繼電器,具有高電壓輸出特性,并帶有共陰極的續(xù)流二極管使器件可用于開關(guān)型感

28、性負載。每對達林頓管的額定集電極電流是500mA,達林頓對管還可并聯(lián)使用以達到更高的輸出電流能力。ULN2003A中每對達林頓管的基極都串聯(lián)有一個2.7kΩ的電阻,可直接與TTL或5V CMOS器件連接。</p><p>  4.3 12864LCD</p><p>  12864A-1漢字圖形點陣液晶顯示模塊,可顯示漢字及圖形,內(nèi)置8192個中文漢字(16X16點陣,16*8=128,1

29、6*4=64,一行只能寫8個漢字,4行;)、128個字符(8X16點陣)及64X256點陣顯示RAM(GDRAM)。</p><p>  4.3.1 主要技術(shù)參數(shù)和顯示特性如下:</p><p>  電源:VDD 3.3V-5V(內(nèi)置升壓電路,無需負壓);</p><p>  顯示內(nèi)容:128列× 64行(128表示點數(shù))</p><p

30、><b>  顯示顏色:黃綠</b></p><p>  顯示角度:6:00鐘直視</p><p><b>  LCD類型:STN</b></p><p>  與MCU接口:8位或4位并行/3位串行</p><p><b>  配置LED背光</b></p>

31、<p>  多種軟件功能:光標(biāo)顯示、畫面移位、自定義字符、睡眠模式等</p><p>  4.3.2 外形尺寸圖:</p><p>  圖5 12864LCD外形尺寸</p><p>  4.3.3 主要外形尺寸</p><p>  4.3.4 模塊引腳說明</p><p>  邏輯工作電壓(VDD):4.

32、5~5.5V</p><p>  電源地(GND):0V</p><p>  工作溫度(Ta):0~60℃(常溫) / -20~75℃(寬溫)</p><p>  4.3.5 接口時序</p><p>  模塊有并行和串行兩種連接方法(時序如下):</p><p>  4.3.5.1 8位并行連接時序圖</p&g

33、t;<p>  圖6 MPU寫資料到模塊</p><p>  圖7 MPU從模塊讀出資料</p><p>  4.3.5.2 串行連接時序圖</p><p><b>  圖8 串行連接時序</b></p><p>  串行數(shù)據(jù)傳送共分三個字節(jié)完成:</p><p>  第一字節(jié):串口

34、控制—格式 11111ABC。A為數(shù)據(jù)傳送方向控制:H表示數(shù)據(jù)從LCD到MCU,L表示數(shù)據(jù)從MCU到LCD。B為數(shù)據(jù)類型選擇:H表示數(shù)據(jù)是顯示數(shù)據(jù),L表示數(shù)據(jù)是控制指令。 C固定為0</p><p>  第二字節(jié):(并行)8位數(shù)據(jù)的高4位—格式 DDDD0000</p><p>  第三字節(jié):(并行)8位數(shù)據(jù)的低4位—格式 0000DDDD</p><p>  串行

35、接口時序參數(shù):(測試條件:T=25℃ VDD=4.5V)</p><p>  4.4 系統(tǒng)的時鐘電路</p><p>  時鐘電路是用于產(chǎn)生單片機工作時所必需的時鐘信號。時鐘是單片機的心臟,單片機各功能部件的運行都是以時鐘頻率為基準的,有條不紊地一拍一拍地工作。時鐘頻率直接影響單片機的速度,時鐘電路的質(zhì)量也直接影響單片機系統(tǒng)的穩(wěn)定性。在本系統(tǒng)中采用外部時鐘方式的電路,如圖所示:</p

36、><p>  圖9 系統(tǒng)的時鐘電路</p><p>  在本設(shè)計中的電容C1、C2典型值為30±10 pF。外接代內(nèi)容的值雖然沒有嚴格的要求,但是電容的大小會影響振蕩器的穩(wěn)定性和起振的快速性。同時,在系統(tǒng)中采用12MHz的晶體振蕩器來產(chǎn)生時鐘脈沖。這樣可以滿足系統(tǒng)在設(shè)計時的機器周期的需要。</p><p>  4.5 步進電機驅(qū)動電路</p>&

37、lt;p>  由單片機直接輸出的脈沖不足以驅(qū)動步進電機正常工作所以需要驅(qū)動電路給步進電機提供電源,在本設(shè)計中采用型號為ULN2003A的芯片,使步進電機正常工作。驅(qū)動信號由P0口的P0.0-P0.3輸出,分別與驅(qū)動芯片的B1-B4相連,電路如下圖所示:</p><p>  圖10 步進電機的驅(qū)動電路</p><p><b>  五 軟件設(shè)計</b></p&

38、gt;<p><b>  1、主程序的設(shè)計</b></p><p>  主程序需具備的功能,要不斷掃描P1口并判斷觸發(fā)按鍵是否閉合,并能根據(jù)其電平高低,輸出不同的控制脈沖,并調(diào)用顯示子程序顯示轉(zhuǎn)速及方向。</p><p>  圖11 主程序設(shè)計流程</p><p><b>  程序如下</b></p&g

39、t;<p>  #include <REG51.h> </p><p>  //#include <stdio.h></p><p>  //#include <math.h></p><p>  #include "macro.h"</p><p>  void iniL

40、CD(void); </p><p>  void write_hz_str( int x1,int y1, uchar *point ) ;</p><p>  uchar buf_Direction; //設(shè)定步進電機的轉(zhuǎn)向</p><p>  uint set_speed;

41、 //設(shè)定步進電機的轉(zhuǎn)速</p><p>  uchar step_motor_loop[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};</p><p>  uchar step_index;</p><p>  uchar buf_SpeedString[]=" ";</p>

42、;<p>  #define CST_STEP_MOTOR_Z 10 //正轉(zhuǎn)</p><p>  #define CST_STEP_MOTOR_F 20 //反轉(zhuǎn)</p><p>  #define CST_STEP_MOTOR_ST 0 //停</p><p>  #defi

43、ne fosc_12MHz 12 </p><p>  #define fosc_24MHz 24 </p><p>  #define fosc_setting fosc_12MHz //工作方式1</p><p>  #define CST_TIME_MS 1000

44、 </p><p>  #define CST_TH0 (65536-CST_TIME_MS*fosc_setting/fosc_12MHz)/256</p><p>  #define ST_TL0 (65536-CST_TIME_MS*fosc_setting/fosc_12MHz)%256 </p><p>  void step_motor_dri

45、ver(void)</p><p><b>  {</b></p><p>  static uint speed_delay=0;</p><p>  speed_delay++;</p><p>  if( buf_Direction==CST_STEP_MOTOR_Z)</p><p>&l

46、t;b>  {</b></p><p>  P0=step_motor_loop[step_index];</p><p>  if(speed_delay >=set_speed)</p><p><b>  {</b></p><p>  speed_delay =0;</p>

47、<p>  step_index++; //大于7,從頭再來 </p><p>  if(step_index >7)</p><p>  step_index =0; </p><p><b>  }</b></p><p><b>  }</b>&l

48、t;/p><p>  else if( buf_Direction==CST_STEP_MOTOR_F)</p><p><b>  {</b></p><p>  P0=step_motor_loop[step_index];</p><p>  if(speed_delay >=set_speed )</p&

49、gt;<p><b>  {</b></p><p>  speed_delay =0;</p><p>  step_index--; </p><p>  if(step_index <=0)</p><p>  step_index =7; </p>

50、<p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  speed_delay =0;</p><p&g

51、t;<b>  P0=0x00;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void caluate(void)</p><p><b>  {</b></p><p&g

52、t;  uchar temp=0;</p><p>  uint u16Temp=0;</p><p>  u16Temp=(100-set_speed)*100/85;</p><p>  buf_SpeedString[0]='0'+(u16Temp/100);</p><p>  buf_SpeedString[1]=&

53、#39;0'+(u16Temp%100/10);</p><p>  buf_SpeedString[2]='0'+(u16Temp%100%10);</p><p>  buf_SpeedString[3]='%';</p><p>  write_hz_str(6,60,&buf_SpeedString);<

54、/p><p><b>  }</b></p><p><b>  //按鍵處理程序</b></p><p>  void key_Scan (void) </p><p><b>  { </b></p><p>  static uchar key_loo

55、se=0;</p><p>  uchar temp=0;</p><p><b>  P1=0XFF;</b></p><p>  temp=P1&0xFF;</p><p>  if(key_loose >0)</p><p><b>  {</b><

56、/p><p>  if(temp==0xFF)</p><p>  key_loose=0;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  else if(temp !=0xFF)</p><p

57、><b>  {</b></p><p>  key_loose=10;</p><p>  temp=P1&0xFF;</p><p>  switch(temp)</p><p><b>  {</b></p><p>  case 0xFE: <

58、;/p><p>  buf_Direction=CST_STEP_MOTOR_Z; </p><p>  write_hz_str(6,20,"反轉(zhuǎn)");</p><p>  caluate();</p><p>  break; </p><p>  case 0xFD

59、: </p><p>  buf_Direction=CST_STEP_MOTOR_F; </p><p>  write_hz_str(6,20,"正轉(zhuǎn)");</p><p>  caluate();</p><p>  break; </p><p> 

60、 case 0xFB: write_hz_str(6,50,"100%");</p><p>  buf_Direction=CST_STEP_MOTOR_ST; </p><p>  write_hz_str(6,20,"停止");</p><p>  caluate();</p><p>  b

61、reak; </p><p>  case 0xEF: </p><p>  if(buf_Direction !=CST_STEP_MOTOR_ST)</p><p><b>  {</b></p><p>  set_speed+=5;</p><p>

62、  if(set_speed>=80)</p><p>  set_speed =80;; //減速</p><p><b>  }</b></p><p>  caluate();</p><p><b>  break;</b></p><p>  cas

63、e 0xF7: </p><p>  if(buf_Direction !=CST_STEP_MOTOR_ST)</p><p><b>  {</b></p><p>  set_speed-=5;</p><p>  if(set_speed <=15)</p><p>  set

64、_speed =15; //加速 </p><p><b>  }</b></p><p>  caluate();</p><p><b>  break;</b></p><p>  default: </p><p>  break;

65、 //其它值返回 </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void isr_timer0 (void) interrupt 1 usin

66、g 1</p><p><b>  {</b></p><p>  TH0=CST_TH0; </p><p>  TL0=CST_TL0;</p><p>  step_motor_driver();</p><p><b>  }</b></p><p

67、>  void init_timer0(void)</p><p><b>  {</b></p><p>  TCON=0x00;</p><p>  TMOD=0x00;</p><p><b>  TL0=0x00;</b></p><p><b>  

68、TH0=0x00;</b></p><p>  TCON=0x00;</p><p>  // Timer 0 C/T=0,定時工作方式</p><p>  //Timer 0 M1,M0=0,1</p><p>  TMOD=0x01; //GATE=0,以運行控制位TR0 啟動定時器0 C/T=0,定時工作方式</p&

69、gt;<p>  TH0=CST_TH0; </p><p>  TL0=CST_TL0;</p><p>  TF0=0;//clear 0. count over flag.</p><p>  TR0=1;// enable TIMER0 ,start count</p><p>  ET0=1; //enable acc

70、ept interrupt</p><p><b>  }</b></p><p>  // 主控程序</p><p>  void main(void) </p><p><b>  { </b></p><p><

71、;b>  P2=0xff;</b></p><p><b>  P1=0xff;</b></p><p><b>  P0=0Xff;</b></p><p>  init_timer0();</p><p>  iniLCD();

72、 //初始化 LCD</p><p>  write_hz_str(0,18,"2013-1-7");</p><p>  write_hz_str(3,18,"步進電機仿真");</p><p>  write_hz_str(6,20,"停止");</p><p

73、>  buf_Direction=CST_STEP_MOTOR_ST;</p><p>  set_speed=60;</p><p>  step_index=3;</p><p>  EA=1; //開中斷 </p><p>  caluate();<

74、;/p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  key_Scan();</p><p><b>  }</b></p><p><b>  }</b></p>

75、<p>  2、顯示子程序的設(shè)計</p><p>  圖12 顯示程序流程圖</p><p><b>  程序如下:</b></p><p>  #include <REG51.h> </p><p>  //#include <stdio.h></p><p&g

76、t;  //#include <math.h></p><p>  #include "macro.h"</p><p>  #include "LCD_HZ.h"</p><p>  sbit E =P3^5;</p><p>  sbit RW=P3^4;</p>&l

77、t;p>  sbit RS =P3^2;</p><p>  sbit L =P3^1;//左半平面 </p><p>  sbit R =P3^0;//右半平面 </p><p>  sbit Busy=P2^7;// //忙 判斷位 </p><p>  #define LCDPAGE

78、 0xB8 //設(shè)置頁指令。</p><p>  #define LCDLINE 0x40 //設(shè)置列指令。</p><p>  //LCD判斷忙的子程序</p><p>  void chkbusy(void) //測LCD忙狀態(tài) </p><p><b>  { &

79、lt;/b></p><p>  E=1; //使能LCD</p><p>  RS=0; //讀寫指令 </p><p>  RW=1; //讀 </p><p>  P2=0xff;

80、 //讀操作前先進行一次空讀操作 ,接下來才能讀到數(shù)據(jù) </p><p>  while(!Busy); //等待,不忙退出 </p><p><b>  }</b></p><p><b>  //寫指令代碼</

81、b></p><p>  void wcode(uchar cd) //寫指令 代碼 </p><p><b>  { </b></p><p>  chkbusy(); //寫等待 </p><p> 

82、 P2=0xff; //使能LCD</p><p>  RW=0; //讀禁止 </p><p>  RS=0; //輸出 設(shè)置 </p><p>  P2=cd;

83、 //寫數(shù)據(jù)代碼 </p><p>  E=1; //以下兩句產(chǎn)生下降沿 </p><p>  E=0; </p><p><b>  }</b></p><p>  //把

84、顯示數(shù)據(jù)寫到內(nèi)存單元中 </p><p>  void wdata(uchar dat) //寫顯示數(shù)據(jù)</p><p><b>  {</b></p><p>  chkbusy(); //寫等待 </p><p>

85、;  P2=0xff; //使能LCD</p><p>  RW=0; //讀禁止 </p><p>  RS=1; //輸出 設(shè)置 </p><p>  P2=dat ^0xFF;

86、 //寫數(shù)據(jù)代碼 </p><p>  E=1; //以下兩句產(chǎn)生下降沿 </p><p>  E=0; </p><p><b>  }</b></p>

87、<p><b>  //顯示LCD程序</b></p><p>  //可以更改程序中的64變?yōu)?2就可以輸出數(shù)字了</p><p>  void disrow(uchar page,uchar col,uchar *temp)</p><p><b>  { </b></p><p>

88、<b>  uchar i;</b></p><p>  if(col<64) // 左半平面</p><p><b>  { </b></p><p><b>  L=1;R=0;</b></p>&l

89、t;p>  wcode(LCDPAGE+page); // 寫指令 頁 </p><p>  wcode(LCDLINE+col); //寫指令行 </p><p>  if((col+16)<64) //如果字在左半平

90、面顯示不了,轉(zhuǎn)到右半平面去 </p><p><b>  { </b></p><p>  for(i=0;i<16;i++) //寫字 </p><p>  wdata(*(temp+i));</p><p><b>  }</b>&

91、lt;/p><p>  else //右半平面 </p><p><b>  {</b></p><p>  for(i=0;i<64-col;i++) //減去左邊數(shù),從右半平面第一位開始顯示 </p><p

92、>  wdata(*(temp+i)); //寫字 顯示 </p><p>  L=0;R=1; //右半平面 </p><p>  wcode(LCDPAGE+page); //寫指令 頁 </p><p>

93、;  wcode(LCDLINE); //寫指令行 </p><p>  for(i=64-col;i<16;i++) //寫字右半平面 </p><p>  wdata(*(temp+i));</p><p><b>  }</b>

94、;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { </b></p><p><b>  L=0;R=1;</b></p><p>  wcode(LCDPAG

95、E+page); // 寫指令 頁 </p><p>  wcode(LCDLINE+col-64); //寫指令行 </p><p>  for(i=0;i<16;i++) //寫字 </p><p>  wdata(

96、*(temp+i)); </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //供調(diào)用子程序</b></p><p>  void display_HZ( int page, int col,uchar *temp)&

97、lt;/p><p><b>  { </b></p><p>  disrow( page, col, temp); //顯示上半字 </p><p>  disrow( page+1, col, temp+16); //顯示下半字 </p>

98、<p><b>  } </b></p><p>  ///****************************************************</p><p>  void disrow_ascii(uchar page,uchar col,uchar *temp)</p><p><b>  { &

99、lt;/b></p><p><b>  uchar i;</b></p><p>  if(col<64) // 左半平面</p><p><b>  { </b></p><p><b>  L=1

100、;R=0;</b></p><p>  wcode(LCDPAGE+page); // 寫指令 頁 </p><p>  wcode(LCDLINE+col); //寫指令行 </p><p>  if((col+8)<64)

101、 //如果字在左半平面顯示不了,轉(zhuǎn)到右半平面去 </p><p><b>  { </b></p><p>  for(i=0;i<8;i++) //寫字 </p><p>  wdata(*(temp+i));</p><p&

102、gt;<b>  }</b></p><p>  else //右半平面 </p><p><b>  {</b></p><p>  for(i=0;i<64-col;i++) //減去左邊數(shù),從右半平面第

103、一位開始顯示 </p><p>  wdata(*(temp+i)); //寫字 顯示 </p><p>  L=0;R=1; //右半平面 </p><p>  wcode(LCDPAGE+page); // 寫指令 頁 </

104、p><p>  wcode(LCDLINE); //寫指令行 </p><p>  for(i=64-col;i<8;i++) //寫字 右半平面 </p><p>  wdata(*(temp+i));</p><p><b>  

105、}</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { </b></p><p><b>  L=0;R=1;</b></p><p>  wc

106、ode(LCDPAGE+page); // 寫指令 頁 </p><p>  wcode(LCDLINE+col-64); //寫指令行 </p><p>  for(i=0;i<8;i++) //寫字 </p><p>

107、  wdata(*(temp+i)); </p><p><b>  }</b></p><p><b>  }</b></p><p>  void display_ascII( int page, int col,uchar *temp)</p><p><b>  { </b

108、></p><p>  disrow_ascii( page, col, temp); //顯示上半字 </p><p>  disrow_ascii( page+1, col, temp+8); //顯示下半字 </p><p><b>  } </b></p>

109、<p><b>  //LCD初始化 </b></p><p>  void iniLCD(void) //初始化 </p><p><b>  { </b></p><p><b>  L=1;</b></p>&l

110、t;p><b>  R=1;</b></p><p>  wcode(0x38);</p><p>  wcode(0x0f); //開顯示 設(shè)置 </p><p>  wcode(0xc0); //設(shè)置顯示

111、啟動為第一行 </p><p>  wcode(0x01); //清屏</p><p>  wcode(0x06); //畫面不動,光標(biāo)右移。</p><p><b>  }</b></p>

112、<p>  //然后應(yīng)用下面程序來索引漢字 </p><p>  void write_hz_str( int x1,int y1, uchar *point ) </p><p><b>  { </b></p><p>  signed char temp1, temp2; </p><p><b&

113、gt;  int i;</b></p><p>  int x,y,hang=0;</p><p>  int hz_cnt=0; </p><p><b>  x=x1;</b></p><p><b>  y=y1;</b></p><p>  while (

114、*point != '\0') //判斷是否顯示完成 </p><p><b>  { </b></p><p>  if (hz_cnt>=8) //應(yīng)是8,中間有字符ASCII 嗎+ 漢字則只有1個字節(jié)空間不夠?qū)憹h字所以換行</p><p>&

115、lt;b>  {</b></p><p>  hz_cnt =0;</p><p>  hang+=2; </p><p><b>  }</b></p><p>  temp1 = *point++; //取漢字數(shù)據(jù) </p><p>  if (temp1 &am

116、p;0x80) //如果是要顯示漢字 </p><p><b>  { </b></p><p>  temp2 = *point ++; </p><p>  for (i = 0; i < HZ_SIZE ; i++) //字碼中共9個漢字</p><p><b>  { </b&

117、gt;</p><p>  if ((temp1 == GB_16[i].Index[0]) && (temp2 == GB_16[i].Index[1])) //查索引 </p><p><b>  { </b></p><p>  x=x1+hang;</p><p>  y=y1+hz_cnt*16

118、;</p><p>  display_HZ(x,y, &(GB_16[i].Msk[0])); //找到,字模指針賦值 </p><p>  hz_cnt+=1;</p><p><b>  break;</b></p><p><b>  } </b></p><

119、;p><b>  } </b></p><p><b>  }</b></p><p>  else if (temp1<=127 && temp1>=32)</p><p><b>  { </b></p><p>  temp1 -=32;

120、 </p><p>  x=x1+hang;</p><p>  y=y1+hz_cnt*8;</p><p>  display_ascII(x,y, &(nAsciiDot[16*temp1])); //找到,字模指針賦值 </p><p>  hz_cnt+=1; </p><p><b&g

121、t;  } </b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  3、 H文件</b></p><p><b>  H文件見附錄</b></p><p>

122、<b>  六、整體電路圖</b></p><p><b>  七、電路仿真及調(diào)試</b></p><p>  7.1Proteus介紹</p><p>  Proteus是由Labcenter Electronics開發(fā)的功能強大的單片機仿真軟件Proteus與其他的仿真軟件相比較,在下面的優(yōu)點:</p>

123、<p>  1.能仿真模擬電路、數(shù)字電路、數(shù)?;旌想娐?;</p><p>  2.能繪制原理圖、PCB圖;</p><p>  3.幾乎包括實際中所有使用的儀器</p><p>  4.其最大的亮點在于能夠?qū)纹瑱C進行實物級的仿真。從程序的編寫,編譯到調(diào)試,目標(biāo)版的仿真一應(yīng)俱全。支持匯編語言和C語言的編程。還可配合Keil C實現(xiàn)程序的聯(lián)合調(diào)試,將Prot

124、eus中繪制的原理圖作為實際中的目標(biāo)板,而用Keil C集成環(huán)境實現(xiàn)對目標(biāo)板的控制,與實際中通過硬件仿真器對目標(biāo)板的調(diào)試幾乎完全相同,并且支持多顯示器的調(diào)試,即Proteus運行在一臺計算機上,而Keil C運行在另一臺計算機上,通過網(wǎng)絡(luò)連接實現(xiàn)遠程的調(diào)試。</p><p><b>  7.2系統(tǒng)仿真</b></p><p>  對應(yīng)的單拍正轉(zhuǎn)、雙拍正轉(zhuǎn)、單雙拍正轉(zhuǎn)種

125、情況下由虛擬示波器(OSCILLOSCOPE)采集的脈沖驅(qū)動信號,對于步進電機的控制,實際上是控制步進脈沖的個數(shù)和步進脈沖的間隔,而步進電機的間隔又可轉(zhuǎn)化為某基準延時子程序的循環(huán)次數(shù)。因此,可以很方便地用軟件來控制步進電機的運行,達到控制目的。繪制完電路圖后,將編好的程序輸入軟件內(nèi)檢查所編程序是否正確,檢查程序無誤后裝入單片機內(nèi),進行防真。仿真結(jié)果可見圖13所示。</p><p><b>  八 設(shè)計總

126、結(jié)</b></p><p>  這次課程設(shè)計根據(jù)課題要求,復(fù)習(xí)了所學(xué)的單片機和步進電機的內(nèi)容,通過查閱大量書籍、專業(yè)網(wǎng)站、論壇等,通過反復(fù)對比,采用技術(shù)較為成熟以及仿真效果的電路。在軟件設(shè)計方面,一部分參考文獻的已成程序進行修改編寫,一部分則是平時的經(jīng)驗積累,初步掌握了步進電機控制的基本原理和步進電機轉(zhuǎn)動編程的方法,步進電機作為執(zhí)行元件,是機電一體化的關(guān)鍵產(chǎn)品之一,廣泛應(yīng)用在各種自動化控制系統(tǒng)中。隨著

127、微電子和計算機技術(shù)的發(fā)展,步進電機的需求量與日增加,在各個國民經(jīng)濟領(lǐng)域仍將起到重要作用。根據(jù)課程設(shè)計的要求和自己通過參考有關(guān)資料,寫好程序流程圖,在程序流程圖的基礎(chǔ)上,根據(jù)芯片的功能寫出相應(yīng)的程序,達到能夠?qū)崿F(xiàn)所要求的功能的目的。 在寫程序時,在每條指令后都寫好注釋,以便在程序出錯的檢查過程中可以更容易查找得到。  本次課程設(shè)計重點是理論與實際的相結(jié)合,不單單只是書上的一條條分離的指令。這次實驗我們學(xué)到了有關(guān)步進電機的

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論