第一次在ST论坛发帖,以前都是瞎逛,在大佬的帖子里学习了不少东西, 这次看到这个什么创意挑战赛,说实话我也没看明白怎么参加这活动,什么格式啥的有啥要求,其实得不得奖无所谓,在这我主要把我做飞控的一些经验分享一下,如果大家喜欢,后期可能或软硬件全部开源。5 O" Q# s; A! _- M9 m/ R
既然是用STM32 那就用彻底了,而且我整的无人机从遥控到电调,到最终的主控全系列STM32 ,制版,程序全部自己来,遥控用的STM32F103C8,电调用的STM32F051 ,飞控用的STM32F446.
. Z K O% [' X. m
, O; Q1 {8 T7 m2 |( s |
目前是3S 2200 电池 测了一下13分钟左右
void STEP1( int PWM). {- C5 U1 X; }6 t7 N* v [% n
{# h! J+ s3 N$ s1 h/ \
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比+ `0 ?2 G* G6 y. K$ N
//关T5 1 O& _& y4 q% [$ E$ S
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0 # \, L) C3 x' ~. i1 I, K. V
//关T6
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出
GPIOB->BRR =0X00000002;//PB1置0" W. z3 I( p1 A+ s" P# Z
//常开T4
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 1 r: x s9 i+ f
GPIOB->BSRR =0X00000001;//PB0置1( {/ }' P% I. K; W" O @
//关T3- u% j" c. F* R* c( @( I& U
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出) U5 `8 s& e$ K
GPIOA->BRR=0X00000200;//PA9置0
//开T1PWM
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM! E9 _' ~% n% P" E7 {. Z& y
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出, F9 G: e" y6 }$ l% X, _
GPIOA->BRR =0X00000080;//PA7置0 2 l9 ?& V" y$ n n. f) b
}4 H! o8 H( ~6 M
& q G$ d0 s: j- y' }; h
void STEP2( int PWM)
{# ~, b+ _' ^2 _: M2 |: Y7 s
TIM1->CCR1=PWM;# q, V' r& i" a- W$ p" q0 S
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比/ J/ r7 [, l$ K; j2 L
//关T4. U! m9 @1 j0 q' O# q( c: v
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出
GPIOB->BRR =0X00000001;//PB0置0
//关T3
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0
//T1常开) ~, j C7 d% m
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出) ]' }/ }( x5 D- F
GPIOA->BSRR=0X00000100;//PA8置1
//关T2# b! \% {- [: C) K- @( a
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出6 i7 H2 l _9 p# }# Y h
GPIOA->BRR =0X00000080;//PA7置0
//开T6PWM
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM4 d# t6 ~8 |. [6 d# G0 z
//关T5
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0 % e: h& ~; y2 q( k/ B
}) u: @ e* g0 c: }0 u9 ~* G# }
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
{( T- ~4 c! v ?: c$ t* h
float Gain=0.0078202080334971915 ;
8 Y$ j& T$ N' y
float b[]={1,2,1};
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };" S( r, v- w5 j
/ X) }- N0 `: s8 U) f3 u
static float Last_Data_IN=0;
static float Last_Last_Data_IN=0;2 z n2 u5 w8 X
float Data_OUT;4 p- N) W% P c$ b7 }
static float Last_Data_OUT=0;5 E' N! i. A0 {* I$ `1 ]! ^
static float Last_Last_Data_OUT=0; ! r- `# M8 \2 k' V, o4 z3 d6 t! Q
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];1 z4 D* _+ o4 M# t# J5 {$ Y# n
Last_Last_Data_IN=Last_Data_IN;
Last_Data_IN=Data_IN;
Last_Last_Data_OUT=Last_Data_OUT;
Last_Data_OUT=Data_OUT;: Y" N# S4 s5 a. W h
return Data_OUT;
}
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。
æ´æºç §ç
饿§PCB
串å£å±ä¸ä½æº
发的多了就不用了
不错,支持
; H/ g6 X9 o# O1 O8 F. g# G
视频