匿名飞控混控器解读并修改机型配置十字型或其他机型配置

匿名飞控的代码还是很简洁的,捋完整个代码框架不难发现各个模块是非常清晰的,每个任务环交换的变量基本都是全局变量,拓展的话也是非常便捷,如果我们需要更改机型配置的话更改文件就可以了

Ano_MotorCtrl.c

来看一下原先X字形混控的配置模块

    
        motor_step[m1] = mc.ct_val_thr -mc.ct_val_rol +mc.ct_val_pit +mc.ct_val_yaw;
        motor_step[m2] = mc.ct_val_thr +mc.ct_val_rol +mc.ct_val_pit -mc.ct_val_yaw;
        motor_step[m3] = mc.ct_val_thr +mc.ct_val_rol -mc.ct_val_pit +mc.ct_val_yaw;
        motor_step[m4] = mc.ct_val_thr -mc.ct_val_rol -mc.ct_val_pit -mc.ct_val_yaw;

其中motor_step定义
  s16 motor_step[MOTORSNUM];

MOTORSNUM是电机的数量

全局搜索不难发现mc.ct_val_thr/mc.ct_val_rol/mc.ct_val_pit/mc.ct_val_yaw这四个变量分别来自文件Ano_AltCtrl.c和Ano_AttCtrl.c,直接滑到文件最下面即可分别找到这四个最终输出变量这四个值即最终作用到电机上的值,起到执行作用,作为负反馈控制中的一部分,得改变执行机构即电机才能通过测量反馈至输入端与期望不断比较再次输出,起到控制作用。很重要!!!

混控器就在这里,m1到m4是各个舵机的输出量,

/*
X型四轴:
      机头
(顺)m2     m1(逆)
        \      /
          \  /
          /  \
        /      \
(逆)m3     m4(顺)
      机尾
*/

对照机型观察代码,首先,所有电机会对四个通道都有反应,油门控制所有电机转速,所有电机的油门mc.ct_val_thr就是正值,观察roll方向,也就是左右侧滚,m1和m4在一侧,m2和m3在一侧,相应的侧滚通道的mc.ct_val_rol 符号位是一样的,当我们使用遥控器控制时往右扳摇杆,输出的roll是正值,无人机的姿态应该是m1和m4降低转速,所以m1和m4的mc.ct_val_rol就是负号,m2和m3的mc.ct_val_rol就是负号,再看pitch通道,俯仰前后方向,m1和m2,m3和m4是一样符号,同理。

将所有的通道相加就得到了每个电机实际控制值。

再进行后限幅输送到pwm

SetPwm(motor);

//motor定义s16 motor[MOTORSNUM];是motor_step限幅后的值


 

再查看SetPwm函数定义

void SetPwm ( int16_t pwm[MOTORSNUM] )
{


   TIM1->CCR4 = PWM_RADIO * ( pwm[0] ) + INIT_DUTY;                //1
   TIM1->CCR3 = PWM_RADIO * ( pwm[1] ) + INIT_DUTY;                //2
   TIM1->CCR2 = PWM_RADIO * ( pwm[2] ) + INIT_DUTY;                //3
   TIM1->CCR1 = PWM_RADIO * ( pwm[3] ) + INIT_DUTY;                //4
    
//     TIM5->CCR4 = PWM_RADIO *( pwm_tem[CH_out_Mapping[4]] ) + INIT_DUTY;                //5
//     TIM5->CCR3 = PWM_RADIO *( pwm_tem[CH_out_Mapping[5]] ) + INIT_DUTY;                //6
//     TIM8->CCR4 = PWM_RADIO *( pwm_tem[CH_out_Mapping[6]] ) + INIT_DUTY;                //7
//     TIM8->CCR3 = PWM_RADIO *( pwm_tem[CH_out_Mapping[7]] ) + INIT_DUTY;                //8

}


   等号左边是具体硬件板子对应的pwm输出的管脚,查看电路图确实一致。
     其中PWM_RADIO , INIT_DUTY 的定义是,所以若我们要输出实际的1000到2000的输出量在这里必须使其输出到4000~8000.

/*初始化高电平时间1000us(4000份)*/
#define INIT_DUTY 4000 //u16(1000/0.25)

 /*设置飞控控制信号转换比例为4*/
#define PWM_RADIO 4//(8000 - 4000)/1000.0
 

这样就输出完成了。

如果我们想要更改机型的配置,那就是这样的步骤

先修改电机数量MOTORSNUM,如果我们要改成四旋翼十字形配置就不需要改动,若改成六旋翼就得改6

然后修改混控器配置

如果是四旋翼十字形配置,这样是最简单的,假设机型配置如下

                m3

                 |

  m2    —    —  m4

                |

              m1

m1和m3是控制俯仰pitch通道,m2和m4是控制侧滚通道,所有的电机都受到油门和偏航通道控制

所以混控器应该是这样

        motor_step[m1]  = mc.ct_val_thr +mc.ct_val_pit  + mc.ct_val_yaw;
        motor_step[m2] = mc.ct_val_thr +mc.ct_val_rol + mc.ct_val_yaw;
        motor_step[m3] = mc.ct_val_thr -mc.ct_val_pit  + mc.ct_val_yaw;
        motor_step[m4] = mc.ct_val_thr -mc.ct_val_rol  + mc.ct_val_yaw;

当然这样的输出是不平滑的,所以还是要进行一系列限幅,这个限幅就需要自己设置,网上也有很多资料可以参考(比如px4)

六旋翼肯定的设置6个电机输出

最后就是设置pwm输出,一样将电机通道对应起来,注意输出4000~8000就没问题;

SetPwm ( int16_t pwm[MOTORSNUM] )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章