博世传感器调试笔记(三)加速度及地磁传感器BMC156

一.    器件简介:
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);

时间: 2024-10-10 12:14:49

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

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

公司是bosch的代理商,最近一段时间一直在公司开发的传感器demo板上调试bosch sensor器件.涉及到的器件有7,8款,类型包括重力加速度.地磁.陀螺仪.温度.湿度.大气压力传感器等.在调试的过程中做了一些笔记,在此将其简单分享出来. BMA253是3轴12 bit加速度传感器,支持I2C/SPI两种通讯方式,其i2c设备地址0x18. 关键寄存器R0:CHIPID register ,值为 0xfa X轴加速度数据12bitr0x02:ACCD_X_LSB acc_x_lsb[3:0

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

一.功能参数简介bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴超低重力加速度计和超低功耗3轴陀螺仪集成于单一封装.MI160采用14管脚LGA封装,尺寸为2.5×3.0×0.8mm3.当加速度计和陀螺仪在全速模式下运行时,耗电典型值低至950μA,仅为市场上同类产品耗电量的50%或者更低. BMI160传感器的i2c 设备地址是 0x68(当sd0脚接地)/0x69(当sdo 脚拉高). 二. 重要寄存器1. 芯片ID----R0:CHIPID 寄存器

飞思卡尔地磁传感器MAG3110调试笔记

首先我们要了解这么一个基本概念:地磁传感器必须和重力传感器一起工作,指南针才可以正常工作. 一.    调试要点: 1.    重力传感器的3轴有方向性,地磁传感器的数据输出也有方向性.我们必须根据硬件layout布板传感器的相对LCD视图的位置配置正确的位置,指南针才能指示正确的方向. 2.    Mag3110的驱动在linux底层注册时,其实是注册了两种Input设备,一种是地磁设备FreescaleMagnetometer,另一种是电子罗盘eCompass.后者会输出指南针等APP应用所

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

由于andorid不推荐用传统的方向传感器,推荐用加速度传感器和地磁传感器来构造得到方向传感器的数据,其实主要是z轴的旋转角度 具体代码示例 代码如下 public class MainActivity extends Activity { private ImageView compass; private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { su

加壳学习笔记(三)-简单的脱壳思路&amp;调试思路

首先一些windows的常用API: GetWindowTextA:以ASCII的形式的输入框 GetWindowTextW:以Unicaode宽字符的输入框 GetDlgItemTextA:以ASCII的形式的输入框 GetDlgItemTextW:以Unicaode宽字符的输入框 这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目.还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能

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

原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(Automation Executables) 2.Office加载项(COM or Excel Add-In) 3.Office文档代码或模板(Code Behind an Office Document or Template) 4.Office 智能标签(Smart Tags) 本次我们将学习使

JavaScript特效(调试笔记)

JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: 1 function getTime() { 2 var today = new Date(); //返回当日的日期和时间. 3 var year = today.getFullYear(); //获得当前的年份 4 var month = today.getMonth() + 1; //获得当前的月份 5 var day = today.getDate(); //获得当前的日期 6

UE4学习笔记(三): 为什么使用C++替代UnrealScript?

原文链接: https://forums.unrealengine.com/showthread.php?2574-Why-C-for-Unreal-4&p=16252&viewfull=1#post16252 之前的三代Unreal引擎中都包括了一种叫UnrealScript的脚本语言, 用它来写游戏玩法简直太方便了, 根本不用去接触复杂的C++引擎. 尽管脚本十分受新手的欢迎, 但它却成为了创新和公布的障碍. 在Unreal引擎成长的过程中, 我们不断地踩到这种坑. 所以在2011年,

Go语言学习笔记(三) [控制结构、内建函数]

日期:2014年7月21日 一.控制结构 1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语句,另外Go中还提供了类型选择和多路通信转接器的select.Go的控制结构的语法和C相比有所不同,它不需要圆括号,但语句体必须总是包含在大括号内. 2.控制结构语法 1)if-else (1)if后紧跟单个条件 例如:if x > 0 {   //{必须和if在同一行,这是Go语法规定的,如果换行写,编译