BMP180是一款由BOSCH開發(fā)的數(shù)字壓力傳感器,IIC接口,壓力測量范圍可以從300hPa至1100hPa,測量海拔高度大約從9000m至-500m。工作電壓范圍在1.8V~3.6V,滿足大部分單片機(jī)電平要求。功耗低,標(biāo)準(zhǔn)模式下單次采樣功耗大約5uA。低噪聲,在低功耗模式下,大約只有0.06hPa,超高分辨模式下只有0.02hPa。內(nèi)置溫度傳感器,加上一些算法可以進(jìn)行溫度補(bǔ)償。其他性能可以查看數(shù)據(jù)手冊。
需要完整參數(shù)可以查看技術(shù)手冊說明。
各模式的配置參數(shù)和電氣特性如下:
校準(zhǔn)參數(shù)和讀取:
BMP180傳感器有大量的出廠校準(zhǔn)參數(shù),利用這些參數(shù)和特點(diǎn)算法,可以很精準(zhǔn)的得到我們想要的氣壓值。
參數(shù)寄存器表如下:
下面我們就可以讀取溫度和壓力寄存器,獲取當(dāng)前未補(bǔ)償?shù)臏囟群蛪毫χ怠R韵率浅绦蛟创a截圖:
以下是程序源代碼:
主程序文件:
#include "bmp280.h"
s32 bmp280_temp;
u32 bmp280_press;
int main(void)
{
delay_init();? ? ??
NVIC_Configuration();?
uart_init(9600);? ? ?
BMP_IIC_Init();
BMP280_Init();?
while(1)
{
BMP280_ReadPressureTemperature(&bmp280_press,&bmp280_temp);
delay_ms(500);
printf("bmp280_press:%d ",bmp280_press);
delay_ms(500);
printf("bmp280_temp :%d ",bmp280_temp);
}
}
bmp280傳感器程序文件:
void BMP280_GPIO_Init(void)
{
GPIO_InitTypeDef? GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);? ? ? ? ? GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;? ? GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;? ?
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
u8 BMP280_Chack(void)
{
u16 time = 0;
u8 chip_ID = 0;
while(time<1000)
{
chip_ID = BMP280_Read_Byte(BMP280_CHIPID_REG);
if(chip_ID==0x57||chip_ID==0x58||chip_ID==0x59)break;
else time++;
delay_ms(1);
}
if(time==1000)return 1;
else?
{
p_bmp280.chip_id = chip_ID;
return 0;
}
}
u8 BMP280_ReadPressureTemperature(u32 *press, s32 *temp)
{
s32 un_press = 0;
s32 un_temp = 0;
u8 res=0;
res=BMP280_ReadUncompPressureTemperature(&un_press,&un_temp);
*temp = BMP280_CompensateTemperatureInt32(un_temp);
*press = BMP280_CompensatePressureInt32(un_press);
return res;
}
u8 BMP280_ReadUncompPressureTemperature(s32 *un_press, s32 *un_temp)
{
u8 a_data_u8[6] = {0,0,0,0,0,0},res = 0;
res = BMP280_Read_Len(BMP280_PRESSURE_MSB_REG,6,a_data_u8);
*un_press = (s32)((((u32)(a_data_u8[0]))<<12)|(((u32)(a_data_u8[1]))<<4)|((u32)a_data_u8[2]>>4));
*un_temp = (s32)((((u32)(a_data_u8[3]))<<12)| (((u32)(a_data_u8[4]))<<4)|((u32)a_data_u8[5]>>4));
return res;
}
u8 BMP_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
u8 i;?
BMP_IIC_Start();?
BMP_IIC_Send_Byte((addr<<1)|0);
{
BMP_IIC_Stop();?
return 1;
}
? ? BMP_IIC_Send_Byte(reg);
? ? BMP_IIC_Wait_Ack();
for(i=0;i
{
BMP_IIC_Send_Byte(buf[i]);
if(BMP_IIC_Wait_Ack())
{
BMP_IIC_Stop();?
return 1;?
}
}? ??
BMP_IIC_Stop();?
return 0;
}?
u8 BMP_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{?
?BMP_IIC_Start();?
BMP_IIC_Send_Byte((addr<<1)|0);
if(BMP_IIC_Wait_Ack())
{
BMP_IIC_Stop();?
return 1;
}
? ? BMP_IIC_Send_Byte(reg);
? ? BMP_IIC_Wait_Ack();
? ? BMP_IIC_Start();
BMP_IIC_Send_Byte((addr<<1)|1);
? ? BMP_IIC_Wait_Ack();
while(len)
{
if(len==1)*buf=BMP_IIC_Read_Byte(0);?
else *buf=BMP_IIC_Read_Byte(1);?
len--;
buf++;?
}? ??
? ? BMP_IIC_Stop();
return 0;
}
u8 BMP_Write_Byte(u8 addr,u8 reg,u8 data) ?
{?
? ? BMP_IIC_Start();?
BMP_IIC_Send_Byte((addr<<1)|0);
if(BMP_IIC_Wait_Ack())
{
BMP_IIC_Stop();?
return 1;
}
? ? BMP_IIC_Send_Byte(reg);
? ? BMP_IIC_Wait_Ack();?
BMP_IIC_Send_Byte(data);
if(BMP_IIC_Wait_Ack())
{
BMP_IIC_Stop();?
return 1;?
}?
? ? BMP_IIC_Stop();?
return 0;
}
u8 BMP_Read_Byte(u8 addr,u8 reg)
{
u8 res;
? ? BMP_IIC_Start();?
BMP_IIC_Send_Byte((addr<<1)|0);
BMP_IIC_Wait_Ack();?
? ? BMP_IIC_Send_Byte(reg);
? ? BMP_IIC_Wait_Ack();
? ? BMP_IIC_Start();
BMP_IIC_Send_Byte((addr<<1)|1);
? ? BMP_IIC_Wait_Ack();
res=BMP_IIC_Read_Byte(0);
? ? BMP_IIC_Stop();
return res;
}
審核編輯:湯梓紅
評論
查看更多