基于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四轴飞控制作笔记相关推荐

  1. 基于STM32与PCA9685制作四足机器人(代码开源)

            前言:本文为手把手教学基于STM32的四足机器人项目--JDY-31蓝牙控制,特别地,本次项目采用的是STM32作为MCU.四足机器人的支架为3D打印件,SG90舵机驱动机器人实现姿态 ...

  2. 基于STM32的DMX512开发笔记

    首先基本了解一下DMX512的基本协议 一.       DMX512协议 DMX 是Digital MultipleX 的缩写,意为多路数字传输.DMX512控制协议是美国舞台灯光协会(usITT) ...

  3. 基于STM32的触摸屏学习笔记

    本文共有三个内容:一.电阻触摸屏的原理:二.XPT2046的控制字与数字接口:三.程序源码讲解(参考正点原子的代码) 一.电阻触摸屏的原理,上图: 图上的文字介绍了触摸的原理,下面总结一下触摸的原理: ...

  4. 基于STM32制作的音乐播放器,用PWM控制蜂鸣器

    目录 效果展示 前言 一.设计背景 1.1.知识储备 二.系统设计方案 2.1.实现功能 2.2.硬件部分 2.3.软件部分 三.软件设计 3.1.设计流程图 3.2.音乐频率的设置 3.3.编程主要 ...

  5. 基于STC51:四轴飞控开源项目原理图与源码(入门级DIY)

    目录 前言(作者:宏晶科技) 一.飞控配件 二.接线 三.原理图 四.调试 五.程序 六.完整工程.原理图文件获取 前言(作者:宏晶科技) 本飞控仅仅是姿态飞行控制,没有GPS.电子罗盘.气压高度计. ...

  6. 关于制作基于STM32的指纹打卡器(不完全体)

    关于制作基于STM32的指纹打卡器(不完全体) 笔者认为首先需要构思好此打卡器需要实现的功能有哪些?作为一个指纹打卡器首先应该具备指纹识别功能.其次需要将我们识别到的用户反馈到显示器上给予打卡者打卡成 ...

  7. 测试基于STM32的ADIS16405评估板,并在匿名四轴上实时显示3轴陀螺仪+3轴加速度计+3轴磁力计 波形。本文最后还公开一个基于C# 的串口波形显示客户端源码。

    标题:测试基于STM32的ADIS16405评估板,并在匿名四轴上实时显示3轴陀螺仪+3轴加速度计+3轴磁力计 波形.本文最好还公开一个基于C# 的串口波形显示客户端源码. 这里附上该评估板的原理图和 ...

  8. 基于tiva的匿名飞控学习笔记(1)

    基于tiva的匿名飞控学习笔记(1) 开关状态任务 遥控器数据处理任务 数传数据交换 延时存储任务 开关状态任务 匿名飞控的开关状态任务为函数Swtich_State_Task(u8 dT_ms),定 ...

  9. 基于STM32的CAN总线通信学习笔记

    转自:https://blog.csdn.net/ludaoyi88/article/details/53350077 基于STM32的CAN总线通信学习笔记 本文主要简单介绍CAN总线的相关概念,以 ...

最新文章

  1. 2011最新个人所得税计算器---起点3500元
  2. pcDuino 软件更新
  3. Node.js webpack中导入vue的三种方法
  4. win10安装java1.8开发环境JDK
  5. CF140C-New Year Snowmen【优先队列】
  6. html表单实验总结,HTML表单总结
  7. Spark整合ElasticSearch
  8. [ASP.NET]动态页面调用JS错误。保存为HTML文件就不报错了。
  9. 【机器学习】无监督学习--(聚类)DBSCAN
  10. mongo java aggregate_java使用spring + mongo进行Aggregation聚合查询
  11. LintCode 4.丑数
  12. 使用ODBC向SQLServer存储过程传参数的方法
  13. [Swift]LeetCode1023. 驼峰式匹配 | Camelcase Matching
  14. UBUNTU启动到BusyBox,怎么办?
  15. 【leetcode】1041. Robot Bounded In Circle
  16. 大话设计模式 设计模式书籍 编程书籍
  17. hp服务器装2012系统还原,用HP GEN8+WIN2012+Hyper V+黑群晖5.2组建家庭NAS中心 篇四:WIN 2012 安装 存储池调试及修复...
  18. 有道云笔记 markdown html,你不可不知的有道云笔记Markdown指南【进阶版】
  19. WPF将点列连接成光滑曲线——贝塞尔曲线
  20. 迁移学习,DomainAdaption 笔记

热门文章

  1. tecplot云图——数据文本格式2
  2. vagrant给vmbox创建虚拟机及docker安装mysql和redis
  3. Android模拟器的安装、连接和操作
  4. IWAM账号密码不一致引起IIS无法处理ASP文件
  5. 新加坡旅游 相关资料
  6. 综合日语第一册第十二课
  7. 解决 filezilla 连接服务器失败问题
  8. CG-62 压电式雨量传感器
  9. Censored! :ac自动机 + DP
  10. CDH-TXKT-集群的维护