本帖最后由 freeelectron 于 2020-1-19 12:00 编辑
如题,代码详解压力传感器BM1383AGLV
1、基本特性 压阻式压力传感器
内置温度补偿 I2C接口
压力范围:300hPa~1100hPa
平均功耗:3uA
运行温度:-40℃~85℃
小封装:2.50mm *2.50mm*1.0mm 相对精度±0.12hPa, 绝对精度±1hPa
主要应用:智能手机、医疗保健、移动设备等
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通信是否正常、检测芯片是否存在。
可以看出,BM1383AGLV的ID是0x32E0。 - 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);
- }
复制代码
|