天天看點

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)

  • 簡介
  • 工作模式
  • 校準數值
  • 測試流程
    • 第一步:微處理器讀取校準數值
    • 第二步:讀取溫度、氣壓初始值
    • 第三步:計算溫度、氣壓
    • 第四步:計算海拔高度
  • 測試結果
  • 擷取工程源碼

簡介

BMP180是一款高精度的氣壓傳感器,具有低功耗、低噪聲等特點,廣泛使用在氣壓、海拔測量。其内部附帶溫度傳感器,可對氣壓測量值進行補償,使用I2C通信方式。此次用到的器件有:STM32最小系統闆、BMP180氣壓傳感器子產品。

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

工作模式

BMP180共有四種工作模式,每種模式有不同的采樣數量、轉換速度和噪聲等參數的不同。可以通過寫入ctrl_meas寄存器來設定模式,預設為第一個ultra low power超低功耗。

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼
BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

校準數值

BMP180的氣壓和溫度數值并不是可以直接讀取的,每個不同的傳感器中,都有自己獨特的校準數值,存儲在内置的E2PROM存儲器中。當微處理器讀取傳感器的原始溫度和氣壓數值後,再根據E2PROM中的校準數值進行轉換,才能得到真正的溫度、氣壓資料。每個校準數值的存儲位置如下,微處理器通過這些位址讀取校準數值。

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

測試流程

工程建立非常簡單,使用STM32CubeMX直接生成,隻用到了I2C通信和序列槽顯示結果。配置圖如下

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

第一步:微處理器讀取校準數值

把16位的校準數值讀取到微處理器中,可以看到一共有11個數值。需要注意的是高位存儲在MSB位址,低位存儲在LSB位址。例如數值AC1,高八位存儲在0xAA位址,低八位存儲在0xAB位址。

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼
void bmp180_get_cal_param(){
		bmp_param.AC1 = Reg_Read16(EEPROM_ADDR_MSB[0],EEPROM_ADDR_LSB[0]);
		bmp_param.AC2 = Reg_Read16(EEPROM_ADDR_MSB[1],EEPROM_ADDR_LSB[1]);
		bmp_param.AC3 = Reg_Read16(EEPROM_ADDR_MSB[2],EEPROM_ADDR_LSB[2]);
		bmp_param.AC4 = Reg_Read16(EEPROM_ADDR_MSB[3],EEPROM_ADDR_LSB[3]);
		bmp_param.AC5 = Reg_Read16(EEPROM_ADDR_MSB[4],EEPROM_ADDR_LSB[4]);
		bmp_param.AC6 = Reg_Read16(EEPROM_ADDR_MSB[5],EEPROM_ADDR_LSB[5]);
		bmp_param.B1 = Reg_Read16(EEPROM_ADDR_MSB[6],EEPROM_ADDR_LSB[6]);
		bmp_param.B2 = Reg_Read16(EEPROM_ADDR_MSB[7],EEPROM_ADDR_LSB[7]);
		bmp_param.MB = Reg_Read16(EEPROM_ADDR_MSB[8],EEPROM_ADDR_LSB[8]);
		bmp_param.MC = Reg_Read16(EEPROM_ADDR_MSB[9],EEPROM_ADDR_LSB[9]);
		bmp_param.MD = Reg_Read16(EEPROM_ADDR_MSB[10],EEPROM_ADDR_LSB[10]);
}
           

第二步:讀取溫度、氣壓初始值

溫度初始值讀取步驟:(1)往寄存器0xf4寫入0x2e,等待4、5ms;(2)讀0xf6(高八位)和0xf7(低八位)兩個寄存器;(3)進行換算: UT=MSB <<8 +LSB。

氣壓初始值讀取步驟:(1)往寄存器0xf4寫入0x34(如果不是預設的工作模式,需要加上oss左移六位的結果,oss為設定工作模式的寄存器0xf4的bit7、bit6位),等待4、5ms;(2)讀0xf6(16-23位)、0xf7(8-15位)和0xf8(0-7位)三個寄存器;(3)進行換算: UP=MSB <<16 + LSB<<8 + XLSB >> (8-oss(這個同溫度初始值讀取一樣))。

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

UT讀取

uint8_t data = 0x2e;
	
		HAL_I2C_Mem_Write (&hi2c1 ,DEVICE_ADDER ,CTRL_MEAS ,1,&data ,1,1000);	
		
		HAL_Delay(10);	
	
		int32_t UT = Reg_Read16(0xf6,0xf7);
           

UP讀取

data = 0x34;
	
		HAL_I2C_Mem_Write (&hi2c1 ,DEVICE_ADDER ,CTRL_MEAS ,1,&data ,1,1000);
	
		HAL_Delay(10);
	
		int32_t UP = Reg_Read32(0xf6,0xf7,0xf8) >> 8 ;
           

第三步:計算溫度、氣壓

根據第一步讀出來的校準系數和第二步讀出來的UT、UP進行換算,最後得出來的T(溫度,每個數值代表0.1攝氏度),p(氣壓,每個數值代表1帕)。具體過程如下圖

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

溫度換算

int32_t X1 = (UT-bmp_param.AC6)* bmp_param.AC5 >> 15;
	
		int32_t X2 = (bmp_param.MC << 11) / (X1 + bmp_param.MD);
	
		int32_t T = (X1 + X2 +8) >> 4 ;
           

氣壓換算(比較複雜)

int32_t B6 = X1 + X2 - 4000;
		
		X1 = (B6 * B6 >> 12) * bmp_param.B2 >> 11;
		
		X2 = bmp_param.AC2 * B6 >> 11;
		
		int32_t X3 = X1 + X2;
		
		int32_t B3 = (((bmp_param.AC1 << 2) + X3) + 2) >> 2;

		X1 = bmp_param.AC3 * B6 >> 13;
		
		X2 = (B6 * B6 >> 12) * bmp_param.B1 >> 16;
		
		X3 = (X1 + X2 + 2) >> 2; 
		
		uint32_t B4 = bmp_param.AC4 * (uint32_t)(X3 + 32768) >> 15;

		uint32_t B7 = ((uint32_t)UP - B3) * 50000;
		
		int32_t p;
		if(B7 < 0x80000000){
				p = (B7 << 1) / B4;  
		}else{
				p = B7/B4 << 1;
		}
		
		X1 = (p >> 8) * (p >> 8);
		
		X1 = (X1 * 3038) >> 16;
		
		X2 = (-7375 * p) >> 16;
		
		p = p + ((X1 + X2 + 3791) >> 4);
           

第四步:計算海拔高度

根據手冊提供公式,可以根據氣壓計算出海拔高度,但此式過于複雜。

在3000M範圍内,每升高12M,大氣壓減小1mmHg,大約133Pa。0海拔高度大約是101325 pa,是以據此可以進行簡單近似的計算:altitude = (101325 - p) /133 * 12。

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

測試結果

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

不同樓層的高度

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

這是最低功耗,也是精度最低的工作模式。可以看見精度并不是非常的高,但可以滿足一般測量。如需要精度高的測量可以試一下其它工作模式。

擷取工程源碼

關注公衆号,檢視相關文章擷取源碼

BMP180氣壓傳感器詳解與示例(STM32 附帶源碼)簡介工作模式校準數值測試流程測試結果擷取工程源碼

繼續閱讀