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

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));
*un_temp = (s32)((((u32)(a_data_u8[3]))<<12)| (((u32)(a_data_u8[4]))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;
}


微软内部对亚洲研究院的未来持有不同看法
采用PC、FPGA功能模块实现DAB发射系统编码器的设计与应用
OPPO在海外市场遭受挫折,欧洲市场面临激烈的竞争
采用DSP+FPGA构架实现高速图形帧存的设计方法
概述MEMS传感器市场的创新和发展
STM32开发的BMP180气压传感器程序源码
光计算的主要优势
与“OEM”共舞气质最搭的互联网公司,语音将会成车内交互的基础
英伟达以超过70亿美元的价格收购以色列芯片制造商Mellanox!
一张纸秒破手机指纹锁
京东企业购推出移动解决方案,突破移动端的技术空白
华为持续助力智慧水利水务建设
苹果提交AR挡风玻璃专利申请 苹果汽车月底“小批量送样”
数字交流闭环型调压器设计
5G标准的加速及外场试验如火如荼的开展中兴通讯也要不甘人后
4G向全IP网络进发,采用WiMax还是LTE?
蔚来创始人李斌:电动汽车的春天快到了
如何使用Python把图片变成文字
变频器在井下皮带机上的应用
电缆损耗