第一次在ST论坛发帖,以前都是瞎逛,在大佬的帖子里学习了不少东西, 这次看到这个什么创意挑战赛,说实话我也没看明白怎么参加这活动,什么格式啥的有啥要求,其实得不得奖无所谓,在这我主要把我做飞控的一些经验分享一下,如果大家喜欢,后期可能或软硬件全部开源。( w9 Y; i+ L. t3 G* L% f' O既然是用STM32 那就用彻底了,而且我整的无人机从遥控到电调,到最终的主控全系列STM32 ,制版,程序全部自己来,遥控用的STM32F103C8,电调用的STM32F051 ,飞控用的STM32F446.; O0 A7 i# l; h+ r8 z- _ |
微信公众号
手机版
目前是3S 2200 电池 测了一下13分钟左右
void STEP1( int PWM)9 X& y! D! ~8 L# T
{5 V) W4 V! _9 v( G: k0 L
4 `: [5 `( q+ N1 Q; c
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比
//关T5 3 @8 d7 i3 I# X9 n- O
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0
//关T6' D4 H: K' _+ A& y
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出
GPIOB->BRR =0X00000002;//PB1置0) e/ _' ?+ W0 S( @
//常开T4
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 0 b1 @3 j a2 a( Z R
GPIOB->BSRR =0X00000001;//PB0置1, b7 ^, Z" I+ w! ?& u
//关T3
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0
//开T1PWM
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM& V. x9 G2 E) c- e$ r7 P
//关T2, H$ B3 [* p/ S
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出3 x2 u1 f* b9 x8 @( G$ e% F ~4 ]
GPIOA->BRR =0X00000080;//PA7置0
}" X ?: p5 a0 b- }3 Y" Z
void STEP2( int PWM)
{: b2 y" s/ ^8 J& g, ^ @
TIM1->CCR1=PWM;& ]5 s: _2 I) M5 [: T& K
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比
//关T4- B, Q5 n8 h8 R% Q
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 : E3 M6 ^3 T$ `
GPIOB->BRR =0X00000001;//PB0置0
//关T3
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0
//T1常开
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出3 C: P0 i$ c6 s* \; `& Z2 n
GPIOA->BSRR=0X00000100;//PA8置1
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出5 E& Q; k/ e- I% C
GPIOA->BRR =0X00000080;//PA7置0
//开T6PWM
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM' h5 _8 K" J* I' P" [! I
//关T5
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出( Q% v$ s8 `8 [3 Y4 @
GPIOA->BRR=0X00000400;//PA10置0
}% D% L; t" I9 j' J7 q
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000' z: P# j( R; z. k! J2 D
{
float Gain=0.0078202080334971915 ;- @* [5 X" f% q5 ?5 _
float b[]={1,2,1};. p: l) p( ~9 }2 @. ~% [
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };% A) ~9 x, c: `0 m! y' }
static float Last_Data_IN=0;
static float Last_Last_Data_IN=0;
float Data_OUT; ~, \2 t% D) m0 C' k
static float Last_Data_OUT=0;
static float Last_Last_Data_OUT=0;
Data_OUT=(Gain*(b[0]*Data_IN + b[1]*Last_Data_IN + b[2]*Last_Last_Data_IN) - a[1]*Last_Data_OUT - a[2]*Last_Last_Data_OUT)/a[0];; }* h9 `# n7 M6 e% G- W- x# q. P
Last_Last_Data_IN=Last_Data_IN;
Last_Data_IN=Data_IN;
Last_Last_Data_OUT=Last_Data_OUT;4 m0 D9 ]+ }/ U: [$ h! w
Last_Data_OUT=Data_OUT;
return Data_OUT;/ W+ L' g# x. C" \. |# x' n
}! V* a$ x. H3 |7 t
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。
æ´æºç §ç
饿§PCB
串å£å±ä¸ä½æº
发的多了就不用了
不错,支持
视频