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

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

[复制链接]
侯元祥 发布时间:2020-4-27 22:27
阅读主题, 点击返回1楼
赞 1 收藏 4 评论21 发布时间:2020-4-27 22:27
21个回答
侯元祥 回答时间:2020-5-2 08:44:31
FDA生成的滤波器滤波器参数本质上是,冲击响应函数,两个系数矩阵,他这里还有一个增益Gain,我们用的时候只需要把这个转为差分方程就可以,下面我直接贴上代码7 ?7 _0 ]. t. E9 p6 X. b" D& d; U
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
1 \! n1 W& G- x$ Z4 M* c( s, C{
/ A9 m" `( n( t( G float Gain=0.0078202080334971915 ;* Y7 |+ t, M5 ]3 o" g( F0 c. t; ~
3 K& ^) M# s# `$ }
float b[]={1,2,1};
/ q* n# A  e  `6 ^6 t0 E float a[]={1, -1.7347257688092752 , 0.76600660094326389 };
6 R  ]( m7 ?8 b, a+ F7 X; v
- j( a0 O# K3 A" l2 m. {" W static float Last_Data_IN=0;
/ U' I% y- k3 z) w6 X) v static float Last_Last_Data_IN=0;
2 v8 k6 s, T6 o5 [, E  float Data_OUT;
+ h; K$ y/ |! D5 R+ `( Q static float Last_Data_OUT=0;7 H2 V9 C% U9 k& d0 `2 x
static float Last_Last_Data_OUT=0; 0 A, ?+ [' `7 I% m" r( x6 P! y" 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];
! F4 P$ R$ R9 T% ^ Last_Last_Data_IN=Last_Data_IN;
% Q7 q& P* h+ b Last_Data_IN=Data_IN;8 B5 G8 S. p- o+ [6 k' W% D
Last_Last_Data_OUT=Last_Data_OUT;
& C. _& ?5 a/ M; E6 Q  T. d7 A0 c Last_Data_OUT=Data_OUT;4 A1 p/ z9 V9 F0 A1 B
  return  Data_OUT;
" \3 R! P2 Q! w% n}/ X3 c( h: B6 K  F4 F
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。4 |6 s* x( q. \* Q! A8 y
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& F* o, j, P& O6 f( c" }
楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学 ...

" I6 p5 w! }( X, X杂七杂八的东西太多了,所以比较费时间,我的电调比较简单,就是方波六步,没上FOC,以及高频注入
侯元祥 回答时间:2020-5-6 09:42:29
分享以下无刷电调的设计经验,无刷电调用的STM32F051,选择这个是因为自带比较器,这样采用虚拟中性点过零点换向的方法就比较好实现,另外,STM32自带的高级定时器输入互补PWM也是节省了不少时间,我使用的是传统的方波六步,原理比较粗暴,哪一相关断,直接把对应的GPIO配置为下拉输出,哪一相需要PWM调制,在配置为PWM复用输出,全部寄存器操作,节省了不少时间。利用了比较器的中断,换向事件完全在中断里解决。以下为方波六步的前两步代码,其他的以此类推。% p/ m- S1 V: I) u  x
void STEP1( int PWM)
$ _) z: k9 }1 h2 ^* E{
' Z- d: F$ \. {* Q. `9 f5 A! f 1 d: Y. O+ s, Z! O$ \) u4 U
TIM1->CCR1=PWM;7 x8 U! G- [7 a0 G7 B) y
TIM1->CCR2=PWM;
' x0 u* f/ p/ ]2 ~7 d# G- [ TIM1->CCR3=PWM;  //给占空比7 {+ i3 S  B" ?# m& p7 |; C2 A
//关T5
6 E3 g# }$ f! Y) x: W5 E GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出$ l0 U: M8 f. u- _
GPIOA->BRR=0X00000400;//PA10置0
" O. M* i+ u4 Z. {* T6 b- Z //关T6, M, T/ V7 e, t. U
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出1 V5 _! N6 Y4 c) l6 ?  Y
GPIOB->BRR =0X00000002;//PB1置0
( |; H7 C7 D9 Z //常开T4
# m1 x1 f, b6 M8 G  U GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出 : F6 _9 W1 B9 ~
GPIOB->BSRR =0X00000001;//PB0置1
; C; Z% S  m$ f9 ~2 C1 b4 d1 Y& j //关T3
  P/ g8 r8 f, v. E GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
, u: `/ p% n& a5 K3 v GPIOA->BRR=0X00000200;//PA9置0
7 |9 I& ~. Y8 l6 T //开T1PWM
5 o+ B3 h" X4 j% N* z GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM
3 O) m' P) ?9 I( b+ {# v0 M+ b //关T2
4 u- f/ B5 N: a1 F2 g6 O0 M: d GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
: U0 t2 y6 Z9 L" j% U4 S5 p! l$ B GPIOA->BRR =0X00000080;//PA7置0
$ l& ?" W0 f6 c/ }( _7 z( z9 F}3 w3 G+ @# G5 V) n
  z! S! C5 @3 J. `$ |
void STEP2( int PWM)9 E; e  H! `+ b+ P
{
7 Z% {( w- M* ?: z* h5 n TIM1->CCR1=PWM;, R8 K* G- x! \. {! |
TIM1->CCR2=PWM;
% r2 c# w' m" S1 r: E6 s+ U: s! v TIM1->CCR3=PWM;  //给占空比
0 c# Y) R% O: b2 Y8 Z: g  U* T //关T4
: Y( ]$ x. s$ B0 x. V GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出
, ^. a' t' v3 e( d+ \# z; R; k0 O7 N GPIOB->BRR =0X00000001;//PB0置0
4 |. @, M0 ?8 e' Z2 s- R* K3 v5 H7 J //关T3
6 V: X& _5 o- G* c, T+ Q0 J8 ?  [ GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
6 @2 F4 M8 {6 I0 @ GPIOA->BRR=0X00000200;//PA9置0   d5 I- {" M; F  m, e
//T1常开( R, @4 N1 M5 q  {: U% ?
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出: U& l' D5 {  L4 a0 E
GPIOA->BSRR=0X00000100;//PA8置1 - W3 R+ @7 i/ G5 [
//关T21 Y  Y/ t" M' m3 O$ ]8 s: i
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
% }. L: N8 |: x) g& s) n0 O GPIOA->BRR =0X00000080;//PA7置0  6 l1 F( k! d0 ^/ x: W
//开T6PWM8 x. [. e  |0 _- v7 a# [
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM" @2 ]4 j/ t( N. E! S8 y5 a
//关T5 ; O( v$ o5 {% w# Z2 a: t
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
& S+ T/ s7 m" y GPIOA->BRR=0X00000400;//PA10置0  ) u" N' j' p! T" C
}
- X6 d+ ]' [0 W* I
, Z; u2 {) {# Y/ m
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 手机版