第一次在ST论坛发帖,以前都是瞎逛,在大佬的帖子里学习了不少东西,这次看到这个什么创意挑战赛,说实话我也没看明白怎么参加这活动,什么格式啥的有啥要求,其实得不得奖无所谓,在这我主要把我做飞控的一些经验分享一下,如果大家喜欢,后期可能或软硬件全部开源。1 B# t [. Z, O/ l9 B) y 既然是用STM32 那就用彻底了,而且我整的无人机从遥控到电调,到最终的主控全系列STM32,制版,程序全部自己来,遥控用的STM32F103C8,电调用的STM32F051 ,飞控用的STM32F446.0 ]% \" j% @1 w1 e+ n |
目前是3S 2200 电池 测了一下13分钟左右
void STEP1( int PWM)' @1 [0 [* @" e3 e
{. t% a1 h* K: h( G- v
3 ~( w6 W2 `- b) C% }2 b
TIM1->CCR1=PWM;$ w6 [, C0 }2 U! Z6 @) U$ B% ]0 L
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比/ t7 I7 \7 h& Q8 L: c* B
//关T5
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0 0 k, s8 h7 `: o7 x$ M) O# s4 B
//关T6
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出+ H( a: I( _! G1 w
GPIOB->BRR =0X00000002;//PB1置0
//常开T41 e& [9 e1 h" m9 r7 q6 M
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 + x& b' E) F1 y9 }3 H
GPIOB->BSRR =0X00000001;//PB0置1
//关T3 C/ |9 s7 D! B8 `+ ~
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0
//开T1PWM
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM* }8 d) m4 h% o0 {1 c5 T/ t/ F) u
//关T2( r4 E( \" {: \* c) [
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
GPIOA->BRR =0X00000080;//PA7置0 7 {2 l+ [9 X( z2 H3 n' u
}5 H _ Z6 B+ t+ ]0 o+ I/ h5 n) \
( J) K5 ^+ u+ `% R" |
void STEP2( int PWM)# ~( U$ K0 R$ f0 P& @- Y
{6 _* D% d' Q+ J/ e7 g+ N
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比2 }+ r; n1 {8 ~" N3 a4 k
//关T4
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 & k, c& Z& Y7 @7 i" `; k
GPIOB->BRR =0X00000001;//PB0置0
//关T32 h7 }8 k6 ~4 r
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出3 ^; \) Y3 ?0 F7 a, t
GPIOA->BRR=0X00000200;//PA9置0 + t5 o+ \' i6 `6 D% i% \8 {' u
//T1常开- H" i Y( ?9 ?2 t: l
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出
GPIOA->BSRR=0X00000100;//PA8置1 & R0 T3 x+ {/ a9 i+ Y8 H' L* q
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出. T# W) Q, e: |# Y/ d
GPIOA->BRR =0X00000080;//PA7置0 / ?+ y h0 m' k8 E$ J* p, M
//开T6PWM( { X# I% ^" `: o6 Z
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM' v, p+ Q$ o; R7 }+ b& s% J0 u
//关T5 & s& d( T, D8 }& u$ o2 k5 Q; e
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0
}; E ^9 k. Z- O2 Z! P
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
{
float Gain=0.0078202080334971915 ;/ g0 h6 U; Q* w. d' T
" a# |7 E# ]" C
float b[]={1,2,1};
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };
static float Last_Data_IN=0;( b8 [- y( A) U
static float Last_Last_Data_IN=0;* }4 M4 W$ `2 ?# u2 C
float Data_OUT;6 W" W- y Y7 L0 ~
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];
Last_Last_Data_IN=Last_Data_IN;
Last_Data_IN=Data_IN;
Last_Last_Data_OUT=Last_Data_OUT;
Last_Data_OUT=Data_OUT;
return Data_OUT;
}3 j: j9 h' a/ C4 S; x
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。. F. \! N7 w9 T' n. K, L
æ´æºç §ç
é¥æ§PCB
串å£å±ä¸ä½æº
发的多了就不用了
不错,支持
( D: J) ~3 d/ [# K" ]9 X3 `, I
视频- O5 w0 N. j. c6 ~5 Y) Z