打印

基于GD32F103 MCU四旋翼飞行器

[复制链接]
1470|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
heisexingqisi|  楼主 | 2018-3-25 18:19 | 只看该作者

前言:

近几年四轴飞行器的市场已经慢慢火起来了,大家也都或多或少的从各个方面接触到了四轴,其中作为商品应用的最广泛的领域就是航拍。说白了,目前四轴还是处于玩具的阶段,无非就是谁家玩具做的好,谁家做的坏而已。从技术上来讲,这是受限于算法、载重、续航、智能控制等等,从环境上来讲,还是受限于各方面的安全性。GD32系列MCU的高性能处理能力提高了代码执行效率,从而使算法的控制更快速有效,加上明显的价格优势,目前在飞行器市场已经有了较高的知名度。

本系列的主要目的就是提供一个基于GD32 MCU的四轴飞行器基本方案设计,传感器方面只使用了惯性传感器,未使用气压计、超声波、光流传感器、摄像头动态捕捉等。

软件方面目前的功能:

1.开启传感器低通滤波98Hz,滤掉电机震动对加速度计和陀螺仪的影响;

2.磁力计现场校准,代码直接完成,不需要PC干预。换个地方飞不用再带个电脑做校准了;

3.陀螺仪零偏自校准;

4.加速度计零偏和灵敏度校准;

4.代码时间片管理,姿态融合500Hz,PID控制200Hz;

5.9DOF的惯性传感器数据融合算法;

6.标准的位置式PID控制,控制参数采用kp,Ti,Td;

7.固定航向模式。日后加入可控航向。

8.串口在线调试,使用蓝牙无线传输,支持在线参数保存和读取,采用GD32F103内部Flash来保存参数,不用外扩存储芯片,也方便调试PID参数和磁力计校准。

9.飞行模式:x模式

硬件方面见下图:

下面这张是自己设计的飞控板第二版,兼容F10x/F2xx/F4xx系列MCU,外扩4个PWMin外接遥控接收机,4个PWMout外接motor,4个PWM备用,1个DCMI摄像头接口,1个USART接蓝牙模块,1个SPI可接SPI nand flash,1个I2C接口可外接其他传感器,1个TF卡插槽用于存储视频。

正面:



反面:



下面这张是整机:两个白色轴中间是机头,右边白色轴上是之前做的蓝牙模块,整机标配:450机架,980kv电机,好盈20A电调,11.1V-3S动力电池,7通道接收机,锂电池低压报警器,桨是1047。



下面这张是调PID的时候:此时yaw、pitch和roll的PID都调的差不多了,已经很稳了。



飞行截图:




下面这张是试飞时坠机的原因:螺丝松了,轴也摔弯了,因为当时未找到合适的桨夹,用螺丝代替的。电机转动时,有两个轴必须要使用逆向的螺纹,这样才能保证螺丝越转越紧,我只能说电机厂家在设计电机时就应该配备逆向螺纹电机和正向螺纹电机,方便小客户。



下面这张是飞控板被摔后的,万幸可以修复:



今天飞了3次,目前电池充满续航也就20分钟不到,这次是失败的例子,就放上来了,目前的情况是飞的还算平稳,不过基本都是被它牵着鼻子走,毕竟标准PID只能保证平稳飞起来,操控性能不好。桨的螺丝松了也是个大的教训,一定要用桨夹。

下面说一些各种技术上的东西,个人感觉还是有点用的,包括PID、整机等等。

PID:

PID分两种,位置式和增量式,我采用的是位置式,将Ki和Kd用Ti和Td的形式来表达,并带入到式2-3中,ek=角度的期望-传感器输出的角度,所用的PID三个参数是:Kp、Ti、Td。公式如图所示:



四轴PID控制的目的就是将接收到的遥控的控制信号(一般有油门THR、升降舵ELE(对应pitch)、副翼Ail(对应roll)、方向舵RUD(对应yaw))与飞控板本身计算得出pitch、roll、yaw做比较,分别得出它们之间的误差值,然后将Kp、Ti、Td与这个误差值结合得出PID输出(PID_pitch、PID_roll或者PID_yaw),再将这三个PID输出与油门结合在一起算出送到每一个电调的PWM数值,从而控制每一个电机的转动。

PID参数的调试我是用的土办法,分别对俯仰、翻滚和偏航做PID调试,x模式下先同时上Kp和Td,光靠Kp是稳不住四轴的,调的差不多了上Ti消除静态误差。在调这三个参数时,要相辅相成,切忌把某一个参数固定下来,因为它们之间都会相互影响。

我们还需要考虑三个问题,这三个问题都是围绕《让自己的四轴怎样转动》:

1. 飞行时是使用“+”模式还是使用“x”模式

2. 四个电机分别该如何旋转,是逆时针还是顺时针

3. 每个电机该怎样旋转才能让我们的四轴上升、下降、左翻、右翻、上仰、俯冲、左转头或者右转头

对于第一个问题来说:

一般“+”模式比较好操作,也比较好调节PID的那三个参数,而“x”模式飞行起来比较灵活,可以做很多复杂动作,但是比较难操作,这里我用的是“x”模式,对于新手来说,包括我,虽然“x”模式难一些,不过最多也就是需要时间来学习和熟练罢了,其实也没什么难的。

对于第二个问题:

首先要确定飞控板的xyz轴正方向如何放置,然后确定4个电机的旋转方向分别是什么,我定义的方式如下图,Y正方向为四轴前进方向:



M1、M2、M3、M4分别为4个电机,其中M1和M4顺时针旋转,M2和M3逆时针旋转。

对于第三个问题:

还是看上图,我定义三点:

1.xyz轴的正方向为:y指向正北,x指向东,z指向天;

2.绕y旋转是roll,绕x旋转是pitch,绕z旋转是yaw;

3.Yaw北偏西为正,pitch往上为正,roll“右翼”下沉为正。

令:“+”表示增加该电机的旋转速度,“-”表示减小该电机的旋转速度,那么“x”模式下的控制规律如下:



最后得出每个电机需要的PWM输出计算公式:



其中Limit_PWMOUT函数是限制PWM的输出,根据电调的PWM占空比来确定。

还有一点需要注意的,就是桨叶的安装,桨叶是分正反浆的,通俗的说,安装时要保证4个桨叶转动时都是往下吹风的。

四轴零件之间的接线与简单说明:

4个电调的正负极需要并联(红色连一起,黑色连1一起),并接到电池的正负极上;

电调3根黑色的电机控制线,连接电机,交换任意两根黑色的连线,可改变电机转动方向,以此来改变桨的旋转方向;

电调有个BEC输出,共3根线,红、黑线用于输出5v的电压,给飞行控制板供电,另外一根线用于接收飞行控制板的PWMout信号;

遥控接收器连接在飞行控制器的PWMin上,输出遥控信号给飞控板,并同时从飞行控制板上得到5v供电;

关于PWMin和PWMout:

对于我的天地飞7通遥控+WFT07接收机来说,遥控发送给接收机的信号是PPM,而接收机输出的信号是标准的PWM。

对于接收机来说,我们只需要关心它输出的高电平时间,也就是PWMin,不用管占空比,因此TIM_Period设定为 0xFFFF。我的WFT07接收机的PWM周期是20ms,高电平是1ms~2ms。

对 于给电调的输入来说,也就是PWMout,要确定其占空比,一般根据自己的电调来确定这个占空比,我用的是好盈天行者20A,频率为50~432hz,所 以我的PWM周期设定为2.5ms 频率400hz,高电平持续时间限制在0.875ms~2.0ms,高电平一般在周期的20%~80%。

如何将遥控的PWMin转化为期望的角度expect:

先看一个公式:e(t)=expect – measured,这是PID中的误差e(t),等于遥控期望值减去传感器的测量值。

而将遥控的PWMin转化为期望的角度expect所达到的目的就是将PWMin转化为expect,使expect的范围大小(不是单位,PWMin的单位可以看成已经是角度单位了)与measured的对应起来,并限制expect的范围,对新手来说好操控。

至于转化,就是将PWMin通过一些加减乘除限定在一定范围内,比如我将PWMin(Motor_Ail、Motor_Ele、Motor_Rud)限定在-25度到+25度内,而Motor_Thr保持原来的范围,暂不做限定,可根据具体操作手感来做限定,如下图,其中AilMiddle、EleMiddle、RudMiddle均为1500:



关于对PWMin的滤波:



将TIM_ICFilter设置为0x0B,滤掉1us以下脉冲干扰,防止误进PWMin中断,避免将干扰信号当作PWMin来接收。

最后:

试飞视频和完整代码见21ic上Gigadevice GD32 MCU的线上论坛:https://bbs.21ic.com/forum.php?mo ... 1&extra=#pid4167670。代码是针对的是GD32F103VCT6这款芯片的,系统时钟108M,较高的系统时钟意味着更快速度的运算效率,代码是在《四轴飞行器第一步》的基础上添改了很多东西,验证无误。至此四轴飞行器整体方案算是告一段落,希望能给大家带来帮助,敬请期待后续改进。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

131

主题

2615

帖子

2

粉丝