注册/登录
论坛 > 板卡试用区
发帖|
看2939|回4|收藏
小马哥-1650185 看全部
2018-11-20 21:21:15
本帖最后由 小马哥-1650185 于 2018-11-20 21:46 编辑

气压传感器顾名思义就是测量大气压强的,应该是比较常见的传感器。

模块使用BM1383AGLV,BM1383AGLV是压阻式压力传感器。BM1383AGLV负责温度补偿MEMS内部芯片,所以很容易得到压力信息。测量范围是 300hPa to 1100hPa。

实物图:
3.jpg

参考电路:
4.jpg

封装及引脚信息
5.jpg
模块电路及pcb
1.jpg 2.jpg

寄存器介绍
6.jpg
控制寄存器
7.jpg
初始化配置寄存器

代码:

  1. byte BM1383AGLV::init(void)
  2. {
  3.   byte rc;
  4.   unsigned char reg;

  5.   rc = read(BM1383AGLV_ID, ®, sizeof(reg));
  6.   if (rc != 0) {
  7.     Serial.println(F("Can't access BM1383AGLV"));
  8.     return (rc);
  9.   }
  10.   Serial.print(F("BM1383AGLV ID Register Value = 0x"));
  11.   Serial.println(reg, HEX);

  12.   if (reg != BM1383AGLV_ID_VAL) {
  13.     Serial.println(F("Can't find BM1383AGLV"));
  14.     return (rc);
  15.   }

  16.   reg = BM1383AGLV_POWER_DOWN_VAL;
  17.   rc = write(BM1383AGLV_POWER_DOWN, ®, sizeof(reg));
  18.   if (rc != 0) {
  19.     Serial.println(F("Can't write BM1383AGLV POWER_DOWN register"));
  20.     return (rc);
  21.   }

  22.   delay(WAIT_BETWEEN_POWER_DOWN_AND_RESET);

  23.   reg = BM1383AGLV_RESET_VAL;
  24.   rc = write(BM1383AGLV_RESET, ®, sizeof(reg));
  25.   if (rc != 0) {
  26.     Serial.println(F("Can't write BM1383AGLV RESET register"));
  27.     return (rc);
  28.   }

  29.   reg = BM1383AGLV_MODE_CONTROL_VAL;
  30.   rc = write(BM1383AGLV_MODE_CONTROL, ®, sizeof(reg));
  31.   if (rc != 0) {
  32.     Serial.println(F("Can't write BM1383AGLV MODE_CONTROL register"));
  33.     return (rc);
  34.   }

  35.   delay(WAIT_TMT_MAX);

  36.   return (rc);
  37. }

压力数据寄存器

8.jpg

转换公式:
9.jpg

0x1A~0x1C中的压力数据必须连续读取,否则会产生数据混淆。

温度寄存器:
10.jpg

转换公式:
11.jpg

温度数据同样需要连续读取。

代码:

  1. byte BM1383AGLV::get_rawval(unsigned char *data)
  2. {
  3.   byte rc;

  4.   rc = read(BM1383AGLV_PRESSURE_MSB, data, GET_BYTE_PRESS_TEMP);
  5.   if (rc != 0) {
  6.     Serial.println(F("Can't get BM1383AGLV PRESS and TEMP value"));
  7.   }

  8.   return (rc);
  9. }

  10. byte BM1383AGLV::get_val(float *press, float *temp)
  11. {
  12.   byte rc;
  13.   unsigned char val[GET_BYTE_PRESS_TEMP];
  14.   unsigned long rawpress;
  15.   short rawtemp;

  16.   rc = get_rawval(val);
  17.   if (rc != 0) {
  18.     return (rc);
  19.   }

  20.   rawpress = (((unsigned long)val[0] << 16) | ((unsigned long)val[1] << 8) | (val[2]&0xFC)) >> 2;

  21.   if (rawpress == 0) {
  22.     return (-1);
  23.   }

  24.   *press = (float)rawpress / HPA_PER_COUNT;

  25.   rawtemp = ((short)val[3] << 8) | val[4];

  26.   if (rawtemp == 0) {
  27.     return (-1);
  28.   }

  29.   *temp = (float)rawtemp / DEGREES_CELSIUS_PER_COUNT;

  30.   return (rc);
  31. }

最后我们看到串口打印结果:

12.jpg
波形数据

13.jpg



feifei21 看全部
2018-11-21 09:05:10
好这个  
微风→寒 看全部
2018-11-21 10:19:07
666                  
stary666 看全部
2018-11-21 12:40:14
看看 logo.png
stary666 看全部
2018-11-21 12:40:38
不错

罗姆半导体技术社区

Powered by Discuz! X3.4

首页|标准版|触屏版|电脑版