上一篇:https://www.cirmall.com/bbs/thread-41717-1-1.html
声明:以下更新只针对新手,为了让新手对整个四轴有个大致全面的认识,现将整个代码放上来,仅供参考,代码的PID部分是标准的PID,可以飞,但是操控性等于0,或者说需要很小心很有经验的去操控,不要拿来移植完了就用,后果就是去淘宝再来500块钱的材料。原因是D项是对角度进行微分,操控起来四轴的动作太猛,之所以先这么做,也是为了验证大家的说法和增加自己的体验,一般把D项改为对角速度的微分,手感就好很多了。
下面说一些乱七八糟的东西,但是个人感觉很有用的东西,包括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数值,从而控制每一个电机的转动。 那么我们就需要考虑三个问题,这三个问题都是围绕《让自己的四轴怎样转动》: 1. 飞行时是使用“+”模式还是使用“x”模式 2. 四个电机分别该如何旋转,是逆时针还是顺时针 3. 每个电机该怎样旋转才能让我们的四轴上升、下降、左翻、右翻、上仰、俯冲、左转头或者右转头 对于第一个问题来说: 一般“+”模式比较好操作,也比较好调节PID的那三个参数,而“x”模式飞行起来比较灵活,可以做很多复杂动作,但是比较难操作,这里我用的是“x”模式,对于新手来说,包括我,虽然“x”模式难一些,不过最多也就是需要时间来学习和熟练罢了,其实也没什么难的。 对于第二个问题: 首先要确定飞控板的xyz轴正方向如何放置,然后确定4个电机的旋转方向分别是什么,我定义的方式如下图,Y正方向为四轴前进方向:
M1、M2、M3、M4分别为4个电机,其中M1和M4顺时针旋转,M2和M3逆时针旋转。
对于第三个问题: 还是看上图,我定义三点: 一.xyz轴的正方向为:y指向正北,x指向东,z指向天; 二.绕y旋转是roll,绕x旋转是pitch,绕z旋转是yaw; 三.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的滤波: TIM2_ICInitStructure.TIM_Channel =TIM_Channel_4; TIM2_ICInitStructure.TIM_ICPolarity= TIM_ICPolarity_Rising; //先上升沿捕获 TIM2_ICInitStructure.TIM_ICSelection= TIM_ICSelection_DirectTI; //映射到TI1上 TIM2_ICInitStructure.TIM_ICPrescaler= TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM2_ICInitStructure.TIM_ICFilter = 0x0B;//IC1F=1010滤掉1us以下脉冲宽度的干扰,避免意外进入中断6/(108Mhz/16)=0.9us TIM_ICInit(TIM2,&TIM2_ICInitStructure); 将TIM_ICFilter设置为0x0B,滤掉1us以下脉冲干扰,防止误进PWMin中断,避免将干扰信号当作PWMin来接收。 下面上代码:
GD32F103VC-AHRS.rar
(640.55 KB, 下载次数: 113)
|