APP下载

四轴飞行器多功能无线遥控器设计

2017-03-31卞玉丽

软件导刊 2016年8期

卞玉丽

摘 要:四轴飞行器因其结构简单和飞行性能优越而成为无人机领域的研究热点。作为一个典型的多变量、非线性系统,在开发过程中其控制参数的取值需反复多次调整,开发一种可扩展、具有多种参数输入方式,同时集数据显示于一体的多功能遥控器显得十分必要。基于STM32F103C8T6单片机、方向摇杆、电位器、陀螺仪、OLED屏以及无线串口等模块以及FreeRTOS操作系统,开发一个用于四轴飞行器参数设定与显示的遥控器,通过该遥控器能够设定及显示飞行器的P、I、D控制参数、运行方向、油门等,可极大方便四轴系统的开发调试。

关键词关键词:四轴飞行器;无线遥控;STM32;FreeRTOS

DOIDOI:10.11907/rjdk.161950

中图分类号:TP319

文献标识码:A 文章编号:1672-7800(2016)008-0110-03

0 引言

四轴飞行器有4个对称旋翼的直升机,具有能垂直起降、结构简单、操作方便、机动灵活的优点,成为近年来研究的热点[1]。在开发时有4个电机需要控制,控制器的参数需要反复调整,最直接的方法就是每改变一次控制参数就烧写一次程序,但这样非常低效、繁琐。于是有人开发出了基于PC机的调试软件,该类调试软件不但可以设定控制参数,还可以实时显示飞行器的各种状态信息,极大方便了开发过程,但这种方案比较适合开发前期初步调试参数时,后期测试就不大方便,因为需要携带电脑,同时通过PC机设定参数及时性也稍差。虽然市面上有商业遥控器在售,但这些遥控器大多只可以设定参数而无法显示飞行器信息,设定参数的摇杆及按钮的数量及功能较为固定,同时传输协议大都不公开,不便于用户进行二次开发、扩展。文献[2]开发了一个包含四路摇杆的遥控器,但只可输入参数无法显示参数,使用起来较为不便。文献[3]中设计的遥控器具有摇杆、电位器、按键输入,以及LCD1602显示功能,但 LCD1602功耗高、显示信息有限,同时该遥控器没有惯性器件无法通过捕获手的姿态来控制飞行器。本文基于STM32F103C8T6、摇杆、电位器、按键、OLDE、陀螺仪、无线串口等模块设计一个用于开发、调试四旋翼飞行器的多功能遥控器。

1 系统结构

整个遥控器以STM32F103C8T6单片机为核心,同时包含两路摇杆输入、四路电位器输入、若干个按键、一个集陀螺仪及加速度计于一体的MPU6050以及一个OLED显示屏。两路摇杆用来设定飞行器的前后、左右运动,四路电位器中的三路用来设定P、I、D的控制参数,一路用来设定油门。MPU6050用来以另一种方式设定飞行器的前后、左右运行,到底采用摇杆输入还是电位器输入由飞控MCU决定。OLED屏用来显示设定参数的具体值,无线串口作为信息传输的通道。系统结构如图1所示。

2 基于FreeRTOS的程序设计

对于简单的程序可以采用前后台的方式设计,但前后台系统的实时性不好,且可扩充性及可维护性较差,于是本系统的设计引入了操作系统。应用于嵌入式系统领域的操作系统往往称为RTOS(实时操作系统),这是因为在嵌入式系统中对系统的实时性大都有一定要求。RTOS种类繁多,而FreeRTOS以免费、结构简单、对硬件要求较低脱颖而出,官方文档显示在2011-2015连续5年的调查中FreeRTOS都处于领先的地位[3],因而本文也基于FreeRTOS构建整个系统。

FreeRTOS中的最基本单元是任务,整个系统应该由一个个独立的任务所构成,比如串口任务、模拟量采集任务、显示任务等。这里的任务其实相当于通用操作系统中的线程而非进程,因此各任务之间共享全局变量。任务就是动态执行中的函数,这样就需要与一个函数相对应,并且该函数的形式一般都是确定的,在FreeRTOS下任务对应函数的原型为: void TaskFunction( void * pParameter ),即返回参数为void,函数参数为指向void类别变量的指针。准备好函数后调用任务创建函数进行任务创建,创建方法为:

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

3 各模塊程序设计

由于采用了RTOS,因此整个系统由各功能相对较为独立的任务构成,主程序仅需依次创建各任务及信号量即可,系统软件结构如图2所示。

3.1 模拟量采集任务

(1)STM32 ADC结构与原理。STM32 ADC模块工作原理如图3所示,STM32处理器有两个AD转换器ADC1和ADC2,每个转换器都有16个通道。每个AD的都是12位分辨率,最高转换速率可达1MHz[5]。同串口的结构一样,ADC的结构和功能也较为复杂,同样很多功能平时较少用到,于是可以将其结构简化为框图。

相对于传统的AD转换器,比如ADC0809、STM32的ADC的许多功能设计得比较人性化,比如可以连续转换。在传统做法中AD转换的流程是:启动转换→等待转换结束→读转换结果,再次启动转换如此往复进行,而在STM32下只需将控制位CONT设置为1,这样在一次转换结束后会自动启动下一次转换。另一个特色是可以逐次扫描转换多个通道,比如设置通道4、通道6、通道3进行扫描转化,这样当转换完通道4后不需要进行任何额外的设置硬件便会自动转换通道6,再转换通道3,要实现该功能仅需将SCAN置1即可。转换结果寄存器是16位的,而ADC是12位的,这样每次转换后的数字量就有靠右对齐与靠左对齐两种方式,当ALIGN被设置为0时靠右对齐,为1时靠左对齐。启动转换的方式有很多种,可以设置为外部触发和软件触发。当选为外部触发时,对应定时器的捕获事件、外部中断事件等都可以启动AD转换。但一般都选择软件触发,这样仅需将SWSTART设置为1即可启动转换。ADON的功能不是启动一次转换,而是使能整个ADC模块,即当ADON为0时整个ADC根本不工作也就无所谓启动转换了,因此上述所有都设置完毕后必须置ADON为1。当一次转换结束后硬件会置为EOC,如果使能中断EOCIE则还会产生中断。

(2)模拟输入通道结构。本遥控器共用到6个模拟通道,其中2个用来检测摇杆的位置以控制飞机的姿态,3个用来设置飞行器的P、I、D参数,1个用来设置油门。

(3)ADC初始化。将ADC1设置为连续、扫描转换,采用查询方式即不开启中断与DMA功能。基于库库函数设置,具体程序如图5所示。

(4)ADC任务。定义一个长度为6的16位无符号数数组用来存放6路AD的输入,由于ADC已经设置为连续、扫描转换方式,因此在程序中仅需依次读转换结果并赋值给对应的变量即可。另外,为了增加稳定性,本文每采集16次转换结果后取平均值作为一次有效的输出。基于RTOS开发程序时由于各任务之间是并发的,因此访问全局数据时要保证排它性的访问以保证数据的完整性。采用信号量可以达到此目的,信号量有计数信号量、二值信号量、互斥信号量3种,它们的共同点是当数值大于0时代表资源可用,否则不可用。计数信号量可以表示的资源数大于1,二值信号量与互斥信号量都只有1和0两种状态,当为1时资源可用,为0时资源不可用。保护全局数据时一般用二值信号量和互斥信号量,它们的区别是互斥信号具有抗优先级反转等更加高级的特性,由于本系统任务不多,且每个信号量都只有两个任务访问不存在优先级反转问题,因此采用较为简单的二值信号量即可。

在FreeRTOS中二值信号量的使用分为4个步骤:①定义 SemaphoreHandle_t SemAnalog = NULL;②创建 SemAnalog = xSemaphoreCreateBinary();③获取 xSemaphoreTake( SemAnalog,portMAX_DELAY);④释放。xSemaphoreGive( SemAnalog );uint16 A_Results[6]。

完整的AD采集任务程序如下(本系统的各个任务都是周期性任务,结构上具有一定相似性,为节省篇幅后文各任务都不再给出完整代码):

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任务

MPU6050模块与STM32之间通过I2C总线连接,通过该模块采集到的原始的角速度与角加速度进行相应运算到3个欧拉角,然后将它们通过串口发送到飞行器上的STM32单片机。本遥控器可同时通过电位器和陀螺仪两种方式设置飞机的姿态,在使用时具体使用哪一种由飞控上的STM32決定,这大大增加了灵活性。3个欧拉角用3个16位全局量表示,后面的发送任务将其转换为6个8位二进制数并发送。为了保护全局量,像模拟量采集任务那样定义一个信号量用来与发送任务之间协调同步。

3.3 OLED显示任务

OLED模块通过SPI总线与STM32相连用来显示各设定参数的具体值。首先定义一个全局二维数组,需显示内容的各任务将数据首先写到该数组中,然后由显示任务负责周期性地将数组输出到OLED上。由于任务的并发性以及显示数组的全局性,同样定义一个信号量对其进行保护,所有向OLED写数据的任务都应首先获取该信号量,访问完毕之后释放该信号量。

3.4 串口发送任务

(1)串口结构。STM32的串口功能很强大,官方手册上给出的结构图较为复杂[4],不易看懂,但大多情况下使用的只是其最基本的数据收发功能,此时串口结构可简化为如图6所示。

与51单片机相类似,在STM32中用户可以访问的数据寄存器只有一个即USART_DR,而事实上当发送数据时即向USART_DR写与接收数据即读时访问的是不同的物理寄存器。串口使用之前需进行一系列配置,包括数据位数、停止位个数、奇偶校验、波特率等,这些要通过各特殊功能寄存器中的配置位来设置,常用的配置参数及其意义如表1所示。

(2)发送任务。一共有9个数据需要发送,每个数据占两个字节,再加上帧头2个字节以及最后的校验和,一帧数据共21个字节,具体分布如图7所示。

串口发送任务首先构造一个由21个元素组成的8位数组,然后根据采集到的6个模拟量以及3个欧拉角得到18个待发送的8位数,再加上2个帧头以及校验和就构成了完整的发送数据。发送任务为周期性运行任务,每20ms运行一次,具体流程如图8所示。

(3)串口接收模块。串口接收不属于遥控器的范畴,是飞控MCU的功能,此处仅简述其功能。当接收到遥控发送的数据时提取P、I、D以及油门等参数进行相应的闭环控制,同时根据发送过来的飞行方向数据调整飞机姿态达到向指定方向运行的目的。

4 结语

本文基于STM32设计了一个多功能无线遥控器,该遥控器可以滑动变阻器设计飞机的P、I、D以及油门等控制参数,同时可以通过摇杆和姿态角控制飞机的运行方向,并且通过OLED屏将各种设定参数直观地显示出来,极大方便了飞行器开发的调试过程。

参考文献:

[1]刘峰,吕强,王国胜,等.四轴飞行器姿态控制系统设计[J].计算机测量与控制,2011(3):583-585,616.

[2]朱海荣,张鹤鸣,郭浩波.基于无线遥控技术的四旋翼飞行器控制系统设计[J].南通职业大学学报,2015(2):86-90.

[3]常国权,戴国强.基于STM32的四轴飞行器飞控系统设计[J].单片机与嵌入式系统应用,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.

(责任编辑:孙 娟)