MS5611气压计数据采集(模拟IIC)/温度采集/相对高度求解

您所在的位置:网站首页 海拔高度公式 MS5611气压计数据采集(模拟IIC)/温度采集/相对高度求解

MS5611气压计数据采集(模拟IIC)/温度采集/相对高度求解

2023-08-23 03:18| 来源: 网络整理| 查看: 265

MS5611气压计数据采集(模拟IIC)/温度采集/相对高度求解 1、 MS5611气压计属性 1.1 基础属性

MS5611使用24位ADC,可以采集温度和气压,并且温度可以用来补偿气压,MS5611在出厂时进行了校准,校准的6个系数存储在PROM寄存器中, PROM寄存器起始地址0XA0, 从0xA0到0XAE, 一共16字节, 一共16*8 = 128位,其中每两个字节为一个系数: 第一个系数: 制造商定的,我们不用在意 第二到第七个系数:我们需要读取,后面用于气压计算 第八个系数:CRC 在这里插入图片描述

1.2 5个命令(COMMANDS)

在这里插入图片描述 分别是: 1、复位 2、读取PROM 3、D1转换, 其实就是设置读取气压的一些参数,然后MS5611会返回24字节(下文会说明) 4、D2转换,其实就是设置读取温度的一些参数 5、读取ADC中的数据

1.3 SPI和IIC接口

IIC模式:PS拉高 SPI模式:PS拉低 本实验用的是模拟IIC读取数据在里插入图片描述 IIC模式中CSB拉低时, IIC从设备地址为0111 0111, CSB拉高时,IIC设备地址为0111 0110

2、 温度气压读取

IIC开始、结束、等待ack、读取发送函数等(参考匿名)

#define MS5611_ADDR 0x77 //0xee // #define CMD_RESET 0x1E // ADC reset command #define CMD_ADC_READ 0x00 // ADC read command #define CMD_ADC_CONV 0x40 // ADC conversion command #define CMD_ADC_D1 0x00 // ADC D1 conversion #define CMD_ADC_D2 0x10 // ADC D2 conversion #define CMD_ADC_256 0x00 // ADC OSR=256 #define CMD_ADC_512 0x02 // ADC OSR=512 #define CMD_ADC_1024 0x04 // ADC OSR=1024 #define CMD_ADC_2048 0x06 // ADC OSR=2048 #define CMD_ADC_4096 0x08 // ADC OSR=4096 #define CMD_PROM_RD 0xA0 // Prom read command #define PROM_NB 8 #define MS5611_OSR 0x08 //CMD_ADC_4096 //开始信号 int I2c_Soft_Start() { MS5611_IIC_SDA = 1; MS5611_IIC_SCL = 1; delay_us(4); if(!MS5611_READ_SDA)return 0; //SDA线为低电平则总线忙,退出 MS5611_IIC_SDA = 0; delay_us(4); if(MS5611_READ_SDA) return 0; //SDA线为高电平则总线出错,退出 MS5611_IIC_SDA = 0; delay_us(4); return 1; } //结束信号 void I2c_Soft_Stop() { MS5611_IIC_SCL = 0; delay_us(4); MS5611_IIC_SDA = 0; delay_us(4); MS5611_IIC_SCL = 1; delay_us(4); MS5611_IIC_SDA = 1; delay_us(4); } //应答 void I2c_Soft_Ask() { MS5611_IIC_SCL = 0; delay_us(4); MS5611_IIC_SDA = 0; delay_us(4); MS5611_IIC_SCL = 1; delay_us(4); MS5611_IIC_SCL = 0; delay_us(4); } //非应答 void I2c_Soft_NoAsk() { MS5611_IIC_SCL = 0; delay_us(4); MS5611_IIC_SDA = 1; delay_us(4); MS5611_IIC_SCL = 1; delay_us(4); MS5611_IIC_SCL = 0; delay_us(4); } // 等待回复 int I2c_Soft_WaitAsk(void) //返回为:=1无ASK,=0有ASK { u8 ErrTime = 0; MS5611_IIC_SCL = 0; delay_us(4); MS5611_IIC_SDA = 1; delay_us(4); MS5611_IIC_SCL = 1; delay_us(4); while(MS5611_READ_SDA) { ErrTime++; if(ErrTime>50) { I2c_Soft_Stop(); return 1; } } MS5611_IIC_SCL = 0; delay_us(4); return 0; } // IIC发送一个字节 void I2c_Soft_SendByte(u8 SendByte) //数据从高位到低位// { u8 i=8; while(i--) { MS5611_IIC_SCL = 0; delay_us(4); if(SendByte&0x80) MS5611_IIC_SDA = 1; else MS5611_IIC_SDA = 0; SendByte ReceiveByte I2c_Soft_Start(); I2c_Soft_SendByte(SlaveAddress I2c_Soft_Start(); I2c_Soft_SendByte(SlaveAddress // MS5611_ADDR:0x77 CMD_RESET:0x1E IIC_Write_1Byte(MS5611_ADDR, CMD_RESET, 1); } u8 MS5611_Read_Prom(void) { uint8_t rxbuf[2] = { 0, 0 }; u8 check = 0; u8 i; for (i = 0; i //CMD_ADC_CONV + CMD_ADC_D2 + MS5611_OSR = 0x48 IIC_Write_1Byte(MS5611_ADDR, CMD_ADC_CONV + CMD_ADC_D2 + MS5611_OSR, 1); // D2 (temperature) conversion start! } // 读取24位温度数据 void MS5611_Read_Adc_T(void) { IIC_Read_nByte( MS5611_ADDR, CMD_ADC_READ, 3, t_rxbuf ); // read ADC } 2.3 第三步:获取气压数据

在这里插入图片描述 首先发送Convert D2命令,进行相应的配置,然后再发送ADC Read命令, 然后MS5611会返回24位的气压数据, 这时候再去读取这些气压数据。

// 写入数据 void MS5611_Start_P(void) { CMD_ADC_CONV + CMD_ADC_D1 + MS5611_OSR = 0x58 IIC_Write_1Byte(MS5611_ADDR, CMD_ADC_CONV + CMD_ADC_D1 + MS5611_OSR, 1); // D1 (pressure) conversion start! } // 读取24位气压数据 void MS5611_Read_Adc_P(void) { IIC_Read_nByte(MS5611_ADDR, CMD_ADC_READ, 3, p_rxbuf); // read ADC } 3、温度补偿气压

在这里插入图片描述

在这里插入图片描述 绝对高度(海拔)的求解公式: H= 44300*(1- (P/P0)^(1/5.256) ) H为高度 P0为标准大气压(≈101Kpa) P为读取的气压 (注意单位得和P0相同)

相对高度(例如飞机起飞前和飞行中的高度差)的求解 这里提供一个思路: MS5611开机上电一段时间后,读取静止100组数据并转换成海拔,取个平均,这个海拔高度就相当于基准海拔,如果你把MS5611拿高或者拿低, 此时的海拔与基准海拔相见就是相对高度。 ps:求相对高度的时候,可以对此时的海拔高度数据进行一个滑动窗滤波,这样求出的相对高度比较平滑。

void MS5611_BaroAltCalculate(void) { float height = 0; int64_t off2 = 0, sens2 = 0, delt = 0, f = 0, f2 = 0; int32_t temperature = 0, pressure = 0, T2 = 0; int32_t dT = 0; int64_t off =0, sens =0; static int num = 0; static int cnt = 0; double ms5611SumDat = 0.0; ms5611_ut = (t_rxbuf[0] delt = temperature + 1500; delt = delt * delt; off2 += 7 * delt; sens2 += (11 * delt) >> 1; } } temperature -= T2; off -= off2; sens -= sens2; ms5611Data.temperature = (double)temperature / 100.0; // ℃ // 温度补偿后的气压 100009 = 1000.09 mbar = 100009 Pa pressure = (((ms5611_up * sens ) >> 21) - off) >> 15; // mbar ms5611Data.pressure = (double)pressure / 100.0; height = (double)((1.0f - pow((double)pressure / 101325.0f, 0.190295f)) * 44330.0f); // meter ms5611Data.height = height; // 求相对高度 // 上电100个数据后 if(num > 100) { if(cnt ms5611SumDat = 0.0; for(int i=0; i ms5611CurAlt -= ms5611StartAlt; // 当前相对高度 } } num = 100; } num++; } 4、总结

MS5611主要是用于计算高度,比如可以用于四旋翼的定高等。 MS5611求海拔高度的时候,由于受温度,气流等各种因素的影响,最终的结果并不理想, 例如下面是我静止采集的30分钟左右的数据,可以明显看到高度是飘的。在这里插入图片描述 最后30分钟左右是我把ms5611拿上拿下来测试的, 所以出现了上图中的波动。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3