STM32F4 使用SPI讀取氣壓計MS5611的數據並轉化爲大氣壓強

ms5611是同時支持I2C和SPI通信協議的氣壓計芯片。已經很普遍的被用在飛行器控制板上作爲高度傳感器。開發過stm32的朋友都知道它的硬件I2C是由bug的,一般使用的都是自己編寫的軟件I2C通信協議。但是其硬件SPI通信卻是沒有問題的。SPI通信一般會比I2C通信快點。下面先從硬件上說明MS5611在選擇SPI的準備。
MS5611要選擇使用SPI通信首先需要做的就是把芯片的PS引腳置低。參考數據手冊如下:
這裏寫圖片描述
根據其設計的PCB原理圖如下:
這裏寫圖片描述
下面是主要代碼:
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中做出曲線如下圖:
這裏寫圖片描述
與工程代碼對應的硬件如下:
PCB正面PCB背面
該飛控板移植了MDK的cleanflight代碼,由於硬件跟cleanflight的並不完全一致,代碼有所改動,需要購買板子的可給我留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章