BMP180是一款由BOSCH开发的数字压力传感器,IIC接口,压力测量范围可以从300hPa至1100hPa,测量海拔高度大约从9000m至-500m。工作电压范围在1.8V~3.6V,满足大部分单片机电平要求。功耗低,标准模式下单次采样功耗大约5uA。低噪声,在低功耗模式下,大约只有0.06hPa,超高分辨模式下只有0.02hPa。内置温度传感器,加上一些算法可以进行温度补偿。其他性能可以查看数据手册。
需要完整参数可以查看技术手册说明。
各模式的配置参数和电气特性如下:
校准参数和读取:
BMP180传感器有大量的出厂校准参数,利用这些参数和特点算法,可以很精准的得到我们想要的气压值。
参数寄存器表如下:
下面我们就可以读取温度和压力寄存器,获取当前未补偿的温度和压力值。以下是程序源代码截图:
以下是程序源代码:
主程序文件:
#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;
}
审核编辑:汤梓红
评论
查看更多