请选择 进入手机版 | 继续访问电脑版
搜索
热搜: ROHM 模拟 车载
查看: 5039|回复: 6

【传感器试用】代码详解三轴磁传感器BM1422AGMV使用

  [复制链接]

该用户从未签到

11

主题

401

帖子

0

精华

金牌会员

最后登录
2022-1-27
发表于 2020-1-19 10:26:58 | 显示全部楼层 |阅读模式
本帖最后由 freeelectron 于 2020-1-19 11:59 编辑

1、基本特征
l 3轴磁阻磁传感器
l I2C接口
l 12bit/14bit数字输出
l 灵敏度:0.042μT/LSB(Typ)
l 测量范围:±1200μT(Typ)  (备注:1T=10000G,±1200μT=±12G)
l 工作温度范围: -40°C to +85°C
l 封装:MLGA010V020A 2.00mm x 2.00mm x 1.00mm
l 工作电流(100SPS): 0.15mA(Typ)

2、引脚描述
图片1.png
ADDR:用于编程I2C地址;DRDY:中断引脚,一般接在mcu的外部中断引脚上。

3、I2C地址
图片2.png
  I2C地址取决于ADDR引脚
ADDR
7bit addr
8bit addr
0
0x0E
0x1C
1
0x0F
0x1E

4、寄存器列表
图片3.png

5、程序编写
5.1、寄存器以及设置参数定义

  1. #define BM1422AGMV_ADDR_PIN  0

  2. #if BM1422AGMV_ADDR_PIN     
  3.     #define BM1422AGMV_I2C_ADDR       0x1E
  4.     #define BM1422AGMV_I2C_7BIT_ADDR  0x0F
  5. #else
  6.     #define BM1422AGMV_I2C_ADDR       0x1C
  7.     #define BM1422AGMV_I2C_7BIT_ADDR  0x0E
  8. #endif

  9. #define  BM1422AGMV_INFO_L           0x0D
  10. #define  BM1422AGMV_INFO_M           0x0E
  11. #define  BM1422AGMV_WIA              0x0F  //0x41

  12. #define  BM1422AGMV_DATAX_L          0x10
  13. #define  BM1422AGMV_DATAX_M          0x11

  14. #define  BM1422AGMV_DATAY_L          0x12
  15. #define  BM1422AGMV_DATAY_M          0x13

  16. #define  BM1422AGMV_DATAZ_L          0x14
  17. #define  BM1422AGMV_DATAZ_M          0x15

  18. #define  BM1422AGMV_STA1             0x18
  19.         //bit[7] reserver
  20.         //bit[6] RD_DRDY
  21.      #define   BM1422AGMV_RD_DRDY     0x40
  22.      #define   BM1422AGMV_RD_NOT      0x00   
  23.         //bit[5:0] reserver

  24. #define  BM1422AGMV_CNT1             0x1B
  25.         //bit[7] PC1
  26.      #define   BM1422AGMV_PC1_PD         0x00
  27.      #define   BM1422AGMV_PC1_ACTIVE     0x80
  28.         //bit[6] OUT_BIT
  29.      #define   BM1422AGMV_OUT_BIT_12     0x00
  30.      #define   BM1422AGMV_OUT_BIT_14     0x40
  31.         //bit[5] RST_LV
  32.      #define   BM1422AGMV_RST_LV_RST_RE  0x00
  33.      #define   BM1422AGMV_RST_LV_RST     0x20
  34.         //bit[4:3]ODR
  35.      #define   BM1422AGMV_ODR_10HZ       0x00
  36.      #define   BM1422AGMV_ODR_20HZ       0x10
  37.      #define   BM1422AGMV_ODR_100HZ      0x08
  38.      #define   BM1422AGMV_ODR_1000HZ     0x18
  39.         //bit[2] reserve
  40.         //bit[1] FS1
  41.      #define   BM1422AGMV_FS1_CON        0x00
  42.      #define   BM1422AGMV_FS1_SIG        0x02
  43.         //bit[0] reserve

  44. #define  BM1422AGMV_CNT2             0x1C
  45.         //bit[7:4]reserver
  46.         //bit[3] DREN
  47.       #define  BM1422AGMV_DREN_DIS       0x00
  48.       #define  BM1422AGMV_DREN_EN        0x08
  49.         //bit[2] DRP
  50.       #define  BM1422AGMV_DRP_LOW        0x00
  51.       #define  BM1422AGMV_DRP_HIGH       0x04
  52.         //bit[1:0] reserver

  53. #define  BM1422AGMV_CNT3             0x1D
  54.         //bit[7]reserver
  55.         //bit[6]FORCE
  56.       #define  BM1422AGMV_FORCE_START    0x40
  57.         //bit[5:0]reserver

  58. #define  BM1422AGMV_AVE_A            0x40
  59.         //bit[7:5]reserver
  60.         //bit[4:2] AVE_A
  61.       #define  BM1422AGMV_AVE_A_4        0x00
  62.       #define  BM1422AGMV_AVE_A_1        0x04
  63.       #define  BM1422AGMV_AVE_A_8        0x0C
  64.       #define  BM1422AGMV_AVE_A_16       0x10
  65.         //bit[1:0]reserver

  66. #define  BM1422AGMV_CNT4_L           0x5C
  67. #define  BM1422AGMV_CNT4_M           0x5D

  68. #define  BM1422AGMV_TEMP_L           0x60
  69. #define  BM1422AGMV_TEMP_M           0x61

  70. #define  BM1422AGMV_OFF_X_L          0x6C
  71. #define  BM1422AGMV_OFF_X_M          0x6D

  72. #define  BM1422AGMV_OFF_Y_L          0x72
  73. #define  BM1422AGMV_OFF_Y_M          0x73

  74. #define  BM1422AGMV_OFF_Z_L          0x78
  75. #define  BM1422AGMV_OFF_Z_M          0x79

  76. #define  BM1422AGMV_FINEOUTPUTX_L    0x90
  77. #define  BM1422AGMV_FINEOUTPUTX_M    0x91

  78. #define  BM1422AGMV_FINEOUTPUTY_L    0x92
  79. #define  BM1422AGMV_FINEOUTPUTY_M    0x93

  80. #define  BM1422AGMV_FINEOUTPUTZ_L    0x94
  81. #define  BM1422AGMV_FINEOUTPUTZ_M    0x95

  82. #define  BM1422AGMV_GAIN_PARA_X_Z    0x9C
  83. #define  BM1422AGMV_GAIN_PARA_X_Y    0x9D

  84. #define  BM1422AGMV_GAIN_PARA_Y_Z    0x9E
  85. #define  BM1422AGMV_GAIN_PARA_Y_X    0x9F

  86. #define  BM1422AGMV_GAIN_PARA_Z_Y    0xA0
  87. #define  BM1422AGMV_GAIN_PARA_Z_X    0xA1
复制代码

5.2、读取设备ID
设备ID一般都是一个固定值,芯片出厂的时候已经固化在芯片里面了,只读,可用于检测I2C通信是否正常、检测芯片是否存在。
图片4.png
  1. bool BM1422AGMVCheck(void)
  2. {
  3.   uint8 chip_id=0;
  4.   
  5.   chip_id=BM1422AGMV_ReadRegU8(BM1422AGMV_WIA);

  6.   if(chip_id==0x41)
  7.   {
  8.     return true;
  9.   }
  10.   else
  11.   {
  12.     return false;
  13.   }
  14. }
复制代码

5.3、传感器初始化设定
图片5.png
图片6.png
图片7.png
图片8.png
  1. void  BM1422AGMVInit(void)
  2. {
  3.   BM1422AGMV_WriteRegU8(BM1422AGMV_CNT1,BM1422AGMV_PC1_ACTIVE|
  4.                                         BM1422AGMV_OUT_BIT_14|
  5.                                         BM1422AGMV_RST_LV_RST_RE|
  6.                                         BM1422AGMV_ODR_10HZ|
  7.                                         BM1422AGMV_FS1_CON); //上电、14bit输出、复位、输出速率10hz、连续测量模式
  8.    
  9.   BM1422AGMV_WriteRegU8(BM1422AGMV_AVE_A,BM1422AGMV_AVE_A_4); //设置采样次数平均时间 :4次
  10.         
  11.   BM1422AGMV_WriteRegU8(BM1422AGMV_CNT4_M,0xff);   //

  12.   BM1422AGMV_WriteRegU8(BM1422AGMV_CNT3,BM1422AGMV_FORCE_START); //启动测量

  13.   BM1422AGMVGetSensitive();
  14. }
复制代码

5.4、获取灵敏度
  1. static uint8 sensitive;
  2. void BM1422AGMVGetSensitive(void)
  3. {
  4.   uint8 val;
  5.    
  6.   val=BM1422AGMV_ReadRegU8(BM1422AGMV_CNT1); //获取灵敏度
  7.   
  8.   if(val&BM1422AGMV_OUT_BIT_14==BM1422AGMV_OUT_BIT_14)
  9.   {
  10.     sensitive=24;
  11.   }
  12.   else
  13.   {
  14.     sensitive=6;
  15.   }
  16. }
复制代码

5.5、读取数据
  1. void BM1422AGMVRead(void)
  2. {
  3.   sint16 x_count,y_count,z_count;
  4. uint16 temp_count;
  5.   float x,y,z,temp;
  6.   
  7.   x_count=BM1422AGMV_ReadRegU16(BM1422AGMV_DATAX_L);
  8.   y_count=BM1422AGMV_ReadRegU16(BM1422AGMV_DATAY_L);
  9.   z_count=BM1422AGMV_ReadRegU16(BM1422AGMV_DATAZ_L);
  10.    
  11.   x=(float)x_count/sensitive;
  12.   y=(float)y_count/sensitive;
  13.   z=(float)z_count/sensitive;
  14.   
  15.   printf("x=%fuT  x=%fuT  x=%fuT\r\n",x,y,z);
  16.   
  17.   temp_count=BM1422AGMV_ReadRegU16(BM1422AGMV_TEMP_L);
  18.   
  19. printf("temp_count=%d\r\n",temp_count);

  20. }
复制代码
把磁场数据的数字值转化为实际值的过程参考了官方的arduino例程,用磁性的东西,靠近传感器,输出三轴数据变化;
温度数据,读出来是数字值,怎么转化为实际值,手册里面没有说明。
图片9.png










回复

使用道具 举报

该用户从未签到

16

主题

2065

帖子

0

精华

金牌会员

最后登录
2024-3-27
发表于 2020-3-11 01:13:05 | 显示全部楼层
感谢分享
回复

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-5-6 14:09:37 | 显示全部楼层
估计能用在无人机上把
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

9

帖子

0

精华

新手上路

最后登录
2020-10-25
发表于 2020-10-20 16:02:35 | 显示全部楼层
学习了
回复

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

精华

新手上路

最后登录
2020-11-11
发表于 2020-11-3 16:03:59 | 显示全部楼层
BM1422AGMV_ReadRegU16()这些函数在哪里呢
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

精华

新手上路

最后登录
2021-3-18
发表于 2021-3-18 15:37:49 | 显示全部楼层
请问,我现在可以读WHO I AM, CNTL1寄存器可以写,读出来也是正常的;但是其他所有的寄存器写完,读出来全是0,这是什么原因呢?多谢
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

3

帖子

0

精华

新手上路

最后登录
2023-7-5
发表于 2023-7-5 12:57:47 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-3-28 22:29 , Processed in 0.135533 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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