版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
論文題目: 基于單片機(jī)的平衡小車的設(shè)計(jì)摘要:兩輪自平衡車在我們的生活中已經(jīng)是越來越常見,他的一個(gè)極其突出的特性就是不穩(wěn)定,與他很類似的一個(gè)模型就是倒立擺。我們必須知道倒立擺的狀態(tài),然后對(duì)他進(jìn)行干擾才能使它保持穩(wěn)定狀態(tài)。本論文所研究的方案就是基于這種原理,用陀螺儀和加速度計(jì)來獲取到平衡車的當(dāng)前狀態(tài),然后控制電機(jī)來作出相應(yīng)的干擾,來讓小車保持平衡。整個(gè)系統(tǒng)設(shè)計(jì)完成后,小車可以實(shí)現(xiàn)自主平衡功能。并且,在人為加入適量干擾后小車也能夠自主調(diào)整并迅速恢復(fù)至穩(wěn)定狀態(tài)。系統(tǒng)還保留了大部分接口,可以進(jìn)行二次開發(fā)和升級(jí),包括手機(jī)藍(lán)牙控制、wifi控制、視覺導(dǎo)航、軌跡跟蹤等。關(guān)鍵詞:加速度;PID算法;陀螺儀;兩輪自平衡小車Abstract:tworoundsofself-balancingvehicleisalreadymoreandmorecommoninourlife,he'saveryprominentfeatureisunstable,andheisverysimilartoamodelofinvertedpendulum.Weneedtoknowthestatusoftheinvertedpendulum,andthentohisinterferencetokeepitstable.Mentionedinthepresentpaperresearchplanisbasedontheprincipleofusinggyroscopeandaccelerometertogettothecurrentstateofthebalanceofthecar,andthencontrolthemotortomakecorrespondinginterference,toletthecarbalance.Aftercompletionofthewholesystemdesign,thecarcanachievebalancefunctionindependently.And,inhumanafteraddingsuitableamountofinterferenceThecarcanalsoindependentadjustmentandquicklyreturntoastablestate.Systemalsohaskeptmostoftheinterface,canundertakesecondarydevelopmentandupgrading,includingmobilephonebluetooth,wifi,visualnavigation,pathtracking,etc.Keywords:Accelerometer;PIDalgorithm;Gyroscope;Balanceofthecar目 錄1緒論 11.1自平衡小車的研究意義 11.2課題研究的主要任務(wù) 12原理分析與關(guān)鍵技術(shù) 22.1原理分析 22.2關(guān)鍵技術(shù) 22.2.1系統(tǒng)建模 22.2.2姿態(tài)檢測(cè) 22.2.3控制算法 33系統(tǒng)硬件設(shè)計(jì) 63.1物理架構(gòu) 73.2元器件選型 83.2.1微處理器 23.2.2陀螺儀與加速度計(jì) 23.2.3電機(jī)驅(qū)動(dòng) 33.2.4編碼器 33.2.5顯示屏 34系統(tǒng)軟件設(shè)計(jì) 164.1模塊初始化 174.2PID算法設(shè)計(jì) 184.3總體軟件架構(gòu) 274.4調(diào)試技巧 275總結(jié)與展望 375.1總結(jié) 375.2展望 37參考文獻(xiàn) 38附錄 38致謝 381緒論1.1研究意義近年來,科技發(fā)展,時(shí)代進(jìn)步。其中各種科技產(chǎn)品也是如雨后春筍紛紛涌現(xiàn),用科技改變世界的時(shí)代也是在加速到來。但是,日益擁堵的交通狀況問題也是越來越嚴(yán)重。改變交通現(xiàn)狀已經(jīng)刻不容緩,其中兩輪平衡車是極具代表性的一個(gè)產(chǎn)品,他適應(yīng)時(shí)代,應(yīng)運(yùn)而生。以其新穎,時(shí)尚,方便的優(yōu)勢(shì)迅速走入大家的生活。這種平衡車與其他短途代步工具的最顯著的特點(diǎn)是:他只有兩個(gè)輪子,都是獨(dú)立驅(qū)動(dòng)工作,并且兩個(gè)輪子在一根軸上面,車的重量加上人的重量正好落在車軸上面,通過輪子前后運(yùn)動(dòng)來保持車生的平衡。由于是使用蓄電池供電,所以沒有污染,并且可以重復(fù)適用,壽命很高。而且電動(dòng)機(jī)能量轉(zhuǎn)換運(yùn)行效率較高并且只有很小的噪音。由于兩個(gè)輪子都可以前進(jìn)后退,所以他可以在很狹窄的空間范圍當(dāng)中也可以進(jìn)退自如。對(duì)他的控制也是極其方便,只要通過身體的前后傾斜改變平衡車的傾斜角度,當(dāng)陀螺儀檢測(cè)到角度的變化后,將數(shù)據(jù)傳送給單片機(jī),單片機(jī)進(jìn)行數(shù)據(jù)處理和融合,將輸出型號(hào)傳送給電機(jī)驅(qū)動(dòng)芯片,進(jìn)而來控制電機(jī)運(yùn)轉(zhuǎn),防止人摔倒。這樣完全可以避免在傳統(tǒng)汽車上出現(xiàn)的剎車片老化剎車不靈的情況,極大地保證了駕駛?cè)藛T的安全?;谝陨细鞣N優(yōu)點(diǎn)可以看出兩輪自平衡車有著廣泛的應(yīng)用前景,目前市面上已經(jīng)涌現(xiàn)除了大量的平衡車。因此本論文對(duì)于平衡車的研究意義非凡。1.2課題研究的主要內(nèi)容本論文著重研究的兩輪平衡車系統(tǒng)主要是由單片機(jī)進(jìn)行控制。完成該設(shè)計(jì)后,小車能實(shí)現(xiàn)自我平衡,直立行走等基本功能。該系統(tǒng)采用了STM單片機(jī)作為核心的控制單元,并加上各種輔助傳感器,完成相對(duì)應(yīng)的電路設(shè)計(jì)并編寫相對(duì)應(yīng)程序完成平衡控制。加速度計(jì)可以獲得小車的傾斜角度,陀螺儀可以捕獲小車的角速度,兩種數(shù)據(jù)捕獲后傳送給MCU,MCU對(duì)數(shù)據(jù)進(jìn)行處理,濾波然后加以融合。而編碼器可以捕獲平衡小車兩個(gè)輪子的即時(shí)速度。然后把即時(shí)速度和濾波后的數(shù)據(jù)進(jìn)行閉環(huán)數(shù)據(jù)處理,得到最終的輸出量把所有的數(shù)據(jù)量進(jìn)行數(shù)據(jù)疊加然后傳送給驅(qū)動(dòng)芯片,進(jìn)而來控制小車的行走狀態(tài)。2原理分析與關(guān)鍵技術(shù)2.1原理分析舉一個(gè)例子,在生活中我們可以嘗試讓一個(gè)根木桿立在手心當(dāng)中而不倒下去,這一個(gè)看似簡(jiǎn)單的過程,其實(shí)就包括了反饋機(jī)制里面所有的條件。我們眼睛看到木桿往一邊倒下去,我們就會(huì)嘗試讓手往相反的方向去移動(dòng),讓木桿繼續(xù)保持平衡??刂平o定控制對(duì)象執(zhí)行機(jī)構(gòu)控制算法控制給定控制對(duì)象執(zhí)行機(jī)構(gòu)控制算法傳感器大腦手掌眼睛木棒傳感器大腦手掌眼睛木棒圖圖2-1保持木棍直立的反饋控制系統(tǒng) 應(yīng)用到平衡車上面也是一樣的。由于小車是兩輪共一個(gè)軸,所以小車只會(huì)向前或者向后傾斜,當(dāng)小車傾斜后,陀螺儀加速度計(jì)等傳感器就會(huì)感知到小車傾斜了,并且CPU會(huì)算出小車傾斜的角度和速度。電機(jī)在得知傾斜的角度和速度后以相對(duì)應(yīng)迅速向相同的方向移動(dòng),小車就可以保持平衡。這里的傳感器就相當(dāng)于木桿模型中的眼睛,用來捕獲傾斜的角度和速度,而大腦控制手往那個(gè)方向動(dòng)的過程就相當(dāng)于CPU算出電機(jī)轉(zhuǎn)動(dòng)方向與速度的過程。最后手控制木桿就相當(dāng)于電機(jī)的轉(zhuǎn)動(dòng)。2.2關(guān)鍵技術(shù)2.2.1系統(tǒng)建模數(shù)學(xué)建模的主要理論依據(jù)是牛頓力學(xué)原理,建立模型后整個(gè)控制流程一目了然,而且一個(gè)良好的物理模型還有助于軟件方面的設(shè)計(jì)與實(shí)現(xiàn)。如圖1.2所示,倒立擺只有在直立時(shí)才算是處于平衡的,但是當(dāng)?shù)沽[向右傾斜時(shí),它就偏離了平衡位置。而此時(shí)小車的合力與位移方向相同,他就會(huì)加速向右傾斜,然后倒下去。我們?yōu)榱俗屝≤嚥坏瓜路€(wěn)定在一個(gè)平衡位置。在下面輪子上施加一個(gè)向右的外力,使輪子快速向右移動(dòng),來保持車身的平衡。以小車作為參考系,重心受到一個(gè)額外的慣性力,與車輪加速度大小相同,方向相反。因此倒立擺所受到的回復(fù)力為F=mgsinθ-macosθ(3-1)根據(jù)控制系統(tǒng)的特性,角θ需要控制在很小的范圍內(nèi),并且假設(shè)控制車輪加速度與角θ成正比,比例系數(shù)為k1F=mgθ-mk此時(shí),只要k1>gF=mgθ-mk式中,k1,k2均為比例系數(shù),θ為小車傾角,θ'為角速度。只要滿足k1>g,k2>0,便可以將小車維持在直立狀態(tài)。k2是小車回到垂直位置的阻尼系數(shù),選取合適的阻尼系數(shù)可以保證小車可以盡快穩(wěn)定在垂直位置。因此為了控制小車穩(wěn)定,需要精確的測(cè)量小車傾角2.2.2姿態(tài)檢測(cè)兩個(gè)輪子自的平衡小車的一個(gè)主要特征就是高度的不穩(wěn)定,對(duì)小車進(jìn)行控制好與壞的一個(gè)重要前提是傳感器能否采集到精確地?cái)?shù)據(jù)。目前,采用最多的解決方案是:傾斜角度由加速度計(jì)采集,角速度有陀螺儀采集,將兩種數(shù)據(jù)融合處理后得到小車的即時(shí)運(yùn)行狀態(tài)。但是,由于這些傳感器有一些自有的特征屬性,他們采集的數(shù)據(jù)會(huì)因溫度等外界環(huán)境的變化而變化。這些變化隨著時(shí)間的推移會(huì)產(chǎn)生很大的誤差,因此我們會(huì)采用一些濾波算法對(duì)數(shù)據(jù)進(jìn)行處理,使融合后的數(shù)據(jù)最接近真實(shí)的數(shù)據(jù)。2.2.3控制算法兩個(gè)輪子的平衡車的最終目標(biāo)是要在適當(dāng)?shù)耐饨绺蓴_下還能實(shí)現(xiàn)自我平衡。這就需要我們選擇合適的控制算法進(jìn)行控制,進(jìn)而讓小車迅速恢復(fù)到平衡狀態(tài)。傳統(tǒng)的PID算法已經(jīng)問世了很多年,他已經(jīng)經(jīng)歷了幾十年的實(shí)踐檢驗(yàn),所以PID算法是本論文要著重研究的控制算法。
3系統(tǒng)硬件設(shè)計(jì)3.1系統(tǒng)架構(gòu)本設(shè)計(jì)采用stm32f103c8t6作為主要控制器。用mpu6050作為輔助姿態(tài)傳感器,mpu6050獲取平衡車的姿態(tài)將數(shù)據(jù)傳送給主控制器。主控制器得到數(shù)據(jù)后通過互補(bǔ)濾波或者卡爾曼濾波進(jìn)行數(shù)據(jù)處理。然后經(jīng)過PID算法處理,將處理后的數(shù)據(jù)反饋給電機(jī)驅(qū)動(dòng)芯片TB6612,驅(qū)動(dòng)芯片得到數(shù)據(jù)后,然后控制電機(jī),電機(jī)轉(zhuǎn)動(dòng)時(shí)小車保持平衡。3.2元器件選型3.2.1微處理器STM32是由意法半導(dǎo)體推出的一款基于ARMCortex-M系列內(nèi)核的高性能
32位單片機(jī)。目前有STM32L0,STM32L1,STM32L4等九個(gè)產(chǎn)品線。其中“STM32”表示基于ARM核心的32位微控制器。時(shí)鐘、復(fù)位和電源管理2.0~3.6伏供電和I/O引腳上電/斷電復(fù)位(POR/PDR)、可編程電壓監(jiān)測(cè)器(PVD)4~16MHz晶體振蕩器。內(nèi)嵌帶校準(zhǔn)的40kHz的RC振蕩器他有兩個(gè)12位的ADC通道數(shù)也可以達(dá)到16個(gè),而且他的模數(shù)轉(zhuǎn)換的范圍也可以達(dá)到0-3.6V。7通道DMA控制器。支持的外設(shè)有定時(shí)器、ADC、SPI、I2C和USART。該控制器有多達(dá)48個(gè)快速I/O端口,所有I/O口可以映像到16個(gè)外部中斷。3.2.2陀螺儀與加速度計(jì)為了保證準(zhǔn)確的控制小車穩(wěn)定,我們就有必要準(zhǔn)確的測(cè)量平衡小車傾斜角度和電機(jī)轉(zhuǎn)速,其中電機(jī)轉(zhuǎn)速在下面一章節(jié)會(huì)介紹,主要是通過編碼器測(cè)量。本章節(jié)主要利用MPU6050來測(cè)量校車的傾斜角度。本控制測(cè)量系統(tǒng)采用了集成度相當(dāng)高的6軸運(yùn)動(dòng)處理器,這樣就避免了用多個(gè)傳感器組合測(cè)量的方案,極大地減少了車身上的空間問題。而且避免了陀螺儀和加速度計(jì)在方向上安裝不能統(tǒng)一的問題。MPU6050中的陀螺儀和加速度計(jì)都是采用了3個(gè)ADC,其中ADC的精度可以達(dá)到16位。分辨率也是可以達(dá)到很高。在MPU6050采集到數(shù)據(jù)后,數(shù)據(jù)量是模擬量,模擬量被ADC轉(zhuǎn)化為數(shù)字量,然后傳送給內(nèi)部DMP進(jìn)行姿態(tài)解算。得到平衡小車的傾斜角度。MPU6050的也是有很多種張配置,配置接口采用了I2C接口,速率可以達(dá)到4000kHZ。因?yàn)榻嵌葌?cè)量是有好很多種的周期,為了準(zhǔn)確跟蹤小車運(yùn)動(dòng)的快慢速。所以,陀螺儀的配置范圍為有±250,±500,±1000,±2000°/秒(dps),加速度計(jì)的配置范圍有±2,±4,±8,±16g。當(dāng)然MPU6050測(cè)量精度越低,他的配置范圍也就越大。MPU6050的加速度計(jì)的測(cè)量原理如下圖。圖圖3-3加速度檢測(cè)的基本原理在縱向方向上加兩個(gè)點(diǎn)極,形成一個(gè)電容。當(dāng)外部產(chǎn)生加速度后兩個(gè)電極之間的距離會(huì)發(fā)生改變,電容也會(huì)相應(yīng)的改變。電容的改變會(huì)導(dǎo)致電壓變化。電壓通過放大電路后再進(jìn)行處理,然后被ADC轉(zhuǎn)化為數(shù)字量。一套參數(shù)的傳遞就形成了加速度與電壓數(shù)值的關(guān)系。 而陀螺儀則是克里利奧力的原理,在器件里面安裝了一個(gè)能感知震動(dòng)的單元。,當(dāng)物體高速旋時(shí),原件里面的震動(dòng)單元的震動(dòng)頻率也會(huì)相應(yīng)地改變,我們只要測(cè)出了物體的振動(dòng)頻率就可以很輕松的得知物體的旋轉(zhuǎn)角速度。將MPU6050安裝在小車上時(shí),可以測(cè)量出小車傾斜的角速度,將角速度信號(hào)進(jìn)行積分便可得到角度,如下圖所示。上面得到了小車的旋轉(zhuǎn)角速度,但是需要的是小車的傾斜角度,所以必須會(huì)對(duì)角速度進(jìn)行積分,得到角度。由于小車測(cè)量的是角速度。外界對(duì)他的干擾可以忽略不計(jì)。但是將角速度積分后,那些很小的干擾也會(huì)累加。從而使測(cè)量值與真實(shí)值存在較大的誤差。如下圖所示。圖圖3-5角度積分漂移所以這個(gè)過程會(huì)進(jìn)行一些數(shù)據(jù)濾波處理。但是還是無法消除誤差。擬采用加速度數(shù)據(jù)與陀螺儀數(shù)據(jù)融合的方式來處理這個(gè)問題。但是由于加速度計(jì)測(cè)量很靈敏,容易摻雜一下外部的高頻率信號(hào)。但是他沒有積分,也就沒有積分誤差。但是陀螺儀就不一樣他受外部高頻噪聲的影響很小。但是他有積分誤差。因此可以使用互補(bǔ)濾波,將這兩種傳感器的優(yōu)勢(shì)互補(bǔ)。換句話說,互補(bǔ)濾波就是以陀螺儀測(cè)量的角度為準(zhǔn)。然后定時(shí)用加速度及測(cè)量的角度為輔進(jìn)行修正。3.2.3電機(jī)驅(qū)動(dòng)芯片本控制系統(tǒng)準(zhǔn)備用東芝生產(chǎn)的一款驅(qū)動(dòng)芯TB6612FNG,他正好可以同時(shí)驅(qū)動(dòng)兩個(gè)電機(jī),非常滿足本論文設(shè)計(jì)的需求。而且它的驅(qū)動(dòng)電流也是相當(dāng)?shù)拇蟆?梢赃_(dá)到1.2A,峰值可達(dá)2A、2.3A。芯片原理結(jié)構(gòu)如下圖,AO1/AO2/BO1/BO2是兩個(gè)電機(jī)的電源的供電口,AIN1/AIN2/BIN1/BIN2是控制兩個(gè)電機(jī)正反轉(zhuǎn)的管腳。而PWM1/PWM2就是接受的控制信號(hào)。單片機(jī)通過PID計(jì)算后得到PWM輸出信號(hào)。芯片就是通過這兩個(gè)管腳來接受單片機(jī)發(fā)過來的pwm信號(hào),然后來控制電機(jī)的速度與正反轉(zhuǎn)。圖圖3-6TB6612FNG芯片功能示意圖
3.2.4編碼器編碼器是一種常用的用來檢測(cè)步進(jìn)電機(jī)的元器件,他的檢測(cè)原理是當(dāng)電機(jī)馬達(dá)轉(zhuǎn)動(dòng)的時(shí)候會(huì)掃描到光電管器件,然后就會(huì)觸發(fā)光電管器件發(fā)送出數(shù)字脈沖信號(hào)。數(shù)字脈沖信號(hào)輸出到單片機(jī)的捕獲接口就可捕獲到脈沖信號(hào)的頻率進(jìn)而得知步進(jìn)電機(jī)的速度。關(guān)于電機(jī)正轉(zhuǎn)還是反轉(zhuǎn)的問題,可以通過脈沖信號(hào)的相位來判斷。如果脈沖信號(hào)相位超前半個(gè)周期就說明電機(jī)正轉(zhuǎn),相反,如果脈沖信號(hào)相位落后半個(gè)周期就說明電機(jī)反轉(zhuǎn)。圖圖3-7光電編碼器3.2.5顯示屏OLED是一種有機(jī)發(fā)光二極管,我們就是采用這種顯示屏來作為顯示的。OLED也有很多的特點(diǎn),比如說,制作簡(jiǎn)單,響應(yīng)速度快,可以做到很薄,他可以自己發(fā)光,不需要背光源,對(duì)比度很高,色彩顯示鮮艷,適應(yīng)的溫度范圍廣等等??傊甇LED屏是下一代顯示材料的趨勢(shì)。圖3-8OLED顯示器本論文采用的OLED顯示器為0.96寸,他的長(zhǎng)寬比例為27mm*26mm。但是他的分辨率卻可以達(dá)到128*64。模塊的去東街口主要有兩種,串行SPI接口和IIC接口。串行接口的速率要比IIC的借口要稍微快一點(diǎn),但是這種接口需要4根管腳來驅(qū)動(dòng),相比IIC兩根接口的驅(qū)動(dòng)方式要臉肥一些資源。在兩種接口都可以滿足需求的情況下我們選擇IIC接口。只要用2根線就可以驅(qū)動(dòng)。
4系統(tǒng)軟件設(shè)計(jì)4.1模塊初始化IIC初始化:IIC初始化用于配置MPU6050,由于MPU6050的配置采用的是IIC接口,所以這個(gè)初始化是必要的,另外IIC還用于驅(qū)動(dòng)OLED顯示屏。下面列出重要的函數(shù)名(具體函數(shù)體見附錄)初始化IIC對(duì)應(yīng)的引腳voidIIC_Init(void){}產(chǎn)生IIC起始信號(hào)intIIC_Start(void){}產(chǎn)生IIC停止信號(hào)voidIIC_Stop(void){}等待應(yīng)答信號(hào)intIIC_Wait_Ack(void){}產(chǎn)生ACK應(yīng)答voidIIC_Ack(void){}產(chǎn)生NACK應(yīng)答voidIIC_NAck(void){}IIC寫一個(gè)字節(jié)voidIIC_Send_Byte(u8txd){}IIC讀取一個(gè)字節(jié)u8IIC_Read_Byte(unsignedcharack){}IIC寫字符串inti2cWrite(uint8_taddr,uint8_treg,uint8_tlen,uint8_t*data){}IIC讀字符串inti2cRead(uint8_taddr,uint8_treg,uint8_tlen,uint8_t*buf){}串口初始化:串口初始化用于打印調(diào)試信息,方便我們調(diào)試程序。初始化串口引腳,串口時(shí)鐘和波特率voiduart_init(u32pclk2,u32bound){}配置串口中斷函數(shù)voidUSART2_IRQHandler(void){}中斷定時(shí)器初始化:用于產(chǎn)生50ms的中斷周期,來進(jìn)行一次PID算法運(yùn)算。初始化中斷定時(shí)器voidEXTI_Init(){}PWM初始化:用于輸出PWM值,電機(jī)驅(qū)動(dòng)通過改值的大小來直接控制電機(jī)的速度與方向。初始化PWM分頻器和自動(dòng)重裝值voidMiniBalance_PWM_Init(u16arr,u16psc){}配置電機(jī)輸出引腳voidMiniBalance_Motor_Init(void){}設(shè)置PWM值,改變電機(jī)速度voidSet_Pwm(intmoto1,intmoto2){}設(shè)置電機(jī)方向intmyabs(inta){}編碼器初始化:用于測(cè)量電機(jī)的實(shí)時(shí)轉(zhuǎn)速初始化左右編碼器voidEncoder_Init_TIM2(void){}voidEncoder_Init_TIM3(void){}獲取電機(jī)的速度intRead_Encoder(u8TIMX){}MPU6050初始化:初始化MPU6050,測(cè)量小車的實(shí)時(shí)狀態(tài)和傾斜角度讀取MPU6050內(nèi)置溫度傳感器數(shù)據(jù)intRead_Temperature(void){}讀取MPU6050內(nèi)置DMP姿態(tài)信息voidRead_DMP(void){}初始化MPU6050內(nèi)置DMPvoidDMP_Init(void){}初始化MPU6050以進(jìn)入可用狀態(tài)voidMPU6050_initialize(void){}設(shè)置MPU6050是否為AUXIIC線的主機(jī)voidMPU6050_setI2CBypassEnabled(void){}檢測(cè)MPU6050是否已連接uint8_tMPU6050_testConnection(void){}讀取MPU6050WHO_AM_I標(biāo)識(shí)uint8_tMPU6050_getDeviceID(void){}設(shè)置MPU6050是否進(jìn)入睡眠狀態(tài)voidMPU6050_setSleepEnabled(uint8_tenabled){}設(shè)置MPU6050加速度計(jì)的最大量程voidMPU6050_setFullScaleAccelRange(uint8_trange){}設(shè)置MPU6050的時(shí)鐘源voidMPU6050_setClockSource(uint8_tsource){}將新的ADC數(shù)據(jù)更新到FIFO數(shù)組,進(jìn)行濾波處理voidMPU6050_newValues(int16_tax,int16_tay,int16_taz,int16_tgx,int16_tgy,int16_tgz){}Flash初始化:用于保存PID數(shù)據(jù)解鎖FlashvoidSTMFLASH_Unlock(void){}上鎖FlashvoidSTMFLASH_Lock(void){}得到Flash狀態(tài)u8STMFLASH_GetStatus(void){}等待Flash操作完成u8STMFLASH_WaitDone(u16time){}擦除Flash頁u8STMFLASH_ErasePage(u32paddr){}從Flash指定的地址寫入半字u8STMFLASH_WriteHalfWord(u32faddr,u16dat){}從Flash指定的地址讀出半字u16STMFLASH_ReadHalfWord(u32faddr){}不檢查Flash寫入數(shù)據(jù)voidSTMFLASH_Write_NoCheck(u32WriteAddr,u16*pBuffer,u16NumToWrite){}從Flash指定的地址寫入指定長(zhǎng)度的數(shù)據(jù)voidSTMFLASH_Write(u32WriteAddr,u16*pBuffer,u16NumToWrite){}從Flash指定的地址讀出指定長(zhǎng)度的數(shù)據(jù)voidSTMFLASH_Read(u32ReadAddr,u16*pBuffer,u16NumToRead){}Flash測(cè)試voidTest_Write(u32WriteAddr,u16WriteData){}Flash讀voidFlash_Read(void){}Flash寫voidFlash_Write(void){}4.2PID算法設(shè)計(jì)PID控制公式如下。(4-2)(4-2)實(shí)際使用中,PID算法不必使用所有控制(比例控制、積分控制、微分控制),只要能滿足使用要求即可。常見的有PD控制和PI控制。在本控制系統(tǒng)中,速度控制使用了PI控制,角度控制使用了PD控制。相應(yīng)控制控制如下:速度控制輸出=車速*Kp+路程*Ki角度控制輸出=傾角*Kp+角速度*Kd其中,Kp為比例系數(shù),Kd為微分系數(shù),Ki為阻尼系數(shù)。在完成速度控制與角度控制之后,需要將獲得的數(shù)據(jù)進(jìn)行疊加,并且加入藍(lán)牙方向控制,以完成小車的左右轉(zhuǎn)。最后對(duì)所得數(shù)據(jù)進(jìn)行判斷與轉(zhuǎn)換,以數(shù)據(jù)的正負(fù)控制電機(jī)的轉(zhuǎn)向,以數(shù)據(jù)的數(shù)值控制占空比,調(diào)節(jié)PWM輸出來控制轉(zhuǎn)速,完成左右電機(jī)的差分控制。由于小車輪胎與地面存在靜摩擦力,因此當(dāng)占空比很小時(shí),電機(jī)驅(qū)動(dòng)電流很小,電機(jī)可以認(rèn)為沒有發(fā)生轉(zhuǎn)動(dòng)。所有需要根據(jù)實(shí)際情況加上死區(qū)常量用來克服這種情況下的靜摩擦力。輸出控制算法程序框圖如下所示。(b(b)(a)intEXTI3_IRQHandler(void){if(PBin(3)==0) { EXTI->PR=1<<3; //判斷是否由外部中斷 Encoder_Left=Read_Encoder(2);//獲取電機(jī)轉(zhuǎn)速 Encoder_Right=Read_Encoder(3);//獲取電機(jī)轉(zhuǎn)速 Get_Angle(Way_Angle);//獲得當(dāng)前角度 Balance_Pwm=balance(Angle_Balance,Gyro_Balance);//PID控制計(jì)算 Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);// Moto1=Balance_Pwm+Velocity_Pwm;//輸出pwm值 Moto2=Balance_Pwm+Velocity_Pwm;//輸出pwm值 Xianfu_Pwm();//限制幅度 Set_Pwm(Moto1,Moto2);//控制電機(jī)return0; }}4.3總體軟件架構(gòu)intmain(void){ Stm32_Clock_Init(9); JTAG_Set(JTAG_SWD_DISABLE); JTAG_Set(SWD_ENABLE);delay_init(72);KEY_Init();OLED_Init();Flash_Init();uart_init(72,115200); IIC_Init(); MPU6050_Init(); Flash_Read(); EXTI_Init();Display_All();While(1);}由于整個(gè)平衡車的處理復(fù)雜度不算特別高,所以整個(gè)軟件系統(tǒng)的設(shè)計(jì)沒有采用才做系統(tǒng)的架構(gòu)模式,而是采用了相對(duì)簡(jiǎn)單且容易實(shí)現(xiàn)的前后臺(tái)架構(gòu)。從上到下,首先完成的是對(duì)系統(tǒng)的時(shí)鐘初始化。這一點(diǎn)是非常必要的,應(yīng)為單片機(jī)可以工作在多種頻率下,應(yīng)為我們有大量的數(shù)據(jù)處理計(jì)算,所以要配置到單片機(jī)的最高頻率。也就是72兆赫茲。這里我沒當(dāng)然也不會(huì)考慮到功率問題。這種頻率完全有能力處理起來整個(gè)平衡車的任務(wù)。其次是關(guān)閉單片機(jī)的JTAG調(diào)試口,應(yīng)為JTAG調(diào)試口占用的管腳較多,而且好需要專門的JTAG調(diào)試器來輔助工作,而這種調(diào)試器非常的昂貴,有的達(dá)到幾千元。因此我們將調(diào)試接口配置為SWD模式,而SWD模式下的調(diào)試器只要幾十元就可以買的到,并且它所占用的管腳資源也是比JTAG要少得多。接下來我們是初始化delay函數(shù),在很多場(chǎng)合延時(shí)對(duì)我們來說用的很頻繁。我們事先就寫了一個(gè)精準(zhǔn)的延時(shí)函數(shù),包括納秒級(jí),微妙級(jí)和秒級(jí)三種。這就可以滿足我們大部分的需求了。后面是對(duì)按鍵的初始化,它的作用是在調(diào)試階段調(diào)參數(shù)時(shí),不只有一個(gè)參數(shù)要調(diào)。我們可以用按鍵的形式來選擇去改變哪一個(gè)參數(shù),這樣一來我們就不必每次都改寫整個(gè)函數(shù)去調(diào)整參數(shù)了。后面是OLED的初始化,在調(diào)試階段,OLED是用來作為輔助調(diào)試手段的。他可以記錄電機(jī)轉(zhuǎn)速,PWM輸出,PID參數(shù)和平衡小車的傾斜角度。在調(diào)試完成后還可以作為輔助顯示手段。Flash_Init()是初始化單片機(jī)的內(nèi)部存儲(chǔ)芯片,用于保存PID的參數(shù)值。后面是串口初始化,用來打印調(diào)試信息。IIC的初始化用來配置MPU6050,以及驅(qū)動(dòng)顯示屏。后面是MPU6050的初始化,用來初始化陀螺儀。然后是讀取flash中保存的參數(shù),主要是上次保存的PID參數(shù),模式參數(shù)以及一些其他的參數(shù)。下面是中斷的初始化,這個(gè)初始化非常重要,我么把他設(shè)置到50ms,當(dāng)50毫秒時(shí)間到達(dá)后,進(jìn)入中斷函數(shù),獲取電機(jī)轉(zhuǎn)速,小車傾斜角度和小車方向。然后進(jìn)行PID計(jì)算輸出到電機(jī),讓電機(jī)以特定的速度運(yùn)轉(zhuǎn),保持小車平衡。最后是顯示所有信息到OLED屏幕,和一個(gè)死循環(huán)。我們?cè)谠O(shè)計(jì)時(shí)死循環(huán)中什么任務(wù)也沒有做,其實(shí)中里面可以添加一些其他的功能函數(shù),比如要坐上位機(jī)通訊時(shí)的功能可以放到這里面。這是就形成了所謂的前后臺(tái)系統(tǒng)了。圖4-3控制流程
4.4調(diào)試技巧平衡車的調(diào)試還是有很多技巧的,首先我們能想到的就是最常用的串口調(diào)試,這種調(diào)試只能應(yīng)用在硬件初始化的過程。比如,陀螺儀的初始化,顯示屏的初始化等等,一旦到了PID參數(shù)整定的調(diào)試工作,這種調(diào)試方法就不奏效了。應(yīng)為我問要在實(shí)物上調(diào)試,并且小車還會(huì)在調(diào)試過程中運(yùn)動(dòng)。用串口調(diào)試就顯得有些力不從心了。因此我們采取了另外一種調(diào)試方法。OLED顯示屏加上編碼器和單片機(jī)內(nèi)部flash結(jié)合起來調(diào)試。下面我們來具體介紹。首先我們知道平衡車上有一個(gè)編碼器,我們?cè)陬l繁該P(yáng)ID參數(shù)時(shí)可以轉(zhuǎn)動(dòng)編碼器,然后設(shè)置對(duì)應(yīng)的PID參數(shù)顯示到顯示屏上面,順時(shí)針轉(zhuǎn)就加參數(shù)值,逆時(shí)針轉(zhuǎn)就減參數(shù)值。然后保存芯片內(nèi)部flash存儲(chǔ)芯片。這樣我們下次重啟平衡車時(shí)就可以直接讀取上次我們?cè)O(shè)置的PID參數(shù),而不用每次到改完參數(shù)后要重新燒寫程序到單片機(jī)了。這樣就讓我們調(diào)參數(shù)的過程變得輕松許多。
5總結(jié)與展望5.1總結(jié)本設(shè)計(jì)系統(tǒng)的硬件系統(tǒng)以ARM公司的STM32為控制核心,使用MPU6050檢測(cè)小車的車身姿態(tài),通過編碼器獲取小車當(dāng)前轉(zhuǎn)速,實(shí)現(xiàn)對(duì)車速的閉環(huán)控制。通過TB6612FNG驅(qū)動(dòng)電路對(duì)兩個(gè)電機(jī)實(shí)現(xiàn)差分控制,進(jìn)而單獨(dú)的控制兩個(gè)電機(jī)。通過藍(lán)牙擴(kuò)展獲得上位機(jī)發(fā)送的控制信號(hào),也可以實(shí)現(xiàn)人機(jī)交互的功能。軟件系統(tǒng)設(shè)計(jì)中,根據(jù)單片機(jī)使用手冊(cè)設(shè)置各個(gè)寄存器;根據(jù)IIC總線協(xié)議編寫通信程序,并且根據(jù)芯片說明配置MPU6050芯片。使用互補(bǔ)濾波融合加速度計(jì)與陀螺儀數(shù)據(jù)并實(shí)現(xiàn)角度控制。使用PID算法計(jì)算角度控制與速度控制的最終輸出量。使得小車在保持平衡的同時(shí)通過藍(lán)牙可實(shí)現(xiàn)人機(jī)交互。5.2展望由于時(shí)間倉促,能力又有限,該設(shè)計(jì)還有許多需要改進(jìn)的地方。采用更先進(jìn)、速度更快的控制器,如ARM,X86等。使用更先進(jìn)的數(shù)據(jù)融合算法,如卡爾曼濾波算法。使用更先進(jìn)的控制算法,如模糊控制,神經(jīng)網(wǎng)絡(luò)等。調(diào)試手段有待進(jìn)一步優(yōu)化??梢詫?duì)平衡車添加一些人機(jī)互動(dòng)功能。比如,添加一個(gè)語音助手,能夠通過語音對(duì)平衡車進(jìn)行控制,讓小車完成像左轉(zhuǎn)彎右轉(zhuǎn)彎自旋轉(zhuǎn)等指定的動(dòng)作。還可以連接藍(lán)牙或者wifi用手機(jī)對(duì)小車進(jìn)行控制。
參考文獻(xiàn)[1]肖洪兵.跟我學(xué)用單片機(jī).北京:北京航空航天大學(xué)出版社,2002.8。
[2]何立民.單片機(jī)高級(jí)教程.第1版.北京:北京航空航天大學(xué)出版社,2001。
[3]趙曉安.MCS-51單片機(jī)原理及應(yīng)用.天津:天津大學(xué)出版社,2001.3。
[4]李廣第.單片機(jī)基礎(chǔ).第1版.北京:北京航空航天大學(xué)出版社,1999。
[5]徐惠民.安德寧.單片微型計(jì)算機(jī)原理接口與應(yīng)用.第1版.北京:北京郵電大學(xué)出版社,1996。
[6]何立民.從Cygnal80C51F看8位單片機(jī)發(fā)展之路.單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2002年,第5期。
[7]夏繼強(qiáng).單片機(jī)實(shí)驗(yàn)與實(shí)踐教程.北京:北京航空航天大學(xué)出版社,2001。
[8]陳志強(qiáng)胡輝.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)實(shí)踐指南.自編教材。
[9]肖洪兵.單片機(jī)應(yīng)用技術(shù).自編教材。
[10]肖洪兵高茂科.CAI課件自主開發(fā)。[11]V.Yu.Teplov,A.V.Anisimov.ThermostattingSystemUsingaSingle-ChipMicrocomputerand[12]ThermoelectricModulesBasedonthePeltierEffect[J],2002
。
[13]YeagerBrent.Howtotroubleshootyourelectronicscale[J]..PowderandBulkEngineering.1995。
[14]MeehanJoanne,MuirLindsey.SCMinMerseysideSMEs:Benefitsandbarriers[J]..TQMJournal.2008。
附錄1.系統(tǒng)設(shè)計(jì)的電路框圖2.部分源代碼#include"sys.h"u8Way_Angle=1;//獲取角度的算法,1:四元數(shù)u8Flag_Show=1;//停止標(biāo)志位和顯示標(biāo)志位默認(rèn)停止顯示打開intEncoder_Left,Encoder_Right;//左右編碼器的脈沖計(jì)數(shù)intMoto1,Moto2;//電機(jī)PWM變量應(yīng)是Motor的floatAngle_Balance,Gyro_Balance,Gyro_Turn;//平衡傾角平衡陀螺儀轉(zhuǎn)向陀螺儀u32Distance;//超聲波測(cè)距u8delay_50,delay_flag,Bi_zhang=0,PID_Send,Flash_Send;//默認(rèn)情況下floatAcceleration_Z;//Z軸加速度計(jì)floatPA=100,PB=500,PC=888,PD=6813;//PID參數(shù)u16PID_Parameter[10],Flash_Parameter[10];//Flash相關(guān)數(shù)組intBalance_Pwm,Velocity_Pwm,Turn_Pwm;floatkp=0,kd=0;floatKp_v=0,Ki_v=0,Kd_v=0; floatmy_Encoder_Integral;floatmy_v_kp1;floatmy_v_kp2;intbalance_pwm;u8key1=0;charEncoder_num;floatoffset;intmy_pwm;voidofset(void);intmain(void){ Stm32_Clock_Init(9); delay_init(72); JTAG_Set(JTAG_SWD_DISABLE); JTAG_Set(SWD_ENABLE); KEY_Init();OLED_Init(); OLED_ShowString(0,0,"Key:"); OLED_ShowString(66,0,"Angle:");OLED_ShowString(0,1,"KP_b:1"); OLED_ShowString(0,2,"KD_b:2"); OLED_ShowString(0,3,"KP_v:3"); OLED_ShowString(0,4,"KI_v:4"); OLED_ShowString(0,5,"KD_v:5"); OLED_ShowString(0,7,"Pwm:"); OLED_ShowString(0,6,"Moto:"); uart_init(72,115200);uart2_init(36,9600); MiniBalance_PWM_Init(7199,0); //TIM4通道34PB89 Encoder_Init_TIM2(); //PA01 Encoder_Init_TIM3(); //PA67 IIC_Init(); //=====模擬IIC初始化MPU6050_initialize(); //=====MPU6050初始化 DMP_Init(); //=====初始化DMP Flash_Read(); OLED_Num_String(35,1,kp); OLED_Num_String(35,2,kd*10); OLED_Num_String(35,3,Kp_v); OLED_Num_String(35,4,Ki_v*10); OLED_Num_String(35,5,Kd_v*10); #if1ofset(); OLED_Num_String(35,1,kp); OLED_Num_String(35,2,kd*10); OLED_Num_String(35,3,Kp_v); OLED_Num_String(35,4,Ki_v*10); OLED_Num_String(35,5,Kd_v*10);#endif EXTI_Init();//=====MPU60505ms定時(shí)中斷初始化while(1){#if1 OLED_Num_String(35,6,Encoder_Left); OLED_Num_String(70,6,Encoder_Right); OLED_Num_String1(35,7,my_pwm); OLED_Num_String1(90,7,(int)my_Encoder_Integral);//積分 OLED_Num_String1(70,1,(int)my_v_kp1);//比例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新華三合同范例
- 2024年度物流園區(qū)土地承包經(jīng)營(yíng)合同3篇
- 2024年水資源管理項(xiàng)目蓄水池施工合同版B版
- 承重廠房建造合同范例
- 2024年特色農(nóng)業(yè)種植用地租賃合同3篇
- 果農(nóng)楊梅訂貨合同范例
- 合同范例全套
- 無償征地合同范例
- 贈(zèng)和合同范例
- 測(cè)繪土方合同范例
- 商品(服裝類)基礎(chǔ)知識(shí)
- 機(jī)電安裝工程質(zhì)量通病及防治措施
- 行政管理學(xué)的判斷題
- 傳感器原理與應(yīng)用課程設(shè)計(jì)報(bào)告磁電式輪速傳感器系統(tǒng)設(shè)計(jì)
- 濟(jì)南市建設(shè)工程竣工測(cè)量技術(shù)規(guī)程
- 語音放大電路的設(shè)計(jì)畢業(yè)論文
- 滑動(dòng)模板施工工法
- 合同履行確認(rèn)單(模板).doc
- 框架結(jié)構(gòu)內(nèi)力計(jì)算-豎向彎矩二次分配,水平D值法講解
- 《初中團(tuán)隊(duì)一體化工作模式的實(shí)踐與研究》
- 工程增項(xiàng)簽證單樣本
評(píng)論
0/150
提交評(píng)論