第一次在ST论坛发帖,以前都是瞎逛,在大佬的帖子里学习了不少东西,这次看到这个什么创意挑战赛,说实话我也没看明白怎么参加这活动,什么格式啥的有啥要求,其实得不得奖无所谓,在这我主要把我做飞控的一些经验分享一下,如果大家喜欢,后期可能或软硬件全部开源。! i B% @! o" a3 l+ q. @ 既然是用STM32 那就用彻底了,而且我整的无人机从遥控到电调,到最终的主控全系列STM32,制版,程序全部自己来,遥控用的STM32F103C8,电调用的STM32F051 ,飞控用的STM32F446." _, H5 U9 o. d% D! q. h( F$ O 1 c- l# H8 X! i; q |
目前是3S 2200 电池 测了一下13分钟左右
void STEP1( int PWM)
{8 ^% b( _9 _: g6 ~$ N
TIM1->CCR1=PWM;9 N5 R5 R5 Y7 [% m" d0 e
TIM1->CCR2=PWM;2 r- |# V; U: C O) P" n8 D! U
TIM1->CCR3=PWM; //给占空比8 n7 }/ L! `" s- X/ W; R; g
//关T5 $ Z5 F- ^* I/ ^% [' \
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出6 m# K* x. r8 S; w- P
GPIOA->BRR=0X00000400;//PA10置0 % _* D# T6 J7 Q
//关T6
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出. t4 U& \1 c$ u1 G! @* R
GPIOB->BRR =0X00000002;//PB1置0
//常开T41 j$ h5 L0 a( K
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 ) X/ g8 |+ q; I8 Q- L
GPIOB->BSRR =0X00000001;//PB0置1
//关T37 ]* g" D6 j. I S0 [& ]( X: w* ~
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出+ D2 W) l7 ] H" _0 j% n
GPIOA->BRR=0X00000200;//PA9置0
//开T1PWM9 [# g) S1 l4 G/ i2 r( B8 ]
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM# r7 D @( H; r6 C
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出+ A( n/ o/ [% @6 f3 P+ G
GPIOA->BRR =0X00000080;//PA7置0
}
void STEP2( int PWM) F& N. ^ j! L Y* v* P
{
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比* B' C9 E) [$ @- u6 ^
//关T4
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 % Q. W" j, v; \) E
GPIOB->BRR =0X00000001;//PB0置0
//关T3' K7 s4 ]2 a- k) E; T. R1 w
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出$ P7 }7 m9 J3 {/ [$ Z; |/ @" z
GPIOA->BRR=0X00000200;//PA9置0
//T1常开
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出
GPIOA->BSRR=0X00000100;//PA8置1 " ?- T0 `/ S4 X: t4 H5 }, e
//关T2% v; h ?$ ^$ Y/ N: U
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出2 X4 m3 z) X: @ x
GPIOA->BRR =0X00000080;//PA7置0
//开T6PWM
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM
//关T5
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出 V% i' z7 O8 K! E% _ @0 g3 [
GPIOA->BRR=0X00000400;//PA10置0
}
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=10009 B9 [' X1 ?$ q1 D2 S3 @0 S
{9 |$ K0 w6 F _$ K6 ?# ]7 Y! \- I
float Gain=0.0078202080334971915 ;
2 U: b) @6 N+ S8 l8 X
float b[]={1,2,1};' O& \; o: M n+ a+ ?
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };. W8 j, w8 C% r0 E& S& M
9 @+ T, l! ~, ~- x# G2 O
static float Last_Data_IN=0;
static float Last_Last_Data_IN=0;) D3 K2 g8 c' n
float Data_OUT;
static float Last_Data_OUT=0;6 }) n. j) V4 H! m7 r
static float Last_Last_Data_OUT=0; 3 Z/ Z. ~( k. @9 p) H$ G/ C
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];
Last_Last_Data_IN=Last_Data_IN;+ ?8 u8 I+ p2 U* ^6 Z
Last_Data_IN=Data_IN;
Last_Last_Data_OUT=Last_Data_OUT;% L9 x( c6 g6 l/ M7 S g
Last_Data_OUT=Data_OUT;# n5 s1 A ]* _0 f2 S- H$ K; e
return Data_OUT;4 x# L4 p) g6 k0 m! e
}
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。
æ´æºç §ç
é¥æ§PCB
串å£å±ä¸ä½æº
发的多了就不用了
不错,支持
视频