ROHM社区举办活动的时候拿到了评估的传感器,在Arduino上面跑过一次,今天再次拿出来用其他mcu跑一次,顺带总结一下。正品现货可以找ROHM原厂代理代理唯样,新人还有活动。
1、基本特性
压阻式气压传感器
内置温度补偿
I2C接口
压力范围:300hPa~1100hPa
平均功耗:3uA
运行温度:-40℃~85℃
小封装 :2.50mm2.50mm1.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);}
|