一.    器件简介:
1.    BMC 156是一款整合三轴地磁传感器与三轴(12bit)加速度传感器于一体的传感器,以BMC 150 电子罗盘模块为基础, 并与Bosch Sensortec 2x2平方毫米的加速度传感器引脚兼容。智能手机开发商可轻松将现有加速度传感器的设计升级为功能齐全的电子罗盘设计,或将电子罗盘方案简化为仅有加速度传感器的方案

2.    测量参数指标:
Acceleration ranges ±2g/±4g/±8g/±16g
Magnetic  ranges±1300µT (x, y-axis), ±2500µT (z-axis),Magnetic field resolution of ~0.3µT

二.    重要寄存器描述:
1.    加速度模块Accelerometer field data
(1)    芯片ID寄存器R0:CHIPID register ,value 0xfa

(2)  X轴加速度数据12bit
r0x02:ACCD_X_LSB acc_x_lsb[3:0]    bit4--bit7
r0x03:ACCD_X_MSB acc_x_msb[11:4]   bit0--bit7

(3) Y轴加速度数据12bit
r0x04:ACCD_Y_LSB acc_y_lsb[3:0]    bit4--bit7
r0x05:ACCD_Y_MSB acc_y_msb[11:4]   bit0--bit7

(4) Z轴加速度数据12bit
r0x06:ACCD_Z_LSB acc_z_lsb[3:0]    bit4--bit7
r0x07:ACCD_Z_MSB acc_z_msb[11:4]   bit0--bit7

2.    地磁模块Magnetic field data
(1)    芯片ID寄存器r0x40:CHIPID register ,value 0x32
This number can only be read if the power control bit (register 0x4B bit0) is enabled.

(2)  X轴地磁数据13bit
r0x42:data_X_LSB axis_x_lsb[4:0]    bit3--bit7
r0x43:data_X_MSB axis_x_msb[12:5]   bit0--bit7

(3) Y轴地磁数据13bit
r0x44:data_Y_LSB axis_y_lsb[4:0]    bit3--bit7
r0x45:data_Y_MSB axis_y_msb[12:5]   bit0--bit7

(4)  Z轴地磁数据15bit
r0x46:data_Z_LSB axis_z_lsb[6:0]    bit1--bit7
r0x47:data_Z_MSB axis_z_msb[14:7]   bit0--bit7

三.    调试注意事项:
1.    BMC 156虽然在硬件上将三轴地磁传感器与三轴(12bit)加速度传感器整合于一体,但实际操作时我们需要将其视为两个独立工作的设备,这两个设备的设备ID是不一样的(加速度模块的设备ID为0xFA,地磁模块的设备ID为0x32),其I2C设备地址也是独立的(加速度模块的I2C地址为0x10,地磁模块的I2C设备地址为0x12)。

2.    上电后,加速度检测模块将直接进入正常工作模块(After power-up  the accelerometer part of  BMC156  is in normal mode )。

3.    上电后,地磁检测模块则直接进入挂起(suspend mode)模式(Suspend  mode  is  the  default  power  mode  of  BMC156  magnetometer  part  after  the  chip  is powered.)。在这个模式下,除了工作模式控制寄存器(R0x4B)及少部分寄存器可以读写外,大部分(包括地磁数据寄存器,甚至是设备ID寄存器)均无法存取。如果需要正常使用地磁检测功能,需要先将设备从suspend mode--sleep mode-normal/forced mode。

如图所示:

4.    建议地磁检测模块使用强制转换(工作)模式forced mode,在需要检测地磁数据时先写入强制转换命令,延时一段时间后即可读取地磁数据。转换完成后地磁模块自动进入sleep mode。使用这样的工作方式系统功耗较低。

四.    数据读取参考代码:
1.    3轴加速度数据读取参考代码:

x =( i2c_read_byte(0x02) &0xf0) >>4 ;
        x = x|(( i2c_read_byte(0x03) &0xff)<<4);//12bit
        if(x>(0xfff/2))
        {
            x = -(0xfff-x);
        }
        x = (x*9.8)/(0xfff/2/2); //当量程为±2g时,转换为g/s的加速度换算公式

y =( i2c_read_byte(0x04) &0xf0) >>4 ;
        y = y|(( i2c_read_byte(0x05) &0xff)<<4);
        if(y>(0xfff/2))
        {
            y = -(0xfff-y);
        }
        y = (y*9.8)/(0xfff/2/2); //当量程为±2g时,转换为g/s的加速度换算公式

z =( i2c_read_byte(0x06) &0xf0) >>4 ;
        z = z|(( i2c_read_byte(0x07) &0xff)<<4);
        if(z>(0xfff/2))
        {
            z = -(0xfff-z);
        }
        z = (z*9.8)/(0xfff/2/2); //当量程为±2g时,转换为g/s的加速度换算公式

2.    地磁数据读取参考代码:
注意:在读取数据前,必须确保地磁模块处于非suspend状态:
//0x4b bit0:power control bit 1:sleep mode;0:suspend mode
        i2c_write_byte(0x4b,0x01);//from suspend mode to sleep mode

//bit3-bit5:out put data rate,0-10hz;1-2hz;2-6hz;3-8hz;4-15hz;5-20hz;6-25hz;7-30hz;
     //bit1-bit2:operation mode: 0-nomal mode;1-forced mode;3-sleep mode;
        i2c_write_byte (0x4c,0x02);

DelayMs(BMI156_CONVERSION_TIME);//wait data convert finish

x =( i2c_read_byte (0x42) &0xf8) >>3 ;
        x = x|(( i2c_read_byte (0x43) &0xff)<<5);

y =( i2c_read_byte (0x44) &0xf8) >>3 ;
        y = y|(( i2c_read_byte (0x45) &0xff)<<5);

z =( i2c_read_byte (0x46) &0xfe) >>1 ;
        z = z|(( i2c_read_byte (0x47) &0xff)<<7);

博世传感器调试笔记(三)加速度及地磁传感器BMC156的更多相关文章

  1. 博世传感器调试笔记(一)----加速度传感器BMA253

    公司是bosch的代理商,最近一段时间一直在公司开发的传感器demo板上调试bosch sensor器件.涉及到的器件有7,8款,类型包括重力加速度.地磁.陀螺仪.温度.湿度.大气压力传感器等.在调试 ...

  2. 博世传感器调试笔记(二)加速度及陀螺仪传感器BMI160

    一.功能参数简介bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴超低重力加速度计和超低功耗3轴陀螺仪集成于单一封装.MI160采用14管脚LGA封装,尺寸为2. ...

  3. Android指南针之加速度传感器地磁传感器-android学习之旅(67)

    由于andorid不推荐用传统的方向传感器,推荐用加速度传感器和地磁传感器来构造得到方向传感器的数据,其实主要是z轴的旋转角度 具体代码示例 代码如下 public class MainActivit ...

  4. JavaScript特效(调试笔记)

    JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...

  5. Android的重力传感器(3轴加速度传感器)简单实例

    重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会 ...

  6. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. 响应式编程笔记三:一个简单的HTTP服务器

    # 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...

随机推荐

  1. EF三种编程方式详细图文教程(C#+EF)之Model First

    Model First Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在V ...

  2. install4j 工具为java程序打包exe

    用 install4j 工具为java程序打包exe 制作人:mark 制作时间:2013-05-02 用Eclipse 将程序源码打包成jar文件. 打包jar方法我不做介绍了,相信大家都会,不会的 ...

  3. Beta 冲刺 (6/7)

    队名:Boy Next Door 燃尽图 代码写入 https://github.com/mangoqiqi/paybook/tree/master/Desktop/Web%E8%B4%A6%E5%8 ...

  4. UIPickerView的使用

    简介:UIPickerView是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活.UIPick ...

  5. 数据库SQL中Like的用法总结

    最先做项目多次用到LIKE语句,下面总结下经常用到了. 语法 match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ] 参数 ...

  6. Android Toast的多功能封装——Android开发之路1

    Android封装实现各种功能的Toast GitHub地址:https://github.com/SibreiaDante/ToastUtils 效果图: 方法封装如下: showSingleton ...

  7. 『编程题全队』Alpha 阶段冲刺博客集合

    『编程题全队』Alpha 阶段冲刺博客集合 »Day1 2018年4月19日 博客连接:『编程题全队』Alpha 阶段冲刺博客Day1 »Day2 2018年4月20日 博客连接:『编程题全队』Alp ...

  8. 安装virtualbox

    1.安装virtualbox https://www.virtualbox.org/ 2.安装centos6.6 3.配置网络 右键-->网络-->网卡2-->host-only c ...

  9. 数据库事务的四大特性以及4种事务的隔离级别-以及对应的5种JDBC事务隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  10. 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化

    线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...