導航:首頁 > 源碼編譯 > 按鍵控制實驗演算法設計

按鍵控制實驗演算法設計

發布時間:2024-09-03 00:57:53

1. 跪求...基於51單片機自動跟蹤陽光太陽能熱水器控制系統的設計

對綠色能源的開發和利用是響應我國節能減排,環保政策的舉措,太陽能作為可持續,零污染,具有很高的環保價值和經濟效益,高效利用太陽能還可以有效替代部分化石能源,從而降低因石化能源燃燒導致的污染,減輕霧霾。然而農村太陽能豐富,卻沒能得到很好的利用,即便現有的發電產品對太陽能電池板也大多採用固定支架。課題對此提出了能夠跟蹤太陽方向的雲台支架,可實現太陽能電池板自動調節而始終面向光線最強的一面,提高太陽能發電的利用率。課題從雲台,電機驅動,控制器,光線感測器,液晶顯示等構成,課題成果不僅可以用到太陽能發電,還可以用到其它的向光場所,如天文觀測等具有較高的實用價值。

隨著時代的進步與科技的飛速發展,使得對能源的需求隨之增加,對不可再生能源的過度依賴[1],從而使得不可再生能源的存儲量急劇減少,一些不可再生能源(石油)被視為戰略資源,據目前統計,煤炭、石油、天然氣也會在歲月的實踐中而日趨枯竭,消耗殆盡。這些不可再生能源的產生顯然跟不上人類對其的需求,為更好的實現可持續發展,本課題提出了一種太陽追蹤的可行方案,可以大大提升對太陽能的利用,減少對不可再生資源的過度依賴。

為了解決人們對不可再生資源的過度依賴和對清潔能源的高利用率。提出設計一款零污染高效率的裝置——太陽追蹤器。通過電機,控制器,採光板光線感測器等元器件之間的相互配合,實現對太陽光照射最強的方位,實現全方位無死角跟蹤,恰巧正好急需這樣一款具有安全、環保、高效率、以及取之不盡用之不竭的特點,也很方便就可以獲取,如風能和潮汐能一樣是絕對的無污染清潔能源,這也就很好的闡述了光能的可行性[2]。——對此提出太陽跟蹤裝置設計與製作。

優點:太陽作為一個取之不盡用之不竭的能源。在《太陽能利用技術》[3]就有相關的提到,所到達地球表面能量等同於每秒向地球源源不斷的投放了500萬噸煤炭。陽光所到之處,皆為財富,免費使用的同時也不需要考慮任何的運輸費用以及零污染等特性。

缺點:即便如此的看似完美無缺,也存在著兩個致命性缺點[4]:一是能流密度很小;二是太陽的光照強度也會因為(天氣、白夜等)因素的不同而有著很大的差距,很難長時間維持在恆定值,這也在一定程度上大大的影響了使用效率[5]。

國外太陽追蹤器:對太陽能的使用在兩千零四年到兩千零六年太陽能的發電量都是驚人的4961MW[6],在一九九七年,美國的Blackace研製了單軸追蹤器,熱接收率提高了百分之十五......,後期圍繞高效率,輕質量展開。在太陽能遊艇、太陽能飛機、太陽能瓦片等方面得到運用,也見證了太陽能利用的高效率性[7]。

國內太陽追蹤器:在應用市場上面得到了不斷擴張,對於太陽能追蹤器的利用那也是一個相當熱門的談話主題,途徑多年的經驗,將其用在了太陽能熱水器、太陽能路燈以及西部計劃、利用太陽能發電、太陽能供暖等等[8]。

更多的往往是採用單軸跟蹤的方式,相比之下更需要多軸,實現全方位無死角跟蹤。

針對不同條件下,提出了自動控制和手動調節的兩種工作方式:

其中以「自動模式」概述:在自動追尋的過程中,會自動判斷光的強度的大小,若下面光照強度大於上面光照強度,STM32單片機就會直接驅動上端電機向下翻轉;以便於在下午太陽西落的時候,獲得更多的光照,若上面光照強度大於下面光照強度,STM32單片機就會直接驅動上端步進電機向上運動;若上下兩個方位的光照強度均等,上端步進電機不進行動作。在上下光照均勻,左右方向運動的情況,右方位的光照強度大於左方位,STM32單片機就直接驅動下方位第一個步進電機向左方位一定角度轉動;若左方位的光照強度大於右方位的光照強度,STM32單片機就直接驅動下方位第一個步進電機向左方位進行運動;當左右方位採光度也保持幾乎均應的時候光照,那麼下方位的第一個電機也將保持不動。
「手動模式」狀態進行使用按鍵手動來完成設備狀態的切換。四個按鍵對應控制電機完成:上、下、左、右的翻轉動作。通過點動的方式來控制驅動步進電機的實際運動。
在給設備系統進行上電後,系統最初為「自動模式」,這樣可以更好的在不受人為干預的情況下實現對太陽能的最大接收。
編譯語言的選取

方案一:C語言

簡潔緊湊、靈活方便;運算符的豐富性;數據結構的豐富性;結構式語言;語法局限性小,程序編寫自由度大;通過對物理地址的直接訪問,使得完全可以對硬體實現直接控制;程序執行效率高。

C語言面向過程,最主要的在於演算法和數據結構。通過一個過程,對輸入進行運算處理得到輸出。

方案二:C++

C++語言是面向對象的語言,在C的基礎上添加了面向對象、模板等現在程序設計語言的特性。拓展了面向對象設計的內容,使之更加符合現代程序設計的需要。

看似C++比C多了很多優點和特性,但C++並不是所有場合都適用,很多嵌入式開發系統,都只提供了C語言的開發環境,而沒有提供C++的開發環境。很多C++語言不願意乾的臟活累活,C語言干起來快活得很。而C++因為過於復雜,在這方面就稍遜一籌了。

方案三:java

Java是一種解釋性語言,Java人氣極高,但其代碼由於需要在運行前進行解釋因此性能表現更差。C++會被編譯為二進制形式,因此其能夠立即運行且速度更快。兩個程序都足夠大、而且C++的代碼經過優化,兩者的速度差就會變得很顯著甚至很驚人,C++會比java快很多。

從系統的復雜性出發來考慮,同時整個過程的計算量比較大,因此我選用了浮點數的計算方式,選用方案一作為整個系統編譯方式。

2.2 控制系統總體方案選取

方案一:視日尋跡追蹤模式

這樣的一種模式,是基於天文學公式來得出太陽在不同時候的理論性的方位角和俯仰角,在後根據太陽每天在當地實際的運行軌跡位置編寫控制演算法程序,通過使用控制演算法的方式來實現對太陽所在位置的計算,最後通過驅動太陽能板的兩個步進電機來達到俯仰和方位上的轉動。有點是對外界環境的依賴小,同是也存在弊端,那就是不管外界環境是何種天氣,它都會以同樣的工作方式運動,增加了不必要的能耗和元器件的壽命磨損。

太陽的俯仰角h和方位角A的兩個位置參數,可表達如下所示:

δ為赤緯角,Φ是本地緯度,Ω表示太陽時角。

方案二:光電追蹤模式

該模式的核心演算法是利用光敏感測器對太陽位置進行檢測。具體方法:在遮陽板兩側完全對稱地安裝光敏感測器,當太陽光垂直照射在太陽能光伏電池板上時,安裝在兩側上的光敏感測器所產生的電信號相等,將這兩路信號經過放大後送入比較器進行比較,此時不驅動步進電機進行轉動。當太陽位置移動後,遮陽板對陽光進行遮擋,此時兩側的光敏感測器產生的電信號不相等,從而經過放大比較後產生差信號,電機開始運動,完成太陽跟蹤過程。

通過兩者的比較,選擇方案二,簡單易操作性,更適合被普及廣泛使用,在同等使用條件下,最簡方案,則是最優方案。

2.3主控系統選擇

方案一:51單片機作為控制晶元。主要是表現在:主要控制參數是使用設置寄存器變數得以實現,在程序的修改方面,也是相當的方便快捷,成本也是相對低廉,性能與相對簡單的太陽能跟蹤裝置系統匹配;數字化的控制系統,可以達到較高的精度。

方案二:採用FPGA這樣的大規模可編程邏輯器件,但本題屬於控制類,即現場可編程門陣列[WJ1] ,它是在PAL、EPLD等可編程器件的基礎上進-一步發展的產物。

方案三:ARM作為一種高性能嵌入式系統。考慮到方案的可實行性,STM32可以很好的解決數據處理和控制功能,十分適用於太陽能跟蹤,雖是ARM價格昂貴,但是在後期的可拓展空間更大。[WJ2]

結合本次設計的任務要求,以及上訴三種方案的相對比較,最後選用方案三更適合本課題的設計標准,具體採用STM32F103C8T6。

2.4電機選擇

方案一:選擇步進電機,然而步進電機的最大優點就是可以精確地控制電機步數和角度,缺點是價格昂貴。

方案二:選擇直流電機。價格便宜是它的一大亮點,通過減速齒可以提高扭力,具有更大的負載,但是對電機的高精度控制直流電機達不到設計要求。

步進電機作為一種將電脈沖轉換成相應角位移或線位移的電磁機械裝置。通過直接控制輸入的脈沖數量,直接控制其啟停,啟動是速度快,步距角和轉速只取決於脈沖頻率,受外界影響因素小。因此,對於本設計任務要求,為更精確地完成對角度值的精度把控,更好地利用太陽能,因此我選用方案一作為本次課程設計的驅動電機。

2.5步進電機驅動系統選擇

方案一:L298專業電機驅動模塊的選擇,這類驅動模塊的操作方便以及介面簡單同時他們既可以驅動步進電機,也可驅動直流電機。

方案二:三極體等分立元件搭H橋。亮點在於實惠型,控制方式簡單以及結構簡單。優點的同時也伴隨著弊端的存在,電流的承載能力比較小,相同的驅動能力受到限制,分立元件則體積較大同時穩定性也得不到保證。

方案三:採用集成晶元,ULN2003。 .

達林頓管ULN2003,該晶元最多可一次驅動八塊步進電機,本設計作用於兩個步進電機,在實際的使用中,往往起著放點輸出的作用用於驅動大負載的步進電機等。

本次設計綜合考慮,依據實際設計需求,選擇方案三作為步進電機的驅動系統。

2.6實體結構框架選擇

方案一:兩電機互相處以垂直狀態,電機一是左右的轉動而電機二是上下的轉動,在不引入外界條件輔助設備的情況下會出現運動死角,從成本化出發是不可取的。

方案二:將兩個電機由之前的垂直安裝,改變為大於90°的安裝,在不引入外部設備的情況下,可以很好的避開運動死角,從而可實現全方位無死角跟蹤,綜合上述情況選擇方案二進行本次的實體結構設計。

2.2系統設計

2.2.1 單片機構成如下圖:

邏輯不通順,要指出FPGA不適用於本題的缺點

STM32整體比FPGA便宜很多,這條論證建議修改,或者做一個成本對比表再下結論

控制方式:第一步就是將數據程序輸入到輸入設備裡面,輸入設備將程序傳輸給運算器CPU和存儲器,各自程序都對應的傳輸到控制器裡面,由控制器完成完成相互的指令傳遞,最後都是作用於輸出設備,在輸出設備上顯示出來的結果就是最初程序所要表達的效果。

2.2.2 系統整體控制框圖如下:

圖2–2–2 系統整體控制框圖

控制方式:完成整個驅動控制,第一步就是感光元件及光敏電阻感測器對外界光的採集,完成電壓跟隨,通過A/D轉換,然後通過電壓的比較,使用STM32F103C8T6單片機控制電機的驅動,最終完成不同電機在不同的光照強度情況下不同方向的運動,最後實現對光的最大化接收。

2.2.3 電機控制框圖如下:

圖2–2–3 電機控制框圖

控制方式:通過光敏感測器對光的採集,實現了最後對電機運動方式的不同選擇和控制。

當感光元器件第一組接受到的光照強度值大於其它三個方位的光照強度時,那麼電機完成水平方向的電機正轉,並返回最初狀態。
當感光元器件第二組接受到的光照強度值大於其它三個方位的光照強度時,那麼電機完成水平方向的電機反轉,並返回最初狀態。
當感光元器件第三組接受到的光照強度值大於其它三個方位的光照強度時,那麼電機完成垂直方向的電機正轉,並返回最初狀態。
當感光元器件第四組接受到的光照強度值大於其它三個方位的光照強度時,那麼電機完成垂直方向的電機反正,並返回最初狀態。
當所有的感光元器件都處於接受管的均勻照射時,此時的光照強度幾乎大小相等,也就電機的狀態保持不運動。

2.2.4整體電路原理圖如下:

圖2-2-4 整體電路原理圖

系統軟體總體設計流程如圖 2-2-4 所示。系統啟動後,軟體先進行初始化等工作,當程序初始化完成後,通過 感光元器件獲得當前的光照強度,然後根據初始化的參數,控制步進電機將太陽能光伏板轉動到理論的初始狀態,預定方位。將太陽能光伏板轉動到理論位置後,程序開始判斷步進電機轉動模式是手動模式還是自動,初始默認狀態是自動跟蹤模式。

當手動模式時,人為調整電機控制上下左右 4 個按鍵的狀態,使得電機按照人們預想的方向進行運動,以此來得以控制四個方位的不同垂直轉動和水平移動的俯仰角和方位角。當程序判斷為自動模式後,開始自動讀取檢測電路的返回信號,當檢測到是各個方位的光照強度值有較大的的差異是,那麼單片機就發出控制指令控制步進電機進行轉動,升壓模塊是為了給整個系統穩定供電而存在。

2. 單片機直流電機調速系統設計

論文題目:直流電動機調速器硬體設計
專業:自動化
本科生:劉小煜 (簽名)____
指導教師:胡曉東 (簽名)____

直流電動機調速器硬體設計
摘 要

直流電動機廣泛應用於各種場合,為使機械設備以合理速度進行工作則需要對直流電機進行調速。該實驗中搭建了基於C8051F020單片機的轉速單閉環調速系統,利用PWM信號改變電動機電樞電壓,並由軟體完成轉速單閉環PI控制,旨在實現直流電動機的平滑調速,並對PI控制原理及其參數的確定進行更深的理解。實驗結果顯示,控制8位PWM信號輸出可平滑改變電動機電樞電壓,實現電動機升速、降速及反轉等功能。實驗中使用霍爾元件進行電動機轉速的檢測、反饋。期望轉速則可通過功能按鍵給定。當選擇比例參數為0.08、積分參數為0.01時,電機轉速可以在3秒左右達到穩定。由實驗結果知,該單閉環調速系統可對直流電機進行調速,達到預期效果。

關鍵字:直流電機, C8051F020,PWM,調速,數字式

Subject: Hardware Design of Speed Regulator for DC motor
Major: Automation
Name: Xiao yu Liu (Signature)____
Instructor:Xiao dong Hu (Signature) ____

Hardware Design of Speed Regulator for DC motor
Abstract

The dc motor is a widely used machine in various occasions.The speed regulaiting systerm is used to satisfy the requirement that the speed of dc motor be controlled over a range in some applications. In this experiment,the digital Close-loop control systerm is based on C8051F020 SCM.It used PI regulator and PWM to regulate the speed of dc motor. The method of speed regulating of dc motor is discussed in this paper and, make a deep understanding about PI regulator.According to experiment ,the armature voltage can be controlled linearnized with regulating the 8 bit PWM.So the dc motor can accelerate or decelerate or reverse.In experiment, hall component is used as a detector and feed back the speed .The expecting speed can be given by key-press.With using the PI regulator,the dc motor will have a stable speed in ten seconds when choose P value as 0.8 and I value as 0.01. At last,the experiment shows that the speed regulating systerm can work as expected.

Key words: dc motor,C8051F020,PWM,speed regulating,digital

目錄

第一章 緒論 1
1.1直流調速系統發展概況 1
1.2 國內外發展概況 2
1.2.1 國內發展概況 2
1.2.2 國外發展概況 3
1.2.3 總結 4
1.3 本課題研究目的及意義 4
1.4 論文主要研究內容 4
第二章 直流電動機調速器工作原理 6
2.1 直流電機調速方法及原理 6
2.2直流電機PWM(脈寬調制)調速工作原理 7
2.3 轉速負反饋單閉環直流調速系統原理 11
2.3.1 單閉環直流調速系統的組成 11
2.3.2速度負反饋單閉環系統的靜特性 12
2.3.3轉速負反饋單閉環系統的基本特徵 13
2.3.4轉速負反饋單閉環系統的局限性 14
2.4 採用PI調節器的單閉環無靜差調速系統 15
2.5 數字式轉速負反饋單閉環系統原理 17
2.5.1原理框圖 17
2.5.2 數字式PI調節器設計原理 18
第三章 直流電動機調速器硬體設計 20
3.1 系統硬體設計總體方案及框圖 20
3.1.1系統硬體設計總體方案 20
3.1.2 總體框圖 20
3.2 系統硬體設計 20
3.2.1 C8051F020單片機 20
3.2.1.1 單片機簡介 20
3.2.1.2 使用可編程定時器/計數器陣列獲得8位PWM信號 23
3.2.1.3 單片機埠配置 23
3.2.2主電路 25
3.2.3 LED顯示電路 26
3.2.4 按鍵控制電路 27
3.2.5 轉速檢測、反饋電路 28
3.2.6 12V電源電路 30
3.3硬體設計總結 31
第四章 實驗運行結果及討論 32
4.1 實驗條件及運行結果 32
4.1.1 開環系統運行結果 32
4.1.2 單閉環系統運行結果 32
4.2 結果分析及討論 32
4.3 實驗中遇到的問題及討論 33
結論 34
致謝 35
參考文獻 36
論文小結 38
附錄1 直流電動機調速器硬體設計電路圖 39
附錄2 直流電動機控制系統程序清單 42
附錄3 硬體實物圖 57

第一章 緒論
1.1直流調速系統發展概況
在現代工業中,電動機作為電能轉換的傳動裝置被廣泛應用於機械、冶金、石油化學、國防等工業部門中,隨著對生產工藝、產品質量的要求不斷提高和產量的增長,越來越多的生產機械要求能實現自動調速。
在可調速傳動系統中,按照傳動電動機的類型來分,可分為兩大類:直流調速系統和交流調速系統。交流電動機直流具有結構簡單、價格低廉、維修簡便、轉動慣量小等優點,但主要缺點為調速較為困難。相比之下,直流電動機雖然存在結構復雜、價格較高、維修麻煩等缺點,但由於具有較大的起動轉矩和良好的起、制動性能以及易於在寬范圍內實現平滑調速,因此直流調速系統至今仍是自動調速系統的主要形式。
直流調速系統的發展得力於微電子技術、電力電子技術、感測器技術、永磁材料技術、自動控制技術和微機應用技術的最新發展成就。正是這些技術的進步使直流調速系統發生翻天覆地的變化。其中電機的控制部分已經由模擬控制逐漸讓位於以單片機為主的微處理器控制,形成數字與模擬的混合控制系統和純數字控制系統,並正向全數字控制方向快速發展。電動機的驅動部分所用的功率器件亦經歷了幾次更新換代。目前開關速度更快、控制更容易的全控型功率器件MOSFET和IGBT成為主流。功率器件控制條件的變化和微電子技術的使用也使新型的電動機控制方法能夠得到實現。脈寬調制控制方法在直流調速中獲得了廣泛的應用。
1964年A.Schonung和H.stemmler首先提出把PWM技術應用到電機傳動中從此為電機傳動的推廣應用開辟了新的局面。進入70年代以來,體積小、耗電少、成本低、速度快、功能強、可靠性高的大規模集成電路微處理器已經商品化,把電機控制推上了一個嶄新的階段,以微處理器為核心的數字控制(簡稱微機數字控制)成為現代電氣傳動系統控制器的主要形式。PWM常取代數模轉換器(DAC)用於功率輸出控制,其中,直流電機的速度控制是最常見的應用。通常PWM配合橋式驅動電路實現直流電機調速,非常簡單,且調速范圍大。在直流電動機的控制中,主要使用定頻調寬法。
目前,電機調速控制模塊主要有以下三種:
(1)、採用電阻網路或數字電位器調整直流電機的分壓,從而達到調速的目的;
(2)、採用繼電器對直流電機的開或關進行控制,通過開關的切換對電機的速度進行調整;
(3)、採用由IGBT管組成的H型PWM電路。用單片機控制IGBT管使之工作在占空比可調的開關狀態,精確調整電動機轉速。
1.2 國內外發展概況
1.2.1 國內發展概況
我國從六十年代初試製成功第一隻硅晶閘管以來,晶閘管直流調速系統開始得到迅速的發展和廣泛的應用。用於中、小功率的 0.4~200KW晶閘管直流調速裝置已作為標准化、系列化通用產品批量生產。
目前,全國各大專院校、科研單位和廠家都在進行數字式直流調速系統的開發,提出了許多關於直流調速系統的控制演算法:
(1)、直流電動機及直流調速系統的參數辯識的方法。該方法據系統或環節的輸入輸出特性,應用最小二乘法,即可獲得系統環節的內部參數。所獲得的參數具有較高的精度,方法簡便易行。
(2)、直流電動機調速系統的內模控制方法。該方法依據內模控制原理,針對雙閉環直流電動機調速系統設計了一種內模控制器,取代常規的PI調節器,成功解決了轉速超調問題,能使系統獲得優良的動態和靜態性能,而且設計方法簡單,控制器容易實現。
(3)、單神經元自適應智能控制的方法。該方法針對直流傳動系統的特點,提出了單神經元自適應智能控制策略。這種單神經元自適應智能控制系統不僅具有良好的靜、動態性能,而且還具有令人滿意的魯棒性與自適應性。
(4)、模糊控制方法。該方法對模糊控制理論在小慣性系統上對其應用進行了嘗試。經1.5kw電機實驗證明,模糊控制理論可以用於直流並勵電動機的限流起動和恆速運行控制,並能獲得理想的控制曲線。
上訴的控制方法僅是直流電機調速系統應用和研究的一個側面,國內外還有許多學者對此進行了不同程度的研究。
1.2.2 國外發展概況
隨著各種微處理器的出現和發展,國外對直流電機的數字控制調速系統的研究也在不斷發展和完善,尤其80年代在這方面的研究達到空前的繁榮。大型直流電機的調速系統一般採用晶閘管整流來實現,為了提高調速系統的性能,研究工作者對晶閘管觸發脈沖的控制演算法作了大量研究,提出了內模控制演算法、I-P控制器取代PI調節器的方法、自適應和模糊PID演算法等等。
目前,國外主要的電氣公司,如瑞典ABB公司,德國西門子公司、AEG公司,日本三菱公司、東芝公司、美國GE公司等,均已開發出數字式直流調裝置,有成熟的系列化、標准化、模版化的應用產品供選用。如西門子公司生產的SIMOREG-K 6RA24 系列整流裝置為三相交流電源直接供電的全數字控制裝置,其結構緊湊,用於直流電機電樞和勵磁供電,完成調速任務。設計電流范圍為15A至1200A,並可通過並聯SITOR可控硅單元進行擴展。根據不同的應用場合,可選擇單象限或四象限運行的裝置,裝置本身帶有參數設定單元,不需要其它任何附加設備便可以完成參數設定。所有控制調節監控及附加功能都由微處理器來實現,可選擇給定值和反饋值為數字量或模擬量。
1.2.3 總結
隨著生產技術的發展,對直流電氣傳動在起制動、正反轉以及調速精度、調速范圍、靜態特性、動態響應等方面都提出了更高的要求,這就要求大量使用直流調速系統。因此人們對直流調速系統的研究將會更深一步。
1.3 本課題研究目的及意義
直流電動機是最早出現的電動機,也是最早實現調速的電動機。長期以來,直流電動機一直占據著調速控制的統治地位。由於它具有良好的線性調速特性,簡單的控制性能,高效率,優異的動態特性,現在仍是大多數調速控制電動機的最優選擇。因此研究直流電機的速度控制,有著非常重要的意義。
隨著單片機的發展,數字化直流PWM調速系統在工業上得到了廣泛的應用,控制方法也日益成熟。它對單片機的要求是:具有足夠快的速度;有PWM口,用於自動產生PWM波;有捕捉功能,用於測頻;有A/D轉換器、用來對電動機的輸出轉速、輸出電壓和電流的模擬量進行模/數轉換;有各種同步串列介面、足夠的內部ROM和RAM,以減小控制系統的無力尺寸;有看門狗、電源管理功能等。因此該實驗中選用Cygnal公司的單片機C8051F020。
通過設計基於C8051F020單片機的直流PWM調速系統並調試得出結論,在掌握C8051F020的同時進一步加深對直流電動機調速方法、PI控制器的理解,對運動控制的相關知識進行鞏固。
1.4 論文主要研究內容
本課題的研究對象為直流電動機,對其轉速進行控制。基本思想是利用C8051F020自帶的PWM口,通過調整PWM的占空比,控制電機的電樞電壓,進而控制轉速。
系統硬體設計為:以C8051F020為核心,由轉速環、顯示、按鍵控制等電路組成。
具體內容如下:
(1)、介紹直流電動機工作原理及PWM調速方法。
(2)、完成以C8051F020為控制核心的直流電機數字控制系統硬體設計。
(3)、以該系統的特點為基礎進行分析,使用PWM控制電機調速,並由實驗得到合適的PI控制及相關參數。
(4)、對該數字式直流電動機調速系統的性能做出總結。

第二章 直流電動機調速器工作原理
2.1 直流電機調速方法及原理
直流電動機的轉速和各參量的關系可用下式表示:

由上式可以看出,要想改變直流電機的轉速,即調速,可有三種不同的方式:調節電樞供電電壓U,改變電樞迴路電阻R,調節勵磁磁通Φ。
3種調速方式的比較表2-1所示.
表2-1 3種電動機調速方式對比
調速方式和方法 控制裝置 調速范圍 轉速變化率 平滑性 動態性能 恆轉矩或恆功 率 效率
改變電樞電阻 串電樞電阻 變阻器或接觸器、電阻器 2:1 低速時大 用變阻器較好
用接觸器、電阻器較差 無自動調節能力 恆轉矩 低
改變電樞電壓 電動機-發電機組 發電機組或電機擴大機(磁放大器) 10:1~20:1 小 好 較好 恆轉矩 60%~70%
靜止變流器 晶閘管變流器 50:1~100:1 小 好 好 恆轉矩 80%~90%
直流脈沖調寬 晶體管或晶閘管直流開關電路 50:1~100:1 小 好 好 恆轉矩 80%~90%
改變磁通 串聯電阻或可變直流電源 直流電源變阻器 3:1

5:1 較大 差 差 恆功率 80%~90%
電機擴大機或磁放大器 好 較好
晶閘管變流器 好

由表2-1知,對於要求在一定范圍內無級平滑調速的系統來說,以調節電樞供電電壓的方式為最佳,而變電樞電壓調速方法亦是應用最廣的調速方法。
2.2直流電機PWM(脈寬調制)調速工作原理
在直流調速系統中,開關放大器提供驅動電機所需要的電壓和電流,通過改變加在電動機上的電壓的平均值來控制電機的運轉。在開關放大器中,常採用晶體管作為開關器件,晶體管如同開關一樣,總是處在接通和斷開的狀態。在晶體管處在接通時,其上的壓降可以略去;當晶體管處在斷開時,其上的壓降很大,但是電流為零,所以不論晶體管導通還是關斷,輸出晶體管中的功耗都是很小的。一種比較簡單的開關放大器是按照一個固定的頻率去接通和斷開放大器,並根據需要改變一個周期內「接通」和「斷開」的相位寬窄,這樣的放大器被稱為脈沖調制放大器。
PWM脈沖寬度調制技術就是通過對一系列脈沖的寬度進行調制,來等效地獲得獲得所需要波形(含形狀和幅值)的技術。
根據PWM控制技術的特點,到目前為止主要有八類方法:相電壓控制PWM、線電壓控制PWM、電流控制PWM、非線性控制PWM,諧振軟開關PWM、矢量控制PWM、直接轉矩控制PWM、空間電壓矢量控制PWM。
利用開關管對直流電動機進行PWM調速控制原理圖及輸入輸出電壓波形如圖2-1、圖2-2所示。當開關管MOSFET的柵極輸入高電平時,開關管導通,直流電動機電樞繞組兩端由電壓。秒後,柵極輸入變為低電平,開關管截止,電動機電樞兩端電壓為0。秒後,柵極輸入重新變為高電平,開關管的動作重復前面的過程。這樣,對應著輸入的電平高低,直流電動機電樞繞組兩端的電壓波形如圖2-2所示。電動機的電樞繞組兩端的電壓平均值為:

式2-1

式中 ——占空比,
占空比表示了在一個周期里,開關管導通的時間與周期的比值。的變化范圍為0≤≤1。由式2-1可知,當電源電壓不變的情況下,電樞的端電壓的平均值取決於占空比的大小,改變值就可以改變端電壓的平均值,從而達到調速的目的,這就是PWM調速原理。
在PWM調速時,占空比是一個重要參數。以下是三種可改變占空比的方法:
(1)、定寬調頻法:保持不變,改變,從而改變周期(或頻率)。
(2)、調寬調頻法:保持不變,改變,從而改變周期(或頻率)。
(3)、定頻調寬法:保持周期(或頻率)不變,同時改變、。
前2種方法由於在調速時改變了控制脈沖的周期(或頻率),當控制脈沖的頻率與系統的固有頻率接近時,將會引起振盪,因此應用較少。目前,在直流電動機的控制中,主要使用第3種方法。

圖2-1 PWM調速控制原理

圖2-2 輸入輸出電壓波形
產生PWM控制信號的方法有4種,分別為:
(1)、分立電子元件組成的PWM信號發生器
這種方法是用分立的邏輯電子元件組成PWM信號電路。它是最早期的方式,現在已經被淘汰了。
(2)、軟體模擬法
利用單片機的一個I/O引腳,通過軟體對該引腳不斷地輸出高低電平來實現PWM信號輸出。這種方法要佔用CPU大量時間,需要很高的單片機性能,易於實現,目前也逐漸被淘汰。
(3)、專用PWM集成電路
從PWM控制技術出現之日起,就有晶元製造商生產專用的PWM集成電路晶元,現在市場上已有許多種。這些晶元除了由PWM信號發生功能外,還有「死區」調節功能、保護功能等。在單片機控制直流電動機系統中,使用專用PWM集成電路可以減輕單片機負擔,工作也更可靠。
(4)、單片機PWM口
新一代的單片機增加了許多功能,其中包括PWM功能。單片機通過初始化設置,使其能自動地發出PWM脈沖波,只能在改變占空比時CPU才進行干預。
其中常用後兩中方法獲得PWM信號。實驗中使用方法(4)獲得PWM信號。
2.3 轉速負反饋單閉環直流調速系統原理
2.3.1 單閉環直流調速系統的組成
只通過改變觸發或驅動電路的控制電壓來改變功率變換電路的輸出平均電壓,達到調節電動機轉速的目的,稱為開環調速系統。但開環直流調速系統具有局限性:
(1)、通過控制可調直流電源的輸入信號,可以連續調節直流電動機的電樞電壓,實現直流電動機的平滑無極調速,但是,在啟動或大范圍階躍升速時,電樞電流可能遠遠超過電機額定電流,可能會損壞電動機,也會使直流可調電源因過流而燒毀。因此必須設法限制電樞動態電流的幅值。
(2)、開環系統的額定速降一般都比較大,使得開環系統的調速范圍D都很小,對於大部分需要調速的生產機械都無法滿足要求。因此必須採用閉環反饋控制的方法減小額定動態速降,以增大調速范圍。
(3)、開環系統對於負載擾動是有靜差的。必須採用閉環反饋控制消除擾動靜差
為克服其缺點,提高系統的控制質量,必須採用帶有負反饋的閉環系統,方框圖如圖2-3所示。在閉環系統中,把系統輸出量通過檢測裝置(感測器)引向系統的輸入端,與系統的輸入量進行比較,從而得到反饋量與輸入量之間的偏差信號。利用此偏差信號通過控制器(調節器)產生控製作用,自動糾正偏差。因此,帶輸出量負反饋的閉環控制系統能提高系統抗擾性,改善控制精度的性能,廣泛用於各類自動調節系統中。

3. C語言課程設計,貪吃蛇應該怎麼做

2.1程序功能介紹

貪吃蛇游戲是一個經典小游戲,一條蛇在封閉圍牆里,圍牆里隨機出現一個食物,通過按鍵盤四個游標鍵控制蛇向上下左右四個方向移動,蛇頭撞倒食物,則食物被吃掉,蛇身體長一節,同時記10分,接著又出現食物,等待蛇來吃,如果蛇在移動中撞到牆或身體交叉蛇頭撞倒自己身體游戲結束。

2.2程序整體設計說明

一個游戲要有開始部分,運行部分,結束部分(實際上開始部分與運行部分是一體的)。

2.2.1設計思路

這個程序的關鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示。移動時必須從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當前方向上前移,當游戲者按了有效的方向鍵後,蛇頭朝著指定的方向移動,一步移動一節身體,所以當按了有效的方向鍵後,先確定蛇頭的位置,然後蛇身體隨著蛇頭移動,圖形的實現是從蛇頭的新位置開始畫出蛇,這時由於沒有慶平的原因,原來蛇的位置和新蛇的位置差一個單位,所以看起來社會多一節身體,所以將蛇的最後一節用背景色覆蓋。食物的出現和消失也是畫矩形塊和覆蓋矩形塊

2.2.2數據結構設計及用法說明

開始部分:

游戲是運行在圖形模式下的,所以第一步一定是初始化圖形模式,接著要有開始的界面,就像書有封面一樣,我設置了一個游戲的標題畫面,除了游戲標題畫面我還設置了一個歡迎畫面。標題畫面以後,還要為游戲的運行部分作初始化,包括繪制游戲運行時的背景,對游戲某些重 要變數的初始化。

運行部分:

作為游戲的核心部分,這里包括的函數比較多,也就是模塊比較多,首先讓我模擬一下貪吃蛇的游戲模式:某個世界上突然出現一條蛇,它很短,它的運動神經異常,它沒法停止自己的多動症在它的世界裡就只有食物,它很餓,也很貪吃;同樣在不明原因的情況下,食物從天而降,可惜的是沒有落到嘴邊;飢餓的主人公,不管它有沒有毒,也不問食物的來歷,徑直向食物爬去;它吃到食物啦,它超出想像的同化能力讓食物很快的成為自己身體的一部分,它的身子變長啦。當它吃到第一顆食物時,上帝有給它第二顆,於是它吃了第二顆,於是又變長了,於是又有第三顆??它的身子是一直的加長,它不管自己過長身體的麻煩——轉身不便,繼續吃下去,現在它是直接把巴張大,好讓食物有個綠色通道。但是在某天的下午,它咬到了自己,它才想起自己是一條毒蛇,於是暈死過去(不是毒死);又或者它往食物沖鋒的時候,它失去控制,撞到了牆上。

第一輪循環:第一步,出現食物;第二步,蛇不停運動;第三步,檢查蛇是撞到自己或牆壁;由第四步起游戲有兩條支線(A、B):

A :第四步,蛇沒有碰到自己或牆壁,蛇繼續前進,繪制蛇的動作;第五步,判斷蛇是否吃到食物,如果蛇吃到食物,身子變長,原來的食物消失;第六步,讓玩家輸入控制指令,讓蛇在下一輪循環的第二步改變運動方向;第七步,第二輪循環的第一步,重復第一輪的步驟;

B:第四步,蛇碰到自己或牆壁,終止游戲。

結束部分:

游戲結束時,顯示「GAME OVER」,已經是約定俗成的規律了,我的游戲也不例外。除了游戲結束畫面外,我還設置了一個游戲退出畫面,「善始善終」嘛。

有了上述的大致劃分,我把整個程序劃分成(13+2)個模塊(其實就是函數)

2.2.3程序結構(流程圖)

圖2.1流程圖

依據所需要處理的任務要求,規劃輸入數據和輸出結果,決定存放數據的數據結構。

C語言中數據結構集中體現在數據類型上,因此在進行C語言程序設計時,應統籌規劃程序中所使用的變數,數組,指針等,以及它們的類型等。這點是很重要的,如果在此期間選擇不合適的變數或者數組,將來修改就十分困難。

現在分析一下貪吃蛇游戲中的元素,繼而得出與它們對應的在程序中的描述:

蛇:

基本描述:長度,顏色,位置。

對應數據與數據類型:長度—雖然可以用坐標表示,但是這樣的話,運算量將很大,所以換算成較大的單位—節數,以固定長度的每節描述;坐標--整型;顏色--整型; 位置--X,Y坐標。

增加的描述:蛇運動的方向,蛇的生命。

對應數據與數據類型:這些描述是為了與程序的按鍵的輸入部分與判斷游戲結束部分相聯系而設的。方向只有四個方向:上下左右。可以設置與之對應的四個整型數:3、4、2、1。生命就只有兩種情況:死或生,對應0或1。

食物:

基本描述:顏色,位置。

對應數據與數據類型:由於顏色設成固定的,所以不再討論。位置—X、Y坐標。

增加的描述:食物的存在。

對應數據與數據類型:這是為了避免重復出現食物而設置的,與繪制食物的函數有聯系。只有兩個值:0或1(沒有食物或有食物)

其他的元素:牆,由於它在顯示上是作為背景而存在的,所以並沒有什麼說明實際的牆壁就是四條直線組成的邊框,由坐標描述。

還需要的變數:鍵盤鍵入的鍵值(作為全局變數,整型);經常要使用的循環變數;自定義的填充圖案;說明文字的字元數組;游戲的記分;游戲的速度(蛇的速度)。

圖2.2蛇的不停運動的關鍵演算法的流程圖

2.2.4各模塊的功能及程序說明

主要模塊的實現思路和演算法的流程圖說明:

關鍵所在——蛇不停移動的Snakemove():

蛇的不停移動,就是蛇的下一節取代前一節的位置,在計算機中就是蛇下一節的位置坐標變成前一節的位置坐標。在上文中,已定義蛇的位置坐標為數組類型,一組坐標對應一節的位置,假設有i+1節,由0到i節,第i節的坐標取第i-1節的坐標,第i-1節的坐標取第i-2節的坐標??直到第1節取第0節的坐標。而第0節的坐標,即蛇頭的坐標要往某個方向變化,變化量為蛇每節的長度。蛇的這種坐標輪換需要循環語句使其繼續下去。

2.2.5程序結果

運行程序得到如下初始界面圖:

圖2.3程序結果圖

用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示:

圖2.4程序結果圖

蛇沒有碰到自己或牆壁,蛇繼續前進:

圖2.5程序結果圖

游戲結束時,顯示「GAME OVER」

圖2.6程序結果圖

2.3程序源代碼及注釋

#define N 200

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

int gamespeed=50000;/*游戲速度自己調整*/

struct Food{

int x;/*食物的橫坐標*/

int y;/*食物的縱坐標*/

int yes;/*判斷是否要出現食物的變數*/

}food;/*食物的結構體*/

struct Snake{

int x[N];

int y[N];

int node;/*蛇的節數*/

int direction;/*蛇移動方向*/

int life;/* 蛇的生命,0活著,1死亡*/

}snake;

void Init(void);/*圖形驅動*/

void Close(void);/*圖形結束*/

void DrawK(void);/*開始畫面*/

void GameOver(void);/*結束游戲*/

void GamePlay(void);/*玩游戲具體過程*/

void PrScore(void);/*輸出成績*/

/*主函數*/

void main(void){

Init();/*圖形驅動*/

DrawK();/*開始畫面*/

GamePlay();/*玩游戲具體過程*/

Close();/*圖形結束*/}

/*圖形驅動*/

void Init(void){

int gd=DETECT,gm;

registerbgidriver(EGAVGA_driver);

initgraph(&gd,&gm,"c:\program files\winyes\tc20h\bgi");

cleardevice();}

/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍牆*/

void DrawK(void){

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/

for(i=50;i<=600;i+=10)/*畫圍牆*/ {

rectangle(i,40,i+10,49); /*上邊*/

rectangle(i,451,i+10,460);/*下邊*/ }

for(i=40;i<=450;i+=10) {

rectangle(50,i,59,i+10); /*左邊*/

rectangle(601,i,610,i+10);/*右邊*/ }}

/*玩游戲具體過程*/

void GamePlay(void){

randomize();/*隨機數發生器*/

food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/

snake.life=0;/*活著*/

snake.direction=1;/*方嚮往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇頭*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*節數*/

PrScore();/*輸出得分*/

while(1)/*可以重復玩游戲,壓ESC鍵結束*/ {

while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/ {

if(food.yes==1)/*需要出現新食物*/ {

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*畫面上有食物了*/ }

if(food.yes==0)/*畫面上有食物了就要顯示*/ {

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10); }

for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵演算法*/ {

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1]; }

/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/

switch(snake.direction) {

case 1:snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break; }

for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/ {

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) {

GameOver();/*顯示失敗*/

snake.life=1;

break; } }

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到牆壁*/ {

GameOver();/*本次游戲結束*/

snake.life=1; /*蛇死*/ }

if(snake.life==1)/*以上兩種判斷以後,如果蛇死就跳出內循環,重新開始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以後*/ {

setcolor(0);/*把畫面上的食物東西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/

snake.node++;/*蛇的身體長一節*/

food.yes=1;/*畫面上需要出現新的食物*/

score+=10;

PrScore();/*輸出新得分*/ }

setcolor(4);/*畫出蛇*/

for(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最後一節*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); } /*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循環*/

break;

key=bioskey(0);/*接收按鍵*/

if(key==ESC)/*按ESC鍵退出*/

break;

else

if(key==UP&&snake.direction!=4)

/*判斷是否往相反的方向移動*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}/*endwhile(1)*/}

/*游戲結束*/

void GameOver(void){

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();}

/*輸出成績*/

void PrScore(void){

char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);}

/*圖形結束*/

void Close(void){

getch();

closegraph();

}

4. 簡易8按鍵電子琴設計實驗

簡易電子琴的設計

摘 要 隨著基於CPLD的EDA技術的發展和應用領域的擴大與深入,EDA技術在電子信息、通信、自動控制用計算機等領域的重要性日益突出。作為一個學電子信息專業的學生,我們必須不斷地了解更多的新產品信息,這就更加要求我們對EDA有個全面的認識。本程序設計的是簡易電子琴的設計。採用EDA作為開發工具,VHDL語言為硬體描述語言,MAX + PLUS II作為程序運行平台,所開發的程序通過調試運行、波形模擬驗證,初步實現了設計目標。本程序使用的硬體描述語言VHDL,可以大大降低了硬體數字系統設計的入門級別,讓人感覺就是C語言的近親。通過老師的指導和自己的學習完成了預想的功能。

關鍵詞 電子琴;課程設計;EDA;VHDL

1 引言

1.1 課程設計胡配陪的目的
鞏固和運用所學課程,理論聯系實際,提高分析、解決計算機技術實際問題的獨立工作能力,通過對一個簡易的八音符電子琴的設計,進一步加深對計算機原理以及數字電路應用技術方面的了解與認識,進一步熟悉數字電路系統設計、製作與調試的方法和步驟。鞏固所學課堂知識,理論聯系實際,提高分析、解決計算機技術實際問題的獨立工作能力。為了進一步了解計算機組成原理與系統結構,深入學習EDA技術,用VHDL語言去控制將會使我們對本專業知識可以更好地掌握。
1.2 課程設計的內容
(1)設計一個簡易的八音符電子琴,它可通過按鍵輸入來控制音響。
(2)演奏時可以選擇是手動演奏(由鍵盤輸入)還是自動演奏已存入的樂曲。
(3)能夠自動演奏多首樂曲,且每首樂曲可重復演奏。

2 開發工具簡介

2.1 EDA技術
EDA是電子設計自動化(Electronic Design Automation)縮寫,是90年代初從CAD(計算機輔助設計)、CAM(計算機輔助製造)、CAT(計算機輔助測試)和CAE(計算機輔助工程)的概念發展而來的。EDA技術是以計算機為工具,根據硬體描述語言HDL( Hardware Description language)完成的設計文件,自動地完成邏輯編譯、化簡、分割、綜合及優化、布局布線、模擬以及對於特定目標晶元的適配編譯和編程褲蠢下載等工作。典型的EDA工具中必須包含兩個特殊的軟體包,即綜合器和適配器。綜合器的功能就是將設計者在EDA平台上完成的針對某個系統項目的HDL、原理圖或狀態圖形描述,針對給定的硬體系統組件,進行編譯、優化、轉換和綜合,最終獲得我們欲實現功能的描述文件。綜合器在工作前,必須給定所要實現的硬體結構參數,它的功能就是將軟體描述與給定的硬體結構用一定的方式聯系起來。也就是說,綜合器是軟體描述與硬體實現的一座橋梁。綜合過程就是將電路的高級語言描述轉換低級的、可與目標器件FPGA/CPLD相映射的網表文件。
適配器的功能是將由綜合器產生的王表文件配置與指定的目標器件中,產生最終的下載文件,如JED文件。適配所選定的目標器件(FPGA/CPLD晶元)必須屬於在綜合器中已指定的目標器件系列。
硬體描述語言HDL是相對於一般的計算機軟體語言,如:C、PASCAL而言的。HDL語言使用與設計硬體電子系統的計算機語言,它能描述電子系統的邏輯功能、電路結構和連接方式。設計者可利用HDL程序來描述所希望的電路系統,規定器件結構特徵和電路的行為方式;然後利用綜合器和適配器將此程序編程能控制FPGA和CPLD內部結構,並實現相應邏輯功能的的門級或更底層的結構網表文件或下載文件。目前,就FPGA/CPLD開發來說,比較常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL。
2.2硬體描述語言—VHDL
VHDL的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language,誕生於1982年。1987年底,VHDL被IEEE和美國國防部確認為標准硬體描述語言 。自IEEE公布了VHDL的標准版本,IEEE-1076(簡稱87版)之後,各EDA公司相繼推出了自己的VHDL設計環境,或宣布自己的設計工賣弊具可以和VHDL介面。此後VHDL在電子設計領域得到了廣泛的接受,並逐步取代了原有的非標準的硬體描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統描述能力上擴展VHDL的內容,公布了新版本的VHDL,即IEEE標準的1076-1993版本,(簡稱93版)。現在,VHDL和Verilog作為IEEE的工業標准硬體描述語言,又得到眾多EDA公司的支持,在電子工程領域,已成為事實上的通用硬體描述語言。有專家認為,在新的世紀中,VHDL於Verilog語言將承擔起大部分的數字系統設計任務。
VHDL主要用於描述數字系統的結構,行為,功能和介面。除了含有許多具有硬體特徵的語句外,VHDL的語言形式和描述風格與句法是十分類似於一般的計算機高級語言。VHDL的程序結構特點是將一項工程設計,或稱設計實體(可以是一個元件,一個電路模塊或一個系統)分成外部(或稱可是部分,及埠)和內部(或稱不可視部分),既涉及實體的內部功能和演算法完成部分。在對一個設計實體定義了外部界面後,一旦其內部開發完成後,其他的設計就可以直接調用這個實體。這種將設計實體分成內外部分的概念是VHDL系統設計的基本點。應用VHDL進行工程設計的優點是多方面的。
(1) 與其他的硬體描述語言相比,VHDL具有更強的行為描述能力,從而決定了他成為系統設計領域最佳的硬體描述語言。強大的行為描述能力是避開具體的器件結構,從邏輯行為上描述和設計大規模電子系統的重要保證。
(2) VHDL豐富的模擬語句和庫函數,使得在任何大系統的設計早期就能查驗設計系統的功能可行性,隨時可對設計進行模擬模擬。
(3) VHDL語句的行為描述能力和程序結構決定了他具有支持大規模設計的分解和已有設計的再利用功能。符合市場需求的大規模系統高效,高速的完成必須有多人甚至多個代發組共同並行工作才能實現。(4)對於用VHDL完成的一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,並自動的把VHDL描述設計轉變成門級網表。
(4) VHDL對設計的描述具有相對獨立性,設計者可以不懂硬體的結構,也不必管理最終設計實現的目標器件是什麼,而進行獨立的設計。
2.3 VHDL的設計流程:
(1) 設計輸入根據電路設計所提出的要求,將程序輸入到VHDL編輯器中去編輯。
(2) 功能級模擬用VHDL,模擬器對編輯後的程序進行模擬,如果達不到設計要求,則可以重新修改程序,直到通過功能模擬。
(3) 邏輯綜合與優化 將通過功能模擬的程序放到VHDL編譯器中,進行邏輯綜合與優化。
(4) 門級模擬對電路用VHDL。模擬器模擬。可對門級電路的延時、定時狀態、驅動能力等進行模擬。如不符合要求,可重復步驟(3),再門級模擬,直到符合要求止。
(5) 版圖生成 用相應的軟體處理後,就可以拿去製版。

設計過程
3.1設計規劃
根據系統設計要求,系統設計採用自頂向下的設計方法,系統的整體組裝設計原理圖如圖3-1所示,它由樂曲自動演奏模塊、音調發生模塊和數控分頻模塊三部分組成。

圖3-1 系統的整體組裝設計原理圖
3.2 各模塊的原理及其程序
(1)樂曲自動演奏模塊
樂曲自動演奏模塊(AUTO.VHD)的作用是產生8位發聲控制輸入信號/當進行自動演奏時,由存儲在此模塊中的8位二進制數作為發聲控制輸入,從而自動演奏樂曲。
VHDL源程序(AUTO.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY AUTO IS
PORT ( CLK : IN STD_LOGIC;
AUTO : IN STD_LOGIC;
CLK2 : BUFFER STD_LOGIC;
INDEX2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
INDEX0 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END AUTO;
ARCHITECTURE BEHAVIORAL OF AUTO IS
SIGNAL COUNT0: INTEGER RANGE 0 TO 31;
BEGIN
PULSE0 :PROCESS(CLK,AUTO)
VARIABLE COUNT :INTEGER RANGE 0 TO 8;
BEGIN
IF AUTO ='1' THEN
COUNT := 0;CLK2<='0';
ELSIF(CLK'EVENT AND CLK ='1')THEN
COUNT :=COUNT +1;
IF COUNT =4 THEN
CLK2 <='1';
ELSIF COUNT =8 THEN
CLK2<='0'; COUNT:=0;
END IF ;
END IF ;
END PROCESS;
MUSIC:PROCESS(CLK2)
BEGIN
IF (CLK2'EVENT AND CLK2='1')THEN
IF (COUNT0=31)THEN
COUNT0<=0;
ELSE
COUNT0<=COUNT0+1;
END IF ;
END IF ;
END PROCESS;
COM1:PROCESS(COUNT0,AUTO,INDEX2)
BEGIN
IF AUTO ='0' THEN
CASE COUNT0 IS
WHEN 0=>INDEX0<="00000100"; --3
WHEN 1=>INDEX0<="00000100"; --3
WHEN 2=>INDEX0<="00000100"; --3
WHEN 3=>INDEX0<="00000100"; --3
WHEN 4=>INDEX0<="00010000"; --5
WHEN 5=>INDEX0<="00010000"; --5
WHEN 6=>INDEX0<="00010000"; --5
WHEN 7=>INDEX0<="00100000"; --6
WHEN 8=>INDEX0<="10000000"; --8
WHEN 9=>INDEX0<="10000000"; --8
WHEN 10=>INDEX0<="10000000"; --8
WHEN 11=>INDEX0<="00000100"; --3
WHEN 12=>INDEX0<="00000010"; --2
WHEN 13=>INDEX0<="00000010"; --2
WHEN 14=>INDEX0<="00000001"; --1
WHEN 15=>INDEX0<="00000001"; --1
WHEN 16=>INDEX0<="00010000"; --5
WHEN 17=>INDEX0<="00010000"; --5
WHEN 18=>INDEX0<="00001000"; --4
WHEN 19=>INDEX0<="00001000"; --4
WHEN 20=>INDEX0<="00001000"; --4
WHEN 21=>INDEX0<="00000100"; --3
WHEN 22=>INDEX0<="00000010"; --2
WHEN 23=>INDEX0<="00000010"; --2
WHEN 24=>INDEX0<="00010000"; --5
WHEN 25=>INDEX0<="00010000"; --5
WHEN 26=>INDEX0<="00001000"; --4
WHEN 27=>INDEX0<="00001000"; --4
WHEN 28=>INDEX0<="00000100"; --3
WHEN 29=>INDEX0<="00000100"; --3
WHEN 30=>INDEX0<="00000010"; --2
WHEN 31=>INDEX0<="00000010"; --2
WHEN OTHERS =>NULL;
END CASE;
ELSE INDEX0<=INDEX2;
END IF;
END PROCESS;
END BEHAVIORAL;
(2) 音調發生模塊
音調發生模塊的作用是產生音階的分頻預置值。當8位發聲控制輸入信號中的某一位為高電平時,則對應某一音節的數值將輸出,該數值即為該音階的分頻預置值,分頻預置值控制數控分頻模塊進行分頻,由此可得到每個音階對應的頻率。

VHDL源程序(TONE.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TONE IS
PORT (INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HIGH: OUT STD_LOGIC;
TONE0: OUT INTEGER RANGE 0 TO 2047);
END TONE;
ARCHITECTURE ART OF TONE IS
BEGIN
SEARCH : PROCESS(INDEX)
BEGIN
CASE INDEX IS
WHEN "00000001"=>TONE0 <=773;CODE<="1001111";HIGH<='1';
WHEN "00000010"=>TONE0 <=912;CODE<="0010010";HIGH<='1';
WHEN "00000100"=>TONE0 <=1036;CODE<="0000110";HIGH<='1';
WHEN "00001000"=>TONE0 <=1116;CODE<="1001100";HIGH<='1';
WHEN "00010000"=>TONE0 <=1197;CODE<="0100100";HIGH<='1';
WHEN "00100000"=>TONE0 <=1290;CODE<="0100000";HIGH<='0';
WHEN "01000000"=>TONE0 <=1372;CODE<="0001111";HIGH<='0';
WHEN "10000000"=>TONE0 <=1410;CODE<="0000000";HIGH<='0';
WHEN OTHERS =>TONE0<=2047;CODE<="0000001";HIGH<='0';
END CASE;
END PROCESS;
END ART;
(3) 數控分頻模塊
數控分頻模塊是對時基脈沖進行分頻,得到與1、2、3、4、5、6、7七個音符相對應的頻率。

VHDL源程序(FENPIN.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FENPIN IS
PORT(CLK1: IN STD_LOGIC;
TONE1: IN INTEGER RANGE 0 TO 2047;
SPKS: OUT STD_LOGIC);
END ENTITY FENPIN;
ARCHITECTURE ART OF FENPIN IS
SIGNAL PRECLK:STD_LOGIC;
SIGNAL FULLSPKS:STD_LOGIC;
BEGIN
PROCESS(CLK1)
VARIABLE COUNT:INTEGER RANGE 0 TO 8;
BEGIN
IF (CLK1'EVENT AND CLK1='1')THEN
COUNT:=COUNT +1;
IF COUNT=2 THEN
PRECLK<='1';
ELSIF COUNT =4 THEN
PRECLK<='0';COUNT:=0;
END IF ;
END IF ;
END PROCESS;
PROCESS(PRECLK,TONE1)
VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;
BEGIN
IF (PRECLK'EVENT AND PRECLK='1')THEN
IF COUNT11<TONE1 THEN
COUNT11:=COUNT11+1;FULLSPKS<='1';
ELSE
COUNT11:=0;FULLSPKS<='0';
END IF ;
END IF ;
END PROCESS;
PROCESS(FULLSPKS)
VARIABLE COUNT2 :STD_LOGIC:='0';
BEGIN
IF (FULLSPKS'EVENT AND FULLSPKS='1')THEN
COUNT2:=NOT COUNT2;
IF COUNT2='1'THEN
SPKS<='1';
ELSE
SPKS<='0';
END IF ;
END IF;
END PROCESS;
END ART;
(4) 頂層設計
VHDL源程序(DIANZIQIN.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DIANZIQIN IS
PORT(CLK32MHZ: IN STD_LOGIC;
HANDTOAUTO:IN STD_LOGIC;
CODE1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--音符顯示信號
INDEX1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);--鍵盤輸入信號
HIGH1: OUT STD_LOGIC;--高低音節信號
SPKOUT: OUT STD_LOGIC);--音頻信號
END;
ARCHITECTURE ART OF DIANZIQIN IS
COMPONENT AUTO
PORT(CLK: IN STD_LOGIC;
AUTO: IN STD_LOGIC;
INDEX2: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
INDEX0: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END COMPONENT;
COMPONENT TONE
PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HIGH: OUT STD_LOGIC;
TONE0: OUT INTEGER RANGE 0 TO 2047);
END COMPONENT;
COMPONENT FENPIN
PORT(CLK1: IN STD_LOGIC;
TONE1:IN INTEGER RANGE 0 TO 2047;
SPKS: OUT STD_LOGIC);
END COMPONENT;
SIGNAL TONE2:INTEGER RANGE 0 TO 2047;
SIGNAL INDX:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
U0:AUTOPORTMAP(CLK=>CLK32MHZ,INDEX2=>INDEX1,INDEX0=>INDX,AUTO=>HANDTOAUTO);
U1:TONEPORTMAP(INDEX=>INDX,TONE0=>TONE2,CODE=>CODE1,HIGH=>HIGH1);
U2:FENPIN PORT MAP(CLK1=>CLK32MHZ,TONE1=>TONE2,SPKS=>SPKOUT);
END ART;

4 波形模擬
(1)樂曲自動演奏模塊的模擬(如圖4-1所示)

圖4-1樂曲自動演奏模塊的模擬圖
(2)音調發生模塊的模擬(如圖4-2)

圖4-2 音調發生模塊的模擬圖
(3)數控分頻模塊的模擬(如圖4-3)

圖4-3數控分頻模塊模擬圖
(4)簡易電子琴整個系統的模擬(如圖4-4)

圖4-4簡易電子琴整個系統的模擬圖

5 結束語
經過努力,簡易電子琴的設計基本上完成了。在整個設計過程中,包括前期中期和後期,我都有著許多不同的體會:
1) 這個設計的基本是接觸一門新的語言並加以應用,對於我來說,沒有想到的是入手的速度比我的預料快,在以前編程的基礎上,從接觸到開始動手編程的時間得到了很大的縮短。知識的接收速度在很大的程度上決定了動手的時間。
2) VHDL的編程與C語言的編程有著本質的不同,然而以往形成的舊編程習慣在VHDL編程中依然起著很大的作用。一通百通,不是沒有道理的。對於學習新的知識並予以應用的信心,顯得更足了。
3) VHDL的設計關鍵是電路邏輯設計,而一個程序的關鍵是總體設計。對於硬體設計接觸不多的我們清楚這一點也許不無好處。
4)通過這個程序設計讓我學會一種新的語言,對數字系統結構也有了更進一步的了解和認識,對我以後的學習有很大的幫助。希望其他人在看再做類似設計時有所借鑒。
通過幾天的課程設計,我對資料庫軟體EDA技術、VHDL、等系列知識都有了一定的了解。使用EDA技術開發頁面的能力也有了很大提高。
在整個設計過程中,有很多人對任務的完成給予了重要的支持和幫助。感謝老師給了我本次設計的機會並提供指導;感謝許多同學在我此課程設計遇到問題時給我的幫助使我能夠順利地進行設計的工作;論壇中有很多認識不認識的朋友也都為我的設計提出了很寶貴的建議,同樣在這里感謝他們。

參考文獻
《VHDL與數字電路設計》.盧毅,賴傑.科學出版社
《VHDL語言100例詳解——北京理工大學ASIC研究所》.北京理工大學ASIC研究所.清華大學出版社
《VHDL程序設計》(第二版). 曾繁泰等.清華大學出版社
《VHDL入門與應用》陳雪松,滕立中.人民郵電出版社
《VHDL簡明教程》.王小軍.清華大學出版社

閱讀全文

與按鍵控制實驗演算法設計相關的資料

熱點內容
湖南戴爾伺服器雲空間 瀏覽:361
聯想驅動怎麼解壓 瀏覽:266
程序員進化論解說 瀏覽:871
怎麼設置個性化文件夾圖標 瀏覽:390
基金投資與入門技巧pdf 瀏覽:891
十六進制文件反編譯成c語言 瀏覽:579
程序員手術裸辭 瀏覽:251
編譯生成錯誤是什麼原因 瀏覽:965
我命令你停下用英語怎麼說 瀏覽:75
rtk文件夾不正確怎麼辦 瀏覽:926
java方法簽名 瀏覽:83
java程序員加薪申請書 瀏覽:600
女孩子如何嫁給程序員 瀏覽:657
安卓的動畫響應為什麼卡 瀏覽:835
怎麼把axure放到伺服器上 瀏覽:847
元柱體的鋼材理論重量的便捷演算法 瀏覽:467
地平線4如何加密 瀏覽:277
淘寶游戲解壓神器 瀏覽:706
androidurl視頻 瀏覽:842
app什麼播放器好 瀏覽:13