罗姆(ROHM)低功耗气压传感器BM1383AGLV

ROHM社区举办活动的时候拿到了评估的传感器,在Arduino上面跑过一次,今天再次拿出来用其他mcu跑一次,顺带总结一下。


1、基本特性

  • 压阻式气压传感器
  • 内置温度补偿
  • I2C接口
  • 压力范围:300hPa~1100hPa
  • 平均功耗:3uA
  • 运行温度:-40℃~85℃
  • 小封装    :2.50mm *2.50mm*1.0mm
  • 相对精度:±0.12hPa
  • 绝对精度:±1hPa
  • 主要应用:智能手机、医疗保健、移动设备等

2、引脚描述

DREG和VSS之间需要接一个旁路电容,大小为0.22uF;

VDD电源供电,VSS接GND,SCL、SDA用于I2C通讯,DRDY引脚一般用于触发mcu外部中断。


3、寄存器描述


4、软件设计

4.1、寄存器定义以及参数设置定义

#define BM1383AGLV_I2C_ADDR          0x5D

#define BM1383AGLV_ID1               0x0F
#define BM1383AGLV_ID2               0x10

#define BM1383AGLV_PWR_DOWN          0x12
          //PWR_DOWN[0]
        #define POWER_DOWN                  0x00
        #define ACTIVE                      0x01 
          //Reserved[7:1]

#define BM1383AGLV_RESET             0x13
          //RSTB[0]
        #define MEASUREMENT_RESET           0x00
        #define MEASUREMENT_ACTIVE          0x01
          //Reserved[7:1]

#define BM1383AGLV_MODE_CONTROL      0x14
          //mode [1:0]
        #define  MODE_STAND_BY              0x00
        #define  MODE_ONE_SHOT              0x01
        #define  MODE_CONTINUOUS            0x02
        #define  MODE_PROHIBITION           0x03
          //Reserved[2]
          //Reserved[3]
        #define  DEFAULT_1                  0x08
          //DRDY pin Enable[4]
        #define  DRDY_PIN_ENABLE            0x10
        #define  DRDY_PIN_DISABLE           0x00
          //Set the average number of measurement data[7:5]
        #define  AVE_NUM_1                  0x00
        #define  AVE_NUM_2                  0x20
        #define  AVE_NUM_4                  0x40
        #define  AVE_NUM_8                  0x60
        #define  AVE_NUM_16                 0x80
        #define  AVE_NUM_32                 0xA0
        #define  AVE_NUM_64                 0xC0
        #define  AVE_NUM_INHIBIT            0xE0

#define BM1383AGLV_STATUS            0x19
          //Pressure and temperature measurement data ready bit[0]
        #define DATA_OUTPUT_AVAILABLE       0x01
        #define DATA_OUTPUT_NOT_AVAILABLE   0x00
          //Reserved[7:1]

#define BM1383AGLV_PRESSURE_MSB      0x1A
#define BM1383AGLV_PRESSURE_LSB      0x1B
#define BM1383AGLV_PRESSURE_DEC      0x1C
          //Pressure data output (decimal extension 6bit)[7:2]
          //Reserved[1:0]

#define BM1383AGLV_TEMPERATURE_MSB   0x1D
#define BM1383AGLV_TEMPERATURE_LSB   0x1E

4.2、读取芯片ID

设备ID一般都是一个固定值,芯片出厂的时候已经固化在芯片里面了,只读,可用于检测I2C通信是否正常、检测芯片是否存在。

bool BM1383AGLVCheck(void)
{
  uint16 chip_id=0;
  
  chip_id=BM1383AGLV_ReadRegU16(BM1383AGLV_ID1);
    
  if(chip_id==0x32E0)
  {
    return true;
  }
  else
  {
    return false;
  }
}

4.3、芯片初始化设置

主要是3个寄存器POWER_DOWN(12h)RESET(13h) MODE_CONTROL(14h),其中

POWER_DOWN(12h)主要是设置芯片上电启动:

RESET(13h)主要设置芯片启动测量控制功能:

MODE_CONTROL(14h)主要用于设置芯片测量模式、测量次数、以及是否使用DRDY引脚

芯片手册中也给了启动流程,先是往寄存器12h中写入0x01,延时至少2ms之后,往寄存器13h中写入0x01即可:

void BM1383AGLVInit(void)
{
    BM1383AGLV_WriteRegU8(BM1383AGLV_PWR_DOWN,ACTIVE);  
    //设置芯片上电
    _delay_ms(5);//延时必须大于2ms
    BM1383AGLV_WriteRegU8(BM1383AGLV_RESET,MEASUREMENT_ACTIVE);  
    //启动测量功能
    BM1383AGLV_WriteRegU8(BM1383AGLV_MODE_CONTROL,MODE_CONTINUOUS|DEFAULT_1|
                                                           DRDY_PIN_DISABLE|AVE_NUM_8);  
    //持续测量模式、每次测量8次、不使能DRDY引脚
}

4.4、读取数据

读取数据之前,我们要先判断一下是否采样完成,涉及到寄存器STATUS(19h),当bit[0]为1的时候,表示采样完成,可以读取数据:

寄存器PRESSURE_MSB(1Ah) PRESSURE_LSB(1Bh)PRESSURE_LSB(Least 6bit) ( 1Ch ) 就是采样出的压力值,需要转换为实际的压力值:

寄存器TEMPERATURE_MSB(1Dh) TEMPERATURE_LSB(1Eh)是采样出的温度值,同样的需要转化为实际温度:

void BM1383AGLVRead(void)
{
  uint32 pressure_count=0;
  uint8 pressure_m , pressure_l,pressure_d;
  float pressure;

  uint32 temperture_count=0;
  uint8 temperture_m , temperture_l;
  float temperture;

 
  while(BM1383AGLV_ReadRegU8(BM1383AGLV_STATUS)&DATA_OUTPUT_AVAILABLE
                                            !=DATA_OUTPUT_AVAILABLE);//等待当前测量完成
  
  pressure_m=BM1383AGLV_ReadRegU8(BM1383AGLV_PRESSURE_MSB);
  pressure_l=BM1383AGLV_ReadRegU8(BM1383AGLV_PRESSURE_LSB);
  pressure_d=BM1383AGLV_ReadRegU8(BM1383AGLV_PRESSURE_DEC);
  
  pressure_d=pressure_d>>2;//高6位有效
  
  pressure_count=pressure_m<<14;
  pressure_count+=pressure_l<<6;
  pressure_count+=pressure_d;
 
  pressure=pressure_count/2048.0;

  printf(“Pressure:%.2f hPa\r\n”,pressure); 

  temperture_m=BM1383AGLV_ReadRegU8(BM1383AGLV_TEMPERATURE_MSB);
  temperture_l=BM1383AGLV_ReadRegU8(BM1383AGLV_TEMPERATURE_LSB);
  
  temperture_count=temperture_m<<8;
  temperture_count+=temperture_l;
  
  temperture=temperture_count/32.0;
  
  printf(“Temperture:%f ℃\r\n”,temperture); 
}

4.5、测试读取数据

4.6、进入休眠

void BM1383AGLVSleep(void)
{
   BM1383AGLV_WriteRegU8(BM1383AGLV_RESET,MEASUREMENT_RESET);
   _delay_ms(5);
   BM1383AGLV_WriteRegU8(BM1383AGLV_PWR_DOWN,POWER_DOWN);  
}
发布了35 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/freemote/article/details/102478090