搜索
热搜: ROHM 模拟 车载
查看: 3074|回复: 1

【传感器试用】代码详解压力传感器BM1383AGLV使用

[复制链接]

该用户从未签到

11

主题

401

帖子

0

精华

金牌会员

最后登录
2022-1-27
发表于 2020-1-17 14:41:24 | 显示全部楼层 |阅读模式
本帖最后由 freeelectron 于 2020-1-19 12:00 编辑

如题,代码详解压力传感器BM1383AGLV
图片1.png
图片2.png
1、基本特性
压阻式压力传感器
内置温度补偿
I2C接口
压力范围:300hPa~1100hPa
平均功耗:3uA
运行温度:-40~85
小封装:2.50mm *2.50mm*1.0mm
相对精度±0.12hPa
绝对精度±1hPa
主要应用:智能手机、医疗保健、移动设备等

2、引脚描述
图片3.png

DREGVSS之间需要接一个旁路电容,大小为0.22uFVDD电源供电,VSSGNDSCLSDA用于I2C通讯,DRDY引脚一般用于触发mcu外部中断。

3、寄存器描述
图片4.png

4、软件设计
4.1寄存器定义以及参数设置定义
  1. #define BM1383AGLV_I2C_ADDR         0x5D

  2. #define BM1383AGLV_ID1               0x0F
  3. #define BM1383AGLV_ID2               0x10

  4. #define BM1383AGLV_PWR_DOWN       0x12
  5.           //PWR_DOWN[0]
  6.         #define POWER_DOWN               0x00
  7.         #define ACTIVE                      0x01
  8.           //Reserved[7:1]

  9. #define BM1383AGLV_RESET             0x13
  10.           //RSTB[0]
  11.         #define MEASUREMENT_RESET           0x00
  12.         #define MEASUREMENT_ACTIVE          0x01
  13.           //Reserved[7:1]

  14. #define BM1383AGLV_MODE_CONTROL     0x14
  15.           //mode [1:0]
  16.         #define  MODE_STAND_BY              0x00
  17.         #define  MODE_ONE_SHOT             0x01
  18.         #define  MODE_CONTINUOUS           0x02
  19.         #define  MODE_PROHIBITION           0x03
  20.           //Reserved[2]
  21.           //Reserved[3]
  22.         #define  DEFAULT_1                   0x08
  23.           //DRDY pin Enable[4]
  24.         #define  DRDY_PIN_ENABLE            0x10
  25.         #define  DRDY_PIN_DISABLE            0x00
  26.           //Set the average number of measurement data[7:5]
  27.         #define  AVE_NUM_1                  0x00
  28.         #define  AVE_NUM_2                  0x20
  29.         #define  AVE_NUM_4                  0x40
  30.         #define  AVE_NUM_8                  0x60
  31.         #define  AVE_NUM_16                 0x80
  32.         #define  AVE_NUM_32                 0xA0
  33.         #define  AVE_NUM_64                 0xC0
  34.         #define  AVE_NUM_INHIBIT             0xE0

  35. #define BM1383AGLV_STATUS            0x19
  36.           //Pressure and temperature measurement data ready bit[0]
  37.         #define DATA_OUTPUT_AVAILABLE        0x01
  38.         #define DATA_OUTPUT_NOT_AVAILABLE    0x00
  39.           //Reserved[7:1]

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

  45. #define BM1383AGLV_TEMPERATURE_MSB   0x1D
  46. #define BM1383AGLV_TEMPERATURE_LSB    0x1E
复制代码
4.2读取设备ID
设备ID一般都是一个固定值,芯片出厂的时候已经固化在芯片里面了,只读,可用于检测I2C通信是否正常、检测芯片是否存在。

图片5.png
可以看出,BM1383AGLVID0x32E0
  1. bool BM1383AGLVCheck(void)
  2. {
  3.   uint16 chip_id=0;
  4.   
  5.   chip_id=BM1383AGLV_ReadRegU16(BM1383AGLV_ID1);
  6.    
  7.   if(chip_id==0x32E0)
  8.   {
  9.     return true;
  10.   }
  11.   else
  12.   {
  13.     return false;
  14.   }
  15. }
复制代码


4.3芯片初始化设定
主要是3个寄存器POWER_DOWN(12h)RESET(13h) MODE_CONTROL(14h)、POWER_DOWN(12h)主要是设置芯片上电启动。
图片6.png
RESET(13h)主要设置芯片启动测量控制功能
图片7.png
MODE_CONTROL(14h)主要用于设置芯片测量模式、测量次数、以及是否使用DRDY引脚。

芯片手册中也给了启动流程,先是往寄存器12h中写入0x01,延时至少2ms之后,往寄存器13h中写入0x01即可。
图片8.png
图片9.png
  1.     void BM1383AGLVInit(void)
  2.     {

  3.     BM1383AGLV_WriteRegU8(BM1383AGLV_PWR_DOWN,ACTIVE);  

  4.     //设置芯片上电

  5.       _delay_ms(5);//延时必须大于2ms

  6.       BM1383AGLV_WriteRegU8(BM1383AGLV_RESET,MEASUREMENT_ACTIVE);  

  7.       //启动测量功能

  8.       BM1383AGLV_WriteRegU8(BM1383AGLV_MODE_CONTROL,MODE_CONTINUOUS|DEFAULT_1|DRDY_PIN_DISABLE|AVE_NUM_8);  

  9.       //持续测量模式、每次测量8次、不使能DRDY引脚

  10.     }
复制代码
4.4读取数据
读取数据之前,我们要先判断一下是否采样完成,涉及到寄存器STATUS(19h),当bit[0]1的时候,表示采样完成,可以读取数据
图片10.png
寄存器PRESSURE_MSB(1Ah) PRESSURE_LSB(1Bh)PRESSURE_LSB(Least 6bit) ( 1Ch ) 就是采样出的压力值,需要转换为实际的压力值。 图片11.png
寄存器TEMPERATURE_MSB(1Dh) TEMPERATURE_LSB(1Eh)是采样出的温度值,同样的需要转化为实际温度。 图片12.png
  1. void BM1383AGLVRead(void)
  2. {
  3.   uint32 pressure_count=0;
  4.   uint8 pressure_m , pressure_l,pressure_d;
  5.   float pressure;

  6.   uint32 temperture_count=0;
  7.   uint8 temperture_m , temperture_l;
  8.   float temperture;

  9. while(BM1383AGLV_ReadRegU8(BM1383AGLV_STATUS)&DATA_OUTPUT_AVAILABLE!=DATA_OUTPUT_AVAILABLE);
  10.   //等待当前测量完成
  11.   
  12.   pressure_m=BM1383AGLV_ReadRegU8(BM1383AGLV_PRESSURE_MSB);
  13.   pressure_l=BM1383AGLV_ReadRegU8(BM1383AGLV_PRESSURE_LSB);
  14.   pressure_d=BM1383AGLV_ReadRegU8(BM1383AGLV_PRESSURE_DEC);
  15.   
  16.   pressure_d=pressure_d>>2;//高6位有效
  17.   
  18.   pressure_count=pressure_m<<14;
  19.   pressure_count+=pressure_l<<6;
  20.   pressure_count+=pressure_d;

  21.   pressure=pressure_count/2048.0;

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

  23.   temperture_m=BM1383AGLV_ReadRegU8(BM1383AGLV_TEMPERATURE_MSB);
  24.   temperture_l=BM1383AGLV_ReadRegU8(BM1383AGLV_TEMPERATURE_LSB);
  25.   
  26.   temperture_count=temperture_m<<8;
  27.   temperture_count+=temperture_l;
  28.   
  29.   temperture=temperture_count/32.0;
  30.   
  31. printf(“Temperture:%f ℃\r\n”,temperture);
  32. }
复制代码
图片13.png









回复

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-5-6 14:07:08 | 显示全部楼层
有新代码吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-4-27 02:44 , Processed in 0.097723 second(s), 14 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表