STM32开发的BMP180气压传感器程序源码

MEMS/传感技术

1280人已加入

描述

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);

if(BMP_IIC_Wait_Ack())

{

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;

}

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分