999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

四軸飛行器多功能無(wú)線(xiàn)遙控器設(shè)計(jì)

2017-03-31 11:22:20卞玉麗
軟件導(dǎo)刊 2016年8期

卞玉麗

摘 要:四軸飛行器因其結(jié)構(gòu)簡(jiǎn)單和飛行性能優(yōu)越而成為無(wú)人機(jī)領(lǐng)域的研究熱點(diǎn)。作為一個(gè)典型的多變量、非線(xiàn)性系統(tǒng),在開(kāi)發(fā)過(guò)程中其控制參數(shù)的取值需反復(fù)多次調(diào)整,開(kāi)發(fā)一種可擴(kuò)展、具有多種參數(shù)輸入方式,同時(shí)集數(shù)據(jù)顯示于一體的多功能遙控器顯得十分必要?;赟TM32F103C8T6單片機(jī)、方向搖桿、電位器、陀螺儀、OLED屏以及無(wú)線(xiàn)串口等模塊以及FreeRTOS操作系統(tǒng),開(kāi)發(fā)一個(gè)用于四軸飛行器參數(shù)設(shè)定與顯示的遙控器,通過(guò)該遙控器能夠設(shè)定及顯示飛行器的P、I、D控制參數(shù)、運(yùn)行方向、油門(mén)等,可極大方便四軸系統(tǒng)的開(kāi)發(fā)調(diào)試。

關(guān)鍵詞關(guān)鍵詞:四軸飛行器;無(wú)線(xiàn)遙控;STM32;FreeRTOS

DOIDOI:10.11907/rjdk.161950

中圖分類(lèi)號(hào):TP319

文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2016)008-0110-03

0 引言

四軸飛行器有4個(gè)對(duì)稱(chēng)旋翼的直升機(jī),具有能垂直起降、結(jié)構(gòu)簡(jiǎn)單、操作方便、機(jī)動(dòng)靈活的優(yōu)點(diǎn),成為近年來(lái)研究的熱點(diǎn)[1]。在開(kāi)發(fā)時(shí)有4個(gè)電機(jī)需要控制,控制器的參數(shù)需要反復(fù)調(diào)整,最直接的方法就是每改變一次控制參數(shù)就燒寫(xiě)一次程序,但這樣非常低效、繁瑣。于是有人開(kāi)發(fā)出了基于PC機(jī)的調(diào)試軟件,該類(lèi)調(diào)試軟件不但可以設(shè)定控制參數(shù),還可以實(shí)時(shí)顯示飛行器的各種狀態(tài)信息,極大方便了開(kāi)發(fā)過(guò)程,但這種方案比較適合開(kāi)發(fā)前期初步調(diào)試參數(shù)時(shí),后期測(cè)試就不大方便,因?yàn)樾枰獢y帶電腦,同時(shí)通過(guò)PC機(jī)設(shè)定參數(shù)及時(shí)性也稍差。雖然市面上有商業(yè)遙控器在售,但這些遙控器大多只可以設(shè)定參數(shù)而無(wú)法顯示飛行器信息,設(shè)定參數(shù)的搖桿及按鈕的數(shù)量及功能較為固定,同時(shí)傳輸協(xié)議大都不公開(kāi),不便于用戶(hù)進(jìn)行二次開(kāi)發(fā)、擴(kuò)展。文獻(xiàn)[2]開(kāi)發(fā)了一個(gè)包含四路搖桿的遙控器,但只可輸入?yún)?shù)無(wú)法顯示參數(shù),使用起來(lái)較為不便。文獻(xiàn)[3]中設(shè)計(jì)的遙控器具有搖桿、電位器、按鍵輸入,以及LCD1602顯示功能,但 LCD1602功耗高、顯示信息有限,同時(shí)該遙控器沒(méi)有慣性器件無(wú)法通過(guò)捕獲手的姿態(tài)來(lái)控制飛行器。本文基于STM32F103C8T6、搖桿、電位器、按鍵、OLDE、陀螺儀、無(wú)線(xiàn)串口等模塊設(shè)計(jì)一個(gè)用于開(kāi)發(fā)、調(diào)試四旋翼飛行器的多功能遙控器。

1 系統(tǒng)結(jié)構(gòu)

整個(gè)遙控器以STM32F103C8T6單片機(jī)為核心,同時(shí)包含兩路搖桿輸入、四路電位器輸入、若干個(gè)按鍵、一個(gè)集陀螺儀及加速度計(jì)于一體的MPU6050以及一個(gè)OLED顯示屏。兩路搖桿用來(lái)設(shè)定飛行器的前后、左右運(yùn)動(dòng),四路電位器中的三路用來(lái)設(shè)定P、I、D的控制參數(shù),一路用來(lái)設(shè)定油門(mén)。MPU6050用來(lái)以另一種方式設(shè)定飛行器的前后、左右運(yùn)行,到底采用搖桿輸入還是電位器輸入由飛控MCU決定。OLED屏用來(lái)顯示設(shè)定參數(shù)的具體值,無(wú)線(xiàn)串口作為信息傳輸?shù)耐ǖ?。系統(tǒng)結(jié)構(gòu)如圖1所示。

2 基于FreeRTOS的程序設(shè)計(jì)

對(duì)于簡(jiǎn)單的程序可以采用前后臺(tái)的方式設(shè)計(jì),但前后臺(tái)系統(tǒng)的實(shí)時(shí)性不好,且可擴(kuò)充性及可維護(hù)性較差,于是本系統(tǒng)的設(shè)計(jì)引入了操作系統(tǒng)。應(yīng)用于嵌入式系統(tǒng)領(lǐng)域的操作系統(tǒng)往往稱(chēng)為RTOS(實(shí)時(shí)操作系統(tǒng)),這是因?yàn)樵谇度胧较到y(tǒng)中對(duì)系統(tǒng)的實(shí)時(shí)性大都有一定要求。RTOS種類(lèi)繁多,而FreeRTOS以免費(fèi)、結(jié)構(gòu)簡(jiǎn)單、對(duì)硬件要求較低脫穎而出,官方文檔顯示在2011-2015連續(xù)5年的調(diào)查中FreeRTOS都處于領(lǐng)先的地位[3],因而本文也基于FreeRTOS構(gòu)建整個(gè)系統(tǒng)。

FreeRTOS中的最基本單元是任務(wù),整個(gè)系統(tǒng)應(yīng)該由一個(gè)個(gè)獨(dú)立的任務(wù)所構(gòu)成,比如串口任務(wù)、模擬量采集任務(wù)、顯示任務(wù)等。這里的任務(wù)其實(shí)相當(dāng)于通用操作系統(tǒng)中的線(xiàn)程而非進(jìn)程,因此各任務(wù)之間共享全局變量。任務(wù)就是動(dòng)態(tài)執(zhí)行中的函數(shù),這樣就需要與一個(gè)函數(shù)相對(duì)應(yīng),并且該函數(shù)的形式一般都是確定的,在FreeRTOS下任務(wù)對(duì)應(yīng)函數(shù)的原型為: void TaskFunction( void * pParameter ),即返回參數(shù)為void,函數(shù)參數(shù)為指向void類(lèi)別變量的指針。準(zhǔn)備好函數(shù)后調(diào)用任務(wù)創(chuàng)建函數(shù)進(jìn)行任務(wù)創(chuàng)建,創(chuàng)建方法為:

xTaskCreate( pvTaskCode,pcName,usStackDepth,pvParameters,uxPriority,pxCreatedTask )

3 各模塊程序設(shè)計(jì)

由于采用了RTOS,因此整個(gè)系統(tǒng)由各功能相對(duì)較為獨(dú)立的任務(wù)構(gòu)成,主程序僅需依次創(chuàng)建各任務(wù)及信號(hào)量即可,系統(tǒng)軟件結(jié)構(gòu)如圖2所示。

3.1 模擬量采集任務(wù)

(1)STM32 ADC結(jié)構(gòu)與原理。STM32 ADC模塊工作原理如圖3所示,STM32處理器有兩個(gè)AD轉(zhuǎn)換器ADC1和ADC2,每個(gè)轉(zhuǎn)換器都有16個(gè)通道。每個(gè)AD的都是12位分辨率,最高轉(zhuǎn)換速率可達(dá)1MHz[5]。同串口的結(jié)構(gòu)一樣,ADC的結(jié)構(gòu)和功能也較為復(fù)雜,同樣很多功能平時(shí)較少用到,于是可以將其結(jié)構(gòu)簡(jiǎn)化為框圖。

相對(duì)于傳統(tǒng)的AD轉(zhuǎn)換器,比如ADC0809、STM32的ADC的許多功能設(shè)計(jì)得比較人性化,比如可以連續(xù)轉(zhuǎn)換。在傳統(tǒng)做法中AD轉(zhuǎn)換的流程是:?jiǎn)?dòng)轉(zhuǎn)換→等待轉(zhuǎn)換結(jié)束→讀轉(zhuǎn)換結(jié)果,再次啟動(dòng)轉(zhuǎn)換如此往復(fù)進(jìn)行,而在STM32下只需將控制位CONT設(shè)置為1,這樣在一次轉(zhuǎn)換結(jié)束后會(huì)自動(dòng)啟動(dòng)下一次轉(zhuǎn)換。另一個(gè)特色是可以逐次掃描轉(zhuǎn)換多個(gè)通道,比如設(shè)置通道4、通道6、通道3進(jìn)行掃描轉(zhuǎn)化,這樣當(dāng)轉(zhuǎn)換完通道4后不需要進(jìn)行任何額外的設(shè)置硬件便會(huì)自動(dòng)轉(zhuǎn)換通道6,再轉(zhuǎn)換通道3,要實(shí)現(xiàn)該功能僅需將SCAN置1即可。轉(zhuǎn)換結(jié)果寄存器是16位的,而ADC是12位的,這樣每次轉(zhuǎn)換后的數(shù)字量就有靠右對(duì)齊與靠左對(duì)齊兩種方式,當(dāng)ALIGN被設(shè)置為0時(shí)靠右對(duì)齊,為1時(shí)靠左對(duì)齊。啟動(dòng)轉(zhuǎn)換的方式有很多種,可以設(shè)置為外部觸發(fā)和軟件觸發(fā)。當(dāng)選為外部觸發(fā)時(shí),對(duì)應(yīng)定時(shí)器的捕獲事件、外部中斷事件等都可以啟動(dòng)AD轉(zhuǎn)換。但一般都選擇軟件觸發(fā),這樣僅需將SWSTART設(shè)置為1即可啟動(dòng)轉(zhuǎn)換。ADON的功能不是啟動(dòng)一次轉(zhuǎn)換,而是使能整個(gè)ADC模塊,即當(dāng)ADON為0時(shí)整個(gè)ADC根本不工作也就無(wú)所謂啟動(dòng)轉(zhuǎn)換了,因此上述所有都設(shè)置完畢后必須置ADON為1。當(dāng)一次轉(zhuǎn)換結(jié)束后硬件會(huì)置為EOC,如果使能中斷EOCIE則還會(huì)產(chǎn)生中斷。

(2)模擬輸入通道結(jié)構(gòu)。本遙控器共用到6個(gè)模擬通道,其中2個(gè)用來(lái)檢測(cè)搖桿的位置以控制飛機(jī)的姿態(tài),3個(gè)用來(lái)設(shè)置飛行器的P、I、D參數(shù),1個(gè)用來(lái)設(shè)置油門(mén)。

(3)ADC初始化。將ADC1設(shè)置為連續(xù)、掃描轉(zhuǎn)換,采用查詢(xún)方式即不開(kāi)啟中斷與DMA功能。基于庫(kù)庫(kù)函數(shù)設(shè)置,具體程序如圖5所示。

(4)ADC任務(wù)。定義一個(gè)長(zhǎng)度為6的16位無(wú)符號(hào)數(shù)數(shù)組用來(lái)存放6路AD的輸入,由于ADC已經(jīng)設(shè)置為連續(xù)、掃描轉(zhuǎn)換方式,因此在程序中僅需依次讀轉(zhuǎn)換結(jié)果并賦值給對(duì)應(yīng)的變量即可。另外,為了增加穩(wěn)定性,本文每采集16次轉(zhuǎn)換結(jié)果后取平均值作為一次有效的輸出。基于RTOS開(kāi)發(fā)程序時(shí)由于各任務(wù)之間是并發(fā)的,因此訪(fǎng)問(wèn)全局?jǐn)?shù)據(jù)時(shí)要保證排它性的訪(fǎng)問(wèn)以保證數(shù)據(jù)的完整性。采用信號(hào)量可以達(dá)到此目的,信號(hào)量有計(jì)數(shù)信號(hào)量、二值信號(hào)量、互斥信號(hào)量3種,它們的共同點(diǎn)是當(dāng)數(shù)值大于0時(shí)代表資源可用,否則不可用。計(jì)數(shù)信號(hào)量可以表示的資源數(shù)大于1,二值信號(hào)量與互斥信號(hào)量都只有1和0兩種狀態(tài),當(dāng)為1時(shí)資源可用,為0時(shí)資源不可用。保護(hù)全局?jǐn)?shù)據(jù)時(shí)一般用二值信號(hào)量和互斥信號(hào)量,它們的區(qū)別是互斥信號(hào)具有抗優(yōu)先級(jí)反轉(zhuǎn)等更加高級(jí)的特性,由于本系統(tǒng)任務(wù)不多,且每個(gè)信號(hào)量都只有兩個(gè)任務(wù)訪(fǎng)問(wèn)不存在優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題,因此采用較為簡(jiǎn)單的二值信號(hào)量即可。

在FreeRTOS中二值信號(hào)量的使用分為4個(gè)步驟:①定義 SemaphoreHandle_t SemAnalog = NULL;②創(chuàng)建 SemAnalog = xSemaphoreCreateBinary();③獲取 xSemaphoreTake( SemAnalog,portMAX_DELAY);④釋放。xSemaphoreGive( SemAnalog );uint16 A_Results[6]。

完整的AD采集任務(wù)程序如下(本系統(tǒng)的各個(gè)任務(wù)都是周期性任務(wù),結(jié)構(gòu)上具有一定相似性,為節(jié)省篇幅后文各任務(wù)都不再給出完整代碼):

void AnalogTask(viod *pParams)

{

int count = 0;

while(1){

count=0;

for(i=0; i<16; i++){

while( !ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC))

;

xSemaphoreTake( SemAnalog,portMAX_DELAY);

A_Results[count]= ADC1->DR;

xSemaphoreGive( SemAnalog );

count++;

}

for(i=0; i<16; i++)

A_Results[i]/=16;

vTaskDelay(LOOP_TICKS)

}

}

3.2 MPU6050任務(wù)

MPU6050模塊與STM32之間通過(guò)I2C總線(xiàn)連接,通過(guò)該模塊采集到的原始的角速度與角加速度進(jìn)行相應(yīng)運(yùn)算到3個(gè)歐拉角,然后將它們通過(guò)串口發(fā)送到飛行器上的STM32單片機(jī)。本遙控器可同時(shí)通過(guò)電位器和陀螺儀兩種方式設(shè)置飛機(jī)的姿態(tài),在使用時(shí)具體使用哪一種由飛控上的STM32決定,這大大增加了靈活性。3個(gè)歐拉角用3個(gè)16位全局量表示,后面的發(fā)送任務(wù)將其轉(zhuǎn)換為6個(gè)8位二進(jìn)制數(shù)并發(fā)送。為了保護(hù)全局量,像模擬量采集任務(wù)那樣定義一個(gè)信號(hào)量用來(lái)與發(fā)送任務(wù)之間協(xié)調(diào)同步。

3.3 OLED顯示任務(wù)

OLED模塊通過(guò)SPI總線(xiàn)與STM32相連用來(lái)顯示各設(shè)定參數(shù)的具體值。首先定義一個(gè)全局二維數(shù)組,需顯示內(nèi)容的各任務(wù)將數(shù)據(jù)首先寫(xiě)到該數(shù)組中,然后由顯示任務(wù)負(fù)責(zé)周期性地將數(shù)組輸出到OLED上。由于任務(wù)的并發(fā)性以及顯示數(shù)組的全局性,同樣定義一個(gè)信號(hào)量對(duì)其進(jìn)行保護(hù),所有向OLED寫(xiě)數(shù)據(jù)的任務(wù)都應(yīng)首先獲取該信號(hào)量,訪(fǎng)問(wèn)完畢之后釋放該信號(hào)量。

3.4 串口發(fā)送任務(wù)

(1)串口結(jié)構(gòu)。STM32的串口功能很強(qiáng)大,官方手冊(cè)上給出的結(jié)構(gòu)圖較為復(fù)雜[4],不易看懂,但大多情況下使用的只是其最基本的數(shù)據(jù)收發(fā)功能,此時(shí)串口結(jié)構(gòu)可簡(jiǎn)化為如圖6所示。

與51單片機(jī)相類(lèi)似,在STM32中用戶(hù)可以訪(fǎng)問(wèn)的數(shù)據(jù)寄存器只有一個(gè)即USART_DR,而事實(shí)上當(dāng)發(fā)送數(shù)據(jù)時(shí)即向USART_DR寫(xiě)與接收數(shù)據(jù)即讀時(shí)訪(fǎng)問(wèn)的是不同的物理寄存器。串口使用之前需進(jìn)行一系列配置,包括數(shù)據(jù)位數(shù)、停止位個(gè)數(shù)、奇偶校驗(yàn)、波特率等,這些要通過(guò)各特殊功能寄存器中的配置位來(lái)設(shè)置,常用的配置參數(shù)及其意義如表1所示。

(2)發(fā)送任務(wù)。一共有9個(gè)數(shù)據(jù)需要發(fā)送,每個(gè)數(shù)據(jù)占兩個(gè)字節(jié),再加上幀頭2個(gè)字節(jié)以及最后的校驗(yàn)和,一幀數(shù)據(jù)共21個(gè)字節(jié),具體分布如圖7所示。

串口發(fā)送任務(wù)首先構(gòu)造一個(gè)由21個(gè)元素組成的8位數(shù)組,然后根據(jù)采集到的6個(gè)模擬量以及3個(gè)歐拉角得到18個(gè)待發(fā)送的8位數(shù),再加上2個(gè)幀頭以及校驗(yàn)和就構(gòu)成了完整的發(fā)送數(shù)據(jù)。發(fā)送任務(wù)為周期性運(yùn)行任務(wù),每20ms運(yùn)行一次,具體流程如圖8所示。

(3)串口接收模塊。串口接收不屬于遙控器的范疇,是飛控MCU的功能,此處僅簡(jiǎn)述其功能。當(dāng)接收到遙控發(fā)送的數(shù)據(jù)時(shí)提取P、I、D以及油門(mén)等參數(shù)進(jìn)行相應(yīng)的閉環(huán)控制,同時(shí)根據(jù)發(fā)送過(guò)來(lái)的飛行方向數(shù)據(jù)調(diào)整飛機(jī)姿態(tài)達(dá)到向指定方向運(yùn)行的目的。

4 結(jié)語(yǔ)

本文基于STM32設(shè)計(jì)了一個(gè)多功能無(wú)線(xiàn)遙控器,該遙控器可以滑動(dòng)變阻器設(shè)計(jì)飛機(jī)的P、I、D以及油門(mén)等控制參數(shù),同時(shí)可以通過(guò)搖桿和姿態(tài)角控制飛機(jī)的運(yùn)行方向,并且通過(guò)OLED屏將各種設(shè)定參數(shù)直觀(guān)地顯示出來(lái),極大方便了飛行器開(kāi)發(fā)的調(diào)試過(guò)程。

參考文獻(xiàn):

[1]劉峰,呂強(qiáng),王國(guó)勝,等.四軸飛行器姿態(tài)控制系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2011(3):583-585,616.

[2]朱海榮,張鶴鳴,郭浩波.基于無(wú)線(xiàn)遙控技術(shù)的四旋翼飛行器控制系統(tǒng)設(shè)計(jì)[J].南通職業(yè)大學(xué)學(xué)報(bào),2015(2):86-90.

[3]常國(guó)權(quán),戴國(guó)強(qiáng).基于STM32的四軸飛行器飛控系統(tǒng)設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2015(2):29-32.

[4]The market leading defacto standard and cross platform real time operating[EB/OL].http://www.freertos.org/.

[5]ST MICROELECTRONICS.STM32 reference manual(RM0008)[Z].2010.

(責(zé)任編輯:孫 娟)

主站蜘蛛池模板: 国产网站免费看| 最近最新中文字幕免费的一页| 在线国产你懂的| 中文字幕2区| 久久精品中文无码资源站| 色哟哟精品无码网站在线播放视频| 国产毛片片精品天天看视频| 永久免费精品视频| 日韩无码视频网站| 亚洲天堂高清| 无码 在线 在线| 亚洲欧州色色免费AV| 国产在线视频欧美亚综合| 色婷婷天天综合在线| 久综合日韩| 国产精品护士| 国产杨幂丝袜av在线播放| 99热国产这里只有精品9九| 免费国产在线精品一区| 久久黄色免费电影| 中文字幕无码av专区久久| 欧美人与牲动交a欧美精品 | 国产高清精品在线91| 国产人人干| 亚洲午夜片| 欧美日韩精品一区二区视频| 亚洲一级毛片在线观播放| 欧美精品在线观看视频| 成人精品午夜福利在线播放 | 国产午夜福利在线小视频| 2019国产在线| 东京热一区二区三区无码视频| 亚洲人成网站在线播放2019| 天天色天天综合| 亚洲三级视频在线观看| 九九九精品成人免费视频7| 波多野结衣中文字幕一区二区 | 美女被操黄色视频网站| 精品人妻无码中字系列| 日韩高清一区 | 精品无码国产一区二区三区AV| 色视频国产| 欧美视频在线播放观看免费福利资源 | AV熟女乱| 国产精品va免费视频| 2020国产精品视频| 人妻21p大胆| 中国国产高清免费AV片| 亚卅精品无码久久毛片乌克兰| 亚洲最大福利网站| 波多野结衣中文字幕久久| 91精品视频在线播放| 日韩区欧美区| 色成人亚洲| 午夜精品福利影院| 97在线碰| 欧美国产日产一区二区| 又爽又大又黄a级毛片在线视频 | 国产精品视频久| 97青草最新免费精品视频| 欧美黄网在线| 2020亚洲精品无码| www.精品国产| 婷婷色一二三区波多野衣| 伊人久久大香线蕉综合影视| 一本无码在线观看| 特级aaaaaaaaa毛片免费视频| 亚洲国产精品人久久电影| 色婷婷电影网| 国语少妇高潮| 在线国产毛片| 波多野结衣亚洲一区| 高清无码一本到东京热| 午夜精品一区二区蜜桃| 欧美激情第一区| 亚洲有码在线播放| 99九九成人免费视频精品| 内射人妻无码色AV天堂| 青草视频免费在线观看| 正在播放久久| 精品欧美一区二区三区久久久| 亚洲一级毛片免费看|