匿名飛控的代碼還是很簡潔的,捋完整個代碼框架不難發現各個模塊是非常清晰的,每個任務環交換的變量基本都是全局變量,拓展的話也是非常便捷,如果我們需要更改機型配置的話更改文件就可以了
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] )