加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 實(shí)現(xiàn)目標(biāo)
    •  
    • 所需工具及環(huán)境
    • 本文素材
    • 傳感器簡(jiǎn)介
    • 傳感器特點(diǎn)
    • 應(yīng)用場(chǎng)景
    •  
    • 接線圖
    •  
    • 測(cè)量流程
    • 具體實(shí)現(xiàn)
    •  
    • 海拔高度的換算
    • 結(jié)果展示
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

可以計(jì)算海拔高度的BMP180氣壓傳感器,你會(huì)使用嗎?

2021/03/04
1743
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

需要測(cè)量大氣壓力、溫度和海拔高度的朋友可以玩玩BMP180這個(gè)傳感器。

這款傳感器出自博世,應(yīng)用非常廣泛。

實(shí)現(xiàn)目標(biāo)

  • 使用普通IO口模擬IIC總線驅(qū)動(dòng)BMP180傳感器利用核心板的串口1打印輸出芯片ID、當(dāng)前溫度和氣壓

 

所需工具及環(huán)境

所用模塊

 

Keil 5

 

STM32F103RET6核心板(本平臺(tái)自制專(zhuān)用核心板)

面包板及少許杜邦線

本文素材

公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字“BMP180”,獲取本模塊的STM32代碼及BMP180的芯片手冊(cè)。

傳感器簡(jiǎn)介

BMP180是Bosch Sensortec的一種高精度數(shù)字氣壓和溫度傳感器,使用BMP180可以測(cè)量環(huán)境溫度、壓力和高度。BMP180是超低功耗,低電壓的電子元件,經(jīng)過(guò)優(yōu)化,具有高精度和高穩(wěn)定性,適用于移動(dòng)電話,PDA,GPS導(dǎo)航設(shè)備和戶外設(shè)備。

它由壓阻傳感器、模數(shù)轉(zhuǎn)換器,帶E2PROM和串行I2C接口的控制單元組成。

BMP180提供未補(bǔ)償?shù)脑級(jí)毫χ岛蜏囟戎?,在E2PROM中存儲(chǔ)了176位的校準(zhǔn)參數(shù),使用這些參數(shù)可以補(bǔ)償傳感器的偏移量、溫度依賴(lài)性等參數(shù)。

傳感器特點(diǎn)

BOSCH BMP180是測(cè)量壓力和海拔高度最常用的傳感器之一。該模塊的特點(diǎn)如下:

壓力測(cè)量范圍為300至1100hPa(海拔9000米 ~ -500米)

芯片電壓1.8V~3.6V(VDDA),1.62V~3.6V(VDD),模塊的VIN輸入5V(3.3V亦可)

高精度:低功耗模式下,分辨率為0.06hPa(0.5米),高線性模式下,分辨率為0.03hPa(0.25米)

低功耗(標(biāo)準(zhǔn)模式下為5μA)

內(nèi)部溫度傳感器,精度為0.5°C

支持I2C協(xié)議進(jìn)行通信

溫度補(bǔ)償,完全校準(zhǔn)

注意:1Pa=0.01hPa=0.01mbar 。

應(yīng)用場(chǎng)景

  • GPS精準(zhǔn)導(dǎo)航(航位推算,上下橋檢測(cè)等)航模等一些需要高度數(shù)據(jù)的場(chǎng)合天氣預(yù)報(bào)垂直速度指示(上升/下沉速度)

 

接線圖

實(shí)物圖

 

具體接線圖

在myiic.h文件中,具體引腳定義如下:

#define IIC_SCL    PAout(6) //SCL
#define IIC_SDA    PAout(7) //輸出SDA  
#define READ_SDA   PAin(7)  //輸入SDA 

 

測(cè)量流程

具體實(shí)現(xiàn)

基礎(chǔ)源碼

 

寫(xiě)入數(shù)據(jù)

寫(xiě)入數(shù)據(jù)時(shí)序

開(kāi)始測(cè)量溫度值UT和壓力值UP的時(shí)序圖如下所示。

在啟動(dòng)后,主機(jī)發(fā)送器件地址,寄存器地址和控制寄存器數(shù)據(jù)。BMP180每接收8個(gè)數(shù)據(jù)位發(fā)送一個(gè)確認(rèn)(ACKS)。主機(jī)在最后一次ACKS后發(fā)送停止。

 

設(shè)備地址

寫(xiě)操作對(duì)應(yīng)地址0XEE(write) 

讀操作對(duì)應(yīng)地址0XEF(read)

相關(guān)寄存器

開(kāi)始溫度和壓力測(cè)量的寄存器地址為:0xF4;

寄存器0xF4的bit5為Sco,開(kāi)始測(cè)量位,當(dāng)該位為“1”的時(shí)候,數(shù)據(jù)正在轉(zhuǎn)換,當(dāng)轉(zhuǎn)換結(jié)束的時(shí)候該位為“0”;

寄存器0xF4的bit6~bit7為Oss,用于控制壓力測(cè)量的過(guò)采樣率, (00b: single,01b: 2 times, 10b: 4 times, 11b: 8 times).

軟件復(fù)位寄存器為:0xE0,如果該寄存器寫(xiě)入0xB6,則完成BMP180的軟件復(fù)位;

芯片ID寄存器為:0xD0,該值固定為0x55,讀出該值可以用于判斷I2C總線通訊是否正常。

多個(gè)字節(jié)的讀取

 

測(cè)量溫度和壓力

啟動(dòng)溫度和壓力測(cè)量的寄存器:0xF4,可以寫(xiě)入如下值:

 

測(cè)量溫度

由上表我們可以知道,要想測(cè)量溫度,需要往0xF4寄存器,寫(xiě)入值0x2E,即開(kāi)啟溫度測(cè)量,延時(shí)之后,讀取0xF6寄存器的值即可求得溫度值。

//從BMP180讀取未修正的溫度
long BMP_Read_UT(void)
{
 long temp = 0;
 BMP_WriteOneByte(0xF4,0x2E);
 
 delay_ms(5);
 temp = (long)BMP_ReadTwoByte(0xF6);
 return temp;
}

 

測(cè)量壓力

由上表我們可以知道,要想測(cè)量壓力,需要往0xF4寄存器,寫(xiě)入值0x34(oss值不同,此值不同),即開(kāi)啟壓力測(cè)量過(guò)程,延時(shí)之后,讀取0xF6寄存器的值即可求得壓力值。

//從BMP180讀取未修正的大氣壓
long BMP_Read_UP(void)
{
 long pressure = 0;
 
 BMP_WriteOneByte(0xF4,0x34);
 delay_ms(5);
 
 pressure = (long)BMP_ReadTwoByte(0xF6);
 pressure &= 0x0000FFFF;
 
 return pressure;
}

 

校準(zhǔn)系數(shù) Calibration coefficients

上面得到的溫度值和壓力值是未經(jīng)過(guò)校準(zhǔn)的值,如果要想得到相對(duì)準(zhǔn)確的值,需要經(jīng)過(guò)校準(zhǔn),校準(zhǔn)系數(shù)保存在E2PROM中。

BMP180中有一個(gè)176位的E2PROM,它被劃分為11個(gè)字(WORD),每個(gè)字16位,對(duì)應(yīng)11個(gè)校準(zhǔn)系數(shù),每個(gè)傳感器模塊都有單獨(dú)的系數(shù),在第一次計(jì)算溫度和壓力時(shí),主機(jī)讀取E2PROM數(shù)據(jù),通過(guò)讀取的值,看是否存在值為0x0000或者0XFFFF的字,可以判斷數(shù)據(jù)通訊是否正常。

根據(jù)上圖中寄存器的值,獲取校準(zhǔn)系數(shù)的函數(shù)如下,獲得的校準(zhǔn)系數(shù)保存至變量中待用:

//從BMP180的獲取校準(zhǔn)系數(shù)
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);
}

 

壓力和溫度的校準(zhǔn)流程

 

海拔高度的換算

BMP180傳感器提供溫度和壓力的絕對(duì)測(cè)量值,但不提供海拔高度的直接輸出。

由于大氣壓力隨高度升高而降低。

由上圖我們可知,氣壓與海平面的高度具有近似線性的反比,因此如果我們測(cè)量了某地的氣壓,我們可以使用簡(jiǎn)單的數(shù)學(xué)運(yùn)算從海平面計(jì)算海拔高度。

 

通過(guò)當(dāng)?shù)氐臍庀蠓?wù)中可以得到海平面壓力P0,利用傳感器讀取的壓力P和該海平面壓力P0的值,通過(guò)上面的公式可以計(jì)算傳感器所在位置的高度。

注意:海平面壓力P0的值不是固定的,跟所屬區(qū)域及環(huán)境溫度和天氣情況的變化而變化。

結(jié)果展示

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號(hào)『嵌入式從0到1』,號(hào)主:程序員小哈,是一個(gè)軟硬件全棧開(kāi)發(fā)工程師(12年工作經(jīng)驗(yàn)的老司機(jī)),電子發(fā)燒友論壇鴻蒙版塊版主,公眾號(hào)內(nèi)容專(zhuān)注于嵌入式學(xué)習(xí)。堅(jiān)持原創(chuàng),寫(xiě)有圖、有視頻的保姆級(jí)教程文章,篇篇有干貨。做一個(gè)講清楚,說(shuō)明白,大家學(xué)得會(huì)的交流平臺(tái)。