基于STM32四轴飞控制作笔记

2023-05-16

基于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的分享

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32四轴飞控制作笔记 的相关文章

  • FreeRtos快速入门

    堆和栈 堆 堆即为一块空闲的内存 xff0c 从这块内存中来取出一部分用完之后再把它释放回去 span class token comment 此时heap buf就相当于一块空闲的内存 span span class token comm
  • GNURadio 3.9 使用 OOT 自定义模块问题记录

    最近由于 GR3 8 里的卷积编码模块有问题就换用了 GR3 9 xff0c 发现 GR3 9 可以正常使用 xff0c 关于 GR3 8 里的卷积编码模块为什么不能用就先不深究了 xff0c 之前写过 GR3 8 编写 OOT 的流程 x
  • 2021-02-11

    多旋翼飞行器学习笔记 一 多旋翼基本组成 1 1机架 xff08 机身 起落架 涵道 xff09 1 机身 机身要考虑的有 xff1a 尺寸 布局 材料 强度 重量 指标参数包括 xff1a 重量 轴距 xff08 外圈电机围城圆的直径 x
  • JAVA学习51-线程礼让

    线程礼让 礼让线程 xff0c 让当前正在执行的线程暂停 xff0c 但不阻塞 将线程从运行状态转换为就绪状态 让CPU重新调度 xff0c 礼让不一定成功 xff0c 看CPU心情 span class token keyword pub
  • Jetson nano安装librealsense和realsense ROS wrapper

    1 安装librealsense librealsense可以使用外国dalao的安装脚本一键安装 git clone https github com JetsonHacksNano installLibrealsense git 这里选
  • ACFly A9飞控使用T265作为位置传感器

    使用一块Jetson nano读取T265数据发送给飞控代替光流实现室内定点飞行 1 Jetson nano数据发送 sudo apt get install ros melodic serial cd ros ws src catkin
  • In grDevices::dev.off() : agg could not write to the given file

    R语言画图保存是报的错误 stackoverflow和github上都没有相关问题 原因是 xff0c 保存的名字字符或标点不对 名字中的标点符号之类的不符合命名原则
  • C++ 创建txt文件,并实现读写txt文件

    最近在逐渐接触C 43 43 xff0c 看了网上很多回答 xff0c 做个汇总的记录 xff0c 方便以后查看 include lt fstream gt include lt iostream gt include lt string
  • eslint:vue报错 error Component name ““ should always be multi-word

    在使用vue cli创建项目 xff0c 命名好组件的时候 xff0c 报错 xff1a error Component name xxx should always be multi word xff0c 解决办法看最后 原因是官方的建议
  • PX4仿真

    XTDrone仿真 运行PX4仿真 span class token builtin class name cd span PX4 Firmware roslaunch px4 mavros posix sitl launch 通过下条命令
  • 安卓期末考试复习题

    安卓试题题型 1 选择题 xff08 10x1 39 xff09 2 填空题 xff08 5x2 39 xff09 3 简答题 xff08 4x5 39 xff09 4 程序分析题 xff08 10 39 xff09 5 编程题 xff08
  • GNURadio 运行报错:ERROR thread[thread-per-block[12]: <block ofdm_cyclic_prefixer(8)>]: Buffer too small

    在修改 GR 的 OFDM 例程时 xff0c 将 OFDM 子载波数从原来的 64 调整为 128 后运行出现了这个问题 xff0c 更全的错误提示如下 xff1a gr log ERROR thread body wrapper ERR
  • kalibr标定realsenseD435i(三)--imu+双目标定

    步骤一 xff1a 编写camchain yaml 具体的参数参考上面得到的yaml文件 xff0c 没有的参数可以删除 cam0 camera model pinhole distortion coeffs 0 3741003900681
  • VINS定位和即时八叉树建图步骤

    在工作空间catkin ws终端运行 1 先source一下 xff0c 以免报错 xff08 注 xff1a 后面每一步都可以source一下 xff09 source catkin ws devel setup bash 2 打开D43
  • ros中的launch文件

    对照运行的mav path plan launch文件进行一个学习 xff08 一 xff09 什么是roslaunch roslaunch是ROS提供的一个启动工具 xff0c 它能够使得启动多个ROS节点的过程变得简单 xff0c 同时
  • EGO Planner代码解析----CMakeLists.txt和package.xml

    ROS本质上就是由一个又一个的package组成的 xff0c package可以说是ROS的细胞 在catkin make的时候它会一个一个的去找package然后生成目标文件 一个package可以有多个节点 判断是否为Package
  • EGO Planner代码解析bspline_optimizer部分(3)

    1 int BsplineOptimizer earlyExit void func data const double x const double g const double fx const double xnorm const d
  • EGO Swarm翻译

    目录 摘要 介绍 相关工作 A 单四旋翼局部规划 B 拓扑规划 C 分布式无人机集群 基于梯度的局部规划隐式拓扑轨迹生成 A 无需ESDF梯度的局部路径规划 B 隐式拓扑轨迹生成 无人机集群导航 A 机间避碰 B 定位漂移补偿 C 从深度图
  • 嵌入式刷题训练1——牛客网

    嵌入式软件工程师面试常考题 文章目录 Q1 xff1a extern关键字的作用是什么 xff1f Q2 xff1a 关于virtual void Draw 61 0 xff0c 下面说法正确的有几个 xff1f Q3 xff1a 对于类的
  • Ubuntu桌面卡死解决办法

    Ubuntu桌面卡死解决办法 我采用这种方式圆满解决 同时按住 Ctrl 和 Alt 键 xff0c 按住不要放

随机推荐

  • sonic 编译

    本文是转载 xff0c sonic 编译 sonic编译过程讲解 xff0c 点击这里
  • arduino总线舵机+实时串口通信控制

    arduino语法 digitalWrite 函数 digitalWrite pin value 定义引脚的电平 pin xff1a 你希望设置模式的引脚的编号 0 xff5e 13 value xff1a 表示为HIGH 高电平 或LOW
  • GNURadio3.9.4创建OOT模块实例

    目录 1 创建自己的block xff08 注意 module 与 block 的区别 xff09 1 1 创建 module 1 2 在创建的 myDemux 中创建 block 2 修改相应的代码 2 1 修改 C 43 43 代码 2
  • LibreOffice具体用法

    1 在命令行执行libreoffice version xff0c 检查是否已经安装LibreOffice span class token comment Linux 下的安装方法 span span class token commen
  • 《1.9.ARM裸机第九部分-定时器、看门狗和RTC》

    第一部分 章节目录 1 9 1 什么是定时器 1 9 2 S5PV210中的定时器 1 9 3 S5PV210的PWM定时器1 1 9 4 S5PV210的PWM定时器2 1 9 5 S5PV210的PWM定时器3 1 9 6 蜂鸣器和PW
  • 云计算概述(5个基本特征、4种部署模型、3种服务类型)

    文章目录 一 IT系统组成二 云计算概述三 云计算的 5 个基本特征四 云计算的 4 种部署模型 xff08 一 xff09 私有云 xff08 二 xff09 社区云 xff08 三 xff09 公共云 xff08 四 xff09 混合云
  • keil安装、注册及pack包安装

    keil安装 注册及pack包安装 一 keil安装包下载二 keil安装三 keil注册四 安装pack包方法一 xff1a keil中直接更新方法二 xff1a 官网下载pack包 前言 xff1a 刚开始接触keil时 xff0c 找
  • Ubuntu18.04下安装opencv3.4.3的完整攻略

    之前写过一篇在Ubuntu18 04下安装opencv4 5的攻略 xff0c 具体是参考了官方的一些文档 xff0c 但是opencv中的很多应用在后来进行了删减 xff0c 如果想要使用opencv训练xml文件 xff0c 需要用到其
  • mysql8远程连接报错1251异常详细(保姆级教程)

    环境centos7 43 mysql8 本地navicat破解版 这种情况下考虑还是因为mysql的版本问题 xff0c 在mysql5的时候mysql使用的是mysql native password加密协议 xff0c 在mysql8之
  • Jave操作Hbase——建立学生信息管理系统

    上文对hbase的建表 对数据的插入 查询 删除进行封装 62条消息 Hbase学习 对表操作进行封装 小镭敲代码的博客 CSDN博客 本文调用封装好的方法 xff0c 建立学生信息管理系统 xff0c 实现 1 注册学生信息 2 查看学生
  • 在Hbase使用过滤器(行键过滤器、列族与列过滤器、值过滤器)

    本文介绍Hbase中的过滤器 xff1a 1 行键过滤器 2 列族与列过滤器 3 值过滤器 4 其他过滤器 格式如下 xff1a scan 39 表名 39 FILTER 61 gt 过滤器 比较运算符 39 比较器 39 34 一 行键过
  • 无人机学习

    无人机飞行原理及控制方法 xff08 以四旋翼无人机为例 xff09 四旋翼无人机一般是由检测模块 xff0c 控制模块 xff0c 执行模块以及供电模块组成 检测模块实现对当前姿态进行量测 xff1b 执行模块则是对当前姿态进行解算 xf
  • 安装完torch geometric,import torch_geometric然后报错:OSError: [WinError 127] 找不到指定的模块

    1 出错原因 xff1a 对于import torch geometric xff0c 然后报错 xff1a OSError WinError 127 找不到指定的模块 我出错的原因是 xff1a pytorch的版本我用的是1 4 xff
  • Word中设置不同页面的页眉不一样的方法(页脚、页码同理)

    目录 1 不同部分页眉的修改 2 如何删除页眉中的横线 1 不同部分页眉的修改 在Word中设置也没的时候默认每页都是一样的 xff0c 如果我们想要不同部分的页眉内容不一样 xff0c 则需要在不同的部分之间加入分节 符 xff0c 注意
  • 【MYSQL】 三大范式 表的关系 外键 ER图

    三大范式 第一范式 xff08 每列保持原子性 xff09 每一列属性都是不可再分的属性值 xff0c 确保每一列的原子性 两列的属性相近或相似或一样 xff0c 尽量合并属性一样的列 xff0c 确保不产生冗余数据 第二范式 xff08
  • 五年嵌入式经验工作与心得

    不知不觉已经从事嵌入式行业5年了 xff0c 大学4年工作5年一直专心从事嵌入式工作 下面我谈一下我对嵌入式的看法 可能对大神们没什么用 xff0c 希望对刚入门或者即将走出校园的同学们有些帮助 嵌入式在工作中分为固件程序 xff08 fi
  • JavaScript-----详细讲解js节点以及节点操作

    x1f353 获取元素通常使用两种方式 x1f407 利用DOM提供的方法获取元素 document querySelector document getElementsByClassName document getElementsByT
  • echarts 全局换肤 echarts根据系统颜色换肤,echarts自定义icon,echarts发光效果

    官网定义颜色网址 效果 代码 span class token tag span class token tag span class token punctuation lt span template span span class t
  • 计算机网络

    计网 2022 4 6 BDY 猛猪猪语录 xff1a Hash xff01 文章目录 计网一 网络分层 xff08 OSI 和 TCP IP 网络分层模型详解 xff09 1 OSI 七层模型2 TCP IP模型3 问题 xff1a 为什
  • 基于STM32四轴飞控制作笔记

    基于STM32四轴飞控制作笔记 前言 大四选了个四轴飞控作为毕业设计的题目 xff0c 近来没事 xff0c 把之前的制作做个总结开源出来 硬件设计 1 遥控MCU模块和飞控的MCU模块都采用stm32f103c8t6单片机 xff0c 很