基于單片機的平衡小車的設(shè)計 電氣工程及其自動化專業(yè)

上傳人:文**** 文檔編號:67317978 上傳時間:2022-03-30 格式:DOCX 頁數(shù):31 大?。?57.58KB
收藏 版權(quán)申訴 舉報 下載
基于單片機的平衡小車的設(shè)計 電氣工程及其自動化專業(yè)_第1頁
第1頁 / 共31頁
基于單片機的平衡小車的設(shè)計 電氣工程及其自動化專業(yè)_第2頁
第2頁 / 共31頁
基于單片機的平衡小車的設(shè)計 電氣工程及其自動化專業(yè)_第3頁
第3頁 / 共31頁

下載文檔到電腦,查找使用更方便

20 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《基于單片機的平衡小車的設(shè)計 電氣工程及其自動化專業(yè)》由會員分享,可在線閱讀,更多相關(guān)《基于單片機的平衡小車的設(shè)計 電氣工程及其自動化專業(yè)(31頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 題目: 基于單片機的平衡小車的設(shè)計 摘要:兩輪自平衡車在我們的生活中已經(jīng)是越來越常見,他的一個極其突出的特性就是不穩(wěn)定,與他很類似的一個模型就是倒立擺。我們必須知道倒立擺的狀態(tài),然后對他進(jìn)行干擾才能使它保持穩(wěn)定狀態(tài)。本論文所研究的方案就是基于這種原理,用陀螺儀和加速度計來獲取到平衡車的當(dāng)前狀態(tài),然后控制電機來作出相應(yīng)的干擾,來讓小車保持平衡。 整個系統(tǒng)設(shè)計完成后,小車可以實現(xiàn)自主平衡功能。并且,在人為加入適量干擾后 小車也能夠自主調(diào)整并迅速恢復(fù)至穩(wěn)定狀態(tài)。系統(tǒng)還保留了大部分接口,可以進(jìn)行二次開發(fā)和升級,包括手機藍(lán)牙控制、wifi控制、視覺導(dǎo)航、軌跡跟蹤等。 關(guān)鍵詞: 加速

2、度;PID算法;陀螺儀;兩輪自平衡小車 Abstract: two rounds of self-balancing vehicle is already more and more common in our life, he's a very prominent feature is unstable, and he is very similar to a model of inverted pendulum. We need to know the status of the inverted pendulum, and then to his interference to k

3、eep it stable. Mentioned in the present paper research plan is based on the principle of using gyroscope and accelerometer to get to the current state of the balance of the car, and then control the motor to make corresponding interference, to let the car balance. After completion of the whole syst

4、em design, the car can achieve balance function independently. And, in human after adding suitable amount of interference The car can also independent adjustment and quickly return to a stable state. System also has kept most of the interface, can undertake secondary development and upgrading, incl

5、uding mobile phone bluetooth, wifi, visual navigation, path tracking, etc. Keywords: Accelerometer;PID algorithm;Gyroscope;Balance of the car 目 錄 1 緒論 1 1.1 自平衡小車的研究意義 1 1.2 課題研究的主要任務(wù) 1 2 原理分析與關(guān)鍵技術(shù) 2 2.1 原理分析 2 2.2關(guān)鍵技術(shù) 2 2.2.1 系統(tǒng)建模 2 2.2.2 姿態(tài)檢測 2 2.2.3 控制算法 3 3 系統(tǒng)硬件設(shè)計 6 3.1 物理架

6、構(gòu) 7 3.2 元器件選型 8 3.2.1 微處理器 2 3.2.2 陀螺儀與加速度計 2 3.2.3 電機驅(qū)動 3 3.2.4 編碼器 3 3.2.5 顯示屏 3 4 系統(tǒng)軟件設(shè)計 16 4.1 模塊初始化 17 4.2 PID算法設(shè)計 18 4.3 總體軟件架構(gòu) 27 4.4 調(diào)試技巧 27 5 總結(jié)與展望 37 5.1 總結(jié) 37 5.2 展望 37 參考文獻(xiàn) 38 附錄 38 致謝 38 III 1 緒論 1.1研究意義 近年來,科技發(fā)展,時代進(jìn)步。其中各種科技產(chǎn)品也是如雨后春筍紛紛涌現(xiàn),用科技改變世界的時代也是在加速到來。但是

7、,日益擁堵的交通狀況問題也是越來越嚴(yán)重。 改變交通現(xiàn)狀已經(jīng)刻不容緩,其中兩輪平衡車是極具代表性的一個產(chǎn)品,他適應(yīng)時代,應(yīng)運而生。以其新穎,時尚,方便的優(yōu)勢迅速走入大家的生活。 這種平衡車與其他短途代步工具的最顯著的特點是:他只有兩個輪子,都是獨立驅(qū)動工作,并且兩個輪子在一根軸上面,車的重量加上人的重量正好落在車軸上面,通過輪子前后運動來保持車生的平衡。由于是使用蓄電池供電,所以沒有污染,并且可以重復(fù)適用,壽命很高。而且電動機能量轉(zhuǎn)換運行效率較高并且只有很小的噪音。 由于兩個輪子都可以前進(jìn)后退,所以他可以在很狹窄的空間范圍當(dāng)中也可以進(jìn)退自如。對他的控制也是極其方便,只要通過身體的前后傾斜改

8、變平衡車的傾斜角度,當(dāng)陀螺儀檢測到角度的變化后,將數(shù)據(jù)傳送給單片機,單片機進(jìn)行數(shù)據(jù)處理和融合,將輸出型號傳送給電機驅(qū)動芯片,進(jìn)而來控制電機運轉(zhuǎn),防止人摔倒。這樣完全可以避免在傳統(tǒng)汽車上出現(xiàn)的剎車片老化剎車不靈的情況,極大地保證了駕駛?cè)藛T的安全。 基于以上各種優(yōu)點可以看出兩輪自平衡車有著廣泛的應(yīng)用前景,目前市面上已經(jīng)涌現(xiàn)除了大量的平衡車。因此本論文對于平衡車的研究意義非凡。 1.2課題研究的主要內(nèi)容 本論文著重研究的兩輪平衡車系統(tǒng)主要是由單片機進(jìn)行控制。完成該設(shè)計后,小車能實現(xiàn)自我平衡,直立行走等基本功能。該系統(tǒng)采用了STM單片機作為核心的控制單元,并加上各種輔助傳感器,完成相對應(yīng)的電

9、路設(shè)計并編寫相對應(yīng)程序完成平衡控制。 加速度計可以獲得小車的傾斜角度,陀螺儀可以捕獲小車的角速度,兩種數(shù)據(jù)捕獲后傳送給MCU,MCU對數(shù)據(jù)進(jìn)行處理,濾波然后加以融合。而編碼器可以捕獲平衡小車兩個輪子的即時速度。然后把即時速度和濾波后的數(shù)據(jù)進(jìn)行閉環(huán)數(shù)據(jù)處理,得到最終的輸出量把所有的數(shù)據(jù)量進(jìn)行數(shù)據(jù)疊加然后傳送給驅(qū)動芯片,進(jìn)而來控制小車的行走狀態(tài)。 2 原理分析與關(guān)鍵技術(shù) 2.1 原理分析 舉一個例子,在生活中我們可以嘗試讓一個根木桿立在手心當(dāng)中而不倒下去,這一個看似簡單的過程,其實就包括了反饋機制里面所有的條件。我們眼睛看到木桿往一邊倒下去,我們就會嘗試讓手往相反的方向去移動,讓木桿繼續(xù)保

10、持平衡。 控制給定 控制對象 執(zhí)行機構(gòu) 控制算法 傳感器 大腦 手掌 眼睛 木棒 圖2-1 保持木棍直立的反饋控制系統(tǒng) 車體垂直,車輪保持靜止 車體向前傾斜,車輪向前加速行駛 車體向后傾斜,車輪向后加速行駛 圖2-2 通過車輪控制車體平衡 應(yīng)用到平衡車上面也是一樣的。由于小車是兩輪共一個軸,所以小車只會向前或者向后傾斜,當(dāng)小車傾斜后,陀螺儀加速度計等傳感器就會感知到小車傾斜了,并且CPU會算出小車傾斜的角度和速度。電機在得知傾斜的角度和速度后以相對應(yīng)迅速向相同的方向移動,小車就可以保持平衡。這里的傳感器就相當(dāng)于木桿模型中的

11、眼睛,用來捕獲傾斜的角度和速度,而大腦控制手往那個方向動的過程就相當(dāng)于CPU算出電機轉(zhuǎn)動方向與速度的過程。最后手控制木桿就相當(dāng)于電機的轉(zhuǎn)動。 2.2關(guān)鍵技術(shù) 2.2.1 系統(tǒng)建模 數(shù)學(xué)建模的主要理論依據(jù)是牛頓力學(xué)原理,建立模型后整個控制流程一目了然,而且一個良好的物理模型還有助于軟件方面的設(shè)計與實現(xiàn)。 mgsinθ ?macosθ mg θ m 圖2-3 受力分析 如圖1.2所示,倒立擺只有在直立時才算是處于平衡的,但是當(dāng)?shù)沽[向右傾斜時,它就偏離了平衡位置。而此時小車的合力與位移方向相同,他就會加速向右傾斜,然后倒下去。 我們?yōu)榱俗屝≤嚥坏瓜路€(wěn)定在一個平衡位

12、置。在下面輪子上施加一個向右的外力,使輪子快速向右移動,來保持車身的平衡。以小車作為參考系,重心受到一個額外的慣性力,與車輪加速度大小相同,方向相反。因此倒立擺所受到的回復(fù)力為 F=mgsinθ?macosθ (3-1) 根據(jù)控制系統(tǒng)的特性,角θ需要控制在很小的范圍內(nèi),并且假設(shè)控制車輪加速度與角θ成正比,比例系數(shù)為k1,因此上式可近似處理為 F=mgθ?mk1θ (3-2) 此時,只要k1>g,回復(fù)力的方向便和位移方

13、向相反,此時小車可以恢復(fù)到平衡位置。為使小車能在平衡位置盡快的穩(wěn)定下來,還需要有阻尼力,阻尼力與角速度方向相反,大小成正比。式(3-2)可變?yōu)? F=mgθ?mk1θ?mk2θ' (3-3) 式中,k1,k2均為比例系數(shù),θ為小車傾角,θ'為角速度。只要滿足k1>g,k2>0,便可以將小車維持在直立狀態(tài)。k2是小車回到垂直位置的阻尼系數(shù),選取合適的阻尼系數(shù)可以保證小車可以盡快穩(wěn)定在垂直位置。因此為了控制小車穩(wěn)定,需要精確的測量小車傾角θ的大小和角速度θ'的大小,并以此控制車輪的加速度。 2.2.2 姿態(tài)檢測

14、 兩個輪子自的平衡小車的一個主要特征就是高度的不穩(wěn)定,對小車進(jìn)行控制好與壞的一個重要前提是傳感器能否采集到精確地數(shù)據(jù)。目前,采用最多的解決方案是:傾斜角度由加速度計采集,角速度有陀螺儀采集,將兩種數(shù)據(jù)融合處理后得到小車的即時運行狀態(tài)。但是,由于這些傳感器有一些自有的特征屬性,他們采集的數(shù)據(jù)會因溫度等外界環(huán)境的變化而變化。這些變化隨著時間的推移會產(chǎn)生很大的誤差,因此我們會采用一些濾波算法對數(shù)據(jù)進(jìn)行處理,使融合后的數(shù)據(jù)最接近真實的數(shù)據(jù)。 2.2.3控制算法 兩個輪子的平衡車的最終目標(biāo)是要在適當(dāng)?shù)耐饨绺蓴_下還能實現(xiàn)自我平衡。這就需要我們選擇合適的控制算法進(jìn)行控制,進(jìn)而讓小車迅速恢復(fù)到平衡狀態(tài)。傳

15、統(tǒng)的PID算法已經(jīng)問世了很多年,他已經(jīng)經(jīng)歷了幾十年的實踐檢驗,所以PID算法是本論文要著重研究的控制算法。 3 系統(tǒng)硬件設(shè)計 3.1 系統(tǒng)架構(gòu) 本設(shè)計采用stm32f103c8t6作為主要控制器。用mpu6050作為輔助姿態(tài)傳感器,mpu6050獲取平衡車的姿態(tài)將數(shù)據(jù)傳送給主控制器。主控制器得到數(shù)據(jù)后通過互補濾波或者卡爾曼濾波進(jìn)行數(shù)據(jù)處理。然后經(jīng)過PID算法處理,將處理后的數(shù)據(jù)反饋給電機驅(qū)動芯片TB6612,驅(qū)動芯片得到數(shù)據(jù)后,然后控制電機,電機轉(zhuǎn)動時小車保持平衡。 主控制器 STM32F103C8T6 陀螺儀加速度計 MPU6050 編碼器 電機驅(qū)動芯片 TB

16、6612FNG 直流電機 OLED 顯示屏 加速度 角速度 圖3-1 硬件設(shè)計總體框圖 3.2 元器件選型 3.2.1 微處理器 STM32 是由意法半導(dǎo)體推出的一款基于 ARM Cortex - M 系列內(nèi)核的高性能 32 位單片機。目前有 STM32L0,STM32L1,STM32L4 等九個產(chǎn)品線。其中“STM32”表示基于 ARM核心的 32 位微控制器。 時鐘、復(fù)位和電源管理2.0~3.6 伏供電和 I/O 引腳上電/斷電復(fù)位(POR/PDR)、可編程電壓監(jiān)測器(PVD) 4~16MHz 晶體振蕩器。 內(nèi)嵌帶校準(zhǔn)的 40kHz的RC振蕩器他有兩個12 位的

17、ADC通道數(shù)也可以達(dá)到16個,而且他的模數(shù)轉(zhuǎn)換的范圍也可以達(dá)到0-3.6V。7 通道 DMA 控制器。支持的外設(shè)有定時器、ADC、SPI、I2C和USART。該控制器有多達(dá)48個快速I/O 端口,所有 I/O 口可以映像到16個外部中斷。 3.2.2 陀螺儀與加速度計 為了保證準(zhǔn)確的控制小車穩(wěn)定,我們就有必要準(zhǔn)確的測量平衡小車傾斜角度和電機轉(zhuǎn)速,其中電機轉(zhuǎn)速在下面一章節(jié)會介紹,主要是通過編碼器測量。本章節(jié)主要利用MPU6050來測量校車的傾斜角度。 本控制測量系統(tǒng)采用了集成度相當(dāng)高的6軸運動處理器,這樣就避免了用多個傳感器組合測量的方案,極大地減少了車身上的空間問題。而且避免了陀螺儀

18、和加速度計在方向上安裝不能統(tǒng)一的問題。 MPU6050中的陀螺儀和加速度計都是采用了3個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。因為角度側(cè)量是有好很多種的周期,為了準(zhǔn)確跟蹤小車運動的快慢速。所以,陀螺儀的配置范圍為有±250,±500,±1000,±2000°/秒(dps),加速度計的配置范圍有±2,±4,±8,±16g。當(dāng)然MPU6050測量精

19、度越低,他的配置范圍也就越大。 +Z +Y +Z +X +Y +X 圖3-2 MPU6050實物圖與對應(yīng)坐標(biāo)軸圖 MPU6050的加速度計的測量原理如下圖。 圖3-3 加速度檢測的基本原理 在縱向方向上加兩個點極,形成一個電容。當(dāng)外部產(chǎn)生加速度后兩個電極之間的距離會發(fā)生改變,電容也會相應(yīng)的改變。電容的改變會導(dǎo)致電壓變化。電壓通過放大電路后再進(jìn)行處理,然后被ADC轉(zhuǎn)化為數(shù)字量。一套參數(shù)的傳遞就形成了加速度與電壓數(shù)值的關(guān)系。 而陀螺儀則是克里利奧力的原理,在器件里面安裝了一個能感知震動的單元。,當(dāng)物體高速旋時,原件里面

20、的震動單元的震動頻率也會相應(yīng)地改變,我們只要測出了物體的振動頻率就可以很輕松的得知物體的旋轉(zhuǎn)角速度。 將MPU6050安裝在小車上時,可以測量出小車傾斜的角速度,將角速度信號進(jìn)行積 分便可得到角度,如下圖所示。 測量 積分 t t ω θ 圖3-4 小車的角速度和角度 上面得到了小車的旋轉(zhuǎn)角速度,但是需要的是小車的傾斜角度,所以必須會對角速度進(jìn)行積分,得到角度。由于小車測量的是角速度。外界對他的干擾可以忽略不計。但是將角速度積分后,那些很小的干擾也會累加。從而使測量值與真實值存在較大的誤差。如下圖所示。 圖3-5 角度積分漂移 所

21、以這個過程會進(jìn)行一些數(shù)據(jù)濾波處理。但是還是無法消除誤差。擬采用加速度數(shù)據(jù)與陀螺儀數(shù)據(jù)融合的方式來處理這個問題。但是由于加速度計測量很靈敏,容易摻雜一下外部的高頻率信號。但是他沒有積分,也就沒有積分誤差。但是陀螺儀就不一樣他受外部高頻噪聲的影響很小。但是他有積分誤差。因此可以使用互補濾波,將這兩種傳感器的優(yōu)勢互補。換句話說,互補濾波就是以陀螺儀測量的角度為準(zhǔn)。然后定時用加速度及測量的角度為輔進(jìn)行修正。 3.2.3 電機驅(qū)動芯片 本控制系統(tǒng)準(zhǔn)備用東芝生產(chǎn)的一款驅(qū)動芯TB6612FNG,他正好可以同時驅(qū)動兩個電機,非常滿足本論文設(shè)計的需求。而且它的驅(qū)動電流也是相當(dāng)?shù)拇蟆?梢赃_(dá)到1.2A, 峰值

22、可達(dá)2A、2.3A。芯片原理結(jié)構(gòu)如下圖,AO1/AO2/BO1/BO2是兩個電機的電源的供電口,AIN1/AIN2/BIN1/BIN2是控制兩個電機正反轉(zhuǎn)的管腳。而PWM1/PWM2就是接受的控制信號。單片機通過PID計算后得到PWM輸出信號。 芯片就是通過這兩個管腳來接受單片機發(fā)過來的pwm信號,然后來控制電機的速度與正反轉(zhuǎn)。 圖3-6 TB6612FNG芯片功能示意圖 3.2.4 編碼器 編碼器是一種常用的用來檢測步進(jìn)電機的元器件,他的檢測原理是當(dāng)電機馬達(dá)轉(zhuǎn)動的時候會掃描到光電管器件,然后就會觸發(fā)光電管器件發(fā)送出數(shù)字脈沖信號

23、。數(shù)字脈沖信號輸出到單片機的捕獲接口就可捕獲到脈沖信號的頻率進(jìn)而得知步進(jìn)電機的速度。關(guān)于電機正轉(zhuǎn)還是反轉(zhuǎn)的問題,可以通過脈沖信號的相位來判斷。如果脈沖信號相位超前半個周期就說明電機正轉(zhuǎn),相反,如果脈沖信號相位落后半個周期就說明電機反轉(zhuǎn)。 圖3-7 光電編碼器 3.2.5 顯示屏 OLED是一種有機發(fā)光二極管,我們就是采用這種顯示屏來作為顯示的。OLED也有很多的特點,比如說,制作簡單,響應(yīng)速度快,可以做到很薄,他可以自己發(fā)光,不需要背光源,對比度很高,色彩顯示鮮艷,適應(yīng)的溫度范圍廣等等??傊甇LED屏是下一代顯示材料的趨勢。 圖

24、3-8 OLED顯示器 本論文采用的OLED顯示器為0.96寸,他的長寬比例為27mm*26mm。但是他的分辨率卻可以達(dá)到128*64。模塊的去東街口主要有兩種,串行SPI接口和IIC接口。串行接口的速率要比IIC的借口要稍微快一點,但是這種接口需要4根管腳來驅(qū)動,相比IIC兩根接口的驅(qū)動方式要臉肥一些資源。在兩種接口都可以滿足需求的情況下我們選擇IIC接口。只要用2根線就可以驅(qū)動。 4 系統(tǒng)軟件設(shè)計 4.1 模塊初始化 IIC初始化:IIC初始化用于配置MPU6050,由于MPU6050的配置采用的是IIC接口,所以這個初始化是必要的,另外IIC還用于驅(qū)

25、動OLED顯示屏。 下面列出重要的函數(shù) 名(具體函數(shù)體見附錄) 初始化IIC對應(yīng)的引腳 void IIC_Init(void) {} 產(chǎn)生IIC起始信號 int IIC_Start(void) {} 產(chǎn)生IIC停止信號 void IIC_Stop(void) {} 等待應(yīng)答信號 int IIC_Wait_Ack(void) {} 產(chǎn)生ACK應(yīng)答 void IIC_Ack(void) {} 產(chǎn)生NACK應(yīng)答 void IIC_NAck(void) {} IIC寫一個字節(jié) void IIC_Send_Byte(u8 txd) {} IIC讀取一個字

26、節(jié) u8 IIC_Read_Byte(unsigned char ack) {} IIC寫字符串 int i2cWrite(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *data) {} IIC讀字符串 int i2cRead(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf) {} 串口初始化:串口初始化用于打印調(diào)試信息,方便我們調(diào)試程序。 初始化串口引腳,串口時鐘和波特率 void uart_init(u32 pclk2,u32 bound) {}

27、 配置串口中斷函數(shù) void USART2_IRQHandler(void) {} 中斷定時器初始化:用于產(chǎn)生50ms的中斷周期,來進(jìn)行一次PID算法運算。 初始化中斷定時器 void EXTI_Init() {} PWM初始化:用于輸出PWM值,電機驅(qū)動通過改值的大小來直接控制電機的速度與方向。 初始化PWM分頻器和自動重裝值 void MiniBalance_PWM_Init(u16 arr,u16 psc) {} 配置電機輸出引腳 void MiniBalance_Motor_Init(void) {} 設(shè)置PWM值,改變電機速度 void

28、 Set_Pwm(int moto1,int moto2) {} 設(shè)置電機方向 int myabs(int a) {} 編碼器初始化:用于測量電機的實時轉(zhuǎn)速 初始化左右編碼器 void Encoder_Init_TIM2(void) {} void Encoder_Init_TIM3(void) {} 獲取電機的速度 int Read_Encoder(u8 TIMX) {} MPU6050初始化:初始化MPU6050,測量小車的實時狀態(tài)和傾斜角度 讀取MPU6050內(nèi)置溫度傳感器數(shù)據(jù) int Read_Temperature(void) {

29、} 讀取MPU6050內(nèi)置DMP姿態(tài)信息 void Read_DMP(void) {} 初始化MPU6050內(nèi)置DMP void DMP_Init(void) {} 初始化MPU6050以進(jìn)入可用狀態(tài) void MPU6050_initialize(void) {} 設(shè)置MPU6050是否為AUX IIC線的主機 void MPU6050_setI2CBypassEnabled(void) {} 檢測MPU6050是否已連接 uint8_t MPU6050_testConnection(void) {} 讀取MPU6050 WHO_AM_

30、I 標(biāo)識 uint8_t MPU6050_getDeviceID(void) {} 設(shè)置MPU6050是否進(jìn)入睡眠狀態(tài) void MPU6050_setSleepEnabled(uint8_t enabled) {} 設(shè)置MPU6050加速度計的最大量程 void MPU6050_setFullScaleAccelRange(uint8_t range) {} 設(shè)置MPU6050的時鐘源 void MPU6050_setClockSource(uint8_t source) {} 將新的ADC數(shù)據(jù)更新到FIFO數(shù)組,進(jìn)行濾波處理 void MPU605

31、0_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz) {} Flash初始化:用于保存PID數(shù)據(jù) 解鎖Flash void STMFLASH_Unlock(void) {} 上鎖Flash void STMFLASH_Lock(void) {} 得到Flash狀態(tài) u8 STMFLASH_GetStatus(void) {} 等待Flash操作完成 u8 STMFLASH_WaitDone(u16 time) {} 擦除Flash頁 u

32、8 STMFLASH_ErasePage(u32 paddr) {} 從Flash指定的地址寫入半字 u8 STMFLASH_WriteHalfWord(u32 faddr, u16 dat) {} 從Flash指定的地址讀出半字 u16 STMFLASH_ReadHalfWord(u32 faddr) {} 不檢查Flash寫入數(shù)據(jù) void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) {} 從Flash指定的地址寫入指定長度的數(shù)據(jù) void STMFLASH_W

33、rite(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) {} 從Flash指定的地址讀出指定長度的數(shù)據(jù) void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) {} Flash測試 void Test_Write(u32 WriteAddr,u16 WriteData) {} Flash讀 void Flash_Read(void) {} Flash寫 void Flash_Write(void) {} 4.2 PID算法設(shè)

34、計 PID控制公式如下。 (4-2) ut=Kpet+1T10tetdt+TDdetdt 實際使用中,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)。最后對所得數(shù)據(jù)進(jìn)行判斷與轉(zhuǎn)換,以數(shù)據(jù)的正負(fù)控制電機

35、的轉(zhuǎn)向,以數(shù)據(jù)的數(shù)值控制占空比,調(diào)節(jié)PWM輸出來控制轉(zhuǎn)速,完成左右電機的差分控制。 由于小車輪胎與地面存在靜摩擦力,因此當(dāng)占空比很小時,電機驅(qū)動電流很小,電機可以認(rèn)為沒有發(fā)生轉(zhuǎn)動。所有需要根據(jù)實際情況加上死區(qū)常量用來克服這種情況下的靜摩擦力。 輸出控制算法程序框圖如下所示。 (b) (a) 互補濾波 獲取PD控制輸出值 結(jié)束 開始 獲取各車輪的車速 判斷電機轉(zhuǎn)向 對速度積分獲取路程值 疊加藍(lán)牙速度控制 是否超出積分上限 獲取PI控制輸出值 取最大值 結(jié)束 開始 獲取角度值與角速度值 Y N 圖4-2 角度控制與速度控制流程圖 int EXTI3_

36、IRQHandler(void) { if(PBin(3)==0) { EXTI->PR=1<<3; //判斷是否由外部中斷 Encoder_Left=Read_Encoder(2); //獲取電機轉(zhuǎn)速 Encoder_Right=Read_Encoder(3);//獲取電機轉(zhuǎn)速 Get_Angle(Way_Angle); //獲得當(dāng)前角度 Balance_Pwm =balance(Angle_Balance,Gyro

37、_Balance); //PID控制計算 Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);// Moto1=Balance_Pwm+Velocity_Pwm; //輸出pwm值 Moto2=Balance_Pwm+Velocity_Pwm; //輸出pwm值 Xianfu_Pwm(); //限制幅度

38、 Set_Pwm(Moto1,Moto2);//控制電機 return 0; } } 4.3總體軟件架構(gòu) int main(void) { Stm32_Clock_Init(9); JTAG_Set(JTAG_SWD_DISABLE); JTAG_Set(SWD_ENABLE); delay_init(72); KEY_Init(); OLED_Init(); Flash_Init();

39、 uart_init(72,115200); IIC_Init(); MPU6050_Init(); Flash_Read(); EXTI_Init(); Display_All(); While(1); } 由于整個平衡車的處理復(fù)雜度不算特別高,所以整個軟件系統(tǒng)的設(shè)計沒有采用才做系統(tǒng)的架構(gòu)模式,而是采用了相對簡單且容易實現(xiàn)的前后臺架構(gòu)。 從上到下,首先完成的是對系統(tǒng)的時鐘初始化。這一點是非常必要的,應(yīng)為單片機可以工作在多種頻率下,應(yīng)為我們有大量的數(shù)據(jù)處理計

40、算,所以要配置到單片機的最高頻率。也就是72兆赫茲。這里我沒當(dāng)然也不會考慮到功率問題。這種頻率完全有能力處理起來整個平衡車的任務(wù)。 其次是關(guān)閉單片機的JTAG調(diào)試口,應(yīng)為JTAG調(diào)試口占用的管腳較多,而且好需要專門的JTAG調(diào)試器來輔助工作,而這種調(diào)試器非常的昂貴,有的達(dá)到幾千元。因此我們將調(diào)試接口配置為SWD模式,而SWD模式下的調(diào)試器只要幾十元就可以買的到,并且它所占用的管腳資源也是比JTAG要少得多。 接下來我們是初始化delay函數(shù),在很多場合延時對我們來說用的很頻繁。我們事先就寫了一個精準(zhǔn)的延時函數(shù),包括納秒級,微妙級和秒級三種。這就可以滿足我們大部分的需求了。 后面是對按鍵的

41、初始化,它的作用是在調(diào)試階段調(diào)參數(shù)時,不只有一個參數(shù)要調(diào)。我們可以用按鍵的形式來選擇去改變哪一個參數(shù),這樣一來我們就不必每次都改寫整個函數(shù)去調(diào)整參數(shù)了。 后面是OLED的初始化,在調(diào)試階段,OLED是用來作為輔助調(diào)試手段的。他可以記錄電機轉(zhuǎn)速,PWM輸出,PID參數(shù)和平衡小車的傾斜角度。在調(diào)試完成后還可以作為輔助顯示手段。 Flash_Init()是初始化單片機的內(nèi)部存儲芯片,用于保存PID的參數(shù)值。 后面是串口初始化,用來打印調(diào)試信息。 IIC的初始化用來配置MPU6050,以及驅(qū)動顯示屏。后面是MPU6050的初始化,用來初始化陀螺儀。 然后是讀取flash中保存的參數(shù),主

42、要是上次保存的PID參數(shù),模式參數(shù)以及一些其他的參數(shù)。 下面是中斷的初始化,這個初始化非常重要,我么把他設(shè)置到50ms,當(dāng)50毫秒時間到達(dá)后,進(jìn)入中斷函數(shù),獲取電機轉(zhuǎn)速,小車傾斜角度和小車方向。然后進(jìn)行PID計算輸出到電機,讓電機以特定的速度運轉(zhuǎn),保持小車平衡。 最后是顯示所有信息到OLED屏幕,和一個死循環(huán)。我們在設(shè)計時死循環(huán)中什么任務(wù)也沒有做,其實中里面可以添加一些其他的功能函數(shù),比如要坐上位機通訊時的功能可以放到這里面。這是就形成了所謂的前后臺系統(tǒng)了。 開始 將速度控制、角度控制進(jìn)行疊加 增加死區(qū)常量 是否飽和 控制電機轉(zhuǎn)向與轉(zhuǎn)速 是否摔倒 停止 取最

43、大值 Y Y N 圖4-3控制流程 4.4調(diào)試技巧 平衡車的調(diào)試還是有很多技巧的,首先我們能想到的就是最常用的串口調(diào)試,這種調(diào)試只能應(yīng)用在硬件初始化的過程。比如,陀螺儀的初始化,顯示屏的初始化等等,一旦到了PID參數(shù)整定的調(diào)試工作,這種調(diào)試方法就不奏效了。應(yīng)為我問要在實物上調(diào)試,并且小車還會在調(diào)試過程中運動。用串口調(diào)試就顯得有些力不從心了。因此我們采取了另外一種調(diào)試方法。OLED顯示屏加上編碼器和單片機內(nèi)部flash結(jié)合起來調(diào)試。下面我們來具體介紹。 首先我們知道平衡車上有一個編碼器,我們在頻繁該PID參數(shù)時可以轉(zhuǎn)動編碼器,然后

44、設(shè)置對應(yīng)的PID參數(shù)顯示到顯示屏上面,順時針轉(zhuǎn)就加參數(shù)值,逆時針轉(zhuǎn)就減參數(shù)值。然后保存芯片內(nèi)部flash存儲芯片。這樣我們下次重啟平衡車時就可以直接讀取上次我們設(shè)置的PID參數(shù),而不用每次到改完參數(shù)后要重新燒寫程序到單片機了。這樣就讓我們調(diào)參數(shù)的過程變得輕松許多。 5 總結(jié)與展望 5.1 總結(jié) 本設(shè)計系統(tǒng)的硬件系統(tǒng)以ARM公司的STM32為控制核心,使用MPU6050檢測小車的車身姿態(tài),通過編碼器獲取小車當(dāng)前轉(zhuǎn)速,實現(xiàn)對車速的閉環(huán)控制。通過TB6612FNG驅(qū)動電路對兩個電機實現(xiàn)差分控制,進(jìn)而單獨的控制兩個電機。通過藍(lán)牙擴展獲得上位機發(fā)送的控制信號,也可以實現(xiàn)人機交互

45、的功能。 軟件系統(tǒng)設(shè)計中,根據(jù)單片機使用手冊設(shè)置各個寄存器;根據(jù)IIC總線協(xié)議編寫通信程序,并且根據(jù)芯片說明配置MPU6050芯片。使用互補濾波融合加速度計與陀螺儀數(shù)據(jù)并實現(xiàn)角度控制。使用PID算法計算角度控制與速度控制的最終輸出量。使得小車在保持平衡的同時通過藍(lán)牙可實現(xiàn)人機交互。 5.2 展望 由于時間倉促,能力又有限,該設(shè)計還有許多需要改進(jìn)的地方。 1. 采用更先進(jìn)、速度更快的控制器,如ARM,X86等。 2. 使用更先進(jìn)的數(shù)據(jù)融合算法,如卡爾曼濾波算法。 3. 使用更先進(jìn)的控制算法,如模糊控制,神經(jīng)網(wǎng)絡(luò)等。 4. 調(diào)試手段有待進(jìn)一步優(yōu)化。 5. 可以對平衡車添加一些人機

46、互動功能。比如,添加一個語音助手,能夠通過語音對平衡車進(jìn)行控制,讓小車完成像左轉(zhuǎn)彎右轉(zhuǎn)彎自旋轉(zhuǎn)等指定的動作。還可以連接藍(lán)牙或者wifi用手機對小車進(jìn)行控制。 參考文獻(xiàn) [1]肖洪兵. 跟我學(xué)用單片機. 北京:北京航空航天大學(xué)出版社,2002.8 。 [2]何立民. 單片機高級教程. 第1版.北京:北京航空航天大學(xué)出版社,2001。 [3]趙曉安. MCS-51單片機原理及應(yīng)用. 天津:天津大學(xué)出版社,2001.3。 [4]李廣第. 單片機基礎(chǔ). 第1版.北京:北京航空航天大學(xué)出版社,1999。 [5]徐惠民.安德寧. 單片微型計算機原理接口與應(yīng)用. 第1版. 北京:北

47、京郵電大學(xué)出版社,1996。 [6]何立民.從Cygnal 80C51F看8位單片機發(fā)展之路. 單片機與嵌入式系統(tǒng)應(yīng)用,2002年,第5期。 [7]夏繼強. 單片機實驗與實踐教程. 北京:北京航空航天大學(xué)出版社, 2001。 [8]陳志強 胡輝. 單片機應(yīng)用系統(tǒng)設(shè)計實踐指南. 自編教材。 [9]肖洪兵. 單片機應(yīng)用技術(shù). 自編教材。 [10]肖洪兵 高茂科. CAI課件 自主開發(fā)。 [11]V.Yu.Teplov,A.V.Anisimov.ThermostattingSystem Using a Single-Chip Microcomputer and [12]Therm

48、oelectric Modules Based on the Peltier Effect[J] ,2002?。 [13]Yeager Brent.How to troubleshoot your electronic scale[J]..Powder and Bulk Engineering.1995。? [14]Meehan Joanne,Muir Lindsey.SCM in Merseyside SMEs:Benefits and barriers[J]..TQM Journal.2008。? 附錄 1.系統(tǒng)設(shè)計的電路框圖 2.部分源代碼 #include

49、"sys.h" u8 Way_Angle=1; //獲取角度的算法,1:四元數(shù) u8 Flag_Show=1; //停止標(biāo)志位和 顯示標(biāo)志位 默認(rèn)停止 顯示打開 int Encoder_Left,Encoder_Right; //左右編碼器的脈沖計數(shù) int Moto1,Moto2; //電機PWM變量 應(yīng)是Motor的 float Angle_Balance,Gyro_Balance,Gyro_Turn; //平衡傾角 平衡陀螺儀 轉(zhuǎn)向陀螺儀 u32 Distance

50、; //超聲波測距 u8 delay_50,delay_flag,Bi_zhang=0,PID_Send,Flash_Send; //默認(rèn)情況下 float Acceleration_Z; //Z軸加速度計 float PA=100,PB=500,PC=888,PD=6813; //PID參數(shù) u16 PID_Parameter[10],Flash_Parameter[10]; //Flash相關(guān)數(shù)組

51、int Balance_Pwm,Velocity_Pwm,Turn_Pwm; float kp=0,kd=0; float Kp_v=0,Ki_v=0,Kd_v=0; float my_Encoder_Integral; float my_v_kp1; float my_v_kp2; int balance_pwm; u8 key1=0; char Encoder_num; float offset; int my_pwm; void ofset(void); int main(void) { Stm32_Clock_Init(9);

52、 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_ShowStrin

53、g(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(3

54、6,9600); MiniBalance_PWM_Init(7199,0); //TIM4 通道3 4 PB8 9 Encoder_Init_TIM2(); //PA0 1 Encoder_Init_TIM3(); //PA6 7 IIC_Init(); //=====模擬IIC初始化 MPU6050_initialize(); //=====MPU6050初始化 DMP_Init

55、(); //=====初始化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); #if 1 ofset(); OLED_Num_String(35,1,kp); OLED_Num_String(35,2,kd*10);

56、 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(); //=====MPU6050 5ms定時中斷初始化 while(1) { #if 1 OLED_Num_String(35,6,Encoder_Left); OLED_Num_String(70,6,Encoder_Right); OLED_Nu

57、m_String1(35,7,my_pwm); OLED_Num_String1(90,7,(int)my_Encoder_Integral);//積分 OLED_Num_String1(70,1,(int)my_v_kp1);//比例 OLED_Num_String1(70,2,(int)my_v_kp2);//微分 OLED_Num_String(96,0,Angle_Balance); #endif } void ofset() { while(key1!=1) { while(key1==10

58、) { Encoder_Right=Read_Encoder(3); if(Encoder_Right>0)kp++; if(Encoder_Right<-0)kp--; OLED_Num_String(35,1,kp); delay_ms(5); } while(key1==2) { Encoder_Right=Read_Encoder(3); if(Encoder_Right>0)kd+=0.1; if(Encoder_Right<-0)kd-=0.

59、1; OLED_Num_String(35,2,kd*10); delay_ms(5); } while(key1==3) { Encoder_Right=Read_Encoder(3); if(Encoder_Right>0)Kp_v++; if(Encoder_Right<-0)Kp_v--; OLED_Num_String(35,3,Kp_v); delay_ms(5); } while(key1==4) { Encoder_Right=Re

60、ad_Encoder(3); if(Encoder_Right>0)Ki_v+=0.1; if(Encoder_Right<-0)Ki_v-=0.1; OLED_Num_String(35,4,Ki_v*10); delay_ms(5); } while(key1==5) { Encoder_Right=Read_Encoder(3); if(Encoder_Right>0)Kd_v+=0.1; if(Encoder_Right<-0)Kd_v-=0.1; OLED_Num_Str

61、ing(35,5,Kd_v*10); delay_ms(5); } } } 致謝 本論文是在我的導(dǎo)師鮑娟老師的親切關(guān)懷和悉心指導(dǎo)下完成的。他嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,精益求精的工作作風(fēng),誨人不倦的高尚師德,嚴(yán)以律己、寬以待人的崇高風(fēng)范,樸實無華、平易近人的人格魅力深深地感染和激勵著我。從課題的選擇到項目的最終完成,王丹老師都始終給予我細(xì)心的指導(dǎo)和不懈的支持,在此謹(jǐn)向X老師致以誠摯的謝意和崇高的敬意。   感謝電子信息工程學(xué)院的老師對我的教育培養(yǎng)。他們細(xì)心指導(dǎo)我的學(xué)習(xí),在此,我要向諸位老師深深地鞠上一躬。   感謝給我提供參考文獻(xiàn)的學(xué)者們,謝謝他們給我提供了大量的文

62、獻(xiàn),使我在寫論文的過程中有了參考的依據(jù)。   感謝我的爸爸媽媽,感謝代寫論文他們?yōu)槲宜冻龅囊磺?。養(yǎng)育之恩,無以回報,你們永遠(yuǎn)健康快樂是我最大的心愿。   彈指一揮間,大學(xué)四年已經(jīng)接近了尾聲。當(dāng)自己懷著忐忑不安的心情完成這篇畢業(yè)論文的時候,自己也從當(dāng)年一個從山里走出的懵懂孩子變成了一個成熟青年,回想自己的十幾年的求學(xué)生涯,雖然只是一個本科畢業(yè),但也實屬不容易。首先,從小學(xué)到大學(xué)的學(xué)費和生活費就不是一個小數(shù)目,這當(dāng)然要感謝我的爸爸媽媽,他們都是農(nóng)民,沒有他們的勤勤懇懇和細(xì)心安排,我是無論如何也完成不了我的大學(xué)生活。   沒有他們的支持和鼓勵,我也不可能完成我經(jīng)濟學(xué)第二專業(yè)的學(xué)習(xí)。當(dāng)然,一個

63、農(nóng)民家庭要同時供兩個大學(xué)生上學(xué),沒有別人的幫助和接濟是相當(dāng)困難的。因此我要感謝那些在我求學(xué)時對我經(jīng)濟和精神上幫助的親戚、朋友、老師和同學(xué)們,我的生活因你們而精彩和充實。 漢口學(xué)院,這里嚴(yán)謹(jǐn)?shù)膶W(xué)風(fēng)、優(yōu)美的校園環(huán)境使我大學(xué)四年過的很充實和愉快。我第一學(xué)期是在哲學(xué)系度過的。在這短短的半年時間里,我有幸和許多優(yōu)秀的同學(xué)一起學(xué)習(xí),聽睿智的哲學(xué)老師講授哲學(xué)。后來由于一些本可抗拒但一時沖動的原因,我依依不舍的離開了哲學(xué)系,離開了親愛的哲學(xué)系的老師和同學(xué)們。   雖然只有短短的半年時光,但我確實學(xué)到了很多有用的知識,尤其是對我思想和方法上的指導(dǎo)。這些有用的東西一直對我大學(xué)的學(xué)習(xí)和生活有很重要的指導(dǎo)作用,我相信,這些東西將伴隨我走完整個人生的道路。   28

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!