STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强

ms5611是同时支持I2C和SPI通信协议的气压计芯片。已经很普遍的被用在飞行器控制板上作为高度传感器。开发过stm32的朋友都知道它的硬件I2C是由bug的,一般使用的都是自己编写的软件I2C通信协议。但是其硬件SPI通信却是没有问题的。SPI通信一般会比I2C通信快点。下面先从硬件上说明MS5611在选择SPI的准备。
MS5611要选择使用SPI通信首先需要做的就是把芯片的PS引脚置低。参考数据手册如下:
STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强_第1张图片
根据其设计的PCB原理图如下:
STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强_第2张图片
下面是主要代码:
1.首先是芯片初始化。
void ms5611_init(void)
{
// ms5611_cs_init();
ms5611_ba_reset();
read_prom_data();
}
复位芯片可以从数据手册中找到参考,其实很简单就是向芯片发送数据0x1e,
void ms5611_ba_reset(void)
{
MS5611_CS_L;
SPI1_Read_Write_Byte(0X1E);
MS5611_CS_H;
Delay_us(2800);
}
初始化第二步是读取prom的数据,这里面有包含计算温度和气压的一些系数。
void read_prom_data(void)
{
u8 i;
for(i=0;i<8;i++)
data[i] = ms5611_read(0xa0+2*i);
for(i=0;i<8;i++)
printf(“data %d = %d\n”,i,data[i]);
}
下面就是读取数据和运算数据的循环了。
int32_t get_pressure(void)
{
int64_t D1,dT,OFF,SENS;
int64_t pressure;

MS5611_CS_L;
SPI1_Read_Write_Byte(0X58);
MS5611_CS_H;
Delay_us(1100);
dT = ms5611_read_adc(0x00);
dT -= (data[5]<<8);

// printf(“dT = %lld\n”,dT);
OFF = ((int64_t)data[2]<<16) + (((int64_t)data[4]*dT)>>7);
SENS = ((int64_t)data[1]<<15) + (((int64_t)data[3]*dT)>>8);

MS5611_CS_L;
SPI1_Read_Write_Byte(0x48);
MS5611_CS_H;

Delay_us(1100);
D1 = ms5611_read_adc(0x00);
pressure = (((D1*SENS)>>21)-OFF)>>15;

return pressure;
}
使用串口终端获得数据在MATLAB中做出曲线如下图:
STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强_第3张图片
与工程代码对应的硬件如下:
STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强_第4张图片STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强_第5张图片
该飞控板移植了MDK的cleanflight代码,由于硬件跟cleanflight的并不完全一致,代码有所改动,需要购买板子的可给我留言

你可能感兴趣的:(飞控,传感器,STM32F4)