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

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


1、关于MS5611的基本介绍

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

3、 转化为相对高度

我选择这个气压计做定高的高度测量模块呢?因为我也很无奈,飞控上用的是,咱也没办法。

先介绍一下这个模块吧,该模块有着SPI和IIC总线接口的高分辨率气压传感器,其包括一个高线性度的压力传感器和一个超低功耗的24位模数转换器MS5611提供了一个精确的24位数字压力值和温度值以及不同的操作模式,可以提高转换速度并优化电流消耗,分辨率可达10CM,说是10cm,我感觉还是挺大的,有一个spl06,精度要比Ms5611要好,不过问题不大,关于MS5611的外围电路原理图:

android开发 如何用气压计测量楼的高度_算法


其实气压计收外界因素的影响还是很大的,还很多,比如受温度啊,所以气压计在读取数据的时候要读取温度,进行二阶的一个温度补偿,不过这个温度可不是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);//通过后期的绝对高度减去刚上电的初始高度算出相对高度
   }

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