单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:7114|回复:0
打印上一主题下一主题

BMP280规格书及Arduino测试程序及原理图

[复制链接]
跳转到指定楼层
楼主
ID:614685发表于 2019-9-22 15:47|只看该作者|只看大图回帖奖励
含BMP280详细的英文规格书  bmp280.pdf
原理图
成品组件图片
Arduino 测试源程序
文件有:Adafruit_BMP280.h   Adafruit_Sensor.h   library.properties  Adafruit_BMP280.cpp  .gitignore README.md  bmp280test.ino

电路原理图如下:


Arduino源程序如下:
  1. /***************************************************************************
  2.   This is a library for the BMP280 pressure sensor

  3.   Designed specifically to work with the Adafruit BMP280 Breakout

  4.   These sensors use I2C to communicate, 2 pins are required to interface.

  5.   Adafruit invests time and resources providing this open source code,
  6.   please support Adafruit andopen-source hardware by purchasing products
  7.   from Adafruit!

  8.   Written by Kevin Townsend for Adafruit Industries.  
  9.   BSD license, all text above must be included in any redistribution
  10. ***************************************************************************/
  11. #include "Arduino.h"
  12. #include< Wire.h>
  13. #include< SPI.h>
  14. #include "Adafruit_BMP280.h"

  15. static bmp280_calib_data bmp280_calib;

  16. /***************************************************************************
  17. PRIVATE FUNCTIONS
  18. ***************************************************************************/


  19. Adafruit_BMP280::Adafruit_BMP280()
  20.   : _cs(-1), _mosi(-1), _miso(-1), _sck(-1)
  21. { }

  22. Adafruit_BMP280::Adafruit_BMP280(int8_t cspin)
  23.   : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1)
  24. { }

  25. Adafruit_BMP280::Adafruit_BMP280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin)
  26.   : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin)
  27. { }


  28. bool Adafruit_BMP280::begin(uint8_t a) {
  29.   _i2caddr = a;

  30.   if (_cs == -1) {
  31.    // i2c
  32.    Wire.begin();
  33.   } else {
  34.    digitalWrite(_cs, HIGH);
  35.    pinMode(_cs, OUTPUT);

  36.    if (_sck == -1) {
  37.      // hardware SPI
  38.      SPI.begin();
  39.    } else {
  40.      // software SPI
  41.      pinMode(_sck, OUTPUT);
  42.      pinMode(_mosi, OUTPUT);
  43.      pinMode(_miso, INPUT);
  44.    }
  45.   }

  46.   if (read8(BMP280_REGISTER_CHIPID) != 0x58)
  47.    return false;

  48.   readCoefficients();
  49.   write8(BMP280_REGISTER_CONTROL, 0x3F);
  50.   return true;
  51. }

  52. uint8_t Adafruit_BMP280::spixfer(uint8_t x) {
  53.   if (_sck == -1)
  54.    return SPI.transfer(x);
  55.   
  56.   // software spi
  57.   //Serial.println("Software SPI");
  58.   uint8_t reply = 0;
  59.   for (int i=7; i>=0; i--) {
  60.    reply<< = 1;
  61.    digitalWrite(_sck, LOW);
  62.    digitalWrite(_mosi, x& (1<<i));
  63.    digitalWrite(_sck, HIGH);
  64.    if (digitalRead(_miso))
  65.      reply |= 1;
  66.   }
  67.   return reply;
  68. }

  69. /**************************************************************************/
  70. /*!
  71.    @brief  Writes an 8 bit value over I2C/SPI
  72. */
  73. /**************************************************************************/
  74. void Adafruit_BMP280::write8(byte reg, byte value)
  75. {
  76.   if (_cs == -1) {
  77.    Wire.beginTransmission((uint8_t)_i2caddr);
  78.    Wire.write((uint8_t)reg);
  79.    Wire.write((uint8_t)value);
  80.    Wire.endTransmission();
  81.   } else {
  82.    if (_sck == -1)
  83.      SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
  84.    digitalWrite(_cs, LOW);
  85.    spixfer(reg& ~0x80); // write, bit 7 low
  86.    spixfer(value);
  87.    digitalWrite(_cs, HIGH);
  88.    if (_sck == -1)
  89.      SPI.endTransaction();           // release the SPI bus
  90.   }
  91. }

  92. /**************************************************************************/
  93. /*!
  94.    @brief  Reads an 8 bit value over I2C
  95. */
  96. /**************************************************************************/
  97. uint8_t Adafruit_BMP280::read8(byte reg)
  98. {
  99.   uint8_t value;
  100.   
  101.   if (_cs == -1) {
  102.    Wire.beginTransmission((uint8_t)_i2caddr);
  103.    Wire.write((uint8_t)reg);
  104.    Wire.endTransmission();
  105.    Wire.requestFrom((uint8_t)_i2caddr, (byte)1);
  106.    value = Wire.read();
  107.    Wire.endTransmission();
  108.   } else {
  109.    if (_sck == -1)
  110.      SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
  111.    digitalWrite(_cs, LOW);
  112.    spixfer(reg | 0x80); // read, bit 7 high
  113.    value = spixfer(0);
  114.    digitalWrite(_cs, HIGH);
  115.    if (_sck == -1)
  116.      SPI.endTransaction();           // release the SPI bus
  117.   }
  118.   return value;
  119. }

  120. /**************************************************************************/
  121. /*!
  122.    @brief  Reads a 16 bit value over I2C
  123. */
  124. /**************************************************************************/
  125. uint16_t Adafruit_BMP280::read16(byte reg)
  126. {
  127.   uint16_t value;

  128.   if (_cs == -1) {
  129.    Wire.beginTransmission((uint8_t)_i2caddr);
  130.    Wire.write((uint8_t)reg);
  131.    Wire.endTransmission();
  132.    Wire.requestFrom((uint8_t)_i2caddr, (byte)2);
  133.    value = (Wire.read()<< 8) | Wire.read();
  134.    Wire.endTransmission();
  135.   } else {
  136.    if (_sck == -1)
  137.      SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0));
  138.    digitalWrite(_cs, LOW);
  139.    spixfer(reg | 0x80); // read, bit 7 high
  140.    value = (spixfer(0)<< 8) | spixfer(0);
  141.    digitalWrite(_cs, HIGH);
  142.    if (_sck == -1)
  143.      SPI.endTransaction();           // release the SPI bus
  144.   }

  145.   return value;
  146. }

  147. uint16_t Adafruit_BMP280::read16_LE(byte reg) {
  148.   uint16_t temp = read16(reg);
  149.   return (temp >> 8) | (temp<< 8);
  150.   
  151. }

  152. /**************************************************************************/
  153. /*!
  154.    @brief  Reads a signed 16 bit value over I2C
  155. */
  156. /**************************************************************************/
  157. int16_t Adafruit_BMP280::readS16(byte reg)
  158. {
  159.   return (int16_t)read16(reg);

  160. }

  161. int16_t Adafruit_BMP280::readS16_LE(byte reg)
  162. {
  163.   return (int16_t)read16_LE(reg);

  164. }

  165. /**************************************************************************/
  166. /*!
  167.    @brief  Reads the factory-set coefficients
  168. */
  169. /**************************************************************************/
  170. void Adafruit_BMP280::readCoefficients(void)
  171. {
  172.    bmp280_calib.dig_T1 = read16_LE(BMP280_REGISTER_DIG_T1);
  173.    bmp280_calib.dig_T2 = readS16_LE(BMP280_REGISTER_DIG_T2);
  174.    bmp280_calib.dig_T3 = readS16_LE(BMP280_REGISTER_DIG_T3);

  175.    bmp280_calib.dig_P1 = read16_LE(BMP280_REGISTER_DIG_P1);
  176.    bmp280_calib.dig_P2 = readS16_LE(BMP280_REGISTER_DIG_P2);
  177.    bmp280_calib.dig_P3 = readS16_LE(BMP280_REGISTER_DIG_P3);
  178.    bmp280_calib.dig_P4 = readS16_LE(BMP280_REGISTER_DIG_P4);
  179.    bmp280_calib.dig_P5 = readS16_LE(BMP280_REGISTER_DIG_P5);
  180.    bmp280_calib.dig_P6 = readS16_LE(BMP280_REGISTER_DIG_P6);
  181.    bmp280_calib.dig_P7 = readS16_LE(BMP280_REGISTER_DIG_P7);
  182.    bmp280_calib.dig_P8 = readS16_LE(BMP280_REGISTER_DIG_P8);
  183.    bmp280_calib.dig_P9 = readS16_LE(BMP280_REGISTER_DIG_P9);
  184. }

  185. /**************************************************************************/
  186. /*!

  187. */
  188. /**************************************************************************/
  189. float Adafruit_BMP280::readTemperature(void)
  190. {
  191.   int32_t var1, var2;
  192.   
  193.   int32_t adc_T = read16(BMP280_REGISTER_TEMPDATA);
  194.   adc_T<< = 8;
  195.   adc_T |= read8(BMP280_REGISTER_TEMPDATA+2);
  196.   adc_T >>= 4;

  197.   var1  = ((((adc_T>>3) - ((int32_t)bmp280_calib.dig_T1<< 1))) *
  198.        ((int32_t)bmp280_calib.dig_T2)) >> 11;

  199.   var2  = (((((adc_T>>4) - ((int32_t)bmp280_calib.dig_T1)) *
  200.          ((adc_T>>4) - ((int32_t)bmp280_calib.dig_T1))) >> 12) *
  201.        ((int32_t)bmp280_calib.dig_T3)) >> 14;

  202.   t_fine = var1 + var2;

  203.   float T  = (t_fine * 5 + 128) >> 8;
  204.   return T/100;
  205. }

  206. /**************************************************************************/
  207. /*!

  208. */
  209. /**************************************************************************/
  210. float Adafruit_BMP280::readPressure(void) {
  211.   int64_t var1, var2, p;
  212.   
  213.   int32_t adc_P = read16(BMP280_REGISTER_PRESSUREDATA);
  214.   adc_P<< = 8;
  215.   adc_P |= read8(BMP280_REGISTER_PRESSUREDATA+2);
  216.   adc_P >>= 4;

  217.   var1 = ((int64_t)t_fine) - 128000;
  218.   var2 = var1 * var1 * (int64_t)bmp280_calib.dig_P6;
  219.   var2 = var2 + ((var1*(int64_t)bmp280_calib.dig_P5)<<17);
  220.   var2 = var2 + (((int64_t)bmp280_calib.dig_P4)<<35);
  221.   var1 = ((var1 * var1 * (int64_t)bmp280_calib.dig_P3)>>8) +
  222.    ((var1 * (int64_t)bmp280_calib.dig_P2)<<12);
  223.   var1 = (((((int64_t)1)<<47)+var1))*((int64_t)bmp280_calib.dig_P1)>>33;
  224.   
  225.   if (var1 == 0) {
  226.    return 0;  // avoid exception caused by division by zero
  227.   }
  228.   p = 1048576 - adc_P;
  229.   p = (((p<<31) - var2)*3125) / var1;
  230.   var1 = (((int64_t)bmp280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25;
  231.   var2 = (((int64_t)bmp280_calib.dig_P8) * p) >> 19;

  232.   p = ((p + var1 + var2) >> 8) + (((int64_t)bmp280_calib.dig_P7)<<4);
  233.   return (float)p/256;
  234. }
复制代码

所有资料51hei提供下载:
GY-BMP280-3.3.zip(2.11 MB, 下载次数: 52)



评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网