基于STM32四轴飞控制作笔记
基于STM32四轴飞控制作笔记
前言
大四选了个四轴飞控作为毕业设计的题目,近来没事,把之前的制作做个总结开源出来。
硬件设计
1.遥控MCU模块和飞控的MCU模块都采用stm32f103c8t6单片机,很多高校的嵌入式教学也是基于这款的。
2.NRF24L01模块是一款2.4G无线收发器模块,通过SPI协议与MCU进行通信。由于NRF24L01采用QFN封装,手上又没有风枪之类的工具,不好焊接。于是就直接买现有的模块进行设计了。关于它的资料和代码我参考与野火的教程:
http://doc.embedfire.com/products/link/zh/latest/module/wireless_misc/nrf24l01.html
3.MPU6050模块是一个6轴传感器模块,也就是加速度三个轴和陀螺仪三个轴。空谈无用,如下图从MPU6050数据手册上的截图:
红色编号1、2、3分别是三个轴的加速度传感器,4、5、6分别是三个轴的角速度传感器,7是温度传感器。大多数传感器的原理就是通过AD采集去实现的,这里也一样,7路ADC采集的值存放到相应的寄存器中。用户通过红色编号9的I2C接口去读取相应寄存器的的值。读取到的值通过数学算法解算后就能得到角度了(也就是姿态角)。还有一种比较简单得方法获取姿态角,就是通过红色编号8的DMP模块来获取,但好像移植到工程中代码量有点大,感觉还不如采用MCU解算算法好用。
MPU6050和DMP方式获取姿态角的参考资料推荐看野火的stm32教程,简单易懂。
https://www.bilibili.com/video/BV1ms411M7Cf?p=60
至于采用MCU算法来解算的方式,代码可以参考正点原子的minifly飞控代码。
http://www.openedv.com/docs/fouraxis-fly/minifly.html
4.电机驱动模块原理图如下:
Q1是一个MOS管,这里可以把他看成一个开关,利用PWM技术开控制开关管的导通与关断的频率,就可以控制点机两端的电压大小,从而达到控制电机转速的目的。其MOS驱动原理可参考:
https://bbs.nuedc-training.com.cn/thread-465-1-1.html
5.MCU主控模块原理图如下:
6.飞控电源模块原理图如下:
由于是使用3.7V的锂电池供电,使用一个MOS管驱动,但是电机只要运行起来,就会产生非常大的干扰,直接导致STM32复位或不运行,故此采用升压+稳压的方案设计,该方案先经过升压电路升压到5V,在经过稳压电路稳压到3.3V供MCU和传感器使用。
ME2188 是一系列高转换效率、低功耗、高工作频率的 PFM 同步升压 DC-DC 转换芯片。参考芯片手册设计原理图。
稳压部分由于手上现成的TL431芯片和三级管,就采用分立元件搭成的线性电源
稳压电路的基本组成电阻R1和稳压管D1构成,输入电压经过R1到稳压管D1,稳压管D1上会得到一个稳定的电压,假如是3.9V的稳压管就得到3.9V电压,稳压管与三极管基极连接,发射极输出,构成三极管射极跟随器,即发射极电压跟随着基极电压,由于Vbe管压降的存在(硅管0.6V~0.7V),输出电压等于稳压二极管稳压值减去三极管be极导通压降,就可以输出3.3V电压了(3.9V-0.6V)。
假如输入是12V,三极管导通后,CE端会直接输出12V电压吗?
答案是肯定不会。那为什么还能稳定输出3.3V呢?原因如下:当 E 极电压为 12V 时, E 点电位就会超过 B 点的电位,此时Vbe之间的电压就小于 0.6V, 三极管截至 (Ib =0, Ic=0)。 这时 E 极的电压就会开始急剧下降, 当下降到3.3V 的时候,Vbe的电压恢复到 0.6V ,三极管导通。这时 E 极的电压就开始往上升,Vbe之间的电压又开始小于 0.6V 并往逐渐减小,CE 之间的阻抗作用越来越大, 直到三极管关闭。 这样周而复始,最终使 E 极电压稳定在3.3V。
我这里使用TL431来替代3.9V稳压管就形成了上面的电路。TL431是一个有良好热稳定性能的三端可调精密电压基准集成芯片,具有体积小、价格低廉、性能优良等特点:它的输出电压用两个电阻就可以任意地设置到从参考电压(2.5V)到36V范围内的任何值,典型动态阻抗仅为0.2Ω,电压参考误差为±0.4%,负载电流能力从1.0mA到100mA,温度漂移低,输出噪声电压低等。
7.ADC模拟摇杆
ADC模拟摇杆的内部 可以看成电位器,PF7引脚可以看成滑片,当摇杆摇动时,电位器滑片滑动,PF7的电压就会变化,此时通过ADC去采集PF7电压,在把ADC采集的值通过无线模块发送到飞控上,控制PWM波的占空比,就能控制飞控了。
软件设计
飞控软件核心就是PID控制器的实现
当前偏差Error,由遥控器给定的目标值(用户设置的姿态)减去MPU6050检测到的测量值所得。
最近偏差Integral,由现在的误差减去上一次误差所得。
历史偏差Differ,是过去的所有误差之和。
P,I,D三个变量是PID的三个参数,PID的输出为PIDout = PError+ IIntegral+ D*Differ。然后把PIDout输出到电机上即可。
标准的PID公式如下:
积分积分 有着累积的意思,这里在程序中的实现就是所有误差的累加。这里就是通过历史的误差来控制系统。
微分,在中学时学过,函数的斜率可以通过微分表示,函数的斜率可以表示函数变化的趋势,预测未来的意思。程序中用 现在的误差减去上一次误差来表示微分项。
对于一个初学者来说飞控程序比较复杂,建议参考开源的飞控代码,反复阅读,然后根据此框架改驱动来适配我们的硬件平台。这里推荐小马哥的飞控代码,其框架比较简单,对新手比较友好。
https://oshwhub.com/PQG2030PQG/kai-yuan-si-zhou-fei-xing-qi
四轴飞控工程文件:
链接:https://pan.baidu.com/s/1vZ7N8XxfHs_EBqMNCYKiIA
提取码:kv0j
–来自百度网盘超级会员V1的分享
基于STM32四轴飞控制作笔记相关推荐
- 基于STM32与PCA9685制作四足机器人(代码开源)
前言:本文为手把手教学基于STM32的四足机器人项目--JDY-31蓝牙控制,特别地,本次项目采用的是STM32作为MCU.四足机器人的支架为3D打印件,SG90舵机驱动机器人实现姿态 ...
- 基于STM32的DMX512开发笔记
首先基本了解一下DMX512的基本协议 一. DMX512协议 DMX 是Digital MultipleX 的缩写,意为多路数字传输.DMX512控制协议是美国舞台灯光协会(usITT) ...
- 基于STM32的触摸屏学习笔记
本文共有三个内容:一.电阻触摸屏的原理:二.XPT2046的控制字与数字接口:三.程序源码讲解(参考正点原子的代码) 一.电阻触摸屏的原理,上图: 图上的文字介绍了触摸的原理,下面总结一下触摸的原理: ...
- 基于STM32制作的音乐播放器,用PWM控制蜂鸣器
目录 效果展示 前言 一.设计背景 1.1.知识储备 二.系统设计方案 2.1.实现功能 2.2.硬件部分 2.3.软件部分 三.软件设计 3.1.设计流程图 3.2.音乐频率的设置 3.3.编程主要 ...
- 基于STC51:四轴飞控开源项目原理图与源码(入门级DIY)
目录 前言(作者:宏晶科技) 一.飞控配件 二.接线 三.原理图 四.调试 五.程序 六.完整工程.原理图文件获取 前言(作者:宏晶科技) 本飞控仅仅是姿态飞行控制,没有GPS.电子罗盘.气压高度计. ...
- 关于制作基于STM32的指纹打卡器(不完全体)
关于制作基于STM32的指纹打卡器(不完全体) 笔者认为首先需要构思好此打卡器需要实现的功能有哪些?作为一个指纹打卡器首先应该具备指纹识别功能.其次需要将我们识别到的用户反馈到显示器上给予打卡者打卡成 ...
- 测试基于STM32的ADIS16405评估板,并在匿名四轴上实时显示3轴陀螺仪+3轴加速度计+3轴磁力计 波形。本文最后还公开一个基于C# 的串口波形显示客户端源码。
标题:测试基于STM32的ADIS16405评估板,并在匿名四轴上实时显示3轴陀螺仪+3轴加速度计+3轴磁力计 波形.本文最好还公开一个基于C# 的串口波形显示客户端源码. 这里附上该评估板的原理图和 ...
- 基于tiva的匿名飞控学习笔记(1)
基于tiva的匿名飞控学习笔记(1) 开关状态任务 遥控器数据处理任务 数传数据交换 延时存储任务 开关状态任务 匿名飞控的开关状态任务为函数Swtich_State_Task(u8 dT_ms),定 ...
- 基于STM32的CAN总线通信学习笔记
转自:https://blog.csdn.net/ludaoyi88/article/details/53350077 基于STM32的CAN总线通信学习笔记 本文主要简单介绍CAN总线的相关概念,以 ...
最新文章
- 2011最新个人所得税计算器---起点3500元
- pcDuino 软件更新
- Node.js webpack中导入vue的三种方法
- win10安装java1.8开发环境JDK
- CF140C-New Year Snowmen【优先队列】
- html表单实验总结,HTML表单总结
- Spark整合ElasticSearch
- [ASP.NET]动态页面调用JS错误。保存为HTML文件就不报错了。
- 【机器学习】无监督学习--(聚类)DBSCAN
- mongo java aggregate_java使用spring + mongo进行Aggregation聚合查询
- LintCode 4.丑数
- 使用ODBC向SQLServer存储过程传参数的方法
- [Swift]LeetCode1023. 驼峰式匹配 | Camelcase Matching
- UBUNTU启动到BusyBox,怎么办?
- 【leetcode】1041. Robot Bounded In Circle
- 大话设计模式 设计模式书籍 编程书籍
- hp服务器装2012系统还原,用HP GEN8+WIN2012+Hyper V+黑群晖5.2组建家庭NAS中心 篇四:WIN 2012 安装 存储池调试及修复...
- 有道云笔记 markdown html,你不可不知的有道云笔记Markdown指南【进阶版】
- WPF将点列连接成光滑曲线——贝塞尔曲线
- 迁移学习,DomainAdaption 笔记