卞玉麗
摘 要:四軸飛行器因其結(jié)構(gòu)簡(jiǎn)單和飛行性能優(yōu)越而成為無(wú)人機(jī)領(lǐng)域的研究熱點(diǎn)。作為一個(gè)典型的多變量、非線性系統(tǒng),在開發(fā)過(guò)程中其控制參數(shù)的取值需反復(fù)多次調(diào)整,開發(fā)一種可擴(kuò)展、具有多種參數(shù)輸入方式,同時(shí)集數(shù)據(jù)顯示于一體的多功能遙控器顯得十分必要。基于STM32F103C8T6單片機(jī)、方向搖桿、電位器、陀螺儀、OLED屏以及無(wú)線串口等模塊以及FreeRTOS操作系統(tǒng),開發(fā)一個(gè)用于四軸飛行器參數(shù)設(shè)定與顯示的遙控器,通過(guò)該遙控器能夠設(shè)定及顯示飛行器的P、I、D控制參數(shù)、運(yùn)行方向、油門等,可極大方便四軸系統(tǒng)的開發(fā)調(diào)試。
關(guān)鍵詞關(guān)鍵詞:四軸飛行器;無(wú)線遙控;STM32;FreeRTOS
DOIDOI:10.11907/rjdk.161950
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2016)008-0110-03
0 引言
四軸飛行器有4個(gè)對(duì)稱旋翼的直升機(jī),具有能垂直起降、結(jié)構(gòu)簡(jiǎn)單、操作方便、機(jī)動(dòng)靈活的優(yōu)點(diǎn),成為近年來(lái)研究的熱點(diǎn)[1]。在開發(fā)時(shí)有4個(gè)電機(jī)需要控制,控制器的參數(shù)需要反復(fù)調(diào)整,最直接的方法就是每改變一次控制參數(shù)就燒寫一次程序,但這樣非常低效、繁瑣。于是有人開發(fā)出了基于PC機(jī)的調(diào)試軟件,該類調(diào)試軟件不但可以設(shè)定控制參數(shù),還可以實(shí)時(shí)顯示飛行器的各種狀態(tài)信息,極大方便了開發(fā)過(guò)程,但這種方案比較適合開發(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é)議大都不公開,不便于用戶進(jìn)行二次開發(fā)、擴(kuò)展。文獻(xiàn)[2]開發(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ú)線串口等模塊設(shè)計(jì)一個(gè)用于開發(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è)定油門。MPU6050用來(lái)以另一種方式設(shè)定飛行器的前后、左右運(yùn)行,到底采用搖桿輸入還是電位器輸入由飛控MCU決定。OLED屏用來(lái)顯示設(shè)定參數(shù)的具體值,無(wú)線串口作為信息傳輸?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)往往稱為RTOS(實(shí)時(shí)操作系統(tǒng)),這是因?yàn)樵谇度胧较到y(tǒng)中對(duì)系統(tǒng)的實(shí)時(shí)性大都有一定要求。RTOS種類繁多,而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)中的線程而非進(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類別變量的指針。準(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è)置油門。
(3)ADC初始化。將ADC1設(shè)置為連續(xù)、掃描轉(zhuǎn)換,采用查詢方式即不開啟中斷與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é)果后取平均值作為一次有效的輸出?;赗TOS開發(fā)程序時(shí)由于各任務(wù)之間是并發(fā)的,因此訪問(wèn)全局?jǐn)?shù)據(jù)時(shí)要保證排它性的訪問(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ù)訪問(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總線連接,通過(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總線與STM32相連用來(lái)顯示各設(shè)定參數(shù)的具體值。首先定義一個(gè)全局二維數(shù)組,需顯示內(nèi)容的各任務(wù)將數(shù)據(jù)首先寫到該數(shù)組中,然后由顯示任務(wù)負(fù)責(zé)周期性地將數(shù)組輸出到OLED上。由于任務(wù)的并發(fā)性以及顯示數(shù)組的全局性,同樣定義一個(gè)信號(hào)量對(duì)其進(jìn)行保護(hù),所有向OLED寫數(shù)據(jù)的任務(wù)都應(yīng)首先獲取該信號(hào)量,訪問(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ī)相類似,在STM32中用戶可以訪問(wèn)的數(shù)據(jù)寄存器只有一個(gè)即USART_DR,而事實(shí)上當(dāng)發(fā)送數(shù)據(jù)時(shí)即向USART_DR寫與接收數(shù)據(jù)即讀時(shí)訪問(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以及油門等參數(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ú)線遙控器,該遙控器可以滑動(dòng)變阻器設(shè)計(jì)飛機(jī)的P、I、D以及油門等控制參數(shù),同時(shí)可以通過(guò)搖桿和姿態(tài)角控制飛機(jī)的運(yùn)行方向,并且通過(guò)OLED屏將各種設(shè)定參數(shù)直觀地顯示出來(lá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ú)線遙控技術(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é)任編輯:孫 娟)