無線遙控的四軸電機(jī)驅(qū)動模塊的設(shè)計_第1頁
無線遙控的四軸電機(jī)驅(qū)動模塊的設(shè)計_第2頁
無線遙控的四軸電機(jī)驅(qū)動模塊的設(shè)計_第3頁
無線遙控的四軸電機(jī)驅(qū)動模塊的設(shè)計_第4頁
無線遙控的四軸電機(jī)驅(qū)動模塊的設(shè)計_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-69-第一章緒論第一節(jié)課題背景1.1.1遙控的發(fā)展概況這些年來,無線通信技術(shù)與人們的生活中息息相關(guān),遙控是無線通信技術(shù)中最主要的產(chǎn)品之一。目前遙控器主要分為紅外遙控器和無線電遙控器兩種,兩者各有不同的優(yōu)勢,應(yīng)用的領(lǐng)域也有所區(qū)別。紅外遙控器的電路調(diào)試簡單,編碼容易,成本較低,不受周邊環(huán)境影響,不干擾其他電器設(shè)備,但是控制范圍較短(一般在10米以內(nèi)),而且是有方向性的,不能穿透障礙物。所以一般用于家用電器(電視、空調(diào)遙控器等等)。無線電遙控器的控制范圍較高,沒有特定的方向,穿透力較強(qiáng),但是發(fā)射功率大耗電大,容易受到電磁的干擾,通常用于汽車遙控、智能家居等等。1.1.2四軸飛行器的發(fā)展概況四軸飛行器又稱四旋翼、四轉(zhuǎn)子,是一種多軸飛行器,有四個旋翼來懸停、維持姿態(tài)及平飛。和固定翼飛機(jī)不同,它通過旋翼提供的推力使飛機(jī)升空。它的四個旋翼大小相同,分布位置接近對稱。對于簡單的設(shè)計來說,僅僅通過調(diào)整不同旋翼之間的相對速度來調(diào)節(jié)不同位置的推力,并克服每個旋翼之間的反扭力矩,就可以控制飛機(jī)維持姿態(tài)和完成各種機(jī)動飛行。這一點和直升機(jī)不同,常見的直升機(jī)就有兩個旋翼,尾槳只起到抵消主旋翼產(chǎn)生的扭矩和控制飛機(jī)偏航運(yùn)動的作用。隨著科技不斷發(fā)展進(jìn)步,尤其是MEMS技術(shù)的發(fā)展和電機(jī)技術(shù)的使用,還有數(shù)學(xué)算法和建模的成熟,創(chuàng)造出了小巧、穩(wěn)定、結(jié)構(gòu)簡單的四軸飛行器。其中微型四軸飛行器的成本十分低廉(可以做到百元內(nèi))。四軸飛行器的應(yīng)用非常廣泛,可以用于軍事、科學(xué)研究和民用。在民用領(lǐng)域,四軸飛行器可以用于影視航拍、農(nóng)業(yè)植保、漁業(yè)監(jiān)管、個人玩具等等。國內(nèi)比較知名的無人機(jī)公司有深圳市大疆創(chuàng)新科技有限公司等等。第二章工作原理第1節(jié)飛行原理2.1.1坐標(biāo)系統(tǒng)飛行器的坐標(biāo)系統(tǒng)是二維空間指教坐標(biāo)系統(tǒng),分別是地理坐標(biāo)系和機(jī)體坐標(biāo)系。地理坐標(biāo)系是固定的,連接在地面上的坐標(biāo)系。機(jī)體坐標(biāo)系也是固定的,連接在飛行器上的坐標(biāo)系。由于四旋翼飛行器的運(yùn)動范圍比較小,所以可以不考慮地面曲率。人們習(xí)慣性上將地面假設(shè)為慣性系。坐標(biāo)地理使用Y軸上北下、X軸南左西右東、Z軸上天下地,坐標(biāo)零點位于機(jī)架中心板中心。如圖2-1所示為坐標(biāo)示意圖。圖2-1坐標(biāo)示意圖X、Y、Z軸與各個選擇軸之間符合右手螺旋定則。各個旋轉(zhuǎn)方向命名為PIT(俯仰)、ROL(橫滾)、YAW(偏航)。由于四軸的運(yùn)動基本是由于傾斜后的分力在起作用,因此后面主要的解算和分析都是圍繞著這幾個旋轉(zhuǎn)量。2.1.2力學(xué)原理四軸飛行器通常有兩種模式,十字模式與X字模式。本次設(shè)計采用的是X字模式。四軸飛行器通過改變自身四個旋翼的轉(zhuǎn)速,可以比較靈活地進(jìn)行各種飛行動作。主要依據(jù)的運(yùn)動原理是力的合成與分解,以及空氣轉(zhuǎn)動扭矩的反向性。為了描述方便,將四個電機(jī)編號為1-4號。如下圖2-2所示X字模式的電機(jī)旋轉(zhuǎn)方向和編號。圖2-2X字模式的電機(jī)旋轉(zhuǎn)方向和編號四個電機(jī)相鄰的兩個旋翼的轉(zhuǎn)動方向相反,而在對角線上的兩個電機(jī)轉(zhuǎn)動方向相同。1、4兩個電機(jī)都是順時針轉(zhuǎn)動,而2、3電機(jī)是逆時針轉(zhuǎn)動。這樣一來,為了保證它們產(chǎn)生的升力都是向上的,1、4電機(jī)需要使用的螺旋槳是正槳,一般指順時針轉(zhuǎn)動時能產(chǎn)生向上升力的槳;而2、3電機(jī)使用的螺旋槳是反槳,即逆時針時產(chǎn)生向上升力的槳。四個旋翼都是向下吹風(fēng)的,以便都提供向上的拉力。順時針轉(zhuǎn)動的槳在轉(zhuǎn)動時,空氣會產(chǎn)生是的四軸逆時針轉(zhuǎn)動的反向扭矩。而當(dāng)1、4同方向,2、3同方向的時候,這兩個扭矩就恰好抵消掉了,使得四軸在偏航方向能保持平衡,不至于出現(xiàn)自旋轉(zhuǎn)。四軸飛行器一共有八種比較典型的運(yùn)動情況,可以概括為:上升、下降、左旋、右旋、左飛、右飛、前飛、后飛。2.1.3姿態(tài)解算的意義姿態(tài)解算即指控制器讀取自身傳感器數(shù)據(jù),實時進(jìn)行計算四軸飛行器的姿態(tài)角,比如翻滾角roll,俯仰角pitch,偏航角yaw,控制器根據(jù)這些信息即可計算4個電機(jī)的輸出量,使飛行器保持平衡穩(wěn)定或者保持一定傾斜角度使飛行器朝著某設(shè)定方向飛行。姿態(tài)解算是飛行器飛行的關(guān)鍵技術(shù)之一,解算速度和精度直接關(guān)系到飛行器飛行中的穩(wěn)定性和可靠性。姿態(tài)解算的方法有很多,比較典型的方法有擴(kuò)展型卡爾曼濾波算法EKF、互補(bǔ)濾波算法等。擴(kuò)展型卡爾曼濾波算法具有高精度的特點,但其計算量大,并要求建立精確的動力學(xué)模型,因此并不是實現(xiàn)微型四軸飛行器的最佳選擇。而互補(bǔ)濾波算法對傳感器的精度要求相對較低,計算量也不大,在微小四軸飛行器的姿態(tài)解算中應(yīng)用最廣。2.1.4姿態(tài)的表示方法四軸飛行器的姿態(tài)表示有很多種方法,最常用的為歐拉角表示方法,即為翻滾角、俯仰角和偏航角。另外還有旋轉(zhuǎn)矩陣表示法和四元數(shù)表示法。一、旋轉(zhuǎn)矩陣和歐拉角、轉(zhuǎn)軸-轉(zhuǎn)角表示法旋轉(zhuǎn)矩陣用于表示一個坐標(biāo)系在另外一個坐標(biāo)系的姿態(tài)。若飛行器姿態(tài)用旋轉(zhuǎn)矩陣R表示,則R具有以下性質(zhì):兩個向量的點積在他們都被同一個旋轉(zhuǎn)矩陣操作(相當(dāng)于旋轉(zhuǎn))之后的點積相等,例如a·b=Ra·Rb,其中a和b為兩個任意3x1的向量;旋轉(zhuǎn)矩陣的逆即為其轉(zhuǎn)置,即R的負(fù)一次方等于R的T次方。歐拉角可以直接從旋轉(zhuǎn)矩陣中直接讀出飛行器的姿態(tài),故被廣泛接受。從一個坐標(biāo)系(比如靜置的全局坐標(biāo)系Fw)轉(zhuǎn)到另一個坐標(biāo)系(比如運(yùn)動的飛行器自身坐標(biāo)系Fb)可以有不同的迅速。常用的旋轉(zhuǎn)順序有Z-X-Y或者Z-Y-X,航空航天上也稱之為Tait-Bryan角。以下以Z-Y-X歐拉角舉例詳細(xì)說明。假設(shè)全局坐標(biāo)系Fw固定于地面保持靜止,而隨飛行器轉(zhuǎn)邊的坐標(biāo)系Fb初始姿態(tài)與Fw是重合為F,然后F按以下順序旋轉(zhuǎn)至最終的姿態(tài)Fb:①Fb0繞著Fw0的Z軸按右手坐標(biāo)系規(guī)則轉(zhuǎn)動α角,α角即為偏航角yaw,并假設(shè)Fb0轉(zhuǎn)動后的新姿態(tài)為Fb0;②Fb1繞著Fb1的Y軸按右手坐標(biāo)系規(guī)則轉(zhuǎn)動β角,β角即為俯仰角pit,并假設(shè)Fb1轉(zhuǎn)動后的新姿態(tài)為Fb1;③Fb2繞著Fb2的X軸按右手坐標(biāo)系規(guī)則轉(zhuǎn)動θ角,θ角即為翻滾角roll,并假設(shè)Fb2轉(zhuǎn)動后的最終坐標(biāo)系Fb2;需要注意的是,以上三次轉(zhuǎn)動分別都繞自身坐標(biāo)系的某一個軸,而不是繞固定于地面的全局坐標(biāo)系的坐標(biāo)軸。以上三次轉(zhuǎn)動分別對應(yīng)一個基本旋轉(zhuǎn)矩陣:R(Z,ψ)=R(Y,θ)=R(X,Φ)=以上三次轉(zhuǎn)動的合成矩陣:二、四元數(shù)表示法單位四元數(shù)與歐拉角、旋轉(zhuǎn)矩陣是等價的,但又不同于歐拉角表示,四元數(shù)表示法沒有奇異點的問題,正是因為這個優(yōu)點,單位四元數(shù)在姿態(tài)估算的核心算法中非常常見。比起三維旋轉(zhuǎn)矩陣,四元數(shù)表示法更能方便地給出旋轉(zhuǎn)的轉(zhuǎn)軸和旋轉(zhuǎn)角。四元數(shù)一般表示為q=q0+q1i+q2j+q3k。由此可見,四元數(shù)的基的乘法是不可交換的。四元數(shù)也可以簡單表示為q=(q0,q1,q2,q3)。泳衣表示旋轉(zhuǎn)矩陣的四元數(shù)必須是單位四元數(shù),即q應(yīng)滿足q02+q12+q22+q32=1。給定兩個四元數(shù)P=p0,p1,p2,p3,q=q0,q1,q2,q3,它們的乘積演算得出p*q≠q*p(此處*特指四元數(shù)乘法),即四元數(shù)乘法是不可交換的??傻玫绞褂盟脑獢?shù)表示的旋轉(zhuǎn)矩陣:R=第三章方案設(shè)計第1節(jié)遙控器的構(gòu)成3.1.1硬件構(gòu)成無線遙控主要由MCU--STM32F103C8模塊、搖桿模塊和nRF24L012.4GHz無線模塊構(gòu)成。無線遙控硬件結(jié)構(gòu)圖如下圖3-1所示。圖3-1無線遙控硬件結(jié)構(gòu)圖無線遙控硬件整體實物連接圖于附錄所示。 一、STM32F103C8T6本文遙控設(shè)計使用的STM32F103C8T6是ST公司設(shè)計研發(fā)的STM32F10xx系列中的一款,中等容量增強(qiáng)型,32位基于ARM核心的帶64或128K字節(jié)閃存的微控制器。STM32F103C8T6芯片如圖3-2所示。圖3-2STM32F103C8T6芯片STM32F103C8T6是基于ARMCortex-M3內(nèi)核的處理器,專為人們的要求--高性能、低成本、低功耗的嵌入式應(yīng)用來設(shè)計的,在市場上比較流行,資料多,容易上手,RAM大,時鐘頻率高,適合用于飛行控制的大量運(yùn)算。本文設(shè)計的遙控需要對搖桿的模擬信號進(jìn)行AD模數(shù)轉(zhuǎn)換,4個方向的模擬信號需要4個模數(shù)轉(zhuǎn)換器。STM32F103C8T6擁有12位ADC,是一種逐次逼近型模擬/數(shù)字轉(zhuǎn)換器。它有18個通道,各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。而且STM32的ADC可以使用DMA(datamemoryaccess)方式操作,方便高效。采用的2.4G無線模塊的通信接口為SPI接口,可以用硬件SPI,也可以用I/O口模擬SPI,模擬SPI需要用到中斷,會占用CPU資源,而硬件SPI不需要CPU參與。STM32F103C8T6有兩個硬件SPI接口。被控端四軸飛行器的傳感器的通信接口是I2C接口,硬件I2C和模擬I2C的情況類似SPI。STM32F103C8T6有硬件I2C接口。綜合考慮以上因素,最終選擇STM32F103C8T6。本次設(shè)計的STM32F103C8T6接口電路及最小系統(tǒng)如圖3-3所示。圖3-3STM32F103C8T6接口電路及最小系統(tǒng)2.4GHzNRF24L01無線通信模塊本次使用的無線模塊為以NRF24L01為核心的2.4GHZ的無線模塊。如圖3-4所示NRF24L01模塊。圖3-4NRF24L01模塊NRF24L01是由NORDIC生產(chǎn)的工作在2.4~2.5GHz的ISM頻段的單片無線收發(fā)器芯片。無線收發(fā)器包括:頻率發(fā)生器、增強(qiáng)型SchockBurst模式控制器、功率放大器、晶體振蕩器、調(diào)制器和解調(diào)器。輸出功率頻道選擇和協(xié)議的設(shè)置可以通過SPI接口進(jìn)行設(shè)置。當(dāng)工作在發(fā)射模式下發(fā)射功率為0dBm時的電流消耗為11.3mA,在接收模式下為12.3mA,在掉電模式和待機(jī)模式下的電流消耗更低。下圖3-5是NRF24L01模塊的IO口接口電路。圖3-5NRF24L04模塊IO口接口電路NRF24L01模塊的引腳及功能如下表3-1。表3-1NRF24L01模塊的引腳及功能引腳名稱引腳功能描述3CE數(shù)字輸入發(fā)射或接收模式選擇4CSNSPI片選信號SPI片選信號5SCK數(shù)字輸入SPI時鐘6MOSI數(shù)字輸入主機(jī)輸出從機(jī)輸入數(shù)據(jù)腳7MISO數(shù)字輸出主機(jī)輸入從機(jī)輸出數(shù)據(jù)腳8IRQ數(shù)字輸出可屏蔽中斷腳STM32F103C8T6與NRF24L01的連接引腳如下圖3-6所示。圖3-6STM32F103C8T6與NRF24L01的連接引腳STM32F103C8T6的SPI_CR寄存器的CPOL和CPHA位,可以組成四種時序關(guān)系。當(dāng)CPHA=0時,時序圖如圖3-7所示。圖3-7CPHA=0時序圖這時候數(shù)據(jù)在第一個邊沿進(jìn)行數(shù)據(jù)位的采樣,CPOL=0時為上升沿采樣,CPOL=1時為下降沿采樣。當(dāng)CPHA=1時,時序圖如圖3-8所示。圖3-8CPHA=1時序圖這時候數(shù)據(jù)在第二個邊沿進(jìn)行數(shù)據(jù)位的采樣,CPOL=1時為上升沿采樣,CPOL=0時為下降沿采樣。外設(shè)從機(jī)的極性一般有嚴(yán)格要求,本次的NRF24L01要求空閑狀態(tài)SCK=0,CPHA=0;數(shù)據(jù)在時鐘第一個時間邊沿采集CPOL=0,如圖3-9所示NRF24L01的SPI時序。圖3-9NRF24L01的SPI時序圖3-9中Cn為SPI命令位,Sn為STATUS寄存器位,Dn為數(shù)據(jù)位(MSB,多字節(jié)輸出時,低字節(jié)在前)。NRF24L01的工作模式,由CE和CONFIG寄存器的PWR_UO和PRIM_RX位共同控制。如表3-2所示。表3-2NRF24L01的工作模式NRF24L01所處模式PWR_UP位狀態(tài)PRIM_RX

位狀態(tài)CE引腳電平

FIFO

寄存器狀態(tài)接收模式111-發(fā)送模式101數(shù)據(jù)在TX

FIFO

寄存器中發(fā)送模式101→0

停留在發(fā)送模式,直至發(fā)送完待機(jī)模式II

101TX

FIFO

為空待機(jī)模式I1-0無數(shù)據(jù)傳輸?shù)綦娔J?-

-

-

其中,收發(fā)模式又有:EnhancedShockBurstTM收發(fā)模式和ShockBurstTM收發(fā)模式,只有EnhancedShockBurstTM收發(fā)模式支持自動ACK和自動重發(fā)。開啟自動ACK,則默認(rèn)選擇Enhanced模式。EnhancedShockBurstTM發(fā)送模式初始化:(1)寫Tx節(jié)點的地址TX_ADDR(2)寫Rx節(jié)點的地址(主要是為了使能AutoAck)RX_ADDR_P0(3)使能AUTOACKEN_AA(4)使能PIPE0EN_RXADDR(5)配置自動重發(fā)次數(shù)SETUP_RETR(6)選擇通信頻率RF_CH(7)配置發(fā)射參數(shù)(低噪放大器增益、發(fā)射功率、無線速率)RF_SETUP(8)配置24L01的基本參數(shù)以及切換工作模式CONFIG。EnhancedShockBurstTM發(fā)送流程:(1)把地址和要發(fā)送的數(shù)據(jù)按時序送入NRF24L01;(2)配置CONFIG寄存器,使之進(jìn)入發(fā)送模式;(3)微控制器把CE置高(至少10us),激發(fā)EnhancedShockBurstTM發(fā)射;(4)EnhancedShockBurstTM發(fā)射:①給射頻前端供電;②射頻數(shù)據(jù)打包(加字頭、CRC校驗碼);③高速發(fā)射數(shù)據(jù)包;④發(fā)射完成,NRF24L01進(jìn)入空閑狀態(tài)EnhancedShockBurstTM接收流程:(1)配置接收地址和要接收的數(shù)據(jù)包大??;(2)配置CONFIG寄存器,使之進(jìn)入接收模式,把CE置高。(3)130us后,NRF24L01進(jìn)入監(jiān)視狀態(tài),等待數(shù)據(jù)包的到來;(4)當(dāng)接收到正確的數(shù)據(jù)包(正確的地址和CRC校驗碼),NRF2401自動把字頭、地址和CRC校驗位移去;(5)NRF24L01通過把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中斷)通知微控制器;(6)微控制器把數(shù)據(jù)從FIFO讀出(0X61指令);(7)所有數(shù)據(jù)讀取完畢后,可以清除STATUS寄存器。NRF2401可以進(jìn)入四種主要的模式之一。搖桿模塊本次遙控設(shè)計采用的是兩軸XY搖桿模塊,而沒有使用按鍵進(jìn)行操作控制。因為按鍵只是單一的0和1兩個變量,而搖桿使用的電位器設(shè)計擁有靈敏的-125至125的行程變量,有較好的操作方便性、可控性和精度??梢暂敵鯴、Y兩路模擬信號和一路中鍵確認(rèn)數(shù)字信號。搖桿模塊如圖3-10所示。圖3-10搖桿模塊搖桿模塊連接電源為3.3V或5V,電源電壓不宜太高,否則會導(dǎo)致模塊燒毀。X軸、Y軸引腳連接單片機(jī)的AD端口。當(dāng)移動搖桿時,X、Y軸的電壓值發(fā)生改變,將變量通過AD轉(zhuǎn)換給STM32。當(dāng)接入3.3V時電壓變化范圍為0~3.3V。四軸飛行器的遙控油門的位置在左邊的是美國手,在右邊的是日本手,本次設(shè)計使用的是美國手。左右兩個搖桿的各個方向功能作用如圖3-11所示。圖3-11搖桿的各個方向功能作用3.1.2軟件實現(xiàn)第一步:對各個模塊進(jìn)行初始化系統(tǒng)時鐘初始化和時鐘源內(nèi)部HSI初始化,開啟系統(tǒng)tick定時器并初始化其中斷,串口初始化,中斷初始化,內(nèi)部flash解鎖,加載系統(tǒng)參數(shù)配置表,IO初始化,搖桿AD初始化,NRF24L01初始化,設(shè)無線模塊為接收模式,遙控?fù)u桿校準(zhǔn),定時器初始化。第二步:等待搖桿移動搖桿移動,將變量值A(chǔ)D轉(zhuǎn)換給STM32。第三步:發(fā)送數(shù)據(jù)STM32將數(shù)據(jù)傳給NRF24L01,NRF24L01將數(shù)據(jù)發(fā)送出去。遙控軟件流程圖如圖3-12所示。圖3-12遙控軟件流程圖具體的程序見附錄所示。第2節(jié)被控端的構(gòu)成3.2.1硬件構(gòu)成被控端四軸飛行器的硬件主要由STM32F103C8T6、NRF24L01無線通信模塊和MPU6050六軸傳感器模塊構(gòu)成,加上適當(dāng)?shù)姆€(wěn)壓、穩(wěn)流電路。四軸的硬件系統(tǒng)框圖如圖3-13所示。圖3-13四軸的硬件系統(tǒng)框圖STM32F103系列單片機(jī)和NRF24L01無線通信模塊在上一節(jié)已經(jīng)有所介紹,本節(jié)不在贅述。一、六軸傳感器MPU6050MPU6050為全球首例集成六軸傳感器的運(yùn)動處理組件,它內(nèi)置一個三軸MEMS陀螺儀、一個三周MEMS加速度計、一個數(shù)字運(yùn)動處理引擎(DMP)以及用于第三方數(shù)字傳感器接口的輔助I2C端口(常用于拓展磁力計)。當(dāng)輔助I2C連接到一個三軸磁力計,MPU6050能提供一個完整的九軸融合輸出到其主I2C端口。MPU6050擁有16為模/數(shù)轉(zhuǎn)換器ADC,將三軸陀螺儀及三軸加速度計的數(shù)據(jù)轉(zhuǎn)化為數(shù)字量輸出。為了精確跟蹤快速和慢速運(yùn)動,MPU6050支持用戶可編程的陀螺儀滿量程范圍有:±250、±500、±1000與±2000(單位為°/S或dps),支持用戶可編程的加速度計滿量程范圍有:±2G、±4G、±8G與±16G。MPU6050同時內(nèi)置了一個可編程的低通濾波器,可用于傳感器數(shù)據(jù)的濾波。MPU6050數(shù)據(jù)傳輸可通過最高至400KHz的I2C總線完成,它的封裝尺寸為QFN,在業(yè)界是革命性的尺寸。其他的特征包括內(nèi)置的溫度傳感器以及高達(dá)10000GHz的碰撞容忍度的振蕩器。MPU6050的供電范圍為2.375~3.46V,三軸陀螺儀的正常工作電流為3.6mA,待機(jī)電流為5uA,三軸加速度計正常工作電流為500uA,待機(jī)電流為10uA。通過片上的數(shù)字運(yùn)動處理引擎DMP可減少復(fù)雜的融合運(yùn)算負(fù)荷,同時使用六軸傳感器以及DMP僅需3.9mA的工作電流。如下圖3-14所示為MPU6050芯片。圖3-14MPU6050芯片MPU6050的引腳接線如圖3-15所示。圖3-15MPU6050的引腳接線SDA和SCL分別接到STM32F103C8T6的PA11和PA12。I2C總線總線的SDA和SCL兩條信號線同時處于高電平時,規(guī)定為總線的空閑狀態(tài)。此時各個器件的輸出級場效應(yīng)管均處在截止?fàn)顟B(tài),即釋放總線,由兩條信號線各自的上拉電阻把電平拉高。起始信號是當(dāng)SCL為高期間,SDA由高到低的跳變。停止信號是當(dāng)SCL為高期間,SDA由低到高的跳變。如圖3-16所示起始和停止信號時序圖。圖3-16起始和停止信號時序圖發(fā)送器每發(fā)送一個字節(jié),就在時鐘脈沖9期間釋放數(shù)據(jù)線,由接收器反饋一個應(yīng)答信號。應(yīng)答信號為低電平時,規(guī)定為有效應(yīng)答位(ACK簡稱應(yīng)答位),表示接收器已經(jīng)成功地接收了該字節(jié);應(yīng)答信號為高電平時,規(guī)定為非應(yīng)答位(NACK),一般表示接收器接收該字節(jié)沒有成功。對于反饋有效應(yīng)答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平。如圖3-17所示I2C的響應(yīng)時序圖。圖3-17I2C的響應(yīng)時序圖I2C總線進(jìn)行數(shù)據(jù)傳送時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。如圖3-18所示數(shù)據(jù)傳送有效性時序圖。如圖3-18所示數(shù)據(jù)傳送有效性時序圖。MPU6050初始化過程①初始化IIC接口。②復(fù)位MPU6050。由電源管理寄存器1(0X6B)控制。③設(shè)置角速度傳感器和加速度傳感器的滿量程范圍。由陀螺儀配置寄存器(0X1B)和加速度傳感器配置寄存器(0X1C)設(shè)置。④設(shè)置其他參數(shù)。配置中斷,由中斷使能寄存器(0X38)控制;設(shè)置AUXIIC接口,由戶控制寄存器(0X6A)控制;設(shè)置FIFO,由FIFO使能寄存器(0X23)控制;陀螺儀采樣率,由采樣率分頻寄存器(0X19)控制;設(shè)置數(shù)字低通濾波器,由配置寄存器(0X1A)控制。⑤設(shè)置系統(tǒng)時鐘。由電源管理寄存器1(0X6B)控制。一般選擇x軸陀螺PLL作為時鐘源,以獲得更高精度的時鐘。⑥使能角速度傳感器(陀螺儀)和加速度傳感器。由電源管理寄存器2(0X6C)控制。初始化完成,即可讀取陀螺儀、加速度傳感器和溫度傳感器的數(shù)據(jù)了。3.2.2機(jī)械構(gòu)成一、機(jī)架由于對重量的要求較高,通??梢灾苯佑米陨淼腜CB電路板充當(dāng)微型四軸飛行器的機(jī)架。使用PCB電路板作為機(jī)架時,可以選擇0.8mm厚度的PCB板,這樣可以兼顧重量和硬度。 二、電池大四軸通常使用2200mAh、3S、25C的電池,小四軸一般是350mAh、1S、25C。電池的C數(shù)是指這個電池的最大放電倍率,航模電池通常用S數(shù)值來表示電壓。 三、電機(jī)及驅(qū)動在微型四軸飛行器上,由于空間和電流都比較有限,通常采用有刷電機(jī)作為動力,具體來說就是空心杯電機(jī)和MOS管驅(qū)動電路的結(jié)合??招谋姍C(jī)屬于直流、永磁、伺服微特電機(jī),具有突出的節(jié)能特性、靈敏方便的控制特性和穩(wěn)定的運(yùn)行特性,作為高效率的能量轉(zhuǎn)換裝置,代表了電動機(jī)的發(fā)展方向??招谋姍C(jī)在結(jié)構(gòu)上突破了傳統(tǒng)電機(jī)的轉(zhuǎn)子結(jié)構(gòu)形式,采用的是無鐵芯轉(zhuǎn)子。通常采用720空心杯電機(jī)。720空心杯大多轉(zhuǎn)速能達(dá)到50000r/min左右。工作電壓為3.7V??蛰d時電流為0.08A,堵轉(zhuǎn)為1.8A。輸出軸直徑1mm,輸出軸長度7mm。螺旋槳的尺寸為直徑55mm槳配720電機(jī)。一般選用最大電流在2A以上的MOS管,比如IRLML2502,或者SI2302。下圖3-19為720空心杯電機(jī)和螺旋槳。圖3-19720空心杯電機(jī)和螺旋槳3.2.3軟件實現(xiàn)軟件大致流程為:系統(tǒng)初始化,無線模塊等待接收,接收到數(shù)據(jù),將數(shù)據(jù)和MPU6050模塊采集到的姿態(tài)數(shù)據(jù)進(jìn)行融合解算,通過PID控制輸出PWM控制電機(jī)調(diào)速。四軸飛行器軟件流程圖如圖3-20所示。圖3-20四軸飛行器軟件流程圖第4章數(shù)據(jù)處理第1節(jié)飛行器的姿態(tài)解算4.1.1PID算法許多復(fù)雜的電子系統(tǒng)中常會包括PID控制,例如磁盤的讀寫頭定位、電源供應(yīng)器的電源條件甚至是現(xiàn)代地震儀的運(yùn)動偵查路線?,F(xiàn)代電子控制器已大幅被這些利用單芯片或FPGA來實現(xiàn)數(shù)字控制器所取代?,F(xiàn)代工業(yè)使用的PID控制器多半會用PLC或有安裝面板的數(shù)字控制器來實現(xiàn)。軟件實現(xiàn)的好處是價格相對低廉,配合PID實現(xiàn)方法調(diào)整的靈敏度很大。在工業(yè)鍋爐、塑膠射出機(jī)械、燙金機(jī)及包裝行業(yè)中都會用到PID控制。PID控制器是一個在工業(yè)控制應(yīng)用中常見的反饋回路部件。這個控制器把收集到的數(shù)據(jù)和一個參考值進(jìn)行比較,然后把這個差別用于計算新的輸入值,這個新的輸入值的目的是讓系統(tǒng)的數(shù)據(jù)達(dá)到或者保持在設(shè)定的參考值。PID控制器可以根據(jù)歷史數(shù)據(jù)和差別的出現(xiàn)率來調(diào)整輸入值,是系統(tǒng)更加準(zhǔn)確且穩(wěn)定。PID控制器的比例單元P、積分單元I和微分單元D分別對應(yīng)目前誤差、過去累計誤差及未來誤差。若是不知道受控系統(tǒng)的特性,一般認(rèn)為PID控制器是最社和用到控制器。借由調(diào)整PID控制器的3個參數(shù)可以調(diào)整控制系統(tǒng),設(shè)法滿足設(shè)計需求??刂破鞯捻憫?yīng)可以用控制器對誤差的反應(yīng)速度、控制器過沖的程度及系統(tǒng)震蕩的程度來表示。不過使用PID控制器不一定能保證可達(dá)到系統(tǒng)的最佳控制,也不能保證系統(tǒng)穩(wěn)定性。經(jīng)典的單級PID控制器如圖4-1所示。圖4-1經(jīng)典的單級PID控制器有些應(yīng)用只需要PID控制器的部分單元,將不需要單元的參數(shù)設(shè)為零即可。因此PID控制器可以變成PI控制器、PD控制器、P控制器或I控制器。其中又以PI控制器比較常用,因為D控制器對系統(tǒng)噪聲十分敏感,若沒有I控制器的話,則系統(tǒng)一般不會回到參考值,而存在一個穩(wěn)定的誤差量。PID回路是要自動實現(xiàn)類似一位操作人員用量具和控制旋鈕進(jìn)行的工作。這個操作人員會用量具測系統(tǒng)輸出的結(jié)果,然后用控制旋鈕來調(diào)整這個系統(tǒng)的輸入,直到系統(tǒng)的輸出在量具上顯示穩(wěn)定的需求結(jié)果。在舊的控制文檔里,這個過程叫做復(fù)位。量具被稱為測量,需要的結(jié)果被稱為設(shè)定值,而設(shè)定值和測量之間的差別被稱為誤差。一個控制回路包括以下三個部分:①系統(tǒng)的傳感器得到的測量結(jié)果;②控制器做出決定;③通過一個輸出設(shè)備來做出反應(yīng)??刂破鲝膫鞲衅鞯玫降臏y量結(jié)果,然后用需求結(jié)果減去測量結(jié)果來得到誤差。然后用誤差計算出一個對系統(tǒng)的糾正值作為輸入結(jié)果,這樣系統(tǒng)就可以從它的輸出結(jié)果中消除誤差。在一個PID回路中,這個糾正值有三種算法:消除目前的誤差,平均過去的誤差,透過誤差的改變來預(yù)測將來的誤差。PID控制器可以用來控制任何可被測量及可被控制變量。比如,它可以用來控制溫度、壓強(qiáng)、流量、化學(xué)成分、速度等。汽車上的巡航定速功能就是一個例子。一些控制系統(tǒng)把數(shù)個PID控制器串聯(lián)起來,或是聯(lián)成網(wǎng)絡(luò)。這樣的話,一個主控制器可能會為其他控制輸出結(jié)果。一個常見的例子是發(fā)動機(jī)的控制??刂葡到y(tǒng)會需要發(fā)動機(jī)有一個受控的速度,最后停在一個確定的位置??捎梢粋€發(fā)動機(jī)子控制器用來管理速度,但是這個子控制器的速度是由控制發(fā)動機(jī)位置的主控制器來管理的。聯(lián)合和串級控制在化學(xué)過程控制系統(tǒng)中也相當(dāng)常見。標(biāo)準(zhǔn)的直接計算法公式:Pout(t)=Kp*e(t)+Ki*∑e(t)+Kd*(e(t)-e(t-1));上一次計算值:Pout(t-1)=Kp*e(t-1)+Ki*∑e(t-1)+Kd*(e(t-1)-e(t-2));兩式相減得到增量法計算公式:Pdlt=Kp*(e(t)-e(t-1))+Ki*e(t)+Kd(e(t)-2*e(t-1)+e(t-2));P比例控制器功能不同比例增益Kp下,受控變量的階躍響應(yīng)不同。比例控制考慮當(dāng)前誤差,誤差值和一個正值的常數(shù)Kp(表示比例)相乘。Kp只是在控制器的輸出和系統(tǒng)的誤差成比例的時候成立。比如說,一個電熱器的控制器的比例尺范圍是10-20℃,它的預(yù)定值是20℃。注意:在誤差是0的時候,控制器的輸出也是0。比例控制的輸出為:Pout=Kpe(t)。若比例增益打,在相同誤差下會有較大的輸出,但若比例增益太大,則會使系統(tǒng)不穩(wěn)定。相反的,若比例增益小,則在相同誤差量下,其輸出較小,因此控制器會響應(yīng)較慢。這會導(dǎo)致當(dāng)有干擾出現(xiàn)時,其控制信號可能不夠大,而無法修正干擾的影響。比例控制在誤差為0是,其輸出也會為0。若要讓受控輸出為非零的數(shù)值,就需要有一個穩(wěn)態(tài)誤差或偏移量。穩(wěn)態(tài)誤差和比例增益成正比,和受控系統(tǒng)本身的增益成反比。若加入一個偏置,或是加入積分控制,可以消除穩(wěn)態(tài)誤差。I積分控制器不同積分增益K1下,受控變量對時間的變化(Kp和KD維持定值)。積分控制考慮過去誤差,將誤差值在過去一段時間內(nèi)的總和(誤差和)乘以一個正值的常數(shù)K1.K1從過去的平均誤差值來找到系統(tǒng)的輸出結(jié)果和預(yù)定值的平均誤差。一個簡單的比例系統(tǒng)會振蕩,會在預(yù)定值附近來回變化,因為系統(tǒng)無法消除多余的糾正。通過加上負(fù)的平均誤差值,平均系統(tǒng)誤差值就會漸漸減小。所以,最終這個PID回路系統(tǒng)會在設(shè)定值處穩(wěn)定下來。積分控制會加速系統(tǒng)趨近設(shè)定值的過程,并且消除純比例控制器出現(xiàn)的穩(wěn)態(tài)誤差。積分增益越大,趨近設(shè)定值的速度越快,不過因為積分控制會累計過去所有的誤差,可能會使反饋值出現(xiàn)過沖的情形。D微分控制器微分控制考慮將來誤差,計算誤差的變化率,并和一個正值的常數(shù)KD相乘。這個變化率的控制會對系統(tǒng)的改變作出反應(yīng)。導(dǎo)數(shù)的結(jié)果越大,那么控制器系統(tǒng)就越能對輸出結(jié)果做出更快速的反應(yīng)。這個KD參數(shù)也是PID被稱為可預(yù)測的控制器的原因。KD參數(shù)有助于減少控制器短期的改變。實際中一些速度緩慢的系統(tǒng)可以不需要KD參數(shù)。微分控制可以提升整定時間及系統(tǒng)穩(wěn)定性。不過因為純微分器不是因果系統(tǒng),因此在PID系統(tǒng)實現(xiàn)是,一般會微分控制加上一個低通濾波器以限制高頻增益和噪聲。實際應(yīng)用上較少用到微分控制,估計PID控制器中只有約20%用到了微分控制。4.3.2飛行器PID參數(shù)調(diào)試PID的參數(shù)調(diào)試是指透過調(diào)整控制參數(shù)(比例增益、積分增益/時間、微分增益/時間)讓系統(tǒng)達(dá)到最佳的控制效果。穩(wěn)定性(不會有散發(fā)性的震蕩)是首要條件。此外,不同系統(tǒng)有不同的行為,不同的應(yīng)用其需求也不同,而且這些需求還可能會互相沖突。PID只有三個參數(shù),在原理上容易說明,但PID參數(shù)調(diào)試是一項困難的工作,因為要符合一些特別的判據(jù),而且PID控制其限制存在。歷史上有許多不同的PID參數(shù)調(diào)試方式,包括齊格勒-尼克爾斯方法等,其中也有一些已申請專利。PID控制器的設(shè)計及調(diào)試在概念上很直接,但若有多個(且互相沖突)的目標(biāo)(例如高穩(wěn)定性及快速的暫態(tài)時間)都要達(dá)到的話,在實際上很難完成。PID控制器的參數(shù)若仔細(xì)調(diào)試會有很好的效果,相反的,若調(diào)試不當(dāng)則效果會很差。一般初始設(shè)計常需要不斷地進(jìn)行環(huán)路模型仿真,并且修改參數(shù),直到達(dá)到理想的性能或是可接受的偏差為止。有些系統(tǒng)有非線性的特性,若在無負(fù)載條件下調(diào)試的參數(shù)可能無法再滿負(fù)載的情況下正常工作。對這樣的系統(tǒng)可以利用增益規(guī)劃的方式進(jìn)行修正(在不同的條件下選用不同的數(shù)值)。穩(wěn)定性若PID控制器的參數(shù)未挑選妥當(dāng),則其控制器輸出可能就是不穩(wěn)定的,也就是其輸出發(fā)散過程中可能有振蕩,也可能沒有振蕩,且其輸出只受飽和或是機(jī)械損壞等原因所限制。不穩(wěn)定一般是因為過大增益造成,特別是針對環(huán)路延遲時間很長的系統(tǒng)。最佳性能PID控制器兩個基本的需求是調(diào)整能力(抑制擾動,使系統(tǒng)維持在設(shè)定值)及命令追隨(設(shè)定值變化下,控制器輸出追隨設(shè)定值的反應(yīng)速度)。有關(guān)命令追隨的一些判據(jù)包括上升時間(risetime)及整定時間。有些應(yīng)用可能基于安全考慮,不允許輸出超過設(shè)定值,也有些應(yīng)用要求在達(dá)到設(shè)定值過程中的能量消耗可以最小化。人工調(diào)試a.位置式PID參數(shù)調(diào)試首先大概設(shè)置一下YAW的參數(shù)P和D。P設(shè)置為5,D設(shè)置為50,以免自轉(zhuǎn)太嚴(yán)重,不方便參加調(diào)試。接下來只需要調(diào)PITCH和ROLL方向的參數(shù)。②然后調(diào)節(jié)參數(shù)D:參數(shù)D代表阻尼作用。阻尼太小,四軸就會振蕩;阻尼太大,四軸也會振蕩。參數(shù)D產(chǎn)生的阻尼力,與控制量(角度)的變化率(角速度)有關(guān),變化率(角速度)越大,阻尼力越大。在調(diào)試的過程中,我們把PITCH和ROLL的參數(shù)D設(shè)為一致,從0開始增加。剛開始增加D的時候,四軸劇烈抖動,基本上馬上就炸機(jī)了,是一種高頻率的反復(fù)振蕩。增加到30左右的時候,發(fā)現(xiàn)四軸振動越來越小了,變穩(wěn)了一些,接著增加,發(fā)現(xiàn)到100的時候四軸會有抖動感,于是把D慢慢調(diào)小,最后確定在80.③接著調(diào)節(jié)參數(shù)P:參數(shù)P代表四軸回復(fù)力的大小,即四軸偏離方向水平方向越多,這個回復(fù)力就越大。在調(diào)試的過程中,我們把PITCH和ROLL的參數(shù)P設(shè)為一致,從0開始往上增加。剛開始增加P的時候,四軸很快就側(cè)翻了,不像調(diào)節(jié)參數(shù)D的時候處在高頻振蕩。慢慢增加P到4左右的時候,基本穩(wěn)定下來了,最后把參數(shù)P確定在6.0。④調(diào)節(jié)參數(shù)I:隨便給一點點參數(shù),先給力0.005,感覺不太明顯,后來加到0.030,感覺即使電池裝的偏重心一點,也可以較好地飛行了。為避免參數(shù)I過大造成超調(diào)振蕩,最終確定參數(shù)I為0.030。位置PID調(diào)試的結(jié)果:四軸很容易達(dá)到懸停的效果,但是機(jī)動性很一般,或者說會中是緩慢的,遙控手感一般。b.串級PID參數(shù)調(diào)試①所有參數(shù)歸零,先調(diào)PITCH和ROLL的內(nèi)環(huán)P(這個步驟跟調(diào)節(jié)位置式PID的參數(shù)D類似,主要是調(diào)節(jié)阻尼)。不斷增大P,直到四軸能平穩(wěn)起飛了,記下這個值。然后不斷增大到開始輕微振蕩,把參數(shù)P調(diào)小一些,然后加入一點點參數(shù)D抑制振蕩,內(nèi)環(huán)暫時好累。此時四軸是一個三軸模式,有點類似KK飛控,只有陀螺儀會保持當(dāng)前角度,但不會自己修正當(dāng)前角度。把四軸拿在手中擺動,可以明顯感覺到抵抗的力(如果此時四軸YAW方向會自旋,就給YAW內(nèi)環(huán)加入?yún)?shù)I,不斷增大直到四軸不會自旋了)。②調(diào)PITCH和ROLL的外環(huán)P,從0開始增大,會感受到四軸回復(fù)力越來越大,但是會振蕩(P負(fù)責(zé)回復(fù)力度的大?。?。加入一點點參數(shù)D抑制超調(diào)。再加入一點參數(shù)I,就能有很好的手感了。如果環(huán)內(nèi)調(diào)節(jié)得好,外環(huán)參數(shù)就很容易整定,基本上試幾次就可得到較好的效果了。③YAW內(nèi)環(huán)P從0開始增大,調(diào)節(jié)到轉(zhuǎn)動平穩(wěn)有力即可。4.3.3基于四元數(shù)的姿態(tài)解算互補(bǔ)濾波算法有了前面章節(jié)的理論基礎(chǔ),本節(jié)給出一個具體實例來講解姿態(tài)解算算法。在一個IMU系統(tǒng)中,一般集成有加速度計芯片、陀螺儀芯片、磁傳感器(羅盤)芯片;而且目前最常見的飛控系統(tǒng)中只有一個傳感器芯片,即這個傳感器芯片集成了加速度計、陀螺儀以及磁傳感器。讀取這些傳感器的數(shù)據(jù)不是本節(jié)的重點,這里只關(guān)心如何把這些數(shù)據(jù)解算成飛行器的姿態(tài),并用四元數(shù)和歐拉角分別表示出來。MPU6050的DMP輸出的是姿態(tài)解算后的四元數(shù),采用q30格式。四元數(shù)轉(zhuǎn)歐拉角q0=quat[0]/q30;//q30格式轉(zhuǎn)換為浮點數(shù)q1=quat[1]/q30;//q30是一個常量,2的30次方即1073741824q2=quat[2]/q30;q3=quat[3]/q30;//計算得到的橫滾角/俯仰角/航向角angle->roll=-atan2(2.0f*(q0*q1+q2*q3),q0^2-q1^2-q2^2-q3^2)*180/pi;//俯仰角180/pi=57.3弧度轉(zhuǎn)換為角度angle->pitch=asin(2.0f*(q0*q2-q1*q3))*180/pi;//橫滾角Angle->yaw=atan2(2*(q0*q1+q2*q3),q0^2+q1^2-q2^2-q3^2)*180/pi;//航向角把加速度計的三維向量轉(zhuǎn)成單位向量norm=invSqrt(ax*ax+ay*ay+az*az);ax=ax*norm;ay=ay*norm;az=az*norm;估計重力加速度方向在飛行器坐標(biāo)系中的表示,為四元數(shù)表示的旋轉(zhuǎn)矩陣的第三行vx=2*(q1*q3-q0*q2);vy=2*(q0*q1+q2*q3);vz=q0*q0-q1*q1-q2*q2+q3*q3;加速度計讀取的方向和重力加速度方向的差值,用向量叉乘計算ex=ay*vz-az*vy;ey=az*vx-ax*vz;ez=ax*vy-ay*vx;誤差累計,已與積分常數(shù)相乘exInt=exInt+ex*Ki;eyInt=eyInt+ey*Ki;ezInt=ezInt+ez*Ki;用叉積誤差來做PI修正陀螺儀零偏,即抵消陀螺儀讀書中的偏移量gx=gx+Kp*ex+exInt;gy=gy+Kp*ey+eyInt;gz=gz+Kp*ez+ezInt;一階近似算法q0=q0_last+(-q1_last*gx-q2_last*gy-q3_last*gz)*halfT;q1=q1_last+(q0_last*gx+q2_last*gz-q3_last*gy)*halfT;q2=q2_last+(q0_last*gy-q1_last*gz+q3_last*gx)*halfT;q3=q3_last+(q0_last*gz+q1_last*gy-q2_last*gx)*halfT;二階近似算法floatdelta2=(gx*gx+gy*gy+gz*gz)*T*T;q0=q0_last*(1-delta2/8)+(-q1_last*gx-q2_last*gy-q3_last*gz)*halfT;q1=q1_last*(1-delta2/8)+(q0_last*gx+q2_last*gz-q3_last*gy)*halfT;q2=q2_last*(1-delta2/8)+(q0_last*gy-q1_last*gz+q3_last*gx)*halfT;q3=q3_last*(1-delta2/8)+(q0_last*gz+q1_last*gy-q2_last*gx)*halfT;三階近似算法floatdelta2=(gx*gx+gy*gy+gz*gz)*T*T;q0=q0_last*(1-delta2/8)+(-q1_last*gx-q2_last*gy-q3_last*gz)*T*(0.5-delta2/48);q1=q1_last*(1-delta2/8)+(q0_last*gx+q2_last*gz-q3_last*gy)*T*(0.5-delta2/48);q2=q2_last*(1-delta2/8)+(q0_last*gy-q1_last*gz+q3_last*gx)*T*(0.5-delta2/48);q3=q3_last*(1-delta2/8)+(q0_last*gz+q1_last*gy-q2_last*gx)*T*(0.5-delta2/48);四階近似算法floatdelta2=(gx*gx+gy*gy+gz*gz)*T*T;q0=q0_last*(1-delta2/8+delta2*delta2/384)+(-q1_last*gx-q2_last*gy-q3_last*gz)*T*(0.5-delta2/48);q1=q1_last*(1-delta2/8+delta2*delta2/384)+(q0_last*gx+q2_last*gz-q3_last*gy)*T*(0.5-delta2/48);q2=q2_last*(1-delta2/8+delta2*delta2/384)+(q0_last*gy-q1_last*gz+q3_last*gx)*T*(0.5-delta2/48);q3=q3_last*(1-delta2/8+delta2*delta2/384)+(q0_last*gz+q1_last*gy-q2_last*gx)*T*(0.5-delta2/48); 四元數(shù)規(guī)范化norm=invSqrt(q0*q0+q1*q1+q2*q2+q3*q3);q0=q0*norm;q1=q1*norm;q2=q2*norm;q3=q3*norm;結(jié)束語由于本人時間倉促,水平有限,本次設(shè)計主要是制作遙控控制電機(jī)的裝置,無法制作出完美的四軸飛行器的設(shè)計。由于本人經(jīng)驗不夠豐富,論文和設(shè)計之中出現(xiàn)的錯誤在所難免,敬請各位讀者批評、指正。四軸飛行器是最近比較火的一種機(jī)電類設(shè)備,適合作為電子信息、自動控制等學(xué)科的研究課題,也適合用作這些專業(yè)的教學(xué)、科技時間、工程實訓(xùn)設(shè)備。目前,從科技競賽到航拍、偵查,隨處可見四軸飛行器的身影。四軸飛行器是機(jī)械、通信、電子、自動控制幾大學(xué)科融匯的具有較高科技含量的一種設(shè)備,主要承載了微處理器、慣性導(dǎo)航、自動控制、無線通信、電腦上位機(jī)軟件、電路設(shè)計、PCB制作、外部機(jī)械結(jié)構(gòu)設(shè)計、空氣動力學(xué)及基本的航??刂浦R。本次設(shè)計這套轉(zhuǎn)置,難點之一是硬件方面的設(shè)計,更大的難點無疑都指向數(shù)據(jù)融合和各種算法。網(wǎng)上的資料對此都是泛泛而談,很少有一些更為具體的應(yīng)用。本人對多旋翼飛行器的興趣濃厚,以后依然會繼續(xù)對此方面進(jìn)行進(jìn)一步的研究。致謝首先非常感謝學(xué)校的教育和栽培,是學(xué)校培養(yǎng)了我現(xiàn)在的思維和學(xué)識,我才可以對深層次的科學(xué)知識進(jìn)行相關(guān)的研究,這篇論文才能寫出來。感謝老師,在跟老師做畢業(yè)設(shè)計的過程中,學(xué)到了遠(yuǎn)比學(xué)習(xí)本身更重要的東西,讓我進(jìn)一步成長。感謝我的父母,他們在物質(zhì)上對我的大力支持是我進(jìn)行科學(xué)研究的基礎(chǔ),他們的愛是我前進(jìn)的動力。感謝網(wǎng)上各位一起探討多旋翼飛行器的網(wǎng)友,他們的經(jīng)驗對我來說非常重要。讓我少走了許多彎路,幫助我解決了不少問題。感謝同班同學(xué)們,是你們的支持讓我充滿激情。參考文獻(xiàn)[1]劉峰,呂強(qiáng),王國勝等.四軸飛行器姿態(tài)控制系統(tǒng)設(shè)計[J].計算機(jī)測量與控制,2011,19(3):583-585,616.[2]劉杰.四軸飛行器研究與設(shè)計[D].南京郵電大學(xué),2013.[3]王冬來,呂強(qiáng),劉峰等.小型四軸飛行器動力學(xué)參數(shù)測定方法設(shè)計[J].科技導(dǎo)報,2011,29(36):42-45.DOI:10.3981/j.issn.1000-7857.2011.36.007.[4]王俊,魯曉天.對四軸飛行器基于姿態(tài)算法的分析與實現(xiàn)[J].河南科技,2015,(2):51-53.DOI:10.3969/j.issn.1003-5168.2015.02.019.[5]郝蕓,楊奇,佟皓萌等.基于STM32的四軸飛行器設(shè)計[J].電子測試,2015,(18):6-8.DOI:10.3969/j.issn.1000-8519.2015.18.004.[6]梁延德,程敏,何福本等.基于互補(bǔ)濾波器的四旋翼飛行器姿態(tài)解算[J].傳感器與微系統(tǒng),2011,30(11):56-58,61.DOI:10.3969/j.issn.1000-9787.2011.11.017.[7]姜山,祝麗.小型四軸飛行器控制器設(shè)計的研究[J].電子世界,2014,(22):260-260,261.[8]

郭天祥.新概念51單片機(jī)C語言教程[M].北京:電子工業(yè)出版社,2009.1

[9]

劉軍,張洋,嚴(yán)漢宇.例說STM32[第二版][M].北京:北京航空航天大學(xué)出版社,2011.4

[10]

張毅剛,彭喜元,彭宇.單片機(jī)原理及應(yīng)用[第二版][M].高等教育出版社,2010.5

[11]

張義和.例說51單片機(jī)[第三版][M].人民郵電出版社,2010.6.1

[12]

童詩白,華成英.模擬電子技術(shù)基礎(chǔ)[第四版][M].高等教育出版社,2001.1

[13]

唐介.電機(jī)與拖動[第二版][M].高等教育出版社,2007.12[14]

閻石.數(shù)字電子技術(shù)基礎(chǔ)[第四版][M].高等教育出版社,1998

[15]

王化祥.自動檢測技術(shù)[第二版][M].化學(xué)工業(yè)出版社,2009.8.1

[16]

趙月飛,胡仁喜.AltiumDesigner13電路設(shè)計標(biāo)準(zhǔn)教程[M].科學(xué)出版社,2014.8

[17]

STM32中文參考手冊_V10

,STM32英文參考手冊[18]

作者:(英國)JosephYiu.譯者:宋巖.ARMCortex-M3權(quán)威指南[M].[19]

尹紀(jì)新.無線射頻基礎(chǔ)[M].人民郵電出版社,2008.10[20]

黃和悅.DIY四軸飛行器基于MSP430F5系列單片機(jī)與Android[M].電子工業(yè)出版社,2015.9[21]

吳勇.四軸飛行器DIY-基于STM32微控制器[M].北京航空航天大學(xué)出版社,2016.2附錄電路圖及PCB1.1四軸總體連接圖1.2四軸飛行器PCB實物圖2.1遙控器實物圖2.2四軸飛行器打樣空板圖2.3四軸飛行器實物圖代碼①main.c#include"stm32f10x.h"#include"stm32f10x_conf.h"#include"SysTick.h"#include"TIM3_IT.h"#include"led.h"#include"adc.h"#include"usart.h"#include"SPI_IO.h"#include"NRF24L01.h"intok;//初始化各個模塊intmain(void){ SysTick_Init(); Tim3_Init(5000); LED_GPIO_Config(); ADC1_Init(); USART1_Config(); Spi1_Init(); Delay_us(50000); Nrf24l01_Init(MODEL_RX2,100);}②TIME3_IT.C#include"TIM3_IT.h"#include"NRF24L01.h"#include"usart.h"#include"adc.h"#include"SysTick.h"voidTim3_Init(u16period_num){ TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period=period_num;//裝載值prescaleris1200,thatis72000000/72/500=2000Hz; TIM_TimeBaseStructure.TIM_Prescaler=72-1;//分頻系數(shù) TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//orTIM_CKD_DIV2orTIM_CKD_DIV4 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //中斷優(yōu)先級設(shè)置 NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3,ENABLE); }unsignedintVCC;unsignedintms;unsignedintRX_speed;unsignedintTX_speed;introll;intpitch;intyaw;intX_g;intY_g;intZ_g;intX_w;intY_w;intZ_w;voidRX_TX_Times(void){ ms++; if(ms>=100) { RX_speed=RX_times; RX_times=0; TX_speed=TX_times; TX_times=0; ms=0; }}voidTME_10ms(void){ ADC1_Value();RX_TX_Times(); NRF_TxPacket_AP(TxBuf,10); Nrf_Check_Event(); roll=NRFRX[0]-30000; pitch=NRFRX[1]-30000; yaw=NRFRX[2]-30000; X_g=NRFRX[3]-30000; Y_g=NRFRX[4]-30000; Z_g=NRFRX[5]-30000; X_w=NRFRX[6]-30000; Y_w=NRFRX[7]-30000; Z_w=NRFRX[8]-30000; NRFTX[0]=accelerator; NRFTX[1]=Pitch_ta+30000; NRFTX[2]=Roll_ta+30000; NRFTX[3]=Yaw_ta+30000; NRFTX[4]=1; UART1_ReportIMU(X_g,Y_g,Z_g,X_w,Y_w,Z_w,RX_speed,TX_speed,accelerator,roll,pitch,yaw/10);}voidTIM3_IRQHandler(void) { staticu8ms10=0; if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM3,TIM_IT_Update); ms10++; TME_5ms(); if(ms10==2) { ms10=0; TME_10ms(); } }}③adc.c#include"adc.h"#defineADC1_DR_Address((u32)0x4001244C)int16_taccelerator;int16_tPitch_ta;int16_tRoll_ta;int16_tYaw_ta;int16_taccelerator_a;int16_tPitch_ta_a;int16_tRoll_ta_a;u16ADC_ConvertedValue[4];staticvoidADC1_GPIO_Config(void){ GPIO_InitTypeDefGPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOC,&GPIO_InitStructure); }staticvoidADC1_Mode_Config(void){DMA_InitTypeDefDMA_InitStructure;ADC_InitTypeDefADC_InitStructure;DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize=4;DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;DMA_InitStructure.DMA_Priority=DMA_Priority_High;DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;DMA_Init(DMA1_Channel1,&DMA_InitStructure);DMA_Cmd(DMA1_Channel1,ENABLE);ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode=ENABLE; ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel=4; ADC_Init(ADC1,&ADC_InitStructure);ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_12,3,ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_13,4,ADC_SampleTime_55Cycles5); ADC_DMACmd(ADC1,ENABLE);ADC_Cmd(ADC1,ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));ADC_SoftwareStartConvCmd(ADC1,ENABLE);}voidADC1_Init(void){ ADC1_GPIO_Config(); ADC1_Mode_Config();}#defineN10floatData_accelerator[N];floatData_Pitch_ta[N];floatData_Roll_ta[N];floatGildeAverageValueFilter(floatNewValue,float*Data){ unsignedchari; floatValue; floatsum; sum=0; Data[N]=NewValue; for(i=0;i<N;i++) { Data[i]=Data[i+1]; sum+=Data[i]; } Value=sum/N; return(Value);}voidADC1_Value(void){ accelerator_a=ADC_ConvertedValue[2]; accelerator=GildeAverageValueFilter(accelerator_a,Data_accelerator); Pitch_ta_a=ADC_ConvertedValue[1]; Pitch_ta=GildeAverageValueFilter(Pitch_ta_a,Data_Pitch_ta)-1500; Roll_ta_a=ADC_ConvertedValue[0]; Roll_ta=GildeAverageValueFilter(Roll_ta_a,Data_Roll_ta)-2100; Yaw_ta=0;//ADC_ConvertedValue[3]; }④SPI_IO.C#include"SPI_IO.h"voidSpi1_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure);}unsignedcharSpi_RW(unsignedcharuchar){ unsignedcharbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) { SPI_MOSI(uchar&0x80); uchar=(uchar<<1); SPI_SCK(1); uchar|=SPI_MISO_IN; SPI_SCK(0); }return(uchar); }⑤NRF24L01.C#include"NRF24L01.h"#include"SPI_IO.h"uint8_tTX_ADDRESS[TX_ADR_WIDTH]={0x01,0x23,0x45}; uint8_tRX_ADDRESS[RX_ADR_WIDTH]={0x01,0x23,0x45}; uint8_tNRF_Write_Reg(uint8_treg,uint8_tvalue){ uint8_tstatus; SPI_CSN_L(); status=Spi_RW(reg); Spi_RW(value); SPI_CSN_H(); return status;}uint8_tNRF_Read_Reg(uint8_treg){ uint8_treg_val; SPI_CSN_L(); Spi_RW(reg); reg_val=Spi_RW(0); SPI_CSN_H(); return reg_val;}uint8_tNRF_Write_Buf(uint8_treg,uint8_t*pBuf,uint8_tuchars){ uint8_ti; uint8_tstatus; SPI_CSN_L(); status=Spi_RW(reg); for(i=0;i<uchars;i++) { Spi_RW(pBuf[i]); } SPI_CSN_H(); return status; }uint8_tNRF_Read_Buf(uint8_treg,uint8_t*pBuf,uint8_tuchars){ uint8_ti; uint8_tstatus; SPI_CSN_L(); status=Spi_RW(reg); for(i=0;i<uchars;i++) { pBuf[i]=Spi_RW(0); } SPI_CSN_H(); return status;}voidNRF_TxPacket_AP(uint8_t*tx_buf,uint8_tlen){ SPI_CE_L(); nRF24L01_tx(NRFTX,TxBuf); NRF_Write_Buf(0xa8,tx_buf,len); SPI_CE_H(); }uint8_tNrf24l01_Check(void){ u8buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; u8i; NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5); NRF_Read_Buf(TX_ADDR,buf,5); for(i=0;i<5;i++)if(buf[i]!=0XA5)break; if(i!=5)return1; return0; }voidNrf24l01_Init(uint8_tmodel,uint8_tch){ SPI_CE_L(); NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1f); NRF_Write_Reg(NRF_WRITE_REG+RF_CH,ch); NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x07); if(model==1) { NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); NRF_Write_Reg(NRF_WRITE_REG+CONFIG,0x0f); } elseif(model==2) //TX { NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); NRF_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); } elseif(model==3) //RX2 { NRF_Write_Reg(FLUSH_TX,0xff); NRF_Write_Reg(FLUSH_RX,0xff); NRF_Write_Reg(NRF_WRITE_REG+CONFIG,0x0f); Spi_RW(0x50); Spi_RW(0x73); NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01); NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x07); } else //TX2 { NRF_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); NRF_Write_Reg(FLUSH_TX,0xff); NRF_Write_Reg(FLUSH_RX,0xff); Spi_RW(0x50); Spi_RW(0x73); NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01); NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x07); } SPI_CE_H();}unsignedcharTxBuf[24]; unsignedcharRxBuf[24];unsign

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論