壓力BMP180傳感器時序詳解

本文參考自: 原文地址

BMP180是一種高精度數字壓力傳感器,BMP180的超低功耗,低電壓電子元件經過優化,適用於移動電話,PDA,GPS導航設備和戶外設備。

UP =壓力數據(16到19位) UT =溫度數據(16位)

採用標準的I2C總線傳輸方式,在手冊裏面【BMP10手冊點擊打開鏈接】有流程圖:開始-開始測量溫度-等待4.5ms-讀溫度-開始測量壓力-等待(看模式)-讀壓力-計算溫度與壓力單元

測量溫度和壓力

開始測量溫度值UT和壓力值UP的時序圖如下所示。在啓動後,主機發送器件地址寫入,寄存器地址和控制寄存器數據。當接收到數據時,BMP180每8個數據位發送一個確認(ACKS)。主機在最後一次ACKS後發送停止條件。


程序爲:

/寫一個數據到BMP180
void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
{
IIC_Start(); //發送起始信號
IIC_Send_Byte(0xEE); //芯片的地址+寫信號
IIC_Wait_Ack(); //等待應答
IIC_Send_Byte(WriteAddr); //內部寄存器地址
IIC_Wait_Ack(); //等待應答
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack(); //等待應答
IIC_Stop(); //發送停止信號

}

爲了讀出溫度數據字UT(16位),壓力數據字UP(16到19位)和E2PROM數據如下進行:

在啓動後,主機發送模塊地址寫入命令和寄存器地址。寄存器地址選擇讀取寄存器:E2PROM數據寄存器0xAA至0xBF溫度或壓力值UT或UP 0xF6(MSB),0xF7(LSB),可選0xF8(XLSB)然後,主設備發送重啓條件,然後讀取模塊地址,BMP180(ACKS)將對其進行確認。BMP180首先發送8個MSB,由主設備(ACKM)確認,然後是8個LSB。主機發送“不確認”(NACKM),最後發送停止條件。時序爲:


//從BMP180讀一個字節數據
uint8_t BMP_ReadOneByte(uint8_t ReadAddr)
{
uint8_t data = 0;
IIC_Start(); //發送起始信號
IIC_Send_Byte(0xEE); //芯片的地址+寫信號
IIC_Wait_Ack(); //等待應答
IIC_Send_Byte(ReadAddr); //內部寄存器地址
IIC_Wait_Ack(); //等待應答
IIC_Start(); //發送起始信號
IIC_Send_Byte(0xEF); //地址+讀信號
IIC_Wait_Ack(); //等待應答
data = IIC_Read_Byte(1);
IIC_Stop(); //發送停止信號
return data;

}

//從BMP180讀一個16位的數據

short BMP_ReadTwoByte(uint8_t ReadAddr)
{
short data;
uint8_t msb,lsb;
IIC_Start();   //發送起始信號
IIC_Send_Byte(0xEE); // 芯片的地址+寫信號
IIC_Wait_Ack(); //等待應答
IIC_Send_Byte(ReadAddr);
IIC_Wait_Ack(); //等待應答
IIC_Start();  // 發送起始信號
IIC_Send_Byte(0xEF); // 地址+讀信號
IIC_Wait_Ack(); //等待應答
msb = IIC_Read_Byte(1);
lsb = IIC_Read_Byte(0);
IIC_Stop(); //發送停止信號
data = msb*256 + lsb;
return data;

}

下圖顯示了壓力和溫度測量的詳細算法。


//從BMP180的獲取計算參數
void BMP_ReadCalibrationData(void)
{
bmp180.AC1 = BMP_ReadTwoByte(0xAA);
bmp180.AC2 = BMP_ReadTwoByte(0xAC);
bmp180.AC3 = BMP_ReadTwoByte(0xAE);
bmp180.AC4 = BMP_ReadTwoByte(0xB0);
bmp180.AC5 = BMP_ReadTwoByte(0xB2);
bmp180.AC6 = BMP_ReadTwoByte(0xB4);
bmp180.B1  = BMP_ReadTwoByte(0xB6);
bmp180.B2  = BMP_ReadTwoByte(0xB8);
bmp180.MB  = BMP_ReadTwoByte(0xBA);
bmp180.MC  = BMP_ReadTwoByte(0xBC);
bmp180.MD  = BMP_ReadTwoByte(0xBE);
}
//從BMP180讀取未修正的溫度
long BMP_Read_UT(void)
{
long temp = 0;
BMP_WriteOneByte(0xF4,0x2E);
delay_ms(5);
temp = (long)BMP_ReadTwoByte(0xF6);
return temp;
}
//從BMP180讀取未修正的大氣壓
long BMP_Read_UP(void)
{
long pressure = 0;
BMP_WriteOneByte(0xF4,0x34);
delay_ms(5);
pressure = (long)BMP_ReadTwoByte(0xF6);
//pressure = pressure + BMP_ReadOneByte(0xf8);
pressure &= 0x0000FFFF;
return pressure;

}

//用獲取的參數對溫度和大氣壓進行修正,並計算海拔
void BMP_UncompemstatedToTrue(void)
{
bmp180.UT = BMP_Read_UT();//第一次讀取錯誤
bmp180.UT = BMP_Read_UT();//進行第二次讀取修正參數
bmp180.UP = BMP_Read_UP();
bmp180.X1 = ((bmp180.UT - bmp180.AC6) * bmp180.AC5) >> 15;
bmp180.X2 = (((long)bmp180.MC) << 11) / (bmp180.X1 + bmp180.MD);
bmp180.B5 = bmp180.X1 + bmp180.X2;
bmp180.Temp  = (bmp180.B5 + 8) >> 4;
bmp180.B6 = bmp180.B5 - 4000;
bmp180.X1 = ((long)bmp180.B2 * (bmp180.B6 * bmp180.B6 >> 12)) >> 11;
bmp180.X2 = ((long)bmp180.AC2) * bmp180.B6 >> 11;
bmp180.X3 = bmp180.X1 + bmp180.X2;
bmp180.B3 = ((((long)bmp180.AC1) * 4 + bmp180.X3) + 2) /4;
bmp180.X1 = ((long)bmp180.AC3) * bmp180.B6 >> 13;
bmp180.X2 = (((long)bmp180.B1) *(bmp180.B6*bmp180.B6 >> 12)) >>16;
bmp180.X3 = ((bmp180.X1 + bmp180.X2) + 2) >> 2;
bmp180.B4 = ((long)bmp180.AC4) * (unsigned long)(bmp180.X3 + 32768) >> 15;
bmp180.B7 = ((unsigned long)bmp180.UP - bmp180.B3) * 50000;
if(bmp180.B7 < 0x80000000)
{
bmp180.p = (bmp180.B7 * 2) / bmp180.B4;
}
else
{
bmp180.p = (bmp180.B7 / bmp180.B4) * 2;
}
bmp180.X1 = (bmp180.p >> 8) * (bmp180.p >>8);
bmp180.X1 = (((long)bmp180.X1) * 3038) >> 16;
bmp180.X2 = (-7357 * bmp180.p) >> 16;
bmp180.p = bmp180.p + ((bmp180.X1 + bmp180.X2 + 3791) >> 4);
bmp180.altitude = 44330 * (1-pow(((bmp180.p) / 101325.0),(1.0/5.255)));  

}

【本文參閱點擊打開鏈接

發佈了39 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章