遥控器用的STM32F103 ,毕竟没有那么高的运算量,简单采集的摇杆电压,通信就行,另外,遥控器部分也加入了陀螺仪与磁力计,可以实现类似重力感应控制的功能。供电采用的是18650电池,USB接口充电,充电芯片烂大街的TP4056,加了一个比较“高大上的屏幕,串口控制”,有上位机编辑界面,感觉挺好用,减轻了不少单片机的负担,再配合上串口DMA,完全不占用CPU资源,另外这里的NRF24L01,使用了带数据的ACK功能,实现了双向传输,飞机也可以把数据回传给遥控,比如姿态信息,剩余电量等。8 W% ^1 a& h: G3 Y, K
目前是3S 2200 电池 测了一下13分钟左右
void STEP1( int PWM)
{
* `3 I7 Y* j4 @! B* o3 A1 v
TIM1->CCR1=PWM;. C( _9 ^! G' j8 O* l
TIM1->CCR2=PWM;1 X- E1 f3 H* L# j9 L. B8 i
TIM1->CCR3=PWM; //给占空比
//关T5 $ F. ^ d! M1 g( K
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0 3 M& y# P6 Y6 P% ~7 N3 B
//关T6% ?8 Q; K: v8 f2 E& S" |/ z
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出: G) T$ }1 p4 z0 |0 a+ h
GPIOB->BRR =0X00000002;//PB1置0
//常开T4! ?' i. O7 E/ k, a4 Z# x' K
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 % s% L' I+ ?0 _4 J) c! t5 K5 `' `4 C$ G
GPIOB->BSRR =0X00000001;//PB0置1
//关T3; i) o- ]5 C; g4 s
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0" C* G5 Y, A: b# R4 z) x
//开T1PWM& w& B y4 ?1 y5 c6 U* a3 W
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM0 z! q& b3 Q- l2 }0 x1 \& n4 Q
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出9 h7 ?, s7 `- R6 D M( Y# N- F+ m
GPIOA->BRR =0X00000080;//PA7置0 1 I0 F! R/ Z+ Y5 F7 d7 K) R: \- o4 L
}8 f# {5 Z' B8 U1 M1 @, e
0 X, {1 ^4 G' D9 N: n
void STEP2( int PWM)
{
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;- D. n6 N2 [3 e6 }
TIM1->CCR3=PWM; //给占空比
//关T4
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 2 V" b+ F5 z7 |# r* a7 [
GPIOB->BRR =0X00000001;//PB0置0
//关T3+ w0 I* a r% }8 E5 _5 M
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出. h+ M. c8 D0 w( ?6 O
GPIOA->BRR=0X00000200;//PA9置0 : s: L8 d- r* M. k+ b! b; {; `
//T1常开4 m$ P- |; U# r! n, M+ q. ]
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出
GPIOA->BSRR=0X00000100;//PA8置1 |8 R6 W/ M6 J9 L2 ~# _
//关T21 n. b) X$ c( f& c% d# r) Z4 S5 P
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
GPIOA->BRR =0X00000080;//PA7置0 ! Z- \* e8 @& n3 R2 A
//开T6PWM8 h6 U7 |( _% M* O# f- }
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM8 _' h% h- M1 m/ z7 V0 l
//关T5 * o( j. Z6 j; T9 u# x/ x6 C
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出5 C/ t& D; E) n4 b6 X" Q$ |7 P* x
GPIOA->BRR=0X00000400;//PA10置0
}8 M$ u: W9 }4 u2 S
8 E7 g6 T. g, P! C
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
{
float Gain=0.0078202080334971915 ;
float b[]={1,2,1};, r, X5 j! u( _( p. Y
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };
static float Last_Data_IN=0;
static float Last_Last_Data_IN=0;2 [# ~9 v9 a3 _. w* W0 l; ]% ?
float Data_OUT;
static float Last_Data_OUT=0;# z2 @, a. D" q: y) _
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];& a% M' u; W. |9 c* V
Last_Last_Data_IN=Last_Data_IN;
Last_Data_IN=Data_IN;
Last_Last_Data_OUT=Last_Data_OUT;" f$ Q+ m5 }8 H: @ l9 @
Last_Data_OUT=Data_OUT;1 ^% Y" F7 J9 w! l' U5 d8 R R0 t
return Data_OUT;
}
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。
æ´æºç §ç
饿§PCB
串å£å±ä¸ä½æº
发的多了就不用了
不错,支持
视频