博世BMI160六轴传感器I2C通信配置

2023-11-06

博世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);使陀螺仪模块进入正常工作模式。这样才能成功读取到数据。





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

博世BMI160六轴传感器I2C通信配置 的相关文章

  • 电阻式湿度传感器原理

    电阻式湿度传感器是利用湿敏元件的电气特性 如电阻值 随湿度的变化而变化的原理进行湿度测量的传感器 湿敏元件一般是在绝缘物上浸渍吸湿性物质 或者通过蒸发 涂覆等工艺制各一层金属 半导体 高分子薄膜和粉末状颗粒而制作的 在湿敏元件的吸湿和脱湿过
  • STM32-土壤湿度传感器

    目录 0 说明 1 传感器介绍 2 代码说明 2 1 ADC初始化函数 adc c 2 2 GPIO初始化函数 2 3 主函数 0 说明 本篇文章主要是说明怎么使用STM32单片机读取土壤湿度传感器采集到的数据 包括模拟和数字数据 并且附带
  • IIC知识整理以及ADS1115

    什么是IIC IIC Inter Integrated Circuit 通常发音为 I squared C 是多主 多从 分组交换 单工的串行总线 通常用于处理器或微控制器与低速外围器件的短距离通信连接 这个通信协议是由 NXP半导体的前生
  • 传感器学习——ESP8266(无线串口使用)

    ESP8266模块是一款高性能的WIFI串口模块 只要知道串口怎么编程使用 就可以实现所谓的透明传输 将usb转ttl如下连接 USB转TTL模块上有3 3V和5V两个引脚可以作为VCC 但是一般选取5V作为VCC AT指令 在使用USB转
  • 传感器学习——旋转编码器

    旋转编码器是将旋转机械位移量转换为电器信号 对该信号进行处理后检测位置 速度等的传感器 旋转编码器可分为 增量式 编码器和 绝对值 式编码器 1 增量式编码器 旋转盘转动时 光敏二极管断续收到发光二极管发出的光 从而输出方波 增量式编码器通
  • 比亚迪半导体IPO再生波折:又被中止审核 红杉小米是股东

    雷递网 雷建平 4月1日报道 2022年1月底刚刚过会的比亚迪半导体上市再生波折 于2022年3月31日的审核再度被中止 这不是比亚迪半导体IPO审核第一次被深交所中止 2021年8月8日 因律师北京市天元律师事务所被中国证监会立案调查 比
  • 基于Matlab的激光雷达与单目摄像头联合外参标定

    1 背景介绍 目前团队正在与某主机厂合作开发L4级自动驾驶出租车项目 所用的传感器包括80线激光雷达和单目摄像头 为了充分利用Lidar和Cam各自的优势 设计了一种融合算法 需要获得Lidar2Camera的联合外参 前期使用Autowa
  • ADXL345传感器介绍

    今天小白给大家介绍一款当下比较流行的三轴加速度传感器 ADXL345 通过本文的介绍让大家学会如何使用这款功能强大的三轴加速度传感器 欢迎一起交流学习 1 ADXL345传感器简介 该款传感器如下图 ADXL345 是 ADI 公司推出的基
  • 博世BMI160六轴传感器I2C通信配置

    博世BMI160简介 Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装 采用14管脚LGA封装 尺寸为2 5 3 0 0 8mm3 当加速度计和陀螺仪在全
  • MS5611气压计 I2C驱动代码 STM32

    文章目录 前言 通信接口 IIC 一 MS5611的5种命令 RESET 重启芯片 READ PROM D1 D2 CONVERSION READ ADC RESULT 二 实现代码 1 初始化 2 读取数据 3 补偿温度数据 前言 这篇博
  • 电容传感器

    背景介绍 去年 博后师兄从新西兰购买了一款电容传感器 能够对大变形进行测量 可以用来人体动作捕捉 在智能穿戴 医疗复健等领域具有广阔的应用前景 本推文对相关内容进行介绍 具体如下图所示 电容传感器主要包含两部分内容 1 传感器部分 师兄对电
  • NPN与PNP型传感器的区别

    NPN与PNP型传感器其实就是利用三极管的饱和和截止 输出两种状态 属于开关型传感器 但输出信号是截然相反的 即高电平和低电平 NPN输出是低电平0 PNP输出的是高电平1 沧正称重传感器 NPN与PNP型传感器 开关型 分为六类 1 NP
  • 【雕爷学编程】Arduino动手做(72)---HX711 人体称重模块

    37款传感器与执行器的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止这37种的 鉴于本人手头积累了一些传感器和执行器模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手尝试系列实验 不管
  • STM32F407基于RT-Thread连接ESP8266WiFi模块

    1 连接规则 STM32F4连接ESP8266无线通信 串口通信 首先 本次用到两个串口 我使用的是普中STM32F407 第一个串口为USART1 PA2 PA3 串口一 就是数据线连接单片机和电脑时用的口 串口三USART3 PB10T
  • CH347读取MPU6050传感器数据和显示

    CH347读取MPU6050传感器数据和显示 MPU6050 是一款集成了六轴加速度计和陀螺仪的微电子机械系统 MEMS 传感器 它由 InvenSense 现为 TDK 公司开发 是一种广泛应用于姿态估计 运动追踪和稳定控制等领域的常用传
  • 讲一点点自动驾驶技术(1)概论

    讲一点点自动驾驶技术 1 概论 作为一个自动驾驶小菜鸟工程师 小Q入门才两三年时间 最近空闲时间比较多 利用这个平台把自己对于无人驾驶技术所看所学的东西在这进行一个整理 一来自己看着方便 二来供大家交流学习 Xiao Xi ps 如果大家觉
  • 相机 - 02 图像处理isp

    isp 知识 1 基本概念 1 1 isp 模块简介 参考 1 基本概念 图像处理流程图 1 光线 gt lens gt sonsor gt 光电转换 gt A D gt bayer pattern gt isp gt I O bayer
  • 关于6轴传感器LSM6DSLTR的调试说明

    关于6轴传感器LSM6DSLTR的调试说明 AP的检测脚需要配置为pull down的 不能配置为pull up 否则中断脚一直是高 sensor的int1脚配置为open drain模式 可以配置wakeup中断 阈值设置为1 2g产生中
  • 常用电子元件介绍与功能

    常用电子元件简介及其作用 一 电容 1 种类 1 CBB电容 2 铝电解电容 3 钽电解电容 4 高频瓷片电容 5 低频瓷片电容 2 作用 1 去耦 2 滤波器 3 储能 4 检波 5 无源晶振 6 隔直通交 3 总结 二 电感 1 种类
  • COCOS2DX学习之Box2D物理引擎-------物体和相互作用

    1 创建一个静态物体 创建一个静态物体应该很简单 在头文件生命一下要创建新物体的函数 然后在cpp文件中实现它即可 具体的时候先过程 首先要用createbody函数创建一个物体 然后定义一个b2bodydef变量 指定一下这个变量的typ

随机推荐

  • 分布式事务与锁

    事务基础概念 事物的回顾 事务的定义 是数据库的操作的最小工作单元 是作为单个逻辑工作单元执行的一系列操作 这些操作作为一个整体一起向系统提交 要么都执行 要么都不执行 事务是一组不可在分割的操作集合 事务的ACID原则 事务具有四个基本特
  • 从程序员到项目经理:项目管理三大目标

    项目管理的三大目标即时间 成本和质量 实际是告诉项目经理应重点关注什么因素 项目控制应该做什么工作 三大目标虽然简单 但如果能将其真正贯彻 到自己的行动中 那么对项目计划制定 过程控制等工作 均能起到引导作用 有了努力的方向 项目经理也就可
  • Kali2022安装Nessus——Docker版

    下载镜像并且创建Nessus容器 root kali docker run itd name ramisec nessus p 8834 8834 ramisec nessus 更新nessus插件 root kali docker exe
  • Coding-数组(Array)

    数组 Array 面试中最常见的就是围绕数组进行出题 主要原则数组可以随机读取 一般遇到数组相关的题目 都不是直观看到的那样 第一步暴力解法 第二步是否可以排序 是否可以二分 是否可以使用数据结构 哈希表 队列 栈等 要时刻注意一个数组中有
  • 经典神经网络( AlexNet,VggNet,NiN,GoogLeNet,ResNet)

    卷积神经网络演化史 AlexNet 模型结构 贡献 ReLU激活函数 分布式GPU运算 LRN 局部响应归一化 提高泛化能力 重叠池化 池化窗的步长小于池化层的大小 在池 化时产生重叠 正则化方法 数据集增强 dropout 随机关闭神经元
  • Powershell:如何创建自定义对象,以及如何给自定义对象添加属性和方法

    还记得我刚学会使用PowerShell的时候 那种兴奋和幸福感 终于找到了在Windows下一个强大的Shell 因为他叫Power Shell 可以一边使用着熟悉的Windows桌面系统一边装X的Shell编程了 当我使用它来处理CSV时
  • Qt中的UI文件介绍

    UI文件是什么 u i ui ui通常是指Qt设计师设计出来的界面文件的后缀 它本质上是一个标准XML格式的文本文件 需要通过 u i
  • 前端moment库时间戳转标准时间不准确的问题解决

    做前端项目的时候 根据后台返回的一个时间戳 将时间戳需要转换成标准时间 因为项目中有moment这个时间处理包 而且moment对于时间的转换比较强大 可以根据特定的格式进行转换 最终将时间戳转换成 年 月 日 时 分 秒 这种形式 但是转
  • SpringQueryMap -SpringCloud feign get method 接受自定义对象参数

    feign中和controller中不一样的地方 controller中可以get方法使用对象参数无需任何注解 可默认绑定到对象 示例代码如下 GetMapping value ClueClient LIST OPERATIONS publ
  • J2EE基础集合框架之Set

    前言 上次与大家介绍了集合框架的LIst集合 List集合的特点的是元素有序且可重复 今天与大家分享的是也是一种集合 叫做Set集合 他和List集合是相反的 今天我们就一起去探究Set集合 首先跟思维导图来了解我今天要分享的内容吧 说明
  • 卷积神经网络&目标检测

    卷积神经网络 目标检测 一 Inception网络 1 Inception网络基本思想 2 采用1 1卷积降低计算量 3 Inception模块和Inception网络 二 迁移学习 三 数据扩充方法 四 目标检测 1 特征点检测 2 通过
  • postman的json脚本转jmeter的jmx脚本

    一般研发同学会用postman做接口自测 但是我们做性能测试的时候 又不能用postman 对鉴权不了解的接口 自己调试脚本又很麻烦 这个时候 我们就可以用这个方法把json脚本转换成jmeter用的jmx脚本 环境准备 这几个工具需要提前
  • join python

    Python join 方法用于将序列中的元素以指定的字符连接生成一个新的字符串 1 join是针对字符串进行操作的 2 join里面的参数只能是一个 可以是字典 列表 元组 然后以前面的分隔 形成一个新的字符串 但是里面的东西必须是字符串
  • 百度智能云x蓝色光标共绘AI营销新篇章

    9月12日 百度集团副总裁袁佛玉参加蓝色光标Blue AI行业模型发布会 参与启动仪式并带来了主题演讲 大模型重塑数智世界 此次蓝色光标推出的行业模型 得益于百度智能云千帆大模型平台 以下简称千帆平台 的强大支持 标志着双方合作的深度与广度
  • element中Notification组件(this.$notify)自定义样式

    1 自定义样式效果 2 vue代码 this notifications this notify title dangerouslyUseHTMLString true duration obj remindMethod 3 0 4500
  • 风火编程-- 装饰器,reduce, 片函数,闭包概念

    python核心编程 读书笔记 六 第十一章 11 3 6装饰器 在不改变函数体的前提下 对函数添加前置或后置功能 def 装饰器函数 func def wrapper args kwargs before func func after
  • LeetCode刷题入门

    Letcode刷题入门篇 开始准备刷Letcode的题目 入门基础题 从简单的题目开始做 先考虑用python解题 一 两数之和 使用最简单的暴力解法 复杂度为O n 2 时间复杂度更低的解法 借用List 的相关函数求解 或使用hash求
  • java实现----猜数:随机生成一个数,判断大小,对错。

    需要用到Random 随机生成一个数 if语句 while语句 import java util Scanner 导包 import java util Random 随机生成一个数 public class 猜数 public stati
  • 3.2 创建Maven聚合工程

    3 2 1 构建父工程fmmall 创建一个maven工程 packing设置为 pom 父工程继承继承spring boot starter parent
  • 博世BMI160六轴传感器I2C通信配置

    博世BMI160简介 Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装 采用14管脚LGA封装 尺寸为2 5 3 0 0 8mm3 当加速度计和陀螺仪在全