原创 BMP085气压传感器基于arduino平台教程

2011-9-28 14:03 10191 1 1 分类: MCU/ 嵌入式

BMP085是一款高精度、超低能耗的压力传感器,可以应用在移动设备中。它的性能卓越,绝对精度最低可以达到0.03hPa,并且耗电极低,只有3μABMP085采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连。

主要特点:

压力范围:300 ... 1100hPa(海拔9000...-500米)

电源电压:1.8V ... 3.6VVDDA 1.62V ... 3.6VVDDD

LCC8封装: 无铅陶瓷载体封装(LCC

寸: 5.0mmx5.0*1.2mm

低功耗: 5μA 在标准模式

高精度:低功耗模式下,分辨率为0.06hPa0.5米), 高线性模式下,分辨率为0.03hPa0.25米)

反应时间:7.5ms

待机电流:0.1μA无需外部时钟电路

典型应用: 1.GPS精确导航(航位推算,上下桥检测等)2.室内室外导航3.休闲、体育和医疗健康等监测4.天气预报5.垂直速度指示(上升/下沉速度)6.风扇功率控制

硬件说明

20110928140220001.jpg

BMP085 Breakout Board一共有6个引脚:'SDA', 'SCL', 'XCLR', 'EOC', 'GND’,'VCC’SDASCLI2C总线引脚;XCLRmaster的复位引脚,低有效,如果把它与地相连,就可以复位BMP085ECO意为 ”end of conversion”BMP085的压力或温度转换完成时触发产生的信号。XCLRECO是可选的2个信号,如果不需要用它,则可以不连接。20110928140221002.jpg

值得注意的是,BMP085能承受的VCC最大电压为3.6V,当你用arduino时,请注意选择3.3V供电。

如何进行温度和压力的测量?

BMP085是通过I2C总线arduino相连,连接方式如图所示:

20110928140226003.jpg

20110928140227004.jpg

这里,我们可以不连接XCLR EOC对测量没有影响。接下来,compile arduino程序,uploadarduino开发板上,点击20110928140227005.jpg打开串口,就可以看见当前的温度和大气压强。

20110928140229006.jpg

 

代码如下:

/*

  Get pressure and temperature from the BMP085.

  Serial.print it out at 9600 baud to serial monitor.

*/

 

#include <Wire.h>

 

#define BMP085_ADDRESS 0x77  // I2C address of BMP085

 

const unsigned char OSS = 0;  // Oversampling Setting

 

// Calibration values

int ac1;

int ac2;

int ac3;

unsigned int ac4;

unsigned int ac5;

unsigned int ac6;

int b1;

int b2;

int mb;

int mc;

int md;

 

// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)

// so ...Temperature(...) must be called before ...Pressure(...).

long b5;

 

short temperature;

long pressure;

 

void setup()

{

  Serial.begin(9600);

  Wire.begin();

  bmp085Calibration();

}

 

void loop()

{

  temperature = bmp085GetTemperature(bmp085ReadUT());

  pressure = bmp085GetPressure(bmp085ReadUP());

  Serial.print("Temperature: ");

  Serial.print(temperature, DEC);

  Serial.println(" *0.1 deg C");

  Serial.print("Pressure: ");

  Serial.print(pressure, DEC);

  Serial.println(" Pa");

  Serial.println();

  delay(1000);

}

 

// Stores all of the bmp085's calibration values into global variables

// Calibration values are required to calculate temp and pressure

// This function should be called at the beginning of the program

void bmp085Calibration()

{

  ac1 = bmp085ReadInt(0xAA);

  ac2 = bmp085ReadInt(0xAC);

  ac3 = bmp085ReadInt(0xAE);

  ac4 = bmp085ReadInt(0xB0);

  ac5 = bmp085ReadInt(0xB2);

  ac6 = bmp085ReadInt(0xB4);

  b1 = bmp085ReadInt(0xB6);

  b2 = bmp085ReadInt(0xB8);

  mb = bmp085ReadInt(0xBA);

  mc = bmp085ReadInt(0xBC);

  md = bmp085ReadInt(0xBE);

}

 

// Calculate temperature given ut.

// Value returned will be in units of 0.1 deg C

short bmp085GetTemperature(unsigned int ut)

{

  long x1, x2;

 

  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;

  x2 = ((long)mc << 11)/(x1 + md);

  b5 = x1 + x2;

 

  return ((b5 + 8)>>4); 

}

 

// Calculate pressure given up

// calibration values must be known

// b5 is also required so bmp085GetTemperature(...) must be called first.

// Value returned will be pressure in units of Pa.

long bmp085GetPressure(unsigned long up)

{

  long x1, x2, x3, b3, b6, p;

  unsigned long b4, b7;

 

  b6 = b5 - 4000;

  // Calculate B3

  x1 = (b2 * (b6 * b6)>>12)>>11;

  x2 = (ac2 * b6)>>11;

  x3 = x1 + x2;

  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

 

  // Calculate B4

  x1 = (ac3 * b6)>>13;

  x2 = (b1 * ((b6 * b6)>>12))>>16;

  x3 = ((x1 + x2) + 2)>>2;

  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

 

  b7 = ((unsigned long)(up - b3) * (50000>>OSS));

  if (b7 < 0x80000000)

    p = (b7<<1)/b4;

  else

    p = (b7/b4)<<1;

   

  x1 = (p>>8) * (p>>8);

  x1 = (x1 * 3038)>>16;

  x2 = (-7357 * p)>>16;

  p += (x1 + x2 + 3791)>>4;

 

  return p;

}

 

// Read 1 byte from the BMP085 at 'address'

char bmp085Read(unsigned char address)

{

  unsigned char data;

 

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(address);

  Wire.endTransmission();

 

  Wire.requestFrom(BMP085_ADDRESS, 1);

  while(!Wire.available())

    ;

   

  return Wire.receive();

}

 

// Read 2 bytes from the BMP085

// First byte will be from 'address'

// Second byte will be from 'address'+1

int bmp085ReadInt(unsigned char address)

{

  unsigned char msb, lsb;

 

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(address);

  Wire.endTransmission();

 

  Wire.requestFrom(BMP085_ADDRESS, 2);

  while(Wire.available()<2)

    ;

  msb = Wire.receive();

  lsb = Wire.receive();

 

  return (int) msb<<8 | lsb;

}

 

// Read the uncompensated temperature value

unsigned int bmp085ReadUT()

{

  unsigned int ut;

 

  // Write 0x2E into Register 0xF4

  // This requests a temperature reading

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(0xF4);

  Wire.send(0x2E);

  Wire.endTransmission();

 

  // Wait at least 4.5ms

  delay(5);

 

  // Read two bytes from registers 0xF6 and 0xF7

  ut = bmp085ReadInt(0xF6);

  return ut;

}

 

// Read the uncompensated pressure value

unsigned long bmp085ReadUP()

{

  unsigned char msb, lsb, xlsb;

  unsigned long up = 0;

 

  // Write 0x34+(OSS<<6) into register 0xF4

  // Request a pressure reading w/ oversampling setting

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(0xF4);

  Wire.send(0x34 + (OSS<<6));

  Wire.endTransmission();

 

  // Wait for conversion, delay time dependent on OSS

  delay(2 + (3<<OSS));

 

  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)

  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.send(0xF6);

  Wire.endTransmission();

  Wire.requestFrom(BMP085_ADDRESS, 3);

 

  // Wait for data to become available

  while(Wire.available() < 3)

    ;

  msb = Wire.receive();

  lsb = Wire.receive();

  xlsb = Wire.receive();

 

  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);

 

  return up;

}

 

 

 

无锡速腾固态数据科技有限公司

地址:江苏省无锡市新区太湖国际科技园菱湖大道200号微纳传感网国际创新园A

邮编: 214028

联系电话:0510-85387391

传真:0510-85387691

Email: sales@soliddigi.com

公司网址www.Soliddigi.com

淘宝FPGA XC3S1000开发板购买地址http://item.taobao.com/item.htm?id=10915682920&

公司全球电子产品展销平台 http://www.soliddepot.com

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
1
关闭 站长推荐上一条 /3 下一条