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

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

[复制链接]
侯元祥 发布时间:2020-4-27 22:27
阅读主题, 点击返回1楼
1 收藏 2 评论21 发布时间:2020-4-27 22:27
21个回答
mmuuss586 回答时间:2020-4-28 10:14:23

不错,支持
侯元祥 回答时间:2020-4-28 11:41:12


视频
a316363723 回答时间:2020-4-29 14:18:16
大佬,你这个可以飞多久呢?
侯元祥 回答时间:2020-4-30 12:32:23
a316363723 发表于 2020-4-29 14:18
大佬,你这个可以飞多久呢?

目前是3S 2200 电池 测了一下13分钟左右
侯元祥 回答时间:2020-5-2 08:37:59
分享一下滤波器的设计把,特别是飞控中,不论是陀螺仪还是加速度计都含有大量的高频噪声,怎样设计滤波器是关键,这里我推荐用matlab自带的FDA滤波器设计工具,打开FDA,可以配置滤波器参数,以飞机常用的IIR巴特沃斯滤波器为例,采样频率FS根据你的陀螺仪输出速率而定我这里是1000HZ,Fc为截止频率,即高于该频率的信号一律滤除,我这里选择30HZ,点击下面的Design Filter,即可生成滤波器,点击Analysis_Coefficientts 就可以查看滤波器的参数了,有了这个参数,怎么用在单片机上,下面再说。
matlab1.PNG
matlab2.PNG
matlab3.PNG
matlab4.PNG
侯元祥 回答时间:2020-5-2 08:44:31
FDA生成的滤波器滤波器参数本质上是,冲击响应函数,两个系数矩阵,他这里还有一个增益Gain,我们用的时候只需要把这个转为差分方程就可以,下面我直接贴上代码
float Butterworth_Low_Pass(float Data_IN) //2阶巴特沃斯低通滤波器截止频率30HZ FS=1000
{
float Gain=0.0078202080334971915 ;

float b[]={1,2,1};
float a[]={1, -1.7347257688092752 , 0.76600660094326389 };

static float Last_Data_IN=0;
static float Last_Last_Data_IN=0;
  float Data_OUT;
static float Last_Data_OUT=0;
static float Last_Last_Data_OUT=0;
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];
Last_Last_Data_IN=Last_Data_IN;
Last_Data_IN=Data_IN;
Last_Last_Data_OUT=Last_Data_OUT;
Last_Data_OUT=Data_OUT;
  return  Data_OUT;
}
上面代码Gain即为matlab生成的Gain参数,b和a分别对应matlab中的Num参数与Dem参数,函数输入为带滤波的数据,返回为滤波后的数据,需要注意的是,我是按采样频率为1000HZ设计的,就必须要求该函数的执行周期为1ms,不然滤波效果就与期望的不符了。
nyszx 回答时间:2020-5-2 21:23:02
楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学无刷驱动软硬件设计,什么BLDC .FOC.HFI的,头都大了
likang1202 回答时间:2020-5-3 09:20:28
赞一个
侯元祥 回答时间:2020-5-6 09:35:42
nyszx 发表于 2020-5-2 21:23
楼主很厉害啊,无刷驱动,飞控系统,无线通讯,软硬件,各种算法,matlab...膜拜!最近买了点书,也想学学 ...

杂七杂八的东西太多了,所以比较费时间,我的电调比较简单,就是方波六步,没上FOC,以及高频注入
侯元祥 回答时间:2020-5-6 09:42:29
分享以下无刷电调的设计经验,无刷电调用的STM32F051,选择这个是因为自带比较器,这样采用虚拟中性点过零点换向的方法就比较好实现,另外,STM32自带的高级定时器输入互补PWM也是节省了不少时间,我使用的是传统的方波六步,原理比较粗暴,哪一相关断,直接把对应的GPIO配置为下拉输出,哪一相需要PWM调制,在配置为PWM复用输出,全部寄存器操作,节省了不少时间。利用了比较器的中断,换向事件完全在中断里解决。以下为方波六步的前两步代码,其他的以此类推。
void STEP1( int PWM)
{

TIM1->CCR1=PWM;
TIM1->CCR2=PWM;
TIM1->CCR3=PWM;  //给占空比
//关T5
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0
//关T6
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFF7)|0X00000004; //PB1输出
GPIOB->BRR =0X00000002;//PB1置0
//常开T4
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出
GPIOB->BSRR =0X00000001;//PB0置1
//关T3
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0
//开T1PWM
GPIOA->MODER=(GPIOA->MODER&0XFFFEFFFF)|0X00020000; //PA8 PWM
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
GPIOA->BRR =0X00000080;//PA7置0
}

void STEP2( int PWM)
{
TIM1->CCR1=PWM;
TIM1->CCR2=PWM;
TIM1->CCR3=PWM;  //给占空比
//关T4
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFD)|0X00000001; //PB0输出
GPIOB->BRR =0X00000001;//PB0置0
//关T3
GPIOA->MODER=(GPIOA->MODER&0XFFF7FFFF)|0X00040000; //PA9输出
GPIOA->BRR=0X00000200;//PA9置0
//T1常开
GPIOA->MODER=(GPIOA->MODER&0XFFFDFFFF)|0X00010000; //PA8输出
GPIOA->BSRR=0X00000100;//PA8置1
//关T2
GPIOA->MODER=(GPIOA->MODER&0XFFFF7FFF)|0X00004000; //PA7输出
GPIOA->BRR =0X00000080;//PA7置0  
//开T6PWM
GPIOB->MODER=(GPIOB->MODER&0XFFFFFFFB)|0X00000008; //PB1 PWM
//关T5
GPIOA->MODER=(GPIOA->MODER&0XffDFFFFF)|0X00100000; //PA10输出
GPIOA->BRR=0X00000400;//PA10置0  
}

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版