1赞

1回答

1收藏

麒麟座MINI开发板--BMP085数字压力传感器

物联网 物联网 4678 人阅读 | 1 人回复 | 2017-10-24

    最近几天一直在看FreeRTOS的东西,今天抽了点时间把手头的数字压力传感器模块GY-65连接到麒麟座MINI开发板上测试了下,主要实现了温度,气压,海拔高度的OLED显示和串口打印显示。
    1.GY-65气压模块简介
     GY-65气压模块是一块数字气压检测模块,它内部采用了BOSCH博世生产的BMP085数字压力传感器。
     该模块的主要特性如下:
  • 压力范围:300 - 1100hPa(海拔9000米至-500米)
  • 电源电压:1.8V - 3.6V(VDDA)
  • 1.62V - 3.6V(VDDD)
  • 低功耗: 5μA 在标准模式
  • 高精度: 低功耗模式下,分辨率为0.06hPa(0.5米)
  • 高线性模式下,分辨率为0.03hPa(0.25米)
  • 含温度输出
  • I2C接口
  • 温度补偿
  2.   GY-65气压模块实物图及内部电路图




   3.GY-65模块与麒麟座MINI开发板连接及实际显示
    由于模块是I2C接口,所以直接和开发板上的I2C接口相连
    SCL-->PB10
    SDA-->PB11





     
    GY-65模块输出的压力值为96Kpa(27层楼),而当地的实时气压为102Kpa(墨迹天气提供),测量传感器所处海拔高度的有一定的影响。另外实测高度440m,而根据所在地位置查询出的海拔高度410米,楼层高度约80米,误差还是挺大的。
  4.GY-65模块数据手册及代码
   
BMP085.pdf (822.98 KB, 下载次数: 1)

   
BMP085_Flyer_Rev.0.2_March2008.pdf (553.22 KB, 下载次数: 1)

    BMP085的STM32驱动代码来源于网络,在这里我贴出来,有兴趣的可以看下。
  1. #include "math.h"
  2. short ac1;
  3. short ac2;
  4. short ac3;
  5. unsigned short ac4;
  6. unsigned short ac5;
  7. unsigned short ac6;
  8. short b1;
  9. short b2;
  10. short mb;
  11. short mc;
  12. short md;

  13. void delay5ms(void)
  14. {
  15.                
  16.    int i=5000;  
  17.    while(i)
  18.    {
  19.      i--;
  20.    }  
  21. }
  22. //***************************************************

  23. void Single_Write_BMP085(unsigned char REG_Address,unsigned char REG_data)
  24. {
  25.     i2c_Start();                 //起始信号
  26.     i2c_SendByte(BMP085_ADDRESS);   //发送设备地址+写信号
  27.           i2c_WaitAck();
  28.     i2c_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf
  29.           i2c_WaitAck();
  30.     i2c_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf
  31.           i2c_WaitAck();
  32.     i2c_Stop();                   //发送停止信号
  33. }

  34. //********单字节读取内部寄存器*************************
  35. unsigned char Single_Read_BMP085(unsigned char REG_Address)
  36. {   unsigned char REG_data;
  37.     i2c_Start();                         //起始信号
  38.     i2c_SendByte(BMP085_ADDRESS);           //发送设备地址+写信号
  39.           i2c_WaitAck();
  40.     i2c_SendByte(REG_Address);                   //发送存储单元地址,从0开始
  41.           i2c_WaitAck();        
  42.     i2c_Start();                         //起始信号
  43.     i2c_SendByte(BMP085_ADDRESS+1);         //发送设备地址+读信号
  44.           i2c_WaitAck();
  45.     REG_data=i2c_ReadByte(0);              //读出寄存器数据  
  46.           i2c_Stop();                         //停止信号
  47.     return REG_data;
  48. }

  49. //******************************************************
  50. //
  51. //连续读出HMC5883内部角度数据,地址范围0x3~0x5
  52. //
  53. //******************************************************
  54. short Multiple_read_BMP085(unsigned char REG_Address)
  55. {   unsigned char msb,lsb;
  56.     short _data;
  57.     i2c_Start();                          //起始信号
  58.     i2c_SendByte(BMP085_ADDRESS);           //发送设备地址+写信号
  59.           i2c_WaitAck();
  60.     i2c_SendByte(REG_Address);                   //发送存储单元地址,从0x3开始
  61.           i2c_WaitAck();        
  62.     i2c_Start();                          //起始信号
  63.     i2c_SendByte(BMP085_ADDRESS+1);         //发送设备地址+读信号
  64.           i2c_WaitAck();
  65.     msb=i2c_ReadByte(1);
  66.           lsb=i2c_ReadByte(0);
  67.     i2c_Stop();                          //停止信号
  68.           delay5ms();
  69.           _data=(msb<<8)|lsb;
  70.           return(_data);        
  71. }
  72. //********************************************************************
  73. long BMP085ReadTemp(void)
  74. {
  75.     long Temperature = 0;
  76.     i2c_Start();                  //起始信号
  77.     i2c_SendByte(BMP085_ADDRESS);   //发送设备地址+写信号
  78.           i2c_WaitAck();
  79.     i2c_SendByte(0xF4);                  // write register address
  80.           i2c_WaitAck();
  81.     i2c_SendByte(0x2E);               // write register data for temp
  82.           i2c_WaitAck();
  83.     i2c_Stop();                    //发送停止信号
  84.           Temperature = Multiple_read_BMP085(0xF6);
  85.           return Temperature ;
  86. }
  87. //*************************************************************
  88. long BMP085ReadPressure(void)
  89. {
  90.         long pressure = 0;
  91.   uint8_t pressureX[3];

  92.     i2c_Start();                   //起始信号
  93.     i2c_SendByte(BMP085_ADDRESS);   //发送设备地址+写信号
  94.           i2c_WaitAck();
  95.     i2c_SendByte(0xF4);                  // write register address
  96.           i2c_WaitAck();
  97.     i2c_SendByte(0x34);                 // write register data for pressure
  98.           i2c_WaitAck();
  99.     i2c_Stop();
  100.         
  101.           pressureX[0]= Multiple_read_BMP085(0xF6);
  102.     pressureX[1]= Multiple_read_BMP085(0xF7);
  103.     pressureX[2]= Multiple_read_BMP085(0xF8);
  104.           pressure = (((long)pressureX[0]<<16)+((long)pressureX[1]<<8)+((long)pressureX[2]))>>8; //////////////////////////////////////////////////////////////
  105.         
  106.           return pressure;        
  107. }

  108. //**************************************************************

  109. //初始化BMP085,根据需要请参考pdf进行修改**************
  110. void Init_BMP085()
  111. {
  112.         ac1 = Multiple_read_BMP085(0xAA);
  113.         ac2 = Multiple_read_BMP085(0xAC);
  114.         ac3 = Multiple_read_BMP085(0xAE);
  115.         ac4 = Multiple_read_BMP085(0xB0);
  116.         ac5 = Multiple_read_BMP085(0xB2);
  117.         ac6 = Multiple_read_BMP085(0xB4);
  118.         b1 =  Multiple_read_BMP085(0xB6);
  119.         b2 =  Multiple_read_BMP085(0xB8);
  120.         mb =  Multiple_read_BMP085(0xBA);
  121.         mc =  Multiple_read_BMP085(0xBC);
  122.         md =  Multiple_read_BMP085(0xBE);
  123. }

  124. void BMP085Convert(BMP085_Data_TypeDef *BMP085_Data)
  125. {
  126.         unsigned int ut;
  127.         unsigned long up;
  128.         long x1, x2, b5, b6, x3, b3, p;
  129.         unsigned long b4, b7;
  130. double dat_temp;
  131. double dat_temp1;
  132.         ut =  BMP085ReadTemp();           // ????
  133.         up = BMP085ReadPressure();  // ????
  134.         x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  135.         x2 = ((long) mc << 11) / (x1 + md);
  136.         b5 = x1 + x2;
  137.         BMP085_Data->temp = (b5 + 8) >> 4;
  138.   BMP085_Data->temp = BMP085_Data->temp/10;

  139.         //*************
  140.         
  141.         
  142.         b6 = b5 - 4000;
  143.         // Calculate B3
  144.         x1 = (b2 * (b6 * b6)>>12)>>11;
  145.         x2 = (ac2 * b6)>>11;
  146.         x3 = x1 + x2;
  147.         b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  148.         
  149.         // Calculate B4
  150.         x1 = (ac3 * b6)>>13;
  151.         x2 = (b1 * ((b6 * b6)>>12))>>16;
  152.         x3 = ((x1 + x2) + 2)>>2;
  153.         b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
  154.         
  155.         b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  156.         if (b7 < 0x80000000)
  157.         p = (b7<<1)/b4;
  158.         else
  159.         p = (b7/b4)<<1;
  160.         
  161.         x1 = (p>>8) * (p>>8);
  162.         x1 = (x1 * 3038)>>16;
  163.         x2 = (-7357 * p)>>16;
  164.   p= p + ((x1 + x2 + 3791) >> 4);
  165.   BMP085_Data->pres= p/1000;

  166.   dat_temp1=(double)p/101325;
  167.   dat_temp=pow(dat_temp1,0.1903);
  168.   BMP085_Data->altitude=(double)44330*(1-dat_temp)/10;   //   
  169. }

复制代码
5.后续计划
    尽快掌握FreeRTOS的应用,把前面所用的传感器整合起来,接入ONENET平台。

   
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

ky123

发表于 2017-10-26 14:18:57 | 只看该作者

你之前是不是比较忙?
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条