畢業(yè)設(shè)計---帆板控制系統(tǒng)_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  畢業(yè)設(shè)計報告</b></p><p>  設(shè)計題目: 帆板控制系統(tǒng) </p><p>  專業(yè)名稱: 電子信息工程技術(shù) </p><p>  學(xué)生班級: </p><p>  學(xué)生姓名: </p

2、><p>  學(xué)生學(xué)號: </p><p>  指導(dǎo)教師: </p><p><b>  2012年4月8號</b></p><p>  摘要: 本帆板控制系統(tǒng)由單片機ATMEGA328作為帆板轉(zhuǎn)角的檢測和控制核心,實現(xiàn)按鍵對風(fēng)扇轉(zhuǎn)速的控制、調(diào)節(jié)風(fēng)力的大小、改變

3、帆板轉(zhuǎn)角θ、液晶顯示等功能。引導(dǎo)方式采用角度傳感器感知與帆板受風(fēng)力大小的轉(zhuǎn)角θ的導(dǎo)引線。通過PWM波控制電機風(fēng)扇風(fēng)力的大小使其改變帆板擺動的角度θ。風(fēng)扇控制核心采用L298電機驅(qū)動模塊,用ATMEGA328單片機為控制核心,產(chǎn)生占空比受數(shù)字PID算法控制的PWM脈沖,實現(xiàn)對直流電機轉(zhuǎn)速的控制,同時利用光電傳感器將電機速度轉(zhuǎn)化成脈沖頻率反饋到單片機中,實現(xiàn)轉(zhuǎn)速閉環(huán)控制,達(dá)到轉(zhuǎn)速無靜差調(diào)節(jié)的目的。MMA7455三軸加速傳感器把角度輸出信號傳

4、送給ATMEGA328單片機進行處理。</p><p>  關(guān)鍵詞: ATMEGA328,MMA7455,PWM波,PID算法</p><p>  Abstract: The This windsurfing control system by the microcontroller ATMEGA328 as windsurfing corner detection and control

5、 of the core to achieve the size of the buttons for fan speed control, adjust the wind, changing windsurfing corner θ, LCD functions. Guide to angle sensor perception and windsurfing by the wind the size of the corner of

6、 θ guides. PWM wave control the size of the motor fan wind to change the the windsurfing swing angle θ. Core fan control L298 motor driver module, ATMEGA328 m</p><p>  Keywords: ATMEGA328, MMA7455 PWM wave,

7、the PID algorithm</p><p><b>  目錄</b></p><p>  1. 系統(tǒng)設(shè)計 ·····················&#

8、183;··································3</p>

9、<p>  1. 設(shè)計要求 · ································&

10、#183;·····················3</p><p>  1.1.1 基本要求 ·········

11、;····································

12、83;······3</p><p>  1.1.2 發(fā)揮部分 ························&#

13、183;····························4</p><p>  1.1.3 說明 ··

14、83;····································&

15、#183;·················4</p><p>  1.2總體設(shè)計方案 ·············&

16、#183;····································

17、;·4</p><p>  1.2.1 設(shè)計思路······························

18、;························5</p><p>  1.2.2 方案論證與比較······&#

19、183;····································

20、·····5</p><p>  1.2.3 系統(tǒng)的組成 ·························

21、3;·························6</p><p>  2. 單元電路設(shè)計······

22、;····································

23、83;··········8</p><p>  2.1 風(fēng)扇控制電路····················

24、83;·······························9</p><p>  2.2角度測量

25、原理····································&#

26、183;···············9</p><p>  2.3控制算法················

27、;····································

28、83;··10</p><p>  3. 軟件設(shè)計·····························

29、;·················· ········12</p><p>  3.1風(fēng)扇控制電路設(shè)計計算····

30、······························ ······

31、83;·13</p><p>  3.2控制算法設(shè)計與實現(xiàn)·····························

32、················13</p><p>  3.3程序流程圖···············&

33、#183;····································

34、;·13</p><p>  4. 系統(tǒng)測試······························&

35、#183;·························14</p><p>  4.1 調(diào)試使用的儀器與方法····&#

36、183;····································

37、··14</p><p>  4.2 測試數(shù)據(jù)完整性 ····························

38、83;···················14</p><p>  4.3 測試結(jié)果分析···········&#

39、183;····································

40、···14</p><p>  4.4 結(jié)束語····························&#

41、183;····························15</p><p>  5. 總結(jié) · ·

42、3;····································&#

43、183;·················15</p><p>  參考文獻(xiàn)··············&

44、#183;····································

45、;········15</p><p>  附錄1 元器件明細(xì)表······················

46、83;························16</p><p>  附錄2 電路圖圖紙······&#

47、183;····································

48、······17</p><p>  附錄3 程序清單·························

49、··························17</p><p><b>  1.系統(tǒng)設(shè)計</b></p>&l

50、t;p><b>  1.1設(shè)計要求</b></p><p>  設(shè)計并制作一個帆板控制系統(tǒng),通過對風(fēng)扇轉(zhuǎn)速的控制,調(diào)節(jié)風(fēng)力大小,改</p><p>  變帆板轉(zhuǎn)角θ,如圖 1 所示。</p><p>  1.1.1 基本要求</p><p>  (1)用手轉(zhuǎn)動帆板時,能夠數(shù)字顯示帆板的轉(zhuǎn)角θ。顯示范圍為0~60&#

51、176;,</p><p>  分辨力為2°,絕對誤差≤5°。 </p><p>  (2)當(dāng)間距 d=10cm 時,通過操作鍵盤控制風(fēng)力大小,使帆板轉(zhuǎn)角θ能夠</p><p>  在 0~60°范圍內(nèi)變化,并要求實時顯示θ。 </p><p>  (3)當(dāng)間距 d=10cm 時,通過操作鍵盤控制風(fēng)力大小,使帆板

52、轉(zhuǎn)角θ穩(wěn)定在 45°±5°范圍內(nèi)。要求控制過程在10 秒內(nèi)完成,實時顯示θ,并</p><p>  由聲光提示,以便進行測試。</p><p><b>  1.1.2發(fā)揮部分</b></p><p>  (1) 當(dāng)間距 d=10cm 時,通過鍵盤設(shè)定帆板轉(zhuǎn)角,其范圍為 0~60°。要求</p>

53、<p>  θ在 5 秒內(nèi)達(dá)到設(shè)定值,并實時顯示θ。最大誤差的絕對值不超過5°。 </p><p> ?。?) 間距 d 在 7~15cm 范圍內(nèi)任意選擇,通過鍵盤設(shè)定帆板轉(zhuǎn)角,范圍為</p><p>  0~60°。要求θ在 5 秒內(nèi)達(dá)到設(shè)定值,并實時顯示θ。最大誤差的絕</p><p>  對值不超過 5°。 <

54、/p><p><b>  (3) 其他。</b></p><p><b>  1.1.3 說明</b></p><p>  (1) 調(diào)速裝置自制。 </p><p> ?。?) 風(fēng)扇選用臺式計算機散熱風(fēng)扇或其他形式的直流供電軸流風(fēng)扇,但不</p><p>  能選用帶有自動調(diào)速功

55、能的風(fēng)扇。 </p><p> ?。?) 帆板的材料和厚度自定,固定軸應(yīng)足夠靈活,不阻礙帆板運動。帆板</p><p>  形式及具體制作尺寸如圖 2 所示。 </p><p>  1.2 總體設(shè)計方案</p><p>  1.2.1 設(shè)計思路</p><p>  題目要求設(shè)計一個翻版控制系統(tǒng),通過對風(fēng)扇轉(zhuǎn)速的控制,調(diào)

56、節(jié)風(fēng)力的大小,改變帆板轉(zhuǎn)角θ。設(shè)計中采用單片機PWM波電機控制方式,使得控制風(fēng)扇風(fēng)力的大小,帆板受到風(fēng)力的大小從而改變帆板偏轉(zhuǎn)的角度θ,角度傳感器把檢測到帆板的偏轉(zhuǎn)角度傳給ATMEGA48單片機進行處理達(dá)到設(shè)計所需的要求再用鍵盤進行調(diào)整,用液晶顯示屏進行顯示。 </p><p>  1.2.2 方案論證與比較</p><p>  1.電源的設(shè)計方案論證與選擇</p><

57、p>  系統(tǒng)需要多個電源,ATMEGA328、L298、MMA7455都使用5V的穩(wěn)壓電源,電</p><p>  機驅(qū)動需要24V電壓。</p><p>  方案一、采用LM2596開關(guān)電壓調(diào)節(jié)器,能夠輸出3A的輸出電流,同時具有很好的線性和負(fù)載調(diào)節(jié)特性,固定輸出3.3V、5V、12V經(jīng)過調(diào)整可輸出小于37V的電壓。</p><p>  方案二、采用升壓型穩(wěn)

58、壓電路。用兩片MC34063芯片分別將3V的電池電壓進行直流斬波調(diào)壓,得到5V和12V的穩(wěn)壓輸出。只需使用兩節(jié)電池,既節(jié)省了電池,又減小了系統(tǒng)體積重量,但該電路供電電流小,供電時間短,無法是相對龐大的系統(tǒng)穩(wěn)定運作。</p><p>  方案三、采用三端穩(wěn)壓集成7805與7824分別得到5V與24V的穩(wěn)壓電壓。利用該方法方便簡單,工作穩(wěn)定可靠。</p><p>  綜上所述,選擇方案三,采用

59、三端穩(wěn)壓電路。</p><p>  2.角度傳感器的設(shè)計方案論證與選擇</p><p>  方案一、采用WDS35D4精密導(dǎo)電塑料角位移傳感器,利用該傳感器的輸入端加上一個直流電壓,在輸出端得到一個直流電壓信號,把角度位移的機械位移量轉(zhuǎn)化成電壓信號,用輸出電壓進行角度位移的控制。用此傳感器只要測量導(dǎo)軌電阻兩端的直流電壓,不同的角度有不同的電阻值,通過電阻來算出角度,計算不方便。電刷在導(dǎo)軌上

60、移動獲得輸出,數(shù)值越小,精度越高。該傳感器的優(yōu)點: 對環(huán)境條件要求低,線性精度高、分辨率高、動態(tài)的噪聲小等優(yōu)點,由于該傳感器的各項精度都比較精細(xì)使其價格過高。</p><p>  方案二、采用電位器進行調(diào)角:帆板轉(zhuǎn)動時電位器跟著轉(zhuǎn)動,電壓隨之發(fā)生變化,通過電壓的值轉(zhuǎn)換成角度值。但扭力過大,而且精度也不高。</p><p>  方案三、采用MMA7455三軸加速度傳感器,利用物體運動和方向改

61、變輸出信號的電壓值,把檢測到的信號傳送給ATMEGA328的AD轉(zhuǎn)化器進行轉(zhuǎn)化與讀取此輸出信號。通過不同的角度,X、Y、Z三個方向的加速度輸出不同,將電容值的變化轉(zhuǎn)化為電壓值,電容值的計算公式是:C=Ae/D,其中A是極板的面積,D是極板間的距離,e是電介質(zhì)常數(shù),再用反正弦函數(shù)把角度算出來,計算比較方便。該傳感器的優(yōu)點:線性精度高、體積小、工作可靠、標(biāo)識清晰、擴展性好等優(yōu)點。</p><p>  綜上所述,選擇方

62、案三,用MMA7455三軸加速傳感器。</p><p><b>  3.顯示方式的選擇</b></p><p>  方案一、采用LED數(shù)碼管顯示。使用數(shù)碼管動態(tài)顯示,由于顯示的內(nèi)容較少,給人的視覺沖擊不怎么的舒適,具有亮度高、工作電壓低功耗小、易于集成、驅(qū)動簡單等優(yōu)點。但在此次設(shè)計中需要設(shè)定的參數(shù)種類多,使用LED數(shù)碼管不能完成設(shè)計任務(wù),不宜采用。</p>

63、<p>  方案二、采用字符型LCD顯示??梢燥@示英文及數(shù)字,利用程序去驅(qū)動液晶</p><p>  顯示模塊,設(shè)計簡單,且界面美觀舒適,耗電小。</p><p>  綜上所述,選擇方案二,用字符型LCD進行顯示。</p><p>  4.帆板的設(shè)計方案論證與選擇</p><p>  方案一、采用電路板作為帆板。根據(jù)設(shè)計需要的要

64、求,電路板需做成寬:10cm,長:15cm;在所擁有的風(fēng)扇下采取電路板作為帆板,很難滿足設(shè)計所需達(dá)到的角度。考慮風(fēng)力的大小和自身重力,不宜采用。</p><p>  方案二、采用泡沫作為帆板。泡沫的體積太輕,很容易滿足設(shè)計所需要的角度,缺點:泡沫的穩(wěn)定性不高,干擾成分太多??紤]不穩(wěn)定性的因素太多此方案不宜采用。</p><p>  方案三、采用鋁板作為帆板。經(jīng)過多次實驗:鋁板可以作為帆板使

65、用,能過達(dá)到設(shè)計所需要的要求,而且鋁板的穩(wěn)定性比較好,抗干擾能力強,受干擾的成分比較小。</p><p>  綜上所述,選擇方案三,用鋁板作為帆板使用。 </p><p>  1.2.3 系統(tǒng)的組成 </p><p>  經(jīng)過方案比較與論證,最終確定的系統(tǒng)組成框圖如圖1.1.1所示。其中的集成電路ATMEGA328單片機驅(qū)動液晶顯示模塊、控制電機驅(qū)動改變風(fēng)扇風(fēng)力的大

66、小從而改變帆板的角度,角度傳感器把接收到的輸出信號傳送給ATMEGA328單片機進行處理再更新顯示。</p><p>  圖1.1.1 系統(tǒng)組成框圖</p><p><b>  PID算法:</b></p><p>  由于單片機的處理速度和RAM資源的限制,一般不采用浮點數(shù)運算,而將所有參數(shù)全部用整數(shù),運算到最后再除以一個2的N次方數(shù)據(jù)

67、(相當(dāng)于移位),作類似定點數(shù)運算,可大大提高運算速度,根據(jù)控制精度的不同要求,當(dāng)精度要求很高時,注意保留移位引起的“余數(shù)”,做好余數(shù)補償。</p><p>  遇限消弱積分:一旦控制變量進入飽和區(qū),將只執(zhí)行削弱積分項的運算而停止進行增大積分項的運算。具體地說,在計算Ui時,將判斷上一個時刻的控制量Ui-1是否已經(jīng)超出限制范圍,如果已經(jīng)超出,那么將根據(jù)偏差的符號,判斷系統(tǒng)是否在超調(diào)區(qū)域,由此決定是否將相應(yīng)偏差計入積

68、分項</p><p>  積分分離法:在基本PID控制中,當(dāng)有較大幅度的擾動或大幅度改變給定值時, 由于此時有較大的偏差,以及系統(tǒng)有慣性和滯后,故在積分項的作用下,往往會產(chǎn)生較大的超調(diào)量和長時間的波動。特別是對于溫度、成份等變化緩慢的過程,這一現(xiàn)象將更嚴(yán)重。為此可以采用積分分離措施,即偏差較大的時,取消積分作用;當(dāng)偏差較小時才將積分作用投入?!?lt;/p><p>  離散化公式:Δu(t)

69、= q0e(t) + q1e(t-1) + q2e(t-2) </p><p>  當(dāng)|e(t)|≤β時 </p><p>  q0 = Kp(1+T/Ti+Td/T) </p><p>  q1 = -Kp(1+2Td/T) </p><p>  q2 = Kp Td /T </p><p>  當(dāng)|e(t)|>β時

70、 </p><p>  q0 = Kp(1+Td/T) </p><p>  q1 = -Kp(1+2Td/T) </p><p>  q2 = Kp Td /T </p><p>  u(t) = u(t-1) + Δu(t)</p><p>  微分控制對系統(tǒng)性能的影響:微分作用可以改善動態(tài)特性,Td偏大時,超調(diào)量

71、較大,調(diào)節(jié)時間較短。Td偏小時,超調(diào)量也較大,調(diào)節(jié)時間也較長。只有Td合適,才能使超調(diào)量較小,減短調(diào)節(jié)時間。</p><p>  由于快速傅立葉變換FFT算法設(shè)計大量的浮點運算,由于一個浮點占用四個字節(jié),所以要占用大量的內(nèi)存,同時浮點運算時間很慢,所以采用普通的8位MCU一般難以在一定的時間內(nèi)完成運算,所以綜合內(nèi)存的大小以及運算速度,采用32位的單片機ATMEGA328,它擁有較大的RAM,并且時鐘頻率高達(dá)16M

72、,所以對于浮點運算不論是在速度上還是在內(nèi)存上都能夠很快的處理。</p><p><b>  2. 單元電路設(shè)計</b></p><p>  2.1 風(fēng)扇控制電路</p><p>  風(fēng)扇控制電路主要是由ATMEGA328、L298電機驅(qū)動模塊組成。L298電機驅(qū)動模塊主要由放大電路、OPAMP運算放大電路、電機驅(qū)動組成。用電阻和電容組成高通濾波

73、電路,用單片機控制達(dá)林頓管使之工作在開關(guān)狀態(tài),通過調(diào)整輸入脈沖的占空比,調(diào)整電機轉(zhuǎn)速。用L298驅(qū)動兩臺直流減速電機的電路引腳A,B分別用PWM控制。如果電機運動則可將IN1,IN2和IN3,IN4兩對引腳分別接高低電平,僅用單片機的兩個端口給出PWM 信號控制A,B即可。特點:工作電壓高,可以達(dá)到46V;輸出電流大,瞬間峰值可達(dá)3A,持續(xù)工作電流2A;額定功率25W。當(dāng)步進電機發(fā)一個控制脈沖,它就轉(zhuǎn)一步,再發(fā)一個脈沖,它會再轉(zhuǎn)一步,

74、兩個脈沖的間隔越短,步進電機就轉(zhuǎn)的越快。調(diào)整單片機發(fā)出的脈沖頻率,就可以對步進電機進行調(diào)速,從而控制了風(fēng)扇的風(fēng)力的大小。L298電機驅(qū)動的特點:可以實現(xiàn)電機正反轉(zhuǎn)及調(diào)速、啟動轉(zhuǎn)矩大。</p><p>  圖1.1.2 L298電機控制電路 </p><p><b>  2.2角度測量原理</b></p><p>  MMA7455三軸加速傳

75、感器是檢測物體運動和方向的傳感器,它根據(jù)帆板運動和方向改變輸出信號的電壓值。當(dāng)帆板受到風(fēng)扇風(fēng)力運動時,三軸加速傳感器檢測到帆板運動的輸出信號,把該輸出的電壓值用三角函數(shù)數(shù)出來在把結(jié)果送往張家界</p><p>  ATMEGA328單片機進行處理,通過按鍵控制與液晶顯示屏進行顯示。MMA7455三軸加速傳感器:如圖1.1.3所示</p><p><b>  2.3控制算法<

76、/b></p><p>  由ATMEGA328單片機組成的數(shù)字控制系統(tǒng)控制中,PID控制器是通過PID控制算法實現(xiàn)的。ATMEGA328單片機通過AD對信號進行采集,變成數(shù)字信號,再在單片機中通過算法實現(xiàn)PID運算,再通過DA把控制量反饋回控制源。從而實現(xiàn)對系統(tǒng)的伺服控制。圖1.1.4位置式PID控制算法的簡化示意圖A、圖B。</p><p><b>  圖1.1.4(A

77、)</b></p><p><b>  圖1.1.4(B)</b></p><p><b>  傳遞函數(shù)為:</b></p><p>  時域的傳遞函數(shù)表達(dá)式:</p><p>  對上式中的微分和積分進行近似:</p><p>  式中n是離散點的個數(shù)。<

78、/p><p>  于是傳遞函數(shù)可以簡化為:</p><p><b>  其中</b></p><p><b>  3. 軟件設(shè)計</b></p><p>  3.1風(fēng)扇控制電路設(shè)計計算</p><p>  由單片機ATMEGA328的處理速度和ram資源的限制,一般不采用浮點數(shù)運

79、算,而將所有參數(shù)全部用整數(shù),運算到最后再除以一個2的N次方數(shù)據(jù)(相當(dāng)于移位),作類似定點數(shù)運算,可大大提高運算速度,根據(jù)控制精度的不同要求,當(dāng)精度要求很高時,注意保留移位引起的“余數(shù)”,做好余數(shù)補償。</p><p>  圖1.1.5 PID算法流程圖</p><p>  3.2控制算法設(shè)計與實現(xiàn)</p><p>  由PID控制器參數(shù)的工程整定方法,主要有臨界

80、比例法、反應(yīng)曲線法和衰減法。三種方法各有其特點,其共同點都是通過試驗,然后按照工程經(jīng)驗公式對控制器參數(shù)進行整定。但無論采用哪一種方法所得到的控制器參數(shù),都需要在實際運行中進行最后調(diào)整與完善?,F(xiàn)在一般采用的是臨界比例法。利用該方法進行 PID控制器參數(shù)的整定步驟如下:(1)首先預(yù)選擇一個足夠短的采樣周期讓系統(tǒng)工作;(2)僅加入比例控制環(huán)節(jié),直到系統(tǒng)對輸入的階躍響應(yīng)出現(xiàn)臨界振蕩,記下這時的比例放大系數(shù)和臨界振蕩周期;(3)在一定的控制度下通

81、過公式計算得到PID控制器的參數(shù)。將采樣值PID通過算法轉(zhuǎn)化為PWM的占空比輸出。</p><p>  按鍵模塊一共5個按鍵,其中一個是單片機復(fù)位按鍵(PC6),還有4個功能鍵,分別為:1號鍵(對3個功能進行切換)、2號鍵(確定功能并且確定微調(diào)值)、3號鍵(減號鍵)、4號鍵(加號鍵)。0號功能(通過3號鍵和4號鍵控制風(fēng)力,使帆板角度變化);1號功能(控制帆板角度在45°);2號功能(設(shè)定帆板角度);&l

82、t;/p><p>  3號功能(長按2號鍵進行自校準(zhǔn))。</p><p><b>  相關(guān)程序:</b></p><p>  struct PID_DATA pidData;</p><p>  volatile unsigned char Function_is_done = 0;</p><p>

83、<b>  // 系統(tǒng)功能編號</b></p><p>  static volatile unsigned char System_Function = 0;</p><p>  // 5號功能: 校準(zhǔn)角度傳感器,長按2號按鍵開始校準(zhǔn)</p><p>  // 0號功能: 通過鍵盤控制操作風(fēng)力,使帆板轉(zhuǎn)角變化</p><p

84、>  // 1號功能: 控制帆板在45°</p><p>  // 2號功能: 10cm時通過鍵盤設(shè)定帆板角度</p><p>  // 3號功能: 7~15cm時通過鍵盤任意設(shè)定帆板角度</p><p>  // 角度設(shè)定功能用PID算法調(diào)節(jié),PID達(dá)到穩(wěn)態(tài)時,聲光提示</p><p>  // 4號功能: 未用<

85、;/p><p>  // 數(shù)碼管使用安排</p><p>  // 位0: 功能編號</p><p>  // 位5、6: 實時顯示角度</p><p>  // 位2、3: 按鍵設(shè)定角度時顯示設(shè)置值,調(diào)整中閃爍顯示,執(zhí)行后停止閃爍。</p><p><b>  3.3 程序流程圖</b></p

86、><p>  圖1.1.6 風(fēng)扇控制系統(tǒng)程序流程圖</p><p>  風(fēng)扇控制系統(tǒng)程序流程圖如圖1.1.6所示。首先系統(tǒng)開始初始化,然后再把</p><p>  MMA7444所讀取風(fēng)扇的角度值分別送給單片機進行處理,然后通過按鍵進行控制,然后用LED進行顯示,蜂鳴器叫鳴。</p><p><b>  系統(tǒng)測試</b>&

87、lt;/p><p>  4、1調(diào)試使用的儀器與方法</p><p>  用函數(shù)信號發(fā)生器給電機驅(qū)動模塊加上12V以上的電壓,用雙蹤示波器查看單片機的PWM波的脈沖信號,查看電機輸出的占空比的大小。用游標(biāo)米尺去測量風(fēng)扇與帆板的距離,風(fēng)扇吹起帆板的角度用角度測量計去測量角度的大小,并記錄相關(guān)的數(shù)據(jù)。</p><p>  4.2 測試數(shù)據(jù)完整性</p><

88、p>  4.3 測試結(jié)果分析</p><p>  經(jīng)過系統(tǒng)的測試發(fā)現(xiàn)該設(shè)計存在著誤差,在帆板受到風(fēng)扇風(fēng)力轉(zhuǎn)動時,帆板受力發(fā)生轉(zhuǎn)動,帆板的角度表現(xiàn)的很不穩(wěn)定,實際值與理論值相差1~3°的誤差。從而得出帆板的偏轉(zhuǎn)角值可能受到外部環(huán)境的干擾或者是電路硬件出現(xiàn)的導(dǎo)致的問題。指針和轉(zhuǎn)軸由于不同心而出現(xiàn)了一些小誤差。還有角度傳感器上的一些細(xì)軟線導(dǎo)致帆板的中心發(fā)生改變。</p><p>

89、<b>  4.4 結(jié)束語</b></p><p> ?、?d = 10cm時,帆板轉(zhuǎn)角θ = 0~60°。</p><p> ?、?d = 10cm時,帆板轉(zhuǎn)角θ = 45°。</p><p> ?、?d = 15cm時,帆板轉(zhuǎn)角θ = 78°。</p><p>  由于系統(tǒng)架構(gòu)設(shè)計合

90、理,功能電路實現(xiàn)較好,系統(tǒng)性能優(yōu)良、穩(wěn)定,較好地達(dá)到了題目要求的各項指標(biāo)。</p><p><b>  5. 總結(jié)</b></p><p>  本系統(tǒng)以單片機ATMEGA328芯片為核心部件,用MMA7455三軸加速度傳感器來檢測L298電機驅(qū)動風(fēng)扇改變帆板的偏轉(zhuǎn)角度,把這輸出的信號傳送給單片機進行處理,利用了角度傳感技術(shù)并配合獨特的軟件算法實現(xiàn)了用按鍵控制風(fēng)力的大小

91、使帆板轉(zhuǎn)角能夠在0~60度范圍內(nèi)變化,并在液晶屏上進行了顯示。在系統(tǒng)設(shè)計過程中,力求硬件線路簡單,充分發(fā)揮軟件編程的靈活方便的特點,來滿足設(shè)計的要求。因為時間有限,該系統(tǒng)還有許多值得改進的地方:三軸加速度傳感</p><p>  器對帆板偏轉(zhuǎn)角檢測不精確,帆板有可能還受外部環(huán)境的影響。</p><p>  在本次設(shè)計的過程中,遇到了很多突發(fā)事件和各種困難,設(shè)計制作中一度中斷,但通過仔細(xì)分析

92、和自我狀態(tài)的調(diào)整解決了很多問題。在這個過程中我們深深地體會到共同協(xié)作和團隊精神的重要性,提高了自己解決問題的能力。</p><p><b>  參考文獻(xiàn):</b></p><p>  《晶體管電路設(shè)計上》,鈴木雅臣著,北京:科學(xué)出版社,1997年;</p><p>  《模擬電子線路基礎(chǔ)》,吳運昌著,廣州:華南理工大學(xué)出版社,2004年;<

93、;/p><p>  《數(shù)字電子技術(shù)基礎(chǔ)》,閻石著,北京:高等教育出版社,1997年;</p><p>  《單片機原理及應(yīng)用》,李曉峰著,北京:北京理工大學(xué)出版社,2010年;</p><p><b>  附錄:</b></p><p>  附1:元器件明細(xì)表:</p><p><b>  

94、附2:電路圖圖紙</b></p><p><b>  附3:程序清單</b></p><p>  unsigned char Function_is_begin = 0;</p><p>  unsigned char SettingAngle = 0;</p><p>  static volatile

95、unsigned char TempAngle = 0;</p><p>  static volatile unsigned int Openloop_PWM = 100;</p><p>  static volatile unsigned char Openloop_Step = 5;</p><p>  void Key1_Press(unsigned ch

96、ar ktype)</p><p><b>  {</b></p><p>  Function_is_begin = 0;</p><p>  PWM_Off();</p><p>  if(++System_Function > 5)</p><p>  System_Function

97、= 0;</p><p>  switch(System_Function){</p><p><b>  case 0:</b></p><p>  Openloop_Step = 5;</p><p>  Openloop_PWM = 100;</p><p>  PWM_OutPut(Ope

98、nloop_PWM);</p><p>  //Digit_Set(STEP_POS, 2);</p><p>  LCD12864_SetXY(0,2);</p><p>  LCD12864_PutNumber(2);</p><p>  ////Digit_Number(1, Openloop_PWM);</p><

99、;p><b>  break;</b></p><p><b>  case 1:</b></p><p>  //Digit_Off(STEP_POS);</p><p>  TempAngle = 45;</p><p>  SettingAngle = 45;</p>&

100、lt;p><b>  case 2:</b></p><p><b>  case 3:</b></p><p>  LCD12864_SetXY(0,4);</p><p>  LCD12864_PutNumber(TempAngle/10);</p><p>  LCD12864_SetX

101、Y(0,5);</p><p>  LCD12864_PutNumber(TempAngle%10);</p><p>  //Digit_Set(SETTING_POS0, TempAngle/10);</p><p>  //Digit_Set(SETTING_POS1, TempAngle%10);</p><p>  //Digit

102、_FlashMode(SETTING_POS0);</p><p>  //Digit_FlashMode(SETTING_POS1);</p><p><b>  break;</b></p><p><b>  case 4:</b></p><p><b>  break;</

103、b></p><p><b>  case 5:</b></p><p>  //Digit_Off(SETTING_POS0);</p><p>  //Digit_Off(SETTING_POS1);</p><p><b>  break;</b></p><p>

104、;<b>  }</b></p><p>  //Digit_Set(0, System_Function);// 顯示系統(tǒng)功能編號</p><p>  LCD12864_SetXY(0,0);</p><p>  LCD12864_PutNumber(System_Function);</p><p><b&

105、gt;  }</b></p><p>  void Key2_Press(unsigned char ktype)</p><p><b>  {</b></p><p>  switch(System_Function){</p><p><b>  case 0:</b></p

106、><p>  switch(Openloop_Step){</p><p><b>  case 1:</b></p><p>  Openloop_Step = 5;</p><p>  //Digit_Set(STE.</p><p>  //P_POS, 2);</p><

107、;p>  LCD12864_SetXY(0,2);</p><p>  LCD12864_PutNumber(2);</p><p><b>  break;</b></p><p><b>  case 5:</b></p><p>  Openloop_Step = 10;</p&g

108、t;<p>  //Digit_Set(STEP_POS, 3);</p><p>  LCD12864_SetXY(0,2);</p><p>  LCD12864_PutNumber(3);</p><p><b>  break;</b></p><p><b>  case 10:<

109、;/b></p><p>  Openloop_Step = 50;</p><p>  //Digit_Set(STEP_POS, 4); </p><p>  LCD12864_SetXY(0,2);</p><p>  LCD12864_PutNumber(4);</p><p><b>  br

110、eak;</b></p><p><b>  case 50:</b></p><p>  Openloop_Step = 1;</p><p>  //Digit_Set(STEP_POS, 1);</p><p>  LCD12864_SetXY(0,2);</p><p>  

111、LCD12864_PutNumber(1);break;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 1:</b></p><p><b>  case 2:</b>&l

112、t;/p><p><b>  case 3:</b></p><p>  //Digit_NormalMode(SETTING_POS0);</p><p>  //Digit_NormalMode(SETTING_POS1);</p><p>  LCD12864_SetXY(1,2);</p><

113、p>  LCD12864_SetXY(1,3);</p><p>  SettingAngle = TempAngle;</p><p>  Function_is_done = 0;</p><p><b>  break;</b></p><p><b>  case 4:</b><

114、;/p><p><b>  break;</b></p><p><b>  case 5:</b></p><p>  if(ktype == eKTYPE_LPRESS)</p><p>  MMA7455_Calibrate();</p><p><b>  br

115、eak;</b></p><p><b>  }</b></p><p>  Function_is_begin = 1;</p><p><b>  }</b></p><p>  void Key3_Press(unsigned char ktype)</p><

116、;p><b>  {</b></p><p>  switch(System_Function){</p><p><b>  case 0:</b></p><p>  if(Openloop_PWM < 1023 - Openloop_Step)</p><p>  Openloop

117、_PWM += Openloop_Step;</p><p>  PWM_OutPut(Openloop_PWM);</p><p>  //Digit_Number(1, Openloop_PWM);</p><p>  LCD12864_SetXY(1,2);</p><p>  LCD12864_PutNumber(TempAngle/

118、10);</p><p>  LCD12864_SetXY(1,3); </p><p>  LCD12864_PutNumber(TempAngle/10);</p><p>  //Digit_Set(SETTING_POS1, TempAngle%10);</p><p><

119、;b>  break;</b></p><p><b>  case 4:</b></p><p><b>  break;</b></p><p><b>  case 5:</b></p><p><b>  break;</b>&l

120、t;/p><p><b>  }</b></p><p><b>  }</b></p><p>  void Function_ParseKeyMsg(struct MSG *pmsg)</p><p><b>  {</b></p><p>  swit

121、ch(pmsg->parma.data[0])</p><p><b>  {</b></p><p><b>  case 1:</b></p><p>  Key1_Press(pmsg->parma.data[1]);</p><p><b>  break;</b

122、></p><p><b>  case 2:</b></p><p>  Key2_Press(pmsg->parma.data[1]);</p><p><b>  break;</b></p><p><b>  case 3:</b></p>

123、<p>  Key3_Press(pmsg->parma.data[1]);</p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  Key4_Press(pmsg->parma.data[1]);</p><p&g

124、t;<b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void Function_Init(void)</p><p><b>  {</b></p><

125、;p>  System_Function = 6;</p><p>  Function_is_begin = 0;</p><p>  SettingAngle = 0;</p><p>  Openloop_Step = 5;</p><p>  Openloop_PWM = 100;</p><p>  i

126、nt16_t inputValue;</p><p>  if(SysTickFlag)</p><p><b>  {</b></p><p>  angle = MMA7455_Angle();</p><p>  if(angle < 100){</p><p>  Insert_A

127、ngle(angle);</p><p>  //Digit_Set(ANGLE_POS0, g_angle/10);</p><p>  LCD12864_SetXY(1,6);</p><p>  LCD12864_PutNumber(g_angle/10);</p><p>  //Digit_Set(ANGLE_POS1, g_a

128、ngle%10);</p><p>  LCD12864_SetXY(1,7);</p><p>  LCD12864_PutNumber(g_angle/10);</p><p>  if(System_Function == 1){</p><p>  //inputValue = pid_Controller(20, g_angle,

129、&pidData);</p><p>  //Set_Input(inputValue);</p><p>  if(g_angle > 45)</p><p><b>  {</b></p><p>  pwm_value = 512 - (int16_t)(g_angle - 45)*15;</p

130、><p>  if(pwm_value < 0) </p><p>  pwm_value = 0;</p><p><b>  }</b></p><p>  else if(g_angle < 45)</p><p><b>  {</b></p>

131、<p>  pwm_value = 512 + (int16_t)(45-g_angle)*15;</p><p>  if(pwm_value > 1023)</p><p>  pwm_value = 1023;</p><p><b>  }</b></p><p>  PWM_OutPut(pwm

132、_value);</p><p><b>  }</b></p><p>  else if(System_Function == 2){</p><p>  inputValue = pid_Controller(SettingAngle, g_angle, &pidData);</p><p>  Set_I

133、nput(inputValue);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  #include

134、 "Message.h"</p><p>  #include "SysTimer.h"</p><p>  enum KScanState{</p><p>  KSCAN_IDLE = 0, /* 無鍵按下, 鍵盤掃描初始狀態(tài) */</p><p>  KSCAN_PRESS,

135、 /* 鍵按下,判斷抖動, 鍵按下>40ms */</p><p>  KSCAN_NORMAL,/* 普通按鍵,判斷是否長按鍵,鍵按下>1.6s */</p><p>  KSCAN_LPRESS, /* 長按鍵,判斷是否連發(fā),鍵按下>1s */</p><p>  KSCAN_LIANFA,

136、 /* 連發(fā)按鍵,判斷連發(fā),每0.4s一次連發(fā)按鍵 */</p><p><b>  };</b></p><p>  struct KStateFsm{</p><p>  enum KScanState kpress_next;/* 鍵按下,下一個狀態(tài) */</p><p>  enum KScanState

137、 nokey_next;/* 鍵抬起,下一個狀態(tài) */</p><p>  unsigned char kpress_time;/* 鍵按下需持續(xù)的時間, 20ms的倍數(shù) */</p><p>  enum KeyType ktype;/* 鍵按下滿足條件,輸出按鍵類型 */</p><p><b>  };</b><

138、;/p><p>  /* 狀態(tài)轉(zhuǎn)換表,保證狀態(tài)編號值與在數(shù)組中的位置相同 */</p><p>  struct KStateFsm kstate_fsm_table[] = {</p><p>  /* current kpress_next, nokey_next, time, type */</p><p>

139、  /* KSCAN_IDLE */ {KSCAN_PRESS, KSCAN_IDLE, 1, eKTYPE_NOKEY},</p><p>  /* KSCAN_PRESS */ {KSCAN_NORMAL, KSCAN_IDLE, 2, eKTYPE_NORMAL},</p><p>  /* KSCAN_NORMAL */ {KSCAN_LPRESS, KSCAN

140、_IDLE, 80, eKTYPE_LPRESS},</p><p>  /* KSCAN_LPRESS */ {KSCAN_LIANFA, KSCAN_IDLE, 50, eKTYPE_LIANFA},</p><p>  /* KSCAN_LIANFA */ {KSCAN_LIANFA, KSCAN_IDLE, 20, eKTYPE_LIANFA}</p>&

141、lt;p><b>  };</b></p><p>  static enum KScanState keystate;</p><p>  static unsigned char oldkey;</p><p>  static unsigned char ktime_counter = 0;</p><p>

142、  static pFunKeyRead KeyRead_CallBack;/* 回調(diào)函數(shù), 讀按鍵,返回按鍵編號 */</p><p>  void KeyScan_Run20ms(void)</p><p><b>  {</b></p><p>  unsigned char key_id = 0;</p><p&

143、gt;  struct MSG msg;</p><p>  if(!KeyRead_CallBack)</p><p><b>  return;</b></p><p>  key_id = (*KeyRead_CallBack)();</p><p>  if( (key_id != 0) && (

144、key_id == oldkey) )</p><p><b>  {</b></p><p>  if(++ktime_counter >= kstate_fsm_table[keystate].kpress_time )</p><p><b>  {</b></p><p>  ktim

145、e_counter = 0;</p><p>  if(eKTYPE_NOKEY != kstate_fsm_table[keystate].ktype)</p><p><b>  {</b></p><p>  msg.msg_id = eMsg_Key;</p><p>  msg.parma_len = 2;&l

146、t;/p><p>  msg.parma.data[0] = key_id;</p><p>  msg.parma.data[1] = kstate_fsm_table[keystate].ktype;</p><p>  Msg_PushMessage(&msg);</p><p><b>  }</b><

147、/p><p>  keystate = kstate_fsm_table[keystate].kpress_next;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p&g

148、t;<b>  {</b></p><p>  keystate = kstate_fsm_table[keystate].nokey_next;</p><p>  oldkey = key_id;</p><p><b>  }</b></p><p><b>  }</b>

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論