基于STM32F407四旋翼无人机---MS5611气压计(三)

2023-05-16

基于STM32F407四旋翼无人机---MS5611气压计(三)

  • 1、关于MS5611的基本介绍
  • 2、通过IIC获取气压计数据
  • 3、 转化为相对高度

1、关于MS5611的基本介绍

2、通过IIC获取气压计数据

3、 转化为相对高度

我选择这个气压计做定高的高度测量模块呢?因为我也很无奈,飞控上用的是,咱也没办法。
先介绍一下这个模块吧,该模块有着SPI和IIC总线接口的高分辨率气压传感器,其包括一个高线性度的压力传感器和一个超低功耗的24位模数转换器MS5611提供了一个精确的24位数字压力值和温度值以及不同的操作模式,可以提高转换速度并优化电流消耗,分辨率可达10CM,说是10cm,我感觉还是挺大的,有一个spl06,精度要比Ms5611要好,不过问题不大,关于MS5611的外围电路原理图:在这里插入图片描述
其实气压计收外界因素的影响还是很大的,还很多,比如受温度啊,所以气压计在读取数据的时候要读取温度,进行二阶的一个温度补偿,不过这个温度可不是MPU6050读取的温度值,MPU6050读取的温度值是这个芯片的温度值,而MS5611采集的温度是外界环境温度,气压计还会受风力的影响,因为风大的时候大气压强是不一样的,光照强度也会对气压计有影响,所以一些飞控会对飞控板这些容易受到外界因素影响的模块做一个封闭的壳子,这样可以减少外界因素的影响,并且在气压计上面使用黑色海绵压着
对于气压计的初始化就不贴代码了,使用IIC或者SPI都可以的,发送对应的命令先去对传感器进行复位,并且从PROM读取出厂校准数据。

PROM寄存器值,只需要读取一次。第一个是厂商信息,2-7是六个系数信息,8是CRC校验信息,这些数据都是厂家出厂时就校准好的,之后也不会更改。每个气压计参数都是不一样的,所以不用怀疑为什么和别人的不一样。

通过IIC获取压力数据和温度数据进行拼接:

MS5611_TEM = (t_rxbuf[0] << 16) | (t_rxbuf[1] << 8)|t_rxbuf[2];//算出温度值
MS5611_PRE = (p_rxbuf[0] << 16) | (p_rxbuf[1] << 8)|p_rxbuf[2];//算出气压值

通过出厂设置的值进行校准:

dT = MS5611_TEM - ((uint32_t)Cal_C[5] << 8);
OFF = ((uint32_t)Cal_C[2] << 16) + ((int64_t)dT * Cal_C[4])/128.0f;
SENS = ((uint32_t)Cal_C[1] << 15) + ((int64_t)dT * Cal_C[3])/256.0f;
temperature = 2000 + ((int64_t)dT * Cal_C[6])/8388608.0f;//得出温度

此时需要对温度进行二阶补偿

if (temperature < 2000) 
   {
        Aux =  (temperature - 2000) *  (temperature - 2000);
        OFF2 = 2.5 * Aux;
        SENS2 = 1.25f * Aux;
      if (temperature < -1500) 
     { 
         Aux = (temperature + 1500) * (temperature + 1500);
         OFF2  += 7.0f * Aux;
         SENS2 += 5.5f * Aux;
     }
  }
  OFF  -= OFF2; 
  SENS -= SENS2;
  MS5611_Pressure=(((MS5611_PRE*SENS )/2097152.0f)-OFF)/32768.0f;
  alt_3 = (101000 - MS5611_Pressure)/1000.0f;
  MS5611_Pressure=0.82f*alt_3*alt_3*alt_3+0.09f*(101000- MS5611_Pressure)*100.0f ;//算出气压值
  

那么问题来了,其实现在算出的是绝对高度,如果使用绝对高度,对于无人机的定高来说是恨不准确的,因为如果想要设定无人机的高度,使用绝对高度是无法获知的,那么我们应该计算出相对高度,怎么计算呢?给大家提供一个思路, ==我们先舍去气压计的前300个数据,因为气压计刚上电的数据很不稳定,错误数据也很多,所以我们大概丢弃掉刚上电的数据,将丢弃后的数据后获取的第一个数据作为基础气压值,将随后获取到的气压值减去基础气压值算出了相对气压值,这样通过相对气压值就可以算出相对高度。

  if( baro_start < 100 )
  {
   baro_start++;
   LPF_relative_height = 0;
   if(baro_start > 50) 
    {
     BARO_Bisic += MS5611_Pressure;  //上电后的气压值作为基础气压
     if(baro_start == 100)
     {
      BARO_Bisicpressue = BARO_Bisic/50.0f;
     }
    }
  } else
   {
    BARO_height = Median(mo_av_baro,MO_LEN ,&moavcnt,(s32)(MS5611_Pressure - BARO_Bisicpressue)); //计算绝对高度
    LPF_1_(1.0f,0.03f,BARO_height,LPF_relative_height);//通过后期的绝对高度减去刚上电的初始高度算出相对高度
   }  

一般想要做更精确的高度定高还需要一个更精确地传感器,可以用超声波模块或者激光测距传感器。

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

基于STM32F407四旋翼无人机---MS5611气压计(三) 的相关文章

  • linux下cannot execute binary file: Exec format error解决办法

    对于linux下cannot execute binary file Exec format error明确说明是执行文件格式错误 xff0c 可能情况 xff1a 1 使用错误的命令 xff0c 如gcc c hello c o hell
  • PX4/Pixhawk---uORB深入理解和应用(最新版)

    1 简介 ps 第1章简介是参考 uORB深入理解和应用 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c 这可以让我们更好的理解PX4 Pixhawk的软件架构和运作 xff
  • 深拷贝和浅拷贝的区别

    1 简单理解 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体 xff0c 而不是引用 假设B复制了A xff0c 修改A的时候 xff0c 看B是否发生变化 xff1a 如果B跟着也变了 xff0c 说明是浅拷贝 xff0c
  • Linux系统下搭建PX4/Pixhawk原生固件编译环境

    对于新版本的固件V1 11 3 在pixhawk官网可以找到开发环境的搭建 xff0c 这里把开发环境链接贴出来 xff1a https docs px4 io master zh dev setup dev env linux ubunt
  • Pixhawk无人机飞行模式详解 (PX4源码)

    我帮大家把飞行模式控制量与特点总结一下 xff0c 方便看代码 xff0c 如下所示 xff1a 辅助模式 Position Mode 位置模式 xff08 定点模式 xff09 横滚俯仰控制角度 xff0c 油门控制上下速度 xff0c
  • pixhawk无人机避障

    本人最近用树莓派结合PX4做无人机避障 xff0c 使用激光雷达 xff0c 有没有一起的小伙伴 xff0c 我们一起交流 xff01 私信我 xff0c
  • 目录前导符不一致解决办法

    最近弄毕业设计 xff0c 写完论文以后发现生成的目录后面的前导码省略号数目 间距不一致 xff0c 非常的难看 xff0c 于是经过仔细研究找到了解决办法 xff1a 首先是问题所在 xff0c 请看下图 xff1a 首先在word中打开
  • 几种编码方式(RZ、NRZ、NRZI、曼彻斯特编码)

    在数字电路中 xff0c 组成一连串信息的基元就是0和1 xff0c 无论是在CPU DSP MCU甚至是个数字计数器中 xff0c 数字电路在其中能够处理的信息也只有0和1 xff0c 而对于任何外界的信息 xff0c 计算机都能通过两个
  • WIN10运行软件,窗口不显示 解决办法

    win10 运行软件后 xff0c 不显示窗口 今天遇到个问题 xff0c 我打开软碟通之后 xff0c 任务栏显示它已经打开了 xff0c 但是窗口就是不显示 xff0c 如下图 xff1a 用alt 43 tab 查看 xff0c 也能
  • 变频器的四大组成部分和工作原理

    随着电子技的发展变频器已经有了很大的变化 xff0c 但其基本原理并没有发生改变 变频器的主要部分有四个 xff1a 整流器 中间电路 逆变器 控制电路 1 xff09 整流器 通用变频器的整流电路是由三相桥式整流桥组成 它的功能是将工频电
  • Pytorch中torch的操作合集

    tensor的基本操作 PyTorch系例 torch Tensor详解和常用操作 这里最重要的概念是索引出来的结果与原数据共享内存 xff0c 也即修改一个 xff0c 另一个也会跟着修改 tensor的广播机制 Pytorch xff1
  • torch.tensor 内存共享机制

    tensor属于可变数据类型 xff0c 因此变量的值存储在堆中 xff0c 变量名存储在栈中 xff0c 当进行变量赋值时 xff0c 就是让栈中的变量指向堆 xff0c 如下面代码 xff1a span class token keyw
  • 熵 KL散度 交叉熵的理解

    熵 KL散度 交叉熵的概念 xff1a 理解二分类交叉熵 可视化的方法解释对数损失交叉熵公式推导 xff1a 理解交叉熵作为损失函数在神经网络中的作用熵 KL散度 交叉熵的关系 xff1a KL散度与交叉熵区别与联系训练过程中三者的应用 x
  • Docker数据目录迁移解决方案

    介绍 在docker的使用中随着下载镜像越来越多 xff0c 构建镜像 运行容器越来越多 数据目录必然会逐渐增大 xff1b 当所有docker镜像 容器对磁盘的使用达到上限时 xff0c 就需要对数据目录进行迁移 如何避免 xff1a 1
  • Git 三剑客 ———— git gui 可视化工具

    目录 页面介绍Unstaged changesStaged Changes xff08 Will Commit xff09 File DisplayCommand Set Repository 操作区Edit 操作区Branch 操作区Co
  • 数组对象转json格式

    1 数组转化成JSON对象后 xff0c key值是索引 xff0c value是数组对应的值 数组也可以转化成JSON对象 var jStr3 61 34 10 20 30 40 50 60 34 var j3 61 JSON parse
  • JS——DOM的结点操作

    H5自定义属性 自定义属性目的 目的 xff1a 是为了保存并且使用数据 有些数据可以把保存到页面中而不用保存到数据库 可以通过getAttribute获取 自定义属性 xff1a data 开头 这是一种规范 dataset xff1a
  • SecureCRT连接Linux

    在将SecureCRT连接Linux上时遇到一些问题 xff0c 记录如下 第一步 xff0c 我们要在在linux上安装openssh server服务 xff0c 并确认打开了22监听端口 在linux上操作命令如下 xff1a apt
  • Linux下添加虚拟串口,接收和发送数据

    之前写的那虚拟串口有点问题 xff0c 只能读取 xff0c 不能接收 今天再来改一下 将python的内容改为如下 xff1a 先新建一个文档 xff0c 内容如下 usr bin env python coding 61 utf 8 i
  • fatal: The remote end hung up unexpectedly解决办法

    今天在写完代码后 xff0c 准备提交到GitHub上 xff0c 结果得到了下面的结果 xff0c 记录一下 百度了之后 xff0c 发现大部分是有两种说法 一种是说提交的文件太大 xff0c 解决办法如下 link 一种是说管理员将项目

随机推荐