博世传感器调试笔记(三)加速度及地磁传感器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);