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

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

[复制链接]
侯元祥 发布时间:2020-4-27 22:27
阅读主题, 点击返回1楼
1 收藏 4 评论21 发布时间:2020-4-27 22:27
21个回答
侯元祥 回答时间:2020-5-2 08:44:31
FDA生成的滤波器滤波器参数本质上是,冲击响应函数,两个系数矩阵,他这里还有一个增益Gain,我们用的时候只需要把这个转为差分方程就可以,下面我直接贴上代码
; x0 {0 s0 `0 Z1 z' U1 h; F# Nfloat Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
  d; G% {$ }3 a& d0 Z: ^{
) B2 {5 k- l7 w1 S4 f  u4 E" Q6 M float Gain=0.0078202080334971915 ;7 b2 M* Z( s/ w7 Z) e

3 R8 \+ q. }; B* Z+ W& _ float b[]={1,2,1};; o1 b% M- x/ U, a) s. E
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };
, y) |4 {9 T* \5 \8 E( x- e
7 j- g9 t" n4 }9 K: m+ ?0 [7 K static float Last_Data_IN=0;
9 P( a9 \! @$ s1 |8 ~- O: d static float Last_Last_Data_IN=0;
$ u# o+ m7 y3 ^. Y4 e* l' K  float Data_OUT;
* u* N* d9 ~0 W1 z7 G static float Last_Data_OUT=0;1 [4 i, P! y4 u5 `
static float Last_Last_Data_OUT=0;
$ S" [4 X: D" X# B- n: w$ T 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];
& u+ ~' l; d' p* l7 B; O. G Last_Last_Data_IN=Last_Data_IN;
* g  n. N1 r& F' x2 L4 B- y- ?5 B1 H0 L Last_Data_IN=Data_IN;* j$ N$ C& H  n
Last_Last_Data_OUT=Last_Data_OUT;8 ]( b) G+ N" \1 G
Last_Data_OUT=Data_OUT;
' e% D) Y4 H, I, E) p  return  Data_OUT;
! ]& d$ d% D0 ~" s1 [  _! s- s}+ F$ S/ C- e& a% t% b
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。" {# O# e9 E- Q1 {7 R; Z: 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" T' A0 s% @/ O( V, q, Y
楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学 ...
' T4 Y' F$ h: A6 y- p4 _) o# j, W
杂七杂八的东西太多了,所以比较费时间,我的电调比较简单,就是方波六步,没上FOC,以及高频注入
侯元祥 回答时间:2020-5-6 09:42:29
分享以下无刷电调的设计经验,无刷电调用的STM32F051,选择这个是因为自带比较器,这样采用虚拟中性点过零点换向的方法就比较好实现,另外,STM32自带的高级定时器输入互补PWM也是节省了不少时间,我使用的是传统的方波六步,原理比较粗暴,哪一相关断,直接把对应的GPIO配置为下拉输出,哪一相需要PWM调制,在配置为PWM复用输出,全部寄存器操作,节省了不少时间。利用了比较器的中断,换向事件完全在中断里解决。以下为方波六步的前两步代码,其他的以此类推。
: J, D* d/ \& p' K8 g6 P0 b9 E! Bvoid STEP1( int PWM)5 H0 j& d( g& Y  l) D
{# z. o' D' X4 _) ^4 M
, K5 R0 s, Z" R! X/ h$ `- V6 n( U% q
TIM1->CCR1=PWM;
& Z9 d. i* F% ^$ o3 {# U, [, S- c0 a TIM1->CCR2=PWM;8 H0 C* |' Q3 D" S, [$ v1 V
TIM1->CCR3=PWM;  //给占空比, T3 A. F* B2 g8 s# r9 C4 u
//关T5
7 A# d/ K9 {3 V GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出8 ~( o, N% _4 ~: k
GPIOA->BRR=0X00000400;//PA10置0 & u! Y* \2 P" v' u
//关T61 f+ P3 b' e, R3 m
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出+ w3 d! Z' W6 T, p
GPIOB->BRR =0X00000002;//PB1置05 l; p* Y: g; {+ N
//常开T43 V$ b* X% ]5 S8 F4 F: [
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出
" q: c! W  D- w GPIOB->BSRR =0X00000001;//PB0置10 ^+ ^4 r4 \, e. u3 I, }
//关T3# c" J1 E" L6 {+ z- R
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
6 k7 M* G% N! Z" }! M9 | GPIOA->BRR=0X00000200;//PA9置01 v% Q6 v: w2 g" h* y, R9 n
//开T1PWM
. I4 O8 b# a) c) k" `- h GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM1 I1 P9 n$ f% V6 e: @3 @) Z8 m3 e
//关T2  g2 S: z; V) j( M5 S& ]( n2 a
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
* O- Y( ?$ a, G5 t( ^) d* a GPIOA->BRR =0X00000080;//PA7置0
+ e; Z1 Q& F8 O6 L4 A+ [0 `% [}& x- A* G$ I7 m- V: P% l8 U4 I
9 p- L" |; H" u& @7 z" K5 \1 r
void STEP2( int PWM)8 f5 D5 k* P( G1 i5 j' M: v  `
{; a9 [2 g, E$ z1 r& B( A* c% g
TIM1->CCR1=PWM;
# h+ C; _# @( T7 e6 n# G) o5 `/ I TIM1->CCR2=PWM;( y. N, ?8 n2 \# n. G3 C
TIM1->CCR3=PWM;  //给占空比2 E6 p6 q, `" O0 Q( u8 J/ M  p3 @
//关T4
3 `5 X* V, K# x GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 9 Z1 B: ], Q3 T  c& b2 y
GPIOB->BRR =0X00000001;//PB0置0# i4 t6 u, _4 J6 ?" e  ]) H
//关T34 r3 t4 _# |6 K, ~
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出: B& K" A4 A! m8 b0 G. L& e
GPIOA->BRR=0X00000200;//PA9置0
7 v1 U9 L6 S3 {4 r. ?% }! y //T1常开! G( @& f# m; E' }5 H# H5 M
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出
1 R8 N/ p, U. d4 v4 E GPIOA->BSRR=0X00000100;//PA8置1 3 s2 J- _5 K2 W7 }; r2 Z' i
//关T2  B+ ~1 Z8 M4 |7 b8 _
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
' s' K% w/ u% l" f; |* G: i GPIOA->BRR =0X00000080;//PA7置0  6 W+ h8 p6 l1 Z2 A
//开T6PWM
, b5 R7 l2 y5 U- q+ y9 W) W GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM  J  y" b4 v# J: A! n3 e
//关T5 ) o) C' m" u$ s7 k* P: z
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出. ~7 y% G& Q( L* k/ r
GPIOA->BRR=0X00000400;//PA10置0  
5 b$ w1 v  d5 r}
3 w- Z/ M1 D- a. M. F! t- a& \3 E3 m- Z" u$ Z* b1 @2 t
guoyuli 回答时间:2020-5-6 22:26:06
厉害了大佬!
菜鸟先飞2016 回答时间:2020-6-30 11:40:00
不错,覆盖全面
12

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版