你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【创意】用STM32搞定无人机飞控系统(遥控、电调、主控)

[复制链接]
侯元祥 发布时间:2020-4-27 22:27
阅读主题, 点击返回1楼
1 收藏 4 评论21 发布时间:2020-4-27 22:27
21个回答
侯元祥 回答时间:2020-5-2 08:44:31
FDA生成的滤波器滤波器参数本质上是,冲击响应函数,两个系数矩阵,他这里还有一个增益Gain,我们用的时候只需要把这个转为差分方程就可以,下面我直接贴上代码5 X/ g* _" a9 w7 A: @' V
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
# v0 o4 z$ F, x# G0 M7 @{" G4 Z( |2 ~5 N# W9 ?% p
float Gain=0.0078202080334971915 ;
& ^  N0 _" f# H5 Y9 A: h+ T% D* _) o- I3 K% I
float b[]={1,2,1};
! ^/ w8 |- x( \ float a[]={1, -1.7347257688092752 , 0.76600660094326389 };' n9 Z1 w1 x% v- A9 ?

) L- G, E1 Z0 D2 ^  V9 l static float Last_Data_IN=0;
) j1 b9 K- a1 h6 n9 ~& {/ b static float Last_Last_Data_IN=0;
0 P% p0 x5 i4 [6 v8 e' U: ^  float Data_OUT;
, m0 }- H% p. v0 ?# A+ Z. i static float Last_Data_OUT=0;
9 ?) i, y& {2 |- I' e; m static float Last_Last_Data_OUT=0; 5 \* W) `3 Y" |! j" F
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];
) \, |9 h3 z8 T4 v- Y; I+ `) |; W Last_Last_Data_IN=Last_Data_IN;7 T6 a1 B9 c* X9 q8 b
Last_Data_IN=Data_IN;1 n: }* P0 z5 p$ a6 ~$ w
Last_Last_Data_OUT=Last_Data_OUT;2 l! K% ^' Y4 s5 \. A
Last_Data_OUT=Data_OUT;* m+ ]- D/ l5 R  v0 H  ?8 i, h
  return  Data_OUT;/ s3 @2 [, @0 A! ^& h3 T% |, q
}
8 [& s  u  ~7 p4 m上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。
. X' Z: ]. r  v
nyszx 回答时间:2020-5-2 21:23:02
楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学无刷驱动软硬件设计,什么BLDC .FOC.HFI的,头都大了
李康1202 回答时间:2020-5-3 09:20:28
赞一个
侯元祥 回答时间:2020-5-6 09:35:42
nyszx 发表于 2020-5-2 21:23
. J7 W% u2 s" Z楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学 ...

3 T/ \" J- {* Y. B! h杂七杂八的东西太多了,所以比较费时间,我的电调比较简单,就是方波六步,没上FOC,以及高频注入
侯元祥 回答时间:2020-5-6 09:42:29
分享以下无刷电调的设计经验,无刷电调用的STM32F051,选择这个是因为自带比较器,这样采用虚拟中性点过零点换向的方法就比较好实现,另外,STM32自带的高级定时器输入互补PWM也是节省了不少时间,我使用的是传统的方波六步,原理比较粗暴,哪一相关断,直接把对应的GPIO配置为下拉输出,哪一相需要PWM调制,在配置为PWM复用输出,全部寄存器操作,节省了不少时间。利用了比较器的中断,换向事件完全在中断里解决。以下为方波六步的前两步代码,其他的以此类推。1 f/ {8 v8 I; f$ r3 k* H
void STEP1( int PWM)
' a  ?9 V3 ?# W7 ]$ r  }{# L: p8 [& w7 T9 ?
! F6 m- ^6 R& h+ N5 d
TIM1->CCR1=PWM;( e. Z& L) e" X9 C. W
TIM1->CCR2=PWM;
. A) g$ b* P2 f TIM1->CCR3=PWM;  //给占空比7 E/ p8 i& J& B. X0 U
//关T5
- v7 v# m3 k4 s/ Q GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
1 h1 M8 w# L: e GPIOA->BRR=0X00000400;//PA10置0
# ?! k" ?" ^) r6 W  ?! x //关T6
) F! E& C, `% s GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出0 {+ b/ L8 G% q
GPIOB->BRR =0X00000002;//PB1置0
% a1 x. Y$ j( B //常开T4
# }" I$ U6 [6 m% _, i! {- W GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 8 O1 v+ V7 k% r3 n
GPIOB->BSRR =0X00000001;//PB0置1
' d0 M6 {1 r: t( X! G //关T3, J! F9 P. L" a/ ?
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出5 ?' ~9 [6 ?3 U+ y; a2 l& Q0 l% \
GPIOA->BRR=0X00000200;//PA9置03 m7 d7 V) T: K: i( Y0 l+ T% L. r; W
//开T1PWM( Q9 Y8 t+ X7 F: e
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM
: h% r7 w2 W8 S8 l //关T2
, |  a* ]/ _: d2 _) E; I. C0 k GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
" c2 t  Y3 C/ v; E- ? GPIOA->BRR =0X00000080;//PA7置0 * |$ L- ^" E5 ~5 g  [+ O
}+ d) B1 O/ h  b7 U* o7 _. }

) ^  }0 G7 J7 c) V0 Z0 Xvoid STEP2( int PWM)
) W3 }( z6 h' Y3 K  Y& G{
& t. R0 @  Z# _4 b6 _ TIM1->CCR1=PWM;
9 V9 p3 P' v( h" n( N* }4 I4 D, p3 q TIM1->CCR2=PWM;
) y; J5 {) S# n9 u TIM1->CCR3=PWM;  //给占空比( B( T4 ?9 u$ r- Y0 E- }
//关T4$ j* a' Y1 r. _" Y4 q
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 - _7 C* |5 p  }% d+ f& }# r+ o
GPIOB->BRR =0X00000001;//PB0置0; ?8 M2 ]/ I8 v7 i! x
//关T3/ Y9 h- G) H; i+ g& w. j
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出) z! H4 [) @# t3 ?- z
GPIOA->BRR=0X00000200;//PA9置0
& w+ S( N4 ]# o9 P: P //T1常开
' a) B3 y5 n5 K2 W GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出9 l6 Y& P" Y3 P
GPIOA->BSRR=0X00000100;//PA8置1
& `2 x; ]( h% Y/ |! E9 q; o$ q //关T2" `6 ~% G5 W, y: u
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出, Z% M+ c* q7 ~- D- S
GPIOA->BRR =0X00000080;//PA7置0  
% t9 p# U2 D- h7 C //开T6PWM- b6 h. [/ H+ v
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM* U* m& a- w! H
//关T5 7 F% E9 ~/ d4 W! n9 e& k2 A
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
2 p. C5 |3 E0 ^ GPIOA->BRR=0X00000400;//PA10置0  6 @/ i$ U; f4 \% \4 U5 E
}$ _/ k% g3 v# F' r
: M: i/ h" o- l. M% l
guoyuli 回答时间:2020-5-6 22:26:06
厉害了大佬!
菜鸟先飞2016 回答时间:2020-6-30 11:40:00
不错,覆盖全面
12
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版