博世BMI160六轴传感器I2C通信配置
博世BMI160简介
Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装。采用14管脚LGA封装,尺寸为2.5×3.0×0.8mm3。当加速度计和陀螺仪在全速模式下运行时,耗电典型值低至950µA,仅为市场上同类产品耗电量的50%或者更低。
BMI160的Datasheet的下载连接如下:
点击此处进入下载网页
BMI160数据流框图和地址
从BMI160的Datasheet中可以看到它的数据流框图如下:
从上面的框图中,我们可以看到,BMI160与外部进行双向数据传输的方式有两种:SPI和I2C。下面,我们来看下通过I2C与外部进行通信的方式。当BMI160通过I2C与外部进行通信的时候,BMI160将作为I2C从设备挂到主控芯片(主设备)的I2C总线上,所以,主控芯片在配置其对应的I2C驱动时就需要知道BMI160的从设备地址。
对于不同的硬件设计,BMI160的从设备地址是不同的,从Datasheet中可以看到详细介绍,截图如下:
从上述描述中可以看出来:当SDO脚接“GND”的时候,BMI160的I2C地址是 0x68;当SDO脚接“VDDIO”的时候,BMI160的I2C地址是 0x69。
BMI160寄存器表
BMI160的寄存器表在其Datasheet的45页,下面,我们重点来介绍一下常用的比较重要的寄存器:
1.芯片ID
地址:0x00。寄存器名:CHIP_ID。默认值:0xD1。该寄存器只可以读,不能写。
2.BMI160工作模式寄存器
地址:0x03。寄存器名:PMU_STATUS。默认值:0x00。该寄存器只可以读,不可以写。该寄存器的值一共8个字节,最高位的2个位保留。后面也是每两个位组成一个值,分别是acc_pmu_status、gyr_pmu_status和mag_pmu_status的状态值。
截图如下:
各个状态值代表的实际含义截图如下:
3.控制寄存器
地址:0x7e。寄存器名:CMD。默认值:0x00。该寄存器可以读也可以写。
我们通过向该地址写入不同的值来控制加速度或者陀螺仪的工作模式。
0x11:通过写入该命令值,可以使加速度模块切换到正常工作模式。
0x15:通过写入该命令值,可以使陀螺仪模块切换到正常工作模式。
4.加速度(Accelerometer)寄存器
通过读该寄存器上的数据,可以得到加速度三个轴的原始数据。各个轴的寄存器地址及数据格式如下图所示:
5.陀螺仪角速度(Gyroscope)寄存器
通过读该寄存器上的数据,可以得到陀螺仪角速度三个轴的原始数据。各个轴的寄存器地址及数据格式如下图所示:
6.加速度和陀螺仪量程配置寄存器
(1)加速度量程配置寄存器地址是 0x41,该寄存器地址上的数据格式表如下所示:
从上图,我们可以看出,加速度量程配置只占了低四位,即 bit 0-3。不同的值对应的量程值如下表:
(2)陀螺仪量程配置寄存器地址是 0x43,该寄存器地址上的数据格式表如下所示:
从上图中可以看出,陀螺仪量程配置只占用了低三位,即 bit 0-2,不同的值对应的量程值如下表:
注意:加速度量程配置寄存器默认值是 0x03,即默认量程是 ±2g;陀螺仪量程配置寄存器默认值是 0x00,即默认角速度量程是 ±2000°/s。建议使用默认配置的量程。
六轴数据获取
1.三轴加速度数据获取实例参考代码
//加速度三轴数据获取源码
void getAccelerometerValue(void)
{signed short acc_x,acc_y,acc_z; unsigned short x,y,z;//向命令寄存器写入0x11,使加速度处于正常工作模式 i2c_write_one_byte(0x7e,0x11); //切换工作模式之后,延时100ms Delay_Ms(100); /加速度 X轴/// x =( i2c_read_one_byte(0x12) &0xff); x = x|(( i2c_read_one_byte(0x13) &0xff)<<8); acc_x = (signed short)x;//当量程为±2g时,转换为g/s的加速度换算公式 acc_x = (signed short)(acc_x*9.8)/(0x8000/2); /加速度 Y轴/// y =( i2c_read_one_byte(0x14) &0xff) ; y = y|(( i2c_read_one_byte(0x15) &0xff)<<8); acc_y = (signed short)y;//当量程为±2g时,转换为g/s的加速度换算公式 acc_y = (signed short)(acc_y*9.8)/(0x8000/2); /加速度 Z轴/// z =( i2c_read_one_byte(0x16) &0xff) ; z = z|(( i2c_read_one_byte(0x17) &0xff)<<8); acc_z = (signed short)z;//当量程为±2g时,转换为g/s的加速度换算公式 acc_z = (signed short)(acc_z*9.8)/(0x8000/2);
}
2.三轴陀螺仪数据获取实例参考代码
//陀螺仪角速度三轴数据获取
void getGyroscopeValue(void)
{signed short gyr_x,gyr_y,gyr_z;unsigned short x,y,z;//向命令寄存器写入0x15,使陀螺仪处于正常工作模式 i2c_write_one_byte(0x7e,0x15); //切换工作模式之后,延时100ms Delay_Ms(100); /陀螺仪角速度 X轴/// x =( i2c_read_one_byte(0x0c) &0xff) ; x = x|(( i2c_read_one_byte(0x0d) &0xff)<<8); gyr_x = (signed short)x;// range为±2000°/s时,转换为角速度°/s的公式 gyr_x = (gyr_x*2000)/0x8000; /陀螺仪角速度 Y轴/// y =( i2c_read_one_byte(0x0e) &0xff) ; y = y|(( i2c_read_one_byte(0x0f) &0xff)<<8); gyr_y = (signed short)y;// range为±2000°/s时,转换为角速度°/s的公式 gyr_y = (gyr_y*2000)/0x8000; /陀螺仪角速度 Z轴/// z =( i2c_read_one_byte(0x10) &0xff) ; z = z|(( i2c_read_one_byte(0x11) &0xff)<<8); gyr_z = (signed short)z;// range为±2000°/s时,转换为角速度°/s的公式 gyr_z = (gyr_z*2000)/0x8000;
}
上述源码中,有三个函数: “ i2c_write_one_byte ” , “ Delay_Ms ” 和 “ i2c_read_one_byte ” ,这三个函数的具体实现跟主控芯片有关,需要大家根据自己的主控芯片来自行封装实现,另外涉及到I2C的时候一般开始需要先初始化,初始化过程需要的从设备地址在前面已经讲过了,具体初始化函数的封装也需要大家自行根据主控芯片的介绍来实现。
上述提供的源码中,“i2c_read_one_byte”接口封装的返回值是“unsigned char”类型的。下面,我们来看看上述源码中加速度和陀螺仪角速度换算的原理:
1.加速度换算原理
换算实现代码如下:
/加速度 X轴///
x =( i2c_read_one_byte(0x12) &0xff);
x = x|(( i2c_read_one_byte(0x13) &0xff)<<8); acc_x = (signed short)x;//当量程为±2g时,转换为g/s的加速度换算公式
acc_x = (signed short)(acc_x*9.8)/(0x8000/2);
加速度每个轴占两个字节,所以从传感器中读取的值需要按照高低位进行拼接,并且因为加速度每个轴都是有方向的,也就是说加速度每个轴的值应该是有正负之分的,因此拼接之后的值强制类型转化为“signed short”。转换之后,我们需要将转换的值换算成加速度的单位。换算公式如下:
acc_x = (signed short)(acc_x*9.8)/(0x8000/2);
9.8是重力加速度的标准值;因为默认量程是 ±2g,最大和最小值相差 4g,而上述公式,我们取的是量程的一半,也就是2g;因为“acc_x”对应的“signed short”的范围是“-32768 ~ +32767”,最大到最小值一共是 65536个值,相当于65536个刻度,同样取一半的话就是0x8000。上述公式通过对应转换之后将采样读取的值乘以 g,这样采样获取值的范围0x8000就需要除以2。
2.陀螺仪角速度换算原理
换算实现代码如下:
/陀螺仪角速度 X轴///
x =( i2c_read_one_byte(0x0c) &0xff) ;
x = x|(( i2c_read_one_byte(0x0d) &0xff)<<8); gyr_x = (signed short)x;// range为±2000°/s时,转换为角速度°/s的公式
gyr_x = (gyr_x*2000)/0x8000;
陀螺仪角速度每个轴也是占用2个字节,所以从传感器中读取的值需要按照高低位进行拼接,并且因为陀螺仪角速度每个轴都是有方向的,也就是说陀螺仪角速度每个轴的值也应该是有正负之分的,因此拼接之后的值强制类型转化为 “ signed short ” 。转换之后,我们需要将转换的值换算成陀螺仪角速度的单位。换算公式如下:
gyr_x = (gyr_x*2000)/0x8000;
因为默认量程是 ±2000°/s,最大和最小值相差 4000,而上述公式,我们取的是量程的一半,也就是2000;因为“gyr_x”对应的“signed short”的范围是“-32768 ~ +32767”,最大到最小值一共是 65536个值,相当于65536个刻度,同样取一半的话就是0x8000。所以对应换算之后就出现了上述公式。
注意事项
默认BMI160开机上电启动的时候处于挂起模式,这个时候加速度和陀螺仪都处于未工作状态,无法读取数据。如果想读取相应数据,需要通过向“0x7E”命令控制寄存器写入相应命令来切换工作状态,具体命令前面介绍过了。
每次读取加速度数据前,都需要调用“i2c_write_one_byte(0x7e,0x11);”使加速度模块进入正常工作模式;每次读取陀螺仪角速度前,当然也需要调用“i2c_write_one_byte(0x7e,0x15);”使陀螺仪模块进入正常工作模式。这样才能成功读取到数据。
博世BMI160六轴传感器I2C通信配置相关推荐
- ICM20602六轴传感器-IIC通信模式
ICM20602六轴传感器 ICM20602 通过IIC协议与MCU通信 ICM20602 初始化配置 ICM20602 相关配置函数 ICM20602 内部寄存器 注意事项 (一)ICM20602 ...
- 【STM32Cube】学习笔记(三):六轴传感器
文章目录 摘要 一.简介 1.I2C原理 2.MPU6050介绍 3.MPU6050寄存器介绍 4.DMP使用 二.硬件电路设计 三.软件设计 1.CubeMX配置 2.CubeIDE代码 3.结果显 ...
- C语言 | 基于MPU605(六轴传感器)的I2C实现LCD1602显示(代码类)
博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 基于MPU605(六轴传感器)的I ...
- 【开源教程13】疯壳·开源编队无人机-SPI(六轴传感器数据获取)
COCOFLY教程 --疯壳·无人机·系列 SPI(六轴传感器数据获取) 图1 一.ICM20602 简介 六轴传感器在当今智能穿戴和定位导航产品 ...
- 【飞控开发基础教程6】疯壳·开源编队无人机-SPI(六轴传感器数据获取)
COCOFLY教程 --疯壳·无人机·系列 SPI(六轴传感器数据获取) 图1 一.ICM20602 简介 六轴传感器在当今智能穿戴和定位导航产品 ...
- 六轴传感器基础知识学习:MPU6050特性,四元数,姿态解算,卡尔曼滤波
实际上,只要说到多少轴的传感器一般是就是指加速度传感器(即加速计).角速度传感器(即陀螺仪).磁感应传感器(即电子罗盘).这三类传感器测量的数据在空间坐标系中都可以被分解为X,Y,Z三个方向轴的力,因 ...
- LSM6DS3(六轴传感器)STM32驱动及6D功能实现
刚使用了STM32测试了LSM6DS3该六轴传感器,顺便也测试了其6D方向检测功能,效果是能满足对6个面方向的识别需求. 该六轴传感器支持I2C/SPI通信.在读取该六轴传感器寄存器时,采用I2C通信 ...
- Micro Python———MPU6050六轴传感器
目录 1.什么是MPU6050? MPU6050介绍: MPU6050寄存器介绍: 2.例程 1.平台 2.目的 3.讲解 1.查阅原理图 2.流程分析 3.代码讲解 3.结果 1.什么是MPU605 ...
- keil4怎么移植其他人的程序_【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608...
之前发了LCD调试笔记,大家很感兴趣,所以这次再来一篇:六轴传感器ICM20608驱动移植笔记,大家还需要什么移植笔记?可以留言.我们尽量满足. 1.1 移植思路 先找到驱动:也许内核里已经有,也许需 ...
- 【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608
在线课堂:https://www.100ask.net/index(课程观看) 论 坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...
最新文章
- Web负载均衡学习笔记之四层和七层负载均衡的区别
- Java案例:简易记事本
- pandas to_sql
- Reboot运维开发Python-03
- 含参变量正常积分_含参变量的积分
- 医院信息化建设,产品规划要求​
- GEEer成长日记六:Sentinel-2计算逐日NDVI时间序列
- pci 1751 java_PCI-1751快速安装使用手册.PDF
- sdk 今日头条_今日头条大数据分析平台艰辛成长路
- Linux的numactl
- WebService 理论详解、JWS(Java Web Service) 快速入门
- 超级好用easyexcel插件
- 专访小熊戴欣,从国内最贵婚尚大咖到仪式感大师的进阶之路
- 初级程序员 高级程序员_程序员的十大电影
- electron 打包后找不到module问题
- 苹果收购AI音乐公司,音乐人工智能将迎来新机遇?
- BOOTMGR is missing错误提示解决方法
- VFP按钮弹出菜单,今天来讲两个方法,非常实用
- js 格式化日期yyyy-MM-dd hh:mm:ss
- 利用飞秋的udp用java语言进行震动攻击
热门文章
- Head First 系列书籍分享,Head First Python (中文版·第2版),Head First Java(中文版):第二版——涵盖Java 5.0...
- “封号斗罗” 程序员修炼之道:通向务实的最高境界
- 无线充电Qi通信协议分析
- Duilib--->Duilib库介绍总结概述
- 微软惊天泄漏,Win11 预览版镜像提前出世
- copy的过去式_[copy是什么意思中文翻译成]copy是什么意思中文翻译
- 百度文库文档免费下载教程
- 微信抢红包微信 PHP代码实现
- 连载31:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)...
- 人人都是产品经理2.0