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

[活动] 【 BM1422地磁传感器】测试读取数据

[复制链接]
  • TA的每日心情
    奋斗
    2022-9-1 17:50
  • 签到天数: 2 天

    [LV.1]初来乍到

    19

    主题

    5661

    帖子

    0

    精华

    论坛元老

    最后登录
    2024-3-29
    发表于 2021-1-4 21:36:42 | 显示全部楼层 |阅读模式
            ROHM的BM1422地磁传感器是检测地磁三轴的传感器,该芯片供电电压范围为1.7V-3.6V,支持标准2线制IIC串行数字总线接口。BM1422AGMV芯片内部集成了三轴MI检测元件、高精度ADC转换器、电源稳压器及逻辑控制器等单元组成,采用2.00mm x 2.00mm LGA封装。

    其应用电路如下:
    1.jpg

        寄存器功能表如下:

    2.jpg 3.jpg

    下面就是BM1422地磁传感器模块:

    4.jpg
    5.jpg

    下面使用STM32F410-Nucleo开发板配合ROHM推出的SensorShield-EVK-001套件进行测试BM1422。因为测试的软件包是基于Arduino的,我自己改了一下适应STM32开发。
    驱动程序:
    1. /*=============================================================================
    2. // File Name:
    3. // Author:
    4. // Date:
    5. // Version:

    6. =============================================================================*/
    7. /* Includes -----------------------------------------------------------------*/
    8. #include "BM1422AGMV.h"

    9. static unsigned char _sens;

    10. //
    11. uint8_t BM1422AGMV_Init(void)
    12. {
    13.         uint8_t         temp;
    14.         uint8_t         buf[2];

    15.         //读ID
    16.         temp = I2C_ReadByte(BM1422AGMV_DEVICE_ADDRESS_0E, BM1422AGMV_WIA);
    17.         if(temp != BM1422AGMV_WIA_VAL)
    18.         {
    19.                 return 1;
    20.         }
    21.        
    22.         //
    23.         I2C_WriteByte(BM1422AGMV_DEVICE_ADDRESS_0E, BM1422AGMV_CNTL1, BM1422AGMV_CNTL1_VAL);

    24.           // Check 12bit or 14bit
    25.           buf[0] = (BM1422AGMV_CNTL1_VAL & BM1422AGMV_CNTL1_OUT_BIT);
    26.           if (buf[0] == BM1422AGMV_CNTL1_OUT_BIT) {
    27.             _sens = BM1422AGMV_14BIT_SENS;
    28.           } else {
    29.                     _sens = BM1422AGMV_12BIT_SENS;
    30.           }
    31.         Delay_ms(1);

    32.           buf[0] = (BM1422AGMV_CNTL4_VAL >> 8) & 0xFF;
    33.           buf[1] = (BM1422AGMV_CNTL4_VAL & 0xFF);
    34.         I2C_PageWrite(BM1422AGMV_DEVICE_ADDRESS_0E,BM1422AGMV_CNTL4,buf,2);

    35.         I2C_WriteByte(BM1422AGMV_DEVICE_ADDRESS_0E, BM1422AGMV_CNTL2, BM1422AGMV_CNTL2_VAL);

    36.         I2C_WriteByte(BM1422AGMV_DEVICE_ADDRESS_0E, BM1422AGMV_AVE_A, BM1422AGMV_AVE_A_VAL);

    37.         return 0;
    38. }


    39. void BM1422AGMV_get_rawdata(uint8_t *buff)
    40. {
    41.     uint8_t temp;
    42.         I2C_WriteByte(BM1422AGMV_DEVICE_ADDRESS_0E, BM1422AGMV_CNTL3, BM1422AGMV_CNTL3_VAL);
    43.         while(1)
    44.         {
    45.             temp = I2C_ReadByte(BM1422AGMV_DEVICE_ADDRESS_0E, BM1422AGMV_STA1);
    46.             if(temp == BM1422AGMV_STA1_RD_DRDY)
    47.             {
    48.                 break;
    49.             }
    50.             Delay_ms(1);
    51.         }
    52.         I2C_PageRead(BM1422AGMV_DEVICE_ADDRESS_0E,
    53.                                 BM1422AGMV_DATAX,
    54.                                 buff, 6);
    55. }

    56. void BM1422AGMV_convert_uT(signed short *rawdata, float *data)
    57. {
    58.           // LSB to uT
    59.           data[0] = (float)rawdata[0] / _sens;
    60.           data[1] = (float)rawdata[1] / _sens;
    61.           data[2] = (float)rawdata[2] / _sens;
    62. }

    63. void BM1422AGMV_get_val(float *data)
    64. {
    65.   unsigned char val[6];
    66.   signed short  mag[3];

    67.   BM1422AGMV_get_rawdata(val);

    68.   mag[0] = ((signed short)val[1] << 8) | (val[0]);
    69.   mag[1] = ((signed short)val[3] << 8) | (val[2]);
    70.   mag[2] = ((signed short)val[5] << 8) | (val[4]);

    71.   BM1422AGMV_convert_uT(mag, data);

    72. }

    73. void BM1422AGMV_get_temperature(uint8_t *buff)
    74. {
    75.     I2C_PageRead(BM1422AGMV_DEVICE_ADDRESS_0E,
    76.             BM1422AGMV_TEMP,
    77.             buff, 2);
    78. }
    79. ///////////////////////////////////////////////////////////
    80. uint16_t BM1422AGMV_get_offx(void)
    81. {
    82.         uint16_t temp;
    83.         uint8_t buff[2];
    84.     I2C_PageRead(BM1422AGMV_DEVICE_ADDRESS_0E,
    85.             BM1422AGMV_OFF_X,
    86.             buff, 2);
    87.         temp = (buff[1]<<8)|buff[0];
    88.         return temp;
    89. }

    90. uint16_t BM1422AGMV_get_offy(void)
    91. {
    92.         uint16_t temp;
    93.         uint8_t buff[2];
    94.      I2C_PageRead(BM1422AGMV_DEVICE_ADDRESS_0E,
    95.             BM1422AGMV_OFF_Y,
    96.             buff, 2);
    97.         temp = (buff[1]<<8)|buff[0];
    98.         return temp;
    99. }

    100. uint16_t BM1422AGMV_get_offz(void)
    101. {
    102.         uint16_t temp;
    103.         uint8_t buff[2];
    104.     I2C_PageRead(BM1422AGMV_DEVICE_ADDRESS_0E,
    105.             BM1422AGMV_OFF_Z,
    106.             buff, 2);
    107.         temp = (buff[1]<<8)|buff[0];
    108.         return temp;
    109. }

    110. //////////////
    111. void BM1422AGMV_set_offx(uint16_t offx)
    112. {
    113.         uint8_t buff[2];
    114.         buff[0] = offx&0xff;
    115.         buff[1] = (offx>>8)&0xff;
    116.     I2C_PageWrite(BM1422AGMV_DEVICE_ADDRESS_0E,
    117.             BM1422AGMV_OFF_X,
    118.             buff, 2);       
    119. }

    120. void BM1422AGMV_set_offy(uint16_t offy)
    121. {
    122.         uint8_t buff[2];
    123.         buff[0] = offy&0xff;
    124.         buff[1] = (offy>>8)&0xff;
    125.      I2C_PageWrite(BM1422AGMV_DEVICE_ADDRESS_0E,
    126.             BM1422AGMV_OFF_Y,
    127.             buff, 2);
    128. }

    129. void BM1422AGMV_set_offz(uint16_t offz)
    130. {
    131.         uint8_t buff[2];
    132.         buff[0] = offz&0xff;
    133.         buff[1] = (offz>>8)&0xff;
    134.        
    135.     I2C_PageWrite(BM1422AGMV_DEVICE_ADDRESS_0E,
    136.             BM1422AGMV_OFF_Z,
    137.             buff, 2);
    138. }

    139. void BM1422AGMV_get_fineoutput_xyz(uint8_t *buff)
    140. {
    141.     I2C_PageRead(BM1422AGMV_DEVICE_ADDRESS_0E,
    142.             BM1422AGMV_FINEOUTPUT_XYZ,
    143.             buff, 6);
    144. }

    145. void BM1422AGMV_get_gainpara_xyz(uint8_t *buff)
    146. {
    147.     I2C_PageRead(BM1422AGMV_DEVICE_ADDRESS_0E,
    148.             BM1422AGMV_GAINPARA_XYZ,
    149.             buff, 6);
    150. }

    151. void BM1422AGMV_power_down(void)
    152. {
    153.     I2C_WriteByte(BM1422AGMV_DEVICE_ADDRESS_0E, BM1422AGMV_CNTL1, 0x00);
    154. }

    复制代码
    1. /*=============================================================================
    2. // File Name:
    3. // Author:
    4. // Date:
    5. // Version:

    6. =============================================================================*/

    7. #ifndef _BM1422AGMV_H_
    8. #define _BM1422AGMV_H_

    9. #include "gpio_i2c.h"


    10. #define BM1422AGMV_DEVICE_ADDRESS_0E   (0x0E)    // 7bit Address    ADDR = L
    11. #define BM1422AGMV_DEVICE_ADDRESS_0F   (0x0F)    // 7bit Address    ADDR = H
    12. #define BM1422AGMV_WIA_VAL             (0x41)

    13. #define BM1422AGMV_WIA                 (0x0F)   //ID = 0X41
    14. #define BM1422AGMV_DATAX               (0x10)   //XYZ: 0X10-0X15
    15. #define BM1422AGMV_STA1                (0x18)   //STATUS: 0X00 = NG,0X40= OK
    16. #define BM1422AGMV_CNTL1               (0x1B)
    17. #define BM1422AGMV_CNTL2               (0x1C)
    18. #define BM1422AGMV_CNTL3               (0x1D)
    19. #define BM1422AGMV_AVE_A               (0x40)   //Average Time:000:4times, 001:1times, 010:2times, 011:8times, 100:16times
    20. #define BM1422AGMV_CNTL4               (0x5C)

    21. #define BM1422AGMV_TEMP                (0x60)   //Temperature value L_H

    22. #define BM1422AGMV_OFF_X               (0x6C)   //
    23. #define BM1422AGMV_OFF_Y               (0x72)
    24. #define BM1422AGMV_OFF_Z               (0x78)

    25. #define BM1422AGMV_FINEOUTPUT_XYZ      (0x90)   //

    26. #define BM1422AGMV_GAINPARA_XYZ        (0x9C)   //



    27. #define BM1422AGMV_STA1_RD_DRDY        (1 << 6)     //0 = NG,1= OK

    28. #define BM1422AGMV_CNTL1_FS1           (1 << 1)     //0=CONTINU MODE,1=SINGLE MODE
    29. #define BM1422AGMV_CNTL1_ODR_10Hz      (0 << 3)     //00=10Hz,01=100Hz,10=20Hz,11=1KHz
    30. #define BM1422AGMV_CNTL1_RST_LV        (1 << 5)     //0=Reset Release,1=Reset
    31. #define BM1422AGMV_CNTL1_OUT_BIT       (1 << 6)     //0=12BIT,1=14BIT
    32. #define BM1422AGMV_CNTL1_PC1           (1 << 7)     //0=POWERDOWN,1=ACTIVE

    33. #define BM1422AGMV_CNTL2_DRP           (1 << 2)     //DRDY :0=LOW ACTIVE,1=HIGH ACTIVE
    34. #define BM1422AGMV_CNTL2_DREN          (1 << 3)     //DRDYENABLE:0=DISABLE,1=ENABLE

    35. #define BM1422AGMV_CNTL3_FORCE         (1 << 6)     //AD start measurement trigger at continuous OR single.Set 1: Start measurement

    36. #define BM1422AGMV_AVE_A_AVE4          (0 << 2)     //000:4times

    37. #define BM1422AGMV_CNTL1_VAL           (BM1422AGMV_CNTL1_FS1 | BM1422AGMV_CNTL1_OUT_BIT | BM1422AGMV_CNTL1_PC1)
    38. #define BM1422AGMV_CNTL2_VAL           (BM1422AGMV_CNTL2_DREN)
    39. #define BM1422AGMV_CNTL3_VAL           (BM1422AGMV_CNTL3_FORCE)
    40. #define BM1422AGMV_CNTL4_VAL           (0x0000)
    41. #define BM1422AGMV_AVE_A_VAL           (BM1422AGMV_AVE_A_AVE4)

    42. #define BM1422AGMV_14BIT_SENS          (24)
    43. #define BM1422AGMV_12BIT_SENS          (6)



    44. extern          uint8_t BM1422AGMV_Init(void);
    45. extern          void BM1422AGMV_get_rawdata(uint8_t *buff);
    46. extern          void BM1422AGMV_get_val(float *data);


    47. void BM1422AGMV_get_temperature(uint8_t *buff);

    48. uint16_t BM1422AGMV_get_offx(void);
    49. uint16_t BM1422AGMV_get_offy(void);
    50. uint16_t BM1422AGMV_get_offz(void);

    51. void BM1422AGMV_set_offx(uint16_t offx);
    52. void BM1422AGMV_set_offy(uint16_t offy);
    53. void BM1422AGMV_set_offz(uint16_t offz);

    54. void BM1422AGMV_get_fineoutput_xyz(uint8_t *buff);
    55. void BM1422AGMV_get_gainpara_xyz(uint8_t *buff);



    56. extern          void BM1422AGMV_power_down(void);

    57. #endif // _BM1422AGMV_H_


    复制代码
       下面是串口输出的3轴地磁数据:
    6.jpg




    BM1422的软件包和PDF芯片文档
    BM1422AGMV.zip (4.2 KB, 下载次数: 1)
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    0

    精华

    新手上路

    最后登录
    2023-7-5
    发表于 2023-7-5 12:56:37 | 显示全部楼层
    谢谢分享,正在调试中
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-3-29 13:15 , Processed in 0.096867 second(s), 14 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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