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

【创意】用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 a& T/ ]2 x0 L+ {6 ^8 y1 d" w
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
: ^1 }0 y  r$ |) E1 `4 o0 ]3 p, ?{! W+ ~; I8 K' C. W
float Gain=0.0078202080334971915 ;
1 V; x" Y  v- [' ~' X% E7 {
' P' M7 z# c9 ~% V6 U3 \! ]8 u float b[]={1,2,1};7 r. y" {+ M) x5 R0 L& r9 l
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };
' G2 Z/ X9 }  u0 F6 ?1 j% W' {4 H$ ?/ P. R+ w
static float Last_Data_IN=0;
! |1 o& O5 d1 x2 s! S$ e3 [" ? static float Last_Last_Data_IN=0;
" {  i9 A+ z$ C5 e, {5 e5 `2 q% H  float Data_OUT;  B2 K4 Y/ f  y7 B6 c7 c
static float Last_Data_OUT=0;+ y: j" q' q- B! S/ T: |
static float Last_Last_Data_OUT=0;
2 v% i; T3 a5 d1 o2 M2 {! Z4 E2 Z- D 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];( r, E% ~8 s8 K8 [% X$ [1 X! T, A
Last_Last_Data_IN=Last_Data_IN;( S# Y+ O* M. w% B3 y/ ?) [2 @
Last_Data_IN=Data_IN;$ }& K" z/ J8 }
Last_Last_Data_OUT=Last_Data_OUT;' m0 Q9 ~- N+ X4 }
Last_Data_OUT=Data_OUT;
9 k8 `; C0 {1 t  d  d9 u  return  Data_OUT;& z& m8 }/ o6 \  c  C& A) i
}
& s4 A4 P8 Z5 v上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。5 V! J) t% x# i% 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
8 H, c- P2 p' J, x/ \8 M% T楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学 ...
! b6 m) a7 l! E& d+ e
杂七杂八的东西太多了,所以比较费时间,我的电调比较简单,就是方波六步,没上FOC,以及高频注入
侯元祥 回答时间:2020-5-6 09:42:29
分享以下无刷电调的设计经验,无刷电调用的STM32F051,选择这个是因为自带比较器,这样采用虚拟中性点过零点换向的方法就比较好实现,另外,STM32自带的高级定时器输入互补PWM也是节省了不少时间,我使用的是传统的方波六步,原理比较粗暴,哪一相关断,直接把对应的GPIO配置为下拉输出,哪一相需要PWM调制,在配置为PWM复用输出,全部寄存器操作,节省了不少时间。利用了比较器的中断,换向事件完全在中断里解决。以下为方波六步的前两步代码,其他的以此类推。
/ e: X2 K9 x2 zvoid STEP1( int PWM)2 w* C/ M. O" j
{
: S: b  D2 F  l7 n1 \  { * B' Z# e: R" F+ t; K: F+ u
TIM1->CCR1=PWM;/ \$ y6 L7 \$ W- ?( |
TIM1->CCR2=PWM;) _; _& F" U2 K2 ]# a+ n& v4 E
TIM1->CCR3=PWM;  //给占空比
* {+ \, b. t6 B3 o( J' \ //关T5
0 I2 A0 M, g# e( y GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出7 @) B+ Y" _6 ^- _/ X% \2 N4 A) S
GPIOA->BRR=0X00000400;//PA10置0
6 J: S6 m1 }) t# C) \. ~- Y //关T6
# K: k6 }1 ~2 {; ~' u+ p3 I7 p8 m GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出
6 F% e5 b5 c; A# g4 l GPIOB->BRR =0X00000002;//PB1置0
, K9 t; x$ d& h3 i/ m! y$ Z //常开T44 Z; Y4 t* l/ ^; V) W
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出
2 ~+ ], b  S: D6 w5 h GPIOB->BSRR =0X00000001;//PB0置1+ ?+ Q2 `; B. h4 V7 _" A# f# D
//关T3
& o# `' s5 Y, B GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
) {9 ~2 p3 e1 D4 E, f1 j GPIOA->BRR=0X00000200;//PA9置0
8 M( z1 V! q* o) n2 ~) w( O7 |8 { //开T1PWM; [( g( i0 t( S+ S+ U& R
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM
+ h0 P0 L4 |1 P. Y& ] //关T2
# ~# T" `2 [. N$ B/ ~. \ GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出& E' G8 I# _1 G) x
GPIOA->BRR =0X00000080;//PA7置0
( F5 A1 G% i+ K$ ?. T4 V}8 W0 V  y/ _9 _+ h, ^
5 w8 B2 w; h$ Q( T: _8 s
void STEP2( int PWM)+ |% q' w& y) h( E3 m7 W' n7 J
{% O9 K# N' I- @, }  h8 V
TIM1->CCR1=PWM;
7 o  g$ Q4 d1 G& o3 A& y TIM1->CCR2=PWM;
9 [9 }- H( r; z; `8 Y" [ TIM1->CCR3=PWM;  //给占空比/ w8 s9 E$ ]$ L8 g% q6 r
//关T4' v& m' U# W: g- o0 x
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出
  Q+ ~+ p/ d7 z6 [0 a; ^, p# O GPIOB->BRR =0X00000001;//PB0置0
, O, C- A+ o* `# y# e; J //关T3( G7 \; x9 [  L/ s8 S: \' Z
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出! E. U, G: u9 B; b5 K3 u0 e4 p
GPIOA->BRR=0X00000200;//PA9置0
2 J9 V* K& W7 g1 q) l2 `* J- g7 {5 x //T1常开
  H% s0 c5 Q2 h" D: m GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出8 f/ p/ \7 k4 b. Q3 \) O, S
GPIOA->BSRR=0X00000100;//PA8置1 0 e* [. Z, N$ T) L- W( U) Q
//关T2
9 |  Y, S1 z# }0 b9 W/ S GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出# b0 \# y4 }$ r& _! G" ?
GPIOA->BRR =0X00000080;//PA7置0  + a# M0 ?! n) b5 w. c) W9 d  L
//开T6PWM
# E6 T( L5 ^4 }9 c GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM; q+ G: d4 T3 m
//关T5
, J) p/ ?( i3 H& h GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出3 }2 r) _2 \6 P9 ?9 g9 R' H
GPIOA->BRR=0X00000400;//PA10置0  
0 X4 p  N5 H/ _! r3 ?  U/ N}
0 F: X+ b, o! \" K# S/ {/ L$ n+ G$ W4 L7 Q. q7 f; 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 手机版