版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 武 昌 理 工 學 院</p><p> 本科畢業(yè)設計(論文)</p><p> 題 目: 風力擺控制系統(tǒng)</p><p> 學 院: 信息工程學院</p><p> ?! I(yè): 自 動 化</p><p> 學 號: </p><
2、;p> 學生姓名: </p><p> 指導教師: </p><p> 二○一六 年 四月 八 日</p><p><b> 風力擺控制系統(tǒng)</b></p><p><b> 摘要</b></p><p> 本系統(tǒng)由微處理器STM
3、32,直流風機及驅動,慣性測量單元MPU6050,OLED顯示,4X4矩陣鍵盤,蜂鳴器構成。系統(tǒng)運行可分為兩部分:風力擺的控制部分和預設值輸入與顯示部分。風力擺控制是由STM32定時器輸出頻率,占空比可調的PWM波經(jīng)驅動模塊之后,使直流風機的轉數(shù)與PWM波占空比成線性關系,以此達到控制風力擺擺動的目的。預設值輸入與顯示是通過矩陣鍵盤將預設值輸入到微處理器。再由處理器將數(shù)據(jù)送至OLED上顯示。MPU6050的三軸加速度數(shù)據(jù)和三軸角速度數(shù)據(jù)
4、,經(jīng)MCU解算之后得到風力擺擺角,形成信號反饋回路。組成閉環(huán)控制系統(tǒng)。控制算法為PI調節(jié)。</p><p> 關鍵詞:STM32F103VCT6; MPU6050;PID控制算法。</p><p> Wind pendulum control system</p><p><b> Abstract</b></p><
5、p> This system is structured by microprocessor STM32, DC fan and its drive, inertial Measuring Unit MPU60510, OLED display, 4*4 rectangular keyboard, and buzzer. The operation of this system is associated with two ma
6、in parts, one is wind pendulum control, and another one is default input and output. The frequency of STM32 timer andthe adjustable duty ratio of PWM go through the wave driving template make the turns of rotation of DC
7、fan are linear with duty ratio of PWM, so thatthe wind pendulum is </p><p> Key word: STM32F103VCT6; MPU6050;PID</p><p><b> 目錄</b></p><p><b> 前言1</b><
8、/p><p> 第一章 系統(tǒng)方案設計與論證3</p><p> 1.1 系統(tǒng)整體結構3</p><p> 1.2 方案簡述3</p><p> 1.3 電源選取3</p><p> 1.4 直流風機3</p><p> 1.5 三維角度傳感器3</p><
9、;p> 1.6 風機驅動模塊4</p><p> 1.7 風力擺結構4</p><p> 1.8 控制算法4</p><p> 第二章 理論分析與計算5</p><p> 2.1 起擺分析5</p><p> 2.2 擺動固定長度5</p><p> 2.3
10、PID算法分析5</p><p> 2.4 擺角解算6</p><p> 第三章 系統(tǒng)各模塊電路設計9</p><p> 3.1 穩(wěn)壓電路模塊9</p><p> 3.2 矩陣鍵盤模塊9</p><p> 3.3 風機驅動模塊10</p><p> 第四章 軟件設計流
11、程11</p><p> 4.1 軟件結構11</p><p> 4.2 軟件流程簡介11</p><p> 4.3 顯示模塊初始化及其界面程序分析11</p><p> 4.4 MPU6050的初始化及相關程序段分析15</p><p> 第五章 測試方案與測試結果18</p>
12、<p> 5.1 測試所用儀器18</p><p> 5.2 測試方案18</p><p> 5.3 誤差分析19</p><p><b> 致謝20</b></p><p><b> 參考文獻21</b></p><p><b>
13、 附錄22</b></p><p><b> 前言</b></p><p> 風力擺控制系統(tǒng)即控制做自由擺運動。自由擺是一種典型而具有代表性的運動形式,一直以來人們對單擺運動的運動規(guī)律進行了大量的研究,自由擺運行相當于是從單擺運動衍生的運動形式。風力擺系統(tǒng)是一個典型非線性,不穩(wěn)定的系統(tǒng)。在經(jīng)典控制理論和現(xiàn)代控制理論的應用是一個很具有代表性的問題。將其
14、作為實驗裝置時可以測試控制理論,檢驗控制方法和思路。這些控制思想都能廣泛應用于一般工業(yè)過程控制,所以對于風力擺控制系統(tǒng)在控制理論的探索方面具有很重要的理論研究和實際應用價值。</p><p> 該系統(tǒng)所運用的傳感器為慣性測量單元,慣性技術作為一門高科技尖端技術,它結合了機電、光學、數(shù)學、力學、控制及計算機科學的尖端技術。慣性是所有質量體的基本屬性,建立在慣性原理基礎上的系統(tǒng)不需要任何外界信息,也不會向外輻射任何
15、信息,僅靠其系統(tǒng)本身就能在全天候環(huán)境下,自主的進行連續(xù)的三維定向和定位。并且能獲取運載體完備的運動信息,以及具有優(yōu)秀的隱蔽性。這些特點是其他導航系統(tǒng)所無法比擬的。</p><p> 運動控制系統(tǒng)包括的處理運動算法和信號的控制器,能增強信號、可供應執(zhí)行器提供運動輸出放大器;慣性測量單元檢測數(shù)據(jù)進行反饋,可基于輸出和輸入的比較值,構成閉環(huán)系統(tǒng)。調節(jié)器對偏差信號進行比例、積分、微分運算。微分作用加快系統(tǒng)動作速度,減少
16、超調,克服振蕩;積分作用消除靜態(tài)誤差。三種作用方式結合在一起可以達到既快速便捷,平穩(wěn)準確的效果。采用這種方式構成的調節(jié)器,只需改變輸入和反饋電路的內(nèi)容,便能獲得不同的調節(jié)規(guī)律。</p><p> 控制系統(tǒng)里的一些比較抽象的概念,反饋、穩(wěn)定性、發(fā)散收斂速度和系統(tǒng)的抗干擾性能等,風力擺都能有很直觀的表現(xiàn)。對于該系統(tǒng)典型的控制方法有,PID控制、智能控制、模糊控制等??刂评碚摰难芯咳藛T將風力擺系統(tǒng)作為研究對象,希望開
17、拓出新的控制方法,應用在航空航天等高科技領域。</p><p> 傳統(tǒng)8/16位單片機,雖然在工業(yè)領域中得到了廣泛運用,但是現(xiàn)在的越來越多的工程控制產(chǎn)品的需求多功能、易用界面、低功耗、多任務等等一系列任務。對于這些需求,僅僅使用傳統(tǒng)8/16位單片機已經(jīng)不足以滿足??礈柿诉@個市場,ARM公司推出了Cortex</p><p> -M3處理器,它對微控制器和低成本應用提出優(yōu)化,具有低成本、
18、低功耗和高性能的特點,能夠滿足工程師進行創(chuàng)新設計的需求。</p><p> 意法半導體公司推出了基于Cortex-M3內(nèi)核32位的微控制器STM32,相對于ARM7、ARM9這類速度更快的32位來說,采用最合適的內(nèi)核構架以及獨特的開發(fā)方式。它具有性價比高和易于開發(fā)兩個優(yōu)勢。這導致STM32一上市就以非??斓乃俣日紦?jù)了中低端微控制器的市場。</p><p> STM32的有兩種開發(fā)方式。
19、一種是與傳統(tǒng)單片機開發(fā)方式相同的寄存器開發(fā),就是通過對微處理器的進行直接的讀寫操作。使用這種方式需要對微處理器的底層寄存器以及外圍電路有很深的理解。而且由于STM32的寄存器種類和數(shù)量都要比傳統(tǒng)單片機多得多,故使用寄存器開發(fā)方式有比較高的門檻。這種方式的優(yōu)點也十分明顯,它十分貼近物理電路層面,這樣設計出的系統(tǒng),其穩(wěn)定性、可靠性以及運行速度都要好得多。</p><p> 另外一種開發(fā)方式是庫函數(shù)開發(fā)。這是一種自頂
20、而下的方式剛好與前一種方式相反,可以從上層的API一層一層跟蹤到底層寄存器,從而徹徹底底的了解寄存器,了解CPU的內(nèi)存分布,再到啟動代碼、開發(fā)環(huán)境設置等等。這種方式大大的降低了學習開發(fā)STM32的門檻,讓初學者能夠快快速上手,僅通過調用庫里的API(應用程序接口)就能夠實現(xiàn)一個大型程序的搭建。做出能滿足各種用戶需求的應用。</p><p> 第一章 系統(tǒng)方案設計與論證</p><p>
21、 1.1 系統(tǒng)整體結構</p><p><b> 圖1 系統(tǒng)整體框圖</b></p><p><b> 1.2 方案簡述</b></p><p> 本系統(tǒng)以超低功耗MCUSTM32F103VCT6為控制核心,風力擺采用萬向節(jié)、碳素纖維管、四個直流風機構成。MCU輸出PWM波經(jīng)過直流電機驅動控制四個風機轉動,使風力擺
22、獲得擺動動力。MPU6050的三軸加速度數(shù)據(jù)和三軸角速度數(shù)據(jù),經(jīng)MCU解算之后得到風力擺擺角,形成信號反饋回路。組成閉環(huán)控制系統(tǒng)。</p><p><b> 1.3 電源選取</b></p><p> 自制穩(wěn)壓源,電源電壓穩(wěn)定,上電即可用,能省掉系統(tǒng)校準的麻煩,自制穩(wěn)壓源采用78系列穩(wěn)壓芯片,最大輸出電流為3A,但對該項目而言,4個直流風機轉動時,電流過大。自制穩(wěn)
23、壓源并不能滿足要求。采用兆信KXN3030B直流穩(wěn)壓電源,最大電壓可達到30V,最大輸出電流能到達30A,能提供四個風機轉動所需電流,電壓穩(wěn)定性也可滿足要求。</p><p><b> 1.4 直流風機</b></p><p> 采用通用小型軸流風機,12V直流供電,輕巧。但功率不大,風力太小,并不能讓風力擺在短時間內(nèi)達到題目所需要的擺動長度。采用小型涵道有刷風機
24、,涵道風機屬于高速軸流風機, 12V直流供電,風機產(chǎn)生風力能有效使風力擺擺動。能滿足要求。</p><p> 1.5 三維角度傳感器</p><p> 采用L3GD20三軸陀螺儀,能測量三軸角速度。如果在此使用還需再另外加載一個三軸加速度計,而采用微處理單元MPU6050。該芯片包含三軸加速度計及三軸陀螺儀,外圍電路設計簡單,采用IIC通信協(xié)議,具有量程大,精度高,功耗低等特點。完全滿
25、足題目要求且具備更優(yōu)的性能。</p><p> 1.6 風機驅動模塊</p><p> 采用L298N電機驅動模塊,最大工作電壓為50V,最高電流4A,一個芯片能驅動兩個直流電機。對于本系統(tǒng)來說,4A電流供兩個電機工作有點勉強,調節(jié)裕度太小。而采用BTN7971的驅動模塊,驅動板工作電壓范圍:7V~14V,最大電流能達到60A,能滿足題目要求。且調節(jié)裕度很大。</p>&
26、lt;p><b> 1.7 風力擺結構</b></p><p> 一組4個直流風機用粗單股導線吊掛在支架上,擺動阻力小,受力更均勻,但單股導線在畫圓時必然產(chǎn)生自旋,加大了系統(tǒng)的控制難度。如果用一組4個直流風機用碳素纖維管通過萬向節(jié)固定在支架上,由于碳棒和萬向節(jié)是剛體,在控制過程中不會遇到自旋的問題,萬向節(jié)擺動時阻力只比粗導線略大,對擺動影響不大。</p><p&
27、gt;<b> 1.8 控制算法</b></p><p> 采用模糊控制算法,模糊控制算法是對手動操作者的手動控制策略、經(jīng)驗的總結.模糊控制算法有多種實現(xiàn)形式,應用最早、最廣泛的是查表法,查表法可大大提高模糊控制的時效性,節(jié)省內(nèi)存,它不需要事先知道對象的數(shù)學模型,具有系統(tǒng)響應快、超調小、過渡過程時間短等優(yōu)點,但編程復雜,數(shù)據(jù)處理量大。 如果采用PID算法,按比例(P)、積分(I)、微分(
28、D)的函數(shù)關系,進行運算,將其運算結果用以輸出控制。優(yōu)點是控制精度高,且算法簡單明了。對于本系統(tǒng)的控制已足夠精確,節(jié)約了MCU的資源和運算時間。 </p><p> 第二章 理論分析與計算</p><p><b> 2.1 起擺分析</b></p><p> 風力擺擺動是依靠風機轉動推動空氣,空氣對風力擺有一個反作用力使風力擺運動起來,
29、想讓風力擺擺動起來,就要使空氣對風力擺的作用力力的方向與速度方向一致。只要控制風機,滿足這個條件轉動,就可以使風力擺的擺動幅度越來越大。本題我們是通過一開始讓一個風機機轉動一定時間,形成小幅度擺動,然后在擺動到最高點的時候,每次位于最高點的風機轉動,這樣使擺動幅度慢慢增加。</p><p> 2.2 擺動固定長度</p><p> 風力擺擺動過程就是動能與重力勢能相互轉化的過程。理想情
30、況下,風力擺應該是可以一直擺動不停止。既只要彌補掉風力擺每次擺動損失的能量就能讓擺擺長穩(wěn)定不變。通過調節(jié)風機轉動,能做到使擺長無明顯衰減也不明顯增大,再通過MPU6050數(shù)據(jù),姿態(tài)解算得到擺角,每一個擺角都能對應成相應擺長。這樣就可以得到與設定偏差長度,再使用PID控制算法自動調節(jié)減小偏差,達到擺動固定長度的要求。</p><p> 2.3 PID算法分析</p><p> 工程實際
31、中,應用最為廣泛調節(jié)器控制規(guī)律為比例、積分、微分控制,簡稱PID控制。 PID控制器問世至今已有近70年歷史,它以其結構簡單、穩(wěn)定性好、工作可靠、調整方便而成為工業(yè)控制主要技術之一。當被控對象結構和參數(shù)不能完全掌握,或不到精確數(shù)學模型時,控制理論其它技術難以采用時,系統(tǒng)控制器結構和參數(shù)必須依靠經(jīng)驗和現(xiàn)場調試來確定。</p><p> PID連續(xù)系統(tǒng)模型為:</p><p> MCU是數(shù)
32、字調節(jié),動作是斷續(xù)的。它以采樣周期為間隔,對MPU6050輸出進行采樣,由于該傳感器輸出為數(shù)字量,故不需要進行模數(shù)轉換。采用數(shù)據(jù)經(jīng)過解算后的到偏差信號,經(jīng)過一定調節(jié)規(guī)律算出輸出值,再通過PWM波向傳送給風機的驅動電路。對MCU來說,需要將上式離散化才能進行運用。</p><p><b> PID離散模型為:</b></p><p> 再將離散算法再是通過軟件實現(xiàn):
33、</p><p> X=X.in - X.offset;</p><p> increment += X;//對X進行積分</p><p> if(increment > increment.max)</p><p> increment = increment.max;</p><p> el
34、se if(increment < -increment.max)</p><p> increment = -increment.max;</p><p> pid_out = kp * X + ki * increment + kd * (X - X _old);</p><p> X _old = X; </p><p>
35、 其中X為偏差信號、X.in為傳感器信號輸入、X.offset為設定值、increment偏差信號積分,increment.max 為積分上限,kp、ki、kd為PID參數(shù),整個程序每隔時間運行一次。</p><p><b> 2.4 擺角解算</b></p><p> 系統(tǒng)的由于慣性測量單元(MPU6050)直接固聯(lián)在單擺中心軸線上,是一個捷聯(lián)式慣導系統(tǒng)。MPU
36、6050測量擺錘的角運動信息和線運動信息,MCU根據(jù)這些信息可解算出擺角。</p><p> 以下參數(shù)均為MPU6050的原始數(shù)據(jù)經(jīng)濾波之后的得到:</p><p> 參數(shù),,分別對應三個軸的角速度數(shù)據(jù),單位是 弧度/秒;</p><p> 參數(shù),,分別對應三個軸的加速度數(shù)據(jù),單位是 米/秒;</p><p> 先根據(jù)加速度數(shù)據(jù)轉換單
37、位加速度分別為,,</p><p> 設將地理坐標參考系轉到當前的系統(tǒng)參考系(角速度積分)的旋轉用四元數(shù)表示為:</p><p> 將地理重力單位向量轉到當前參考系。則有:</p><p> 向量(,,)為在當前參考坐標系的中地理重力單位向量。</p><p> MPU6050的加速度計由于噪聲比較大,受振動影響比其角速度計明顯,在一
38、段較短時間內(nèi)的可靠性不高。而角速度計噪聲小,但是由于積分是離散的,長時間的積分會出現(xiàn)漂移,從而產(chǎn)生較大誤差。因此需要用加速度計求得的姿態(tài)來矯正角速度積分得到的姿態(tài)。</p><p> 在當前參照系上,由于擺錘只受重力作用,故加速度計輸出即為測出來的重力向量是(,,);根據(jù)陀螺儀工作原理,角速度積分后的姿態(tài)來推算出的重力向量是(,,),它們之間的誤差向量,就是角速度積分后的姿態(tài)和加速度計測出來的姿態(tài)之間的誤差。&
39、lt;/p><p> 向量間的誤差即向量積(也叫外積、叉乘):</p><p> 、、 就是兩個重力向量的叉積。這個叉積向量依然是位于當前坐標參考系上,而角速度積分誤差也是在當前坐標參考系,而且叉積的大小與角速度積分誤差成正比,正好拿來糾正陀螺。對叉積進行積分:</p><p> 用叉乘誤差來做PI修正陀螺零偏,通過調節(jié)Kp,Ki兩個參數(shù),可以控制加速度計修正陀螺
40、儀積分姿態(tài)的速度</p><p> 再對角速度進行直接積分:</p><p> 再將該四元數(shù)歸一化之后,轉換成歐拉角即可得到兩個方向的擺角</p><p> 第三章 系統(tǒng)各模塊電路設計</p><p> 3.1 穩(wěn)壓電路模塊</p><p> 由于直流電機做執(zhí)行機構,所以需要有給直流電機供電的電源,并且為了
41、防止電機轉動帶來的電流對MCU的影響,MCU供電和電機供電要分開。所以選用7805穩(wěn)壓芯片輸出5V穩(wěn)定電壓給MCU供電。C1、C2分別為輸入端和輸出端濾波電容。</p><p> 圖2 穩(wěn)壓電路模塊原理圖</p><p> 3.2 矩陣鍵盤模塊</p><p> 鍵盤作為人機交互的輸入設備,其在要求有充足的輸入端為人機交互信息輸入做好硬件基礎,CH451。內(nèi)
42、置RC 振蕩電路,可以動態(tài)驅動8 位數(shù)碼管或者64 位LED燈,具有BCD 譯碼、移位等功能;同時還可以進行64 鍵的鍵盤掃描;CH451 通過1 線或者可以級聯(lián)的4 線串行接口與MCU等交換數(shù)據(jù);并且提供上電復位和看門狗等監(jiān)控功能。本系統(tǒng)以CH451為核心的矩陣鍵盤,CH451芯片內(nèi)部自帶硬件消抖,大大方便軟件處理,并可做到多達64個按鍵,本次設計使用16個按鍵。</p><p> 圖3 CH451矩陣鍵盤
43、原理圖</p><p> 3.3 風機驅動模塊</p><p> 風機作為本系統(tǒng)的動力部分,其功率要求大,對驅動承受電流值要求高,以BTN7971B驅動芯片為核心的電機驅動,可以承受0—68A電流,本系統(tǒng)每個風機驅動采用雙BTN7971B大電流H橋驅動。</p><p> 圖4 風機驅動模塊原理圖</p><p> 第四章 軟件設
44、計流程</p><p><b> 4.1 軟件結構</b></p><p> 圖5 軟件流程圖</p><p> 4.2 軟件流程簡介</p><p> 開始運行以后,首先進行系統(tǒng)各個硬件的初始化,然后進入循環(huán)體進行按鍵掃描,檢測到有鍵按下通過switch判斷后進入相應的功能界面中,進入界面后輸入相應的參數(shù)后
45、,按下確定鍵,風力擺即可安裝設定參數(shù)進行動作。</p><p> 4.3 顯示模塊初始化及其界面程序分析</p><p> 本系統(tǒng)使用的顯示模塊為ALIENTEK 推出的一款高性能 OLED 顯示模塊ATK-0.96’ OLED,要使用這個顯示模塊,主要有三個步驟,首先是選擇MCU與OLED通信所使用的通信協(xié)議,再根據(jù)所選的通信協(xié)議進行物理線路的連接,最后用MCU通過協(xié)議對模塊寄存器
46、進行配置。</p><p> 這里使用的是SPI通信協(xié)議;</p><p> SPI, Serial Perripheral Interface, 串行外圍設備接口, 是 Motorola 公司推出的一種同步串行接口技術. SPI 總線在物理上是通過接在外圍設備微控制器(PICmicro) 上面的微處理控制單元 (MCU) 上叫作同步串行端口(Synchronous Serial Po
47、rt) 的模塊(Module)來實現(xiàn)的, 它允許 MCU 以全雙工的同步串行方式, 與各種外圍設備進行高速數(shù)據(jù)通信。</p><p> 圖6 SPI寫時序圖</p><p> (本圖片摘自ATK-0.96’ OLED模塊用戶手冊_V1.0)</p><p><b> CS:片選信號</b></p><p> RS
48、T(RES):硬復位</p><p> DC:命令/數(shù)據(jù)標志(0,讀寫命令;1,讀寫數(shù)據(jù))。 </p><p> SCLK(D0):串行時鐘線SCLK</p><p> SDIN(D1):串行數(shù)據(jù)線SDIN </p><p> 圖7 MCU與OLED通信原理圖</p><p> 在發(fā)送數(shù)據(jù)時, MCU要先向內(nèi)
49、部緩沖區(qū)里寫入將要發(fā)送出去的數(shù)據(jù), 這些數(shù)據(jù)會被移位寄存器自動移入內(nèi)部緩沖區(qū)里的數(shù)據(jù), 然后這些數(shù)據(jù)通過MCU的SDO管腳傳給OLED的SDI 管腳, OLED的移位寄存器則把從SDI管腳接收到的數(shù)據(jù)移入其內(nèi)部緩沖區(qū) 里. 與此同時, OLED的移位寄存器里面的數(shù)據(jù)根據(jù)每次接收數(shù)據(jù)的大小, 通過OLED的SDO 發(fā)往 MCU的SDI, MCU的移位寄存器再把從 SDI 接收的數(shù)據(jù)移入內(nèi)部緩沖區(qū).在單次數(shù)據(jù)傳輸完成之后,內(nèi)部緩沖區(qū)會將數(shù)
50、據(jù)移出到相應的讀寄存器中,程序可以通過從MCU讀寄存器讀取與OLED數(shù)據(jù)交換得到的數(shù)據(jù)。在這個過程中時鐘信號又MCU的定時器生成通過SCK線傳輸給OLED模塊,從而實現(xiàn)同步。</p><p> MCU與OLED的數(shù)據(jù)交換之后向其控制寄存器中寫入相應參數(shù)進行初始化,之后就可以對顯示模塊的界面進行相應的配置。</p><p><b> 界面程序分析:</b></
51、p><p> typedef struct </p><p><b> {</b></p><p><b> u8 SET;</b></p><p><b> u8 mode;</b></p><p><b> u8 point;<
52、;/b></p><p> u8 pointMAX;</p><p> u8 Numallow;</p><p> u8 NumFlag;</p><p> u8 pointFlag;</p><p> float Value;</p><p><b> }<
53、/b></p><p><b> KeyNum;</b></p><p> extern KeyNum KEY_FLAG;</p><p> 以上為按鍵的結構體定義以及聲明。其中定義了按鍵配合顯示的各種標志位,以及鍵盤輸入值的緩存空間Value。</p><p> void window_main(void
54、)</p><p><b> {</b></p><p> switch(KEY_FLAG.mode)</p><p><b> { </b></p><p> case 0:window0();break;</p><p> case 1:window1();
55、break;</p><p> case 2:window2();break;</p><p> case 3:window3();break;</p><p> case 4:window4();break;</p><p> case 5:window5() ;break;</p><p> defaul
56、t:break;</p><p><b> }</b></p><p><b> }</b></p><p> 這是程序主循環(huán)中的內(nèi)容,用于根據(jù)按鍵輸入的值確定系統(tǒng)將要執(zhí)行的動作以及進入對應的功能設置界面,其中window0()為主界面,window1()~window5()為相應的功能界面。</p>
57、<p> void window0(void)</p><p><b> {</b></p><p> if(KEY_FLAG.mode==0)</p><p><b> { </b></p><p> if(!KEY_FLAG.pointFlag)</p>&
58、lt;p><b> { </b></p><p> OLED_Fill(0x00); //清屏</p><p> OLED_P6x8Str(0,0, (uint8_t *)"1.request1 and 2");</p><p> OLED_P6x8Str(0,1,(uint8_t *)"2.req
59、uest3 ");</p><p> OLED_P6x8Str(0,2,(uint8_t *)"3.request4 ");</p><p> OLED_P6x8Str(0,3,(uint8_t *)"4. request5 ");</p><p> OLED_P6x8Str(0,4,(uint8_t *
60、)"5. request6");</p><p> OLED_P6x8Str(0,7,(uint8_t *)"mode= 000 "); </p><p> KEY_FLAG.pointFlag=1; </p><p><b> }</b></p><p> OLE
61、D_P6x8Num_8bit(36,7,mode);</p><p><b> }</b></p><p><b> }</b></p><p> 該函數(shù)設置系統(tǒng)主界面里面顯示的元素以及實時的對mode這個功能字進行顯示。</p><p> void window1(void)</p&
62、gt;<p><b> {</b></p><p> if(KEY_FLAG.mode!=0)</p><p><b> { </b></p><p> if(!KEY_FLAG.pointFlag)</p><p><b> { </b></
63、p><p> OLED_Fill(0x00); </p><p> OLED_P6x8Str(0,0,(uint8_t *)"1.request1 and 2");</p><p> OLED_P6x8Str(0,2,(uint8_t *)"Length: ");</p><p> OLE
64、D_P6x8Str(0,4,(uint8_t *)"--------------");</p><p> KEY_FLAG.pointFlag=1;</p><p> KEY_FLAG.point=1;</p><p> KEY_FLAG.pointMAX=3;</p><p> KEY_FLAG.Numallow
65、=1;</p><p><b> }</b></p><p> switch(KEY_FLAG.point)</p><p><b> {</b></p><p> case 0: ;break;</p><p> case 1:{OLED_P6x8Num_8bit
66、(42,2, KEY_FLAG.Value);}break;</p><p> case 2:{Clength=KEY_FLAG.Value;</p><p> OLED_P6x8Str(110,2,(uint8_t*)"OK");</p><p> KEY_FLAG.Value=0;</p><p> KEY_F
67、LAG.point++;</p><p><b> }break;</b></p><p> case 3:{ </p><p> KEY_FLAG.Numallow=0;</p><p> if(KEY_FLAG.SET) </p><p><b> { </b&g
68、t;</p><p> OLED_P6x8Str(0,7,(uint8_t *)" SET!!!!");</p><p> request1();</p><p><b> }</b></p><p><b> }break;</b></p>&l
69、t;p> default:break;</p><p><b> }</b></p><p> 功能界面配置函數(shù),這個函數(shù)實現(xiàn)的功能是對擺長的設定,并且一鍵啟動。其中首先是對圖像界面進行了設置,然后進行鍵盤輸入值的實時顯示,以及鍵值和相應的動作設備直接的數(shù)據(jù)傳遞,實現(xiàn)通過鍵盤對單擺擺長,停擺等動作的控制。這個函數(shù)是一個功能窗口模版,其他的功能配置一樣是通過
70、這個函數(shù)實現(xiàn),使用時只需修改if(KEY_FLAG.SET){}這個大括號的內(nèi)容以及界面的顯示字符。</p><p> 4.4 MPU6050的初始化及相關程序段分析</p><p> MPU6050整合了三軸陀螺儀、三軸加速度計,可同時對角速度和加速度進行測量,初始化MPU6050首先就需要在MCU上實現(xiàn)數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議。</p><p> 通信協(xié)議為I
71、IC總線協(xié)議,該協(xié)議的硬件連接十分簡單,只要求兩條總線線路 一條串行數(shù)據(jù)線 SDA 一條串行時鐘線 SCL。IIC是一個真正的多主機總線 如果兩個或更多主機同時初始化數(shù)據(jù)傳輸可以通過沖突檢測和仲裁防止數(shù)據(jù)被破壞。</p><p> 在 I2C 總線中 有起始條件和停止條件,起始條件是指SCL線是高電平時 SDA 線從高電平向低電平切換。停止條件是指當 SCL 是高電平時 SDA 線由低電平向高電平切換。起始和停
72、止條件都由MCU產(chǎn)生。</p><p><b> 起始條件:</b></p><p><b> SDA_H;</b></p><p><b> SCL_H;</b></p><p> _NOP;//適當延時</p><p><b>
73、SDA_L;</b></p><p><b> 結束條件:</b></p><p><b> SDA_L;</b></p><p><b> SCL_H;</b></p><p> _NOP; //適當延時</p><p><b
74、> SDA_H;</b></p><p> SDA 線電平要在SCL 線的高電平周期保持不變。數(shù)據(jù)線的高或低電平狀態(tài)只有在 SCL 線的時鐘信號是低電平時才能改變。</p><p> MCU在GPIO上生成開始條件后,SCL發(fā)生一次下降沿時,MCU從SDA讀入一位數(shù)據(jù),連續(xù)8次完成1byte的一個字節(jié)數(shù)據(jù)傳輸。每次次發(fā)送數(shù)據(jù)必須為 8 位一個字節(jié)。每次傳輸可以發(fā)送的
75、字節(jié)數(shù)量不受限制 每個字節(jié)后必須跟一個響應位。數(shù)據(jù)傳輸順序是從高位到低位。如果在數(shù)據(jù)傳輸過程中,MCU不能立即接受數(shù)據(jù)。例如有一個一個內(nèi)部中斷服務程序優(yōu)先級在數(shù)據(jù)傳輸程序之上,可以使時鐘線 SCL 保持低電平讓主機進入等待狀態(tài) 當從機準備好接收下一個數(shù)據(jù)字節(jié)并釋放時鐘線 SCL 后,數(shù)據(jù)繼續(xù)傳輸。</p><p> IIC協(xié)議配置完畢之后就開始對MPU6050的寄存器進行配置:</p><p
76、> u8 InitMPU6050(void)</p><p><b> {</b></p><p><b> u8 date;</b></p><p> date = Single_Write(MPU6050_ADDRESS, PWR_MGMT_1, 0x00); </p><p>
77、<b> //解除休眠狀態(tài)</b></p><p> date += Single_Write(MPU6050_ADDRESS, SMPLRT_DIV, 0x07); </p><p> date += Single_Write(MPU6050_ADDRESS, cONFIG, 0x03); </p><p>&l
78、t;b> //低通濾波</b></p><p> date += Single_Write(MPU6050_ADDRESS, GYRO_CONFIG, 0x10); </p><p> //陀螺儀量程選擇 +-1000</p><p> date += Single_Write(MPU6050_ADDRESS, ACCEL_CONFI
79、G, 0x09); </p><p> //加速度計量程選擇 +-4G</p><p> return date;</p><p><b> }</b></p><p> 在寄存器配置完成之后,MPU6050就已經(jīng)開始工作,通過對其數(shù)據(jù)緩存器進行讀操作就能得到相應的角速度和加速度。讀取完畢后的數(shù)據(jù)不能直接使用,
80、其中的噪聲很大,需要用濾波算法將其有效信號提取出來再進行使用。</p><p> double IIR_I_Filter(double InData, double *x, double *y, double *b, short nb, double *a, short na)</p><p><b> {</b></p><p> do
81、uble z1,z2;</p><p><b> short i;</b></p><p> double OutData;</p><p> for(i=nb-1; i>0; i--)</p><p><b> {</b></p><p> x[i]=x[i
82、-1];</p><p><b> }</b></p><p> x[0] = InData;</p><p> for(z1=0,i=0; i<nb; i++)</p><p><b> {</b></p><p> z1 += x[i]*b[i];<
83、/p><p><b> }</b></p><p> for(i=na-1; i>0; i--)</p><p><b> {</b></p><p> y[i]=y[i-1];</p><p><b> }</b></p>&
84、lt;p> for(z2=0,i=1; i<na; i++)</p><p><b> {</b></p><p> z2 += y[i]*a[i];</p><p><b> }</b></p><p> y[0] = z1 - z2; </p><p&g
85、t; OutData = y[0];</p><p> return OutData;</p><p><b> }</b></p><p> 該函數(shù)實現(xiàn)的是一個IIR直接I型濾波器,InData為當前數(shù)據(jù),*x為未濾波數(shù)據(jù)緩存區(qū),*y為已濾波數(shù)據(jù)緩存區(qū),*b、*a為參數(shù)緩存區(qū),nb、na 為濾波器階,OutData為輸出結果。
86、 </p><p> 第五章 測試方案與測試結果</p><p> 5.1 測試所用儀器</p><p><b> 5.2 測試方案</b></p><p> ?。?) 從靜止開始,進行幅度可控的擺動,畫出長度可設置,偏差不大于±2.5cm 的直線段,并且具有較好的重復性,用上位機觀察角速度波形是否發(fā)散
87、(或收斂)記錄風力擺達到要求所需時間,實際直線段長度。</p><p> ?。?)風力擺從靜止開始,設定擺動方向,按照設置的方向(角度)擺動,畫出不短于20cm 的直線段。記錄風力擺達到要求所需時間,實際直線段長度。</p><p> ?。?) 將風力擺拉起一定角度(30°~45°)放開,記錄風力擺制動達到靜止狀態(tài)的時間。</p><p> (
88、4)以風力擺靜止時激光筆的光點為圓心,驅動風力擺用激光筆在地面畫</p><p> 圓,重復3次;在 15~35cm 范圍內(nèi)設置圓半徑,記錄風力擺達到要求所需時間,</p><p> 設定圓半徑,實際園半徑。</p><p> ?。?)作圓周運動,在距離風力擺 1~2m 距離內(nèi)用一臺 50~60W 臺扇在水平方向吹向風力擺,臺扇吹 5s 后停止,記錄風力擺恢復發(fā)
89、揮設定規(guī)定的圓周運動所需時間。設定圓半徑,實際園半徑。</p><p><b> 5.3 誤差分析</b></p><p> 機械結構不均勻使風力擺靜止時重心不位于中軸線上,擺角解算出的角度與實際角度有誤差。</p><p><b> 致謝</b></p><p> 這篇論文是三個月來在老師
90、悉心指導下綜合運用大學這幾年來所學的各種專業(yè)知識與實踐相結合的結果。</p><p> 這篇論文能夠完成,首先要感謝唐XX老師的悉心指導。唐老師見識廣博,為我提供了大量的資源以及更為廣闊的發(fā)展空間。并開放實驗室,讓我能將純粹理論與實際聯(lián)合在一起,得出最正確的結論。</p><p> 從剛開始的什么都不懂到現(xiàn)在論文就要完成,其中的過程有許多磕磕碰碰。經(jīng)歷過后真正的感覺以往學到的理論知識,
91、不僅僅只是理論。似乎許多事物都能透過現(xiàn)象看到它的工作本質。在這整個過程中還有許多可敬的朋友、同學、師長給了幫助,在這里請接受我最誠摯的謝意,由于筆者能力有限,文章中可能有許多錯誤或疏漏之處,懇請各位老師予以斧正。</p><p><b> 參考文獻</b></p><p> 【1】 胡壽松.自動控制原理(第六版).科學出版社</p><p>
92、; 【2】 秦永元.慣性導航(第二版).科學出版社</p><p> 【3】 宋 巖.ARM Cortex-M3權威指南.北京航空航天大學出版社</p><p> 【4】 劉火良.STM32庫開發(fā)實戰(zhàn)指南.機械工業(yè)出版社</p><p> 【5】 童詩白.模擬電子技術基礎(第四版).高等教育出版社 </p><p> 【6】 閻石
93、.數(shù)字電子技術基礎.清華大學電子學教研組編</p><p> 【7】 張華清等.信號與系統(tǒng)分析.機械工業(yè)出版社</p><p> 【8】 邱關源等.電路.高等教育出版社 </p><p> 【9】 李元春.計算機控制系統(tǒng) .高等教育出版社</p><p> 【10】譚浩強.C程序設計.北京:清華大學出版社</p><
94、;p> 【11】 楊建華 楊艷琴.MSP430系列16位超低功耗單片機原理與實踐.北京航空航天大學出版社</p><p> 【12】羅杰 謝自美.電子線路 設計·實驗·測試.電子工業(yè)出版社</p><p> 【13】黃根春等.全國大學生電子設計競賽教程:基于TI器件設計方法.電子工業(yè)出版社</p><p> 【14】胡壽松.自動控制
95、原理(第五版).科學出版社</p><p> 【15】蘇金明 . MATLAB7.0實用指南[M ].電子工業(yè)出版社</p><p> 【16】范超毅等.步進電機的選型與計算.機床與液壓</p><p> 【17】金以蕊.過程控制[M].清華大學出版社</p><p> 【18】徐科軍.傳感器與檢測技術(第二版).北京電子工業(yè)出版社&
96、lt;/p><p><b> 附錄</b></p><p> STM32VCT6原理圖</p><p> //********************************main.c********************************//</p><p> #include "include
97、.h" </p><p> #define MAX(v1,v2) v1>v2?v1:v2</p><p> extern u8 sentDateFlag;</p><p> u8 Status_Senser_RC_cnt=0,data_cnt=0;</p><p> u16 youa=0;</p>&l
98、t;p> void request1(void)</p><p><b> {</b></p><p> Swing(0,600);</p><p> TIM2->CCR1 = 0;</p><p> TIM2->CCR1 = 0;</p><p> TIM2->
99、;CCR1 = 0;</p><p> TIM2->CCR1 = 0;</p><p> EnTIM3(); </p><p><b> while(1)</b></p><p><b> {</b></p><p> if(sensor.gyro.ori
100、gin.x<100)</p><p> TIM2->CCR1=290;</p><p><b> else</b></p><p> TIM2->CCR1=0;</p><p> if(sentDateFlag) </p><p><b> {</b&g
101、t;</p><p> sentDateFlag = 0;</p><p> Status_Senser_RC_cnt++;</p><p> data_cnt++;</p><p> if(Status_Senser_RC_cnt==4)</p><p><b> {</b></
102、p><p> Status_Senser_RC_cnt = 0;</p><p> Send_Status = 1;</p><p> Send_Senser = 1;</p><p> Send_RCData=1;</p><p><b> }</b></p><p&g
103、t; if(data_cnt==3)</p><p><b> {</b></p><p> data_cnt=0;</p><p> Data_Exchange();</p><p><b> }</b></p><p><b> }</b&
104、gt;</p><p> BATTDispaly();</p><p><b> }</b></p><p><b> }</b></p><p> void request2(u16 l)</p><p><b> {</b></p&g
105、t;<p> float max_h=0,max_s=0;</p><p> u8 cnt=30;</p><p> u16 pid_out;</p><p> float e_h=0,sum_e=0;</p><p> pid_out=l*7/13;</p><p> Swing(0,l);
106、</p><p> TIM2->CCR1 = 0;</p><p> TIM2->CCR2 = 0;</p><p> TIM2->CCR3 = 0;</p><p> TIM2->CCR4 = 0;</p><p> EnTIM3(); </p><p
107、> max_h=atan((float)l/2/880)*57.3;</p><p><b> while(1)</b></p><p><b> {</b></p><p><b> if(cnt)</b></p><p><b> {</b&
108、gt;</p><p> if(max_s<angle.roll)</p><p> max_s = angle.roll;</p><p> if(angle.roll<1&&angle.roll>(-1))</p><p><b> cnt--;</b></p>
109、<p><b> }</b></p><p> if(sensor.gyro.origin.x<(100))</p><p> TIM2->CCR1=pid_out;</p><p><b> else</b></p><p> TIM2->CCR1=0;&l
110、t;/p><p> if(sentDateFlag) </p><p><b> {</b></p><p> sentDateFlag = 0;</p><p> Status_Senser_RC_cnt++;</p><p> data_cnt++;</p><p&
111、gt; if(Status_Senser_RC_cnt==4)</p><p><b> {</b></p><p> Status_Senser_RC_cnt = 0;</p><p> Send_Status = 1;</p><p> Send_Senser = 1;</p><p&g
112、t; Send_RCData=1;</p><p><b> }</b></p><p> if(data_cnt==3)</p><p><b> {</b></p><p> data_cnt=0;</p><p> Data_Exchange();<
113、;/p><p><b> }</b></p><p><b> }</b></p><p> BATTDispaly(); </p><p> if(cnt==0) </p><p><b> {</b></p><p>
114、 e_h=max_h-max_s;</p><p> sum_e+=e_h;</p><p> if(sum_e>150) sum_e=150;</p><p> pid_out = (28-l/100)*e_h+0.2*sum_e;</p><p> if(pid_out<0) pid_out=0;</p>
115、<p><b> cnt=30;</b></p><p><b> max_s=0;</b></p><p><b> }</b></p><p> if(sensor.gyro.origin.x<(100))</p><p> TIM2->C
116、CR1=pid_out;</p><p><b> else</b></p><p> TIM2->CCR1=0;</p><p><b> }</b></p><p><b> }</b></p><p> u8 flag_stop=1
117、,flag_stop2=1;</p><p> u16 time_requet4;</p><p> void request4(u16 time,u8 mode)</p><p><b> {</b></p><p> //float kp=3.5,kp_w=10;</p><p>
118、 float kp=2.7,kp_w=10;</p><p> //u16 time=400,pid_out;</p><p> u16 pid_out;</p><p> time_requet4=time;</p><p> request4_flag=1;</p><p><b> EnTI
119、M3();</b></p><p> GPIO_SetBits(GPIOB,GPIO_Pin_0);</p><p> delay(1000);</p><p> GPIO_ResetBits(GPIOB,GPIO_Pin_0);</p><p><b> while(1)</b></p>
120、<p><b> {</b></p><p> if(flag_stop2)</p><p><b> {</b></p><p> if(sensor.gyro.origin.x<0)</p><p><b> {</b></p>
121、<p> pid_out=-1*kp* sensor.gyro.origin.x-kp_w*angle.roll;</p><p> if(pid_out>2499)pid_out=2499;</p><p> TIM2->CCR3 =pid_out ;</p><p> TIM2->CCR1 = 0 ;</p>&
122、lt;p> //delay(time);</p><p> //TIM2->CCR3 = 0;</p><p><b> }</b></p><p> if(sensor.gyro.origin.x>0)</p><p><b> {</b></p&
123、gt;<p> pid_out=kp* sensor.gyro.origin.x+kp_w*angle.roll;</p><p> if(pid_out>2499)pid_out=2499;</p><p> TIM2->CCR1 = pid_out;</p><p> TIM2->CCR3 = 0 ;</p>
124、<p> //delay(time);</p><p> //TIM2->CCR1 = 0;</p><p><b> }</b></p><p> if(sensor.gyro.origin.y<0)</p><p><b> {</b></
125、p><p> pid_out=-1*kp* sensor.gyro.origin.y-(kp_w-0.1)*angle.pitch;</p><p> if(pid_out>2499)pid_out=2499;</p><p> TIM2->CCR4 = pid_out;</p><p> TIM2->CCR2 = 0
126、;</p><p> //delay(time);</p><p> //TIM2->CCR4 = 0;</p><p><b> }</b></p><p> if(sensor.gyro.origin.y>0)</p><p><b> {<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 風力擺控制系統(tǒng)設計論文
- 畢業(yè)設計----二維倒擺控制系統(tǒng)設計
- 路燈控制系統(tǒng)畢業(yè)設計論文
- 溫度控制系統(tǒng)設計畢業(yè)設計論文
- 風力擺控制系統(tǒng)-電子設計競賽項目設計報告
- 溫度控制系統(tǒng)設計畢業(yè)設計論文
- 畢業(yè)論文-基于labview的倒立擺控制系統(tǒng)設計
- 畢業(yè)論文-基于labview的倒立擺控制系統(tǒng)設計
- 模擬路燈控制系統(tǒng)畢業(yè)設計論文
- 畢業(yè)設計論文-智能溫度控制系統(tǒng)
- 滅火小車控制系統(tǒng)畢業(yè)設計論文
- 畢業(yè)設計(論文)-恒壓供水控制系統(tǒng)設計
- 智能溫度控制系統(tǒng)畢業(yè)設計論文
- 基于步進電機的自由擺控制系統(tǒng)設計【畢業(yè)論文】
- 風力擺控制系統(tǒng)(B題)2015電子設計大賽.pdf
- 鍋爐汽包水位控制系統(tǒng)設計-畢業(yè)設計論文
- 機械手控制系統(tǒng)設計畢業(yè)設計論文
- 畢業(yè)設計(論文)-礦車變頻牽引控制系統(tǒng)
- 自動加料機控制系統(tǒng)-畢業(yè)設計論文
- 交通燈控制系統(tǒng)畢業(yè)設計論文
評論
0/150
提交評論