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

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

[复制链接]
侯元祥 发布时间:2020-4-27 22:27
阅读主题, 点击返回1楼
1 收藏 4 评论21 发布时间:2020-4-27 22:27
21个回答
侯元祥 回答时间:2020-5-2 08:44:31
FDA生成的滤波器滤波器参数本质上是,冲击响应函数,两个系数矩阵,他这里还有一个增益Gain,我们用的时候只需要把这个转为差分方程就可以,下面我直接贴上代码
& y" T& R  `5 O- M4 ~4 A, ?float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
; Q6 z6 \: O1 `{
" r; }# z, T% h" R) o float Gain=0.0078202080334971915 ;
' v# W  D! Z/ n% F; [) i, H
' H* D+ b  G6 p6 z& j$ O" r float b[]={1,2,1};
+ C0 ~. U6 M+ m/ R float a[]={1, -1.7347257688092752 , 0.76600660094326389 };7 E; R; _7 q4 X; l/ {( n7 A
1 c, x% V5 s# [5 }8 j
static float Last_Data_IN=0;
* s0 {$ F0 t  J6 ~, ~( H static float Last_Last_Data_IN=0;
( j0 x8 k6 m/ H$ |  float Data_OUT;2 r  A' |/ d: E3 A3 `# Z# F
static float Last_Data_OUT=0;
8 C  s; [# [, `1 _ static float Last_Last_Data_OUT=0;
3 X2 T" d2 H) o9 p 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];
8 _0 `+ Q1 x* t5 l# w$ n Last_Last_Data_IN=Last_Data_IN;" x( l; v# E) W3 K3 P' {
Last_Data_IN=Data_IN;% I2 g, x3 v! z/ q5 z, g
Last_Last_Data_OUT=Last_Data_OUT;2 u/ I1 I/ z! h' P% q
Last_Data_OUT=Data_OUT;6 \" u5 g$ B% q: A! @6 o0 v- U
  return  Data_OUT;. s" W: h1 B0 c! g5 V
}& L/ ]/ g% y0 A$ {6 m: ~
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。2 L; t2 ~- `: |5 ^1 t
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- ^/ R$ O5 I, k% X8 g/ R& [
楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学 ...
4 E  C" S5 j9 X
杂七杂八的东西太多了,所以比较费时间,我的电调比较简单,就是方波六步,没上FOC,以及高频注入
侯元祥 回答时间:2020-5-6 09:42:29
分享以下无刷电调的设计经验,无刷电调用的STM32F051,选择这个是因为自带比较器,这样采用虚拟中性点过零点换向的方法就比较好实现,另外,STM32自带的高级定时器输入互补PWM也是节省了不少时间,我使用的是传统的方波六步,原理比较粗暴,哪一相关断,直接把对应的GPIO配置为下拉输出,哪一相需要PWM调制,在配置为PWM复用输出,全部寄存器操作,节省了不少时间。利用了比较器的中断,换向事件完全在中断里解决。以下为方波六步的前两步代码,其他的以此类推。
5 c, W% A9 z1 I9 Ovoid STEP1( int PWM)
( T! P; b0 p( Y: e- T{8 |, a* h( M; `, l+ t/ u6 B

* [. Q5 K* K; |- }# D) H. Y0 E TIM1->CCR1=PWM;  p+ R6 o. k# H: V5 P8 P0 z/ t
TIM1->CCR2=PWM;! y" r8 Z# L% Q
TIM1->CCR3=PWM;  //给占空比# u3 R, r$ O, H0 G! O: P: K6 z
//关T5 - n$ [4 A& S, I# z! J) _. k6 j
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
2 Q3 B# [' W1 }( T& Z3 j7 v GPIOA->BRR=0X00000400;//PA10置0 3 Y. P1 b* N/ g$ v+ H% n8 |3 {
//关T6
' [% Y3 U# f( [" U+ |' L GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出3 `+ a* {- b: X
GPIOB->BRR =0X00000002;//PB1置0
9 A5 u9 J0 ^5 \ //常开T43 b/ q9 u1 A( g
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 - d6 l2 Z* m/ b. g
GPIOB->BSRR =0X00000001;//PB0置1* j. R& B( T) k$ E  y, d8 i* c
//关T3* W8 ~; V9 e% _! r4 K
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出% h* O/ t# i" @* U
GPIOA->BRR=0X00000200;//PA9置0) V5 Z( S6 _6 t" c! j* s8 X
//开T1PWM7 d$ c4 e/ E; t6 f& ^, M2 b3 @
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM
% _  k* O/ d1 f. o" g //关T2# j; R+ f; A6 L$ q/ N
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
& |- Y. |. h! m7 J GPIOA->BRR =0X00000080;//PA7置0 8 g! i; ~, }* g: W4 c8 V# c
}
- d  W$ b" A+ \* t7 X) b" f1 J
% T3 V7 R: ^" ]" qvoid STEP2( int PWM)
* @, b+ h# C& ?+ h' Q{
9 Y( E0 k4 P1 Z; V) k TIM1->CCR1=PWM;1 X3 _9 t$ P; H5 K& x( @; d
TIM1->CCR2=PWM;
: B, S# r- p) V6 O9 K. c$ q TIM1->CCR3=PWM;  //给占空比$ e+ W$ p" l0 B! e& q$ c
//关T44 @# N; p& z& r0 X2 F$ t: x
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 + K9 ]! P# X3 @
GPIOB->BRR =0X00000001;//PB0置0
3 R* f3 G. u+ W) W" t //关T3
& p' N3 s0 G9 b1 G GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
" Z3 ?& ]9 K3 j) K  k$ @) ^ GPIOA->BRR=0X00000200;//PA9置0
5 o. N. m- X1 Y2 |  n; J& n5 | //T1常开
8 b! ^& _4 d+ M4 k8 _' p0 N' ]1 W GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出
* f: I# b9 q: k! I; ^1 B GPIOA->BSRR=0X00000100;//PA8置1
# r. T; j$ L: o4 ~# L# r //关T29 t7 C' i  m1 G
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
# e/ v9 }" }# ]" q+ a; C' x GPIOA->BRR =0X00000080;//PA7置0  ) p7 j- G  x5 c
//开T6PWM
3 a6 Q/ ]5 m% M& x5 V1 c GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM
0 p6 ?) W7 L9 x& Q) f //关T5
0 W5 }8 ~* E( Z" N  L" \5 P GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
! b% {8 G. \- z7 K! X GPIOA->BRR=0X00000400;//PA10置0  
6 x& |" c4 Q. U9 }; h/ S}. _+ f1 u; A* ^" ~

. P; `; ^6 _) @, v
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 手机版