第一次在ST论坛发帖,以前都是瞎逛,在大佬的帖子里学习了不少东西, 这次看到这个什么创意挑战赛,说实话我也没看明白怎么参加这活动,什么格式啥的有啥要求,其实得不得奖无所谓,在这我主要把我做飞控的一些经验分享一下,如果大家喜欢,后期可能或软硬件全部开源。! l! {6 E% h( h0 a7 O. r4 g既然是用STM32 那就用彻底了,而且我整的无人机从遥控到电调,到最终的主控全系列STM32 ,制版,程序全部自己来,遥控用的STM32F103C8,电调用的STM32F051 ,飞控用的STM32F446.& t* Q/ x$ M9 u) A/ H6 b5 R5 [; a5 Q3 t" }) Q- c& X( T |
微信公众号
手机版
目前是3S 2200 电池 测了一下13分钟左右
void STEP1( int PWM)
{+ H$ S9 V$ A% w! ]0 x
# ^5 ^" \$ }( R1 E9 F0 U# i
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;! F; \0 [9 K" c
TIM1->CCR3=PWM; //给占空比
//关T5 7 E. S7 W) u2 [. \0 {
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出* {! Z5 F; o: \
GPIOA->BRR=0X00000400;//PA10置0 4 r5 t% P1 N. ]# B% O
//关T6; N4 A0 p3 w0 k0 }0 x
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出
GPIOB->BRR =0X00000002;//PB1置0# I V( {# s' m7 I; f
//常开T4- C* T4 P6 O8 p$ |" h$ b2 b' _
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 0 @% L5 Z( e9 b: X9 t
GPIOB->BSRR =0X00000001;//PB0置15 V- n0 L/ T4 ~: l
//关T3
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0. F/ i; [& A$ Q3 f# m8 D0 P) I
//开T1PWM
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出$ J% Q# i6 ^7 E8 n( X( |. f6 C
GPIOA->BRR =0X00000080;//PA7置0
}* S9 J. Z7 `2 {$ G7 |1 ]
void STEP2( int PWM)0 K6 r/ `4 s$ _$ w" B+ q5 L' K! p
{
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;
TIM1->CCR3=PWM; //给占空比$ Z1 \# ^2 ~9 i9 @% `5 U6 H0 [9 G
//关T4, |' C1 _9 W$ j j. D: d
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 4 O# ?* q8 L6 d; d
GPIOB->BRR =0X00000001;//PB0置0
//关T3
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0 ) @+ `6 F1 ]6 P9 T$ s1 j
//T1常开* Y* R9 y. b+ w- ]7 q
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出
GPIOA->BSRR=0X00000100;//PA8置1
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出, v4 }$ {0 ~# a& m( V( I3 b; o
GPIOA->BRR =0X00000080;//PA7置0
//开T6PWM) F" c3 _ M6 b4 w$ Y' `2 n' Q( |# S
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM
//关T5 ; X# Q5 `; `+ O: K* ^+ O
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0 . u" }3 k' \, s
}- R0 D( @( b; p6 s; a+ s
% X0 W2 v; e( y/ E a; m& Q- s# y
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
{9 n. r c/ \' e9 {6 |4 q4 ]
float Gain=0.0078202080334971915 ;
?! Z- e% w; G' y' m
float b[]={1,2,1};
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };
static float Last_Data_IN=0;
static float Last_Last_Data_IN=0;7 [+ N1 L! J' e6 D
float Data_OUT;
static float Last_Data_OUT=0;
static float Last_Last_Data_OUT=0; 7 E6 t, I# T: d
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;/ f; K& Z7 Z+ M9 I% Q
Last_Last_Data_OUT=Last_Data_OUT;
Last_Data_OUT=Data_OUT;
return Data_OUT;9 N) P7 ^5 N5 f6 w% X& x9 w* j O3 M* _
}- t% w% O1 ? H1 K, l) T# ~
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。
æ´æºç §ç
饿§PCB
串å£å±ä¸ä½æº
发的多了就不用了
不错,支持
5 X- J! l' v9 |- k* ~8 F
视频+ A$ t' B% G, s& y$ }- [6 U