爱板网论坛

查看: 160|回复: 1

[中移One NET] 麒麟座MINI开发板--BMP085数字压力传感器

[复制链接]

4

主题

0

好友

95

积分

童生

Rank: 2

  • TA的每日心情
    开心
    2017-11-5 21:25
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-10-24 22:35:58 |显示全部楼层
        最近几天一直在看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气压模块实物图及内部电路图

    bmp085模块

     bmp085模块


    电路图

    电路图


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


    bmp085模块实物

     bmp085模块实物

    bmp085数据显示

     bmp085数据显示

    串口显示

    串口显示

         
        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平台。

       
    回复

    使用道具 举报

    23

    主题

    10

    好友

    3182

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2017-10-26 14:18:57 |显示全部楼层
    你之前是不是比较忙?
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-11-21 08:42 , Processed in 0.429669 second(s), 16 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部