博世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上对于火焰模块的应用分析

    在stm32上对于火焰模块的应用分析 一 火焰模块 接线说明 供电 3 3v G 接地 GND AO模拟输入 DO数字输出 以stm32f407举例说明 AO接入 PF7 DO接入 PA4 实际上也可以不接 因为本实例没用到 二 火焰模块的
  • 电阻式湿度传感器原理

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

    光刻是集成电路最重要的加工工艺 他的作用 如同金工车间中车床的作用 在整个芯片制造工艺中 几乎每个工艺的实施 都离不开光刻的技术 光刻也是制造芯片的最关键技术 他占芯片制造成本的35 以上 在如今的科技与社会发展中 光刻技术的增长 直接关系
  • 关于激光雷达盲区0.4m问题

    https xw qq com amphtml 20220302A03F6I00 盲区 吸点 激光雷达探测器一般有几到几十纳秒的Dead Time Dead Time指是接收到一个激光脉冲后到再能接受一个新激光脉冲所需的最短时间 当一束激光
  • 地图采集车的那些事

    一 背景 高精地图 高精采集车 是做地图和出行领域同学经常挂在嘴上的一些常用词儿 但是 圈外的同学可能会问 到底什么是高精 高精是指高精度定位 高精地图是指包含丰富地理信息数据 具有高精度坐标的地图 当然 高精采集车就是采集制作高精地图数据
  • stm32水质检测系统(TDS检测,水温检测,PH检测,wifi上传,上位机显示)

    一 硬件材料清单 1 STM32核心板 2 OLED显示屏 3 PH传感器 4 TDS传感器 5 DS18B02水温传感器 6 ESP8266 二 实现的功能 1 数据的实时检测 2 本地OLED数据实时刷新 3 远程终端上位机数据显示刷新
  • IIC知识整理以及ADS1115

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

    配置串口4 uart c u8 USART4 RX BUF USART REC LEN 接收缓冲 最大USART REC LEN个字节 u16 USART4 RX STA 0 接收状态标记 void uart4 init u32 bound
  • 比亚迪半导体IPO再生波折:又被中止审核 红杉小米是股东

    雷递网 雷建平 4月1日报道 2022年1月底刚刚过会的比亚迪半导体上市再生波折 于2022年3月31日的审核再度被中止 这不是比亚迪半导体IPO审核第一次被深交所中止 2021年8月8日 因律师北京市天元律师事务所被中国证监会立案调查 比
  • arduino实战 2——利用arduino做一个人体传感器

    arduino是较为简单的单片机 易上手 所以利用arduino开始探索之旅吧 目录 一 材料清单 一 模块介绍 1 HC SR501 2 HC SR04 二 实物展示 1 工作流程 2 连线 二 代码 1 代码展示 2 代码的理解 三 写
  • 基于物联网的视觉暂留风扇设计

    论文下载 知网链接 版权所有 有相关问题或索要完整代码实现请联系作者gzn00417或邮箱gzn00417 foxmail com 基于物联网的视觉暂留风扇设计 郭茁宁1 林亦宁2 何胜阳2 哈尔滨工业大学计算机科学与技术学院 黑龙江 哈尔
  • DS18B20温度传感器简介和1-Wire驱动程序

    目录 DS18B20简介 DS18B20的两种供电方式 64位ROM 温度传感器 1 Wire Bus简介 DS18B20通信时序 初始化 ROM相关命令 后续包含任何数据交换的操作 功能相关命令 后续包含任何数据交换的操作 单个DS18B
  • STM32+MS5611测气压温度例程详解,测试无误

    硬件平台 STM32F10X MS5611 JLink 软件平台 Keil 4 一 基础知识 首先 MS5611是什么 MS5611气压传感器是集合SPI和I C 高达20 MHz 总线接口的高分辨率气压传感器 分辨率可达到10cm 内部有
  • EC11编码器和单片机通信

    EC11编码器 EC11编码器通常又被称作为旋转编码器 一般主要是用于亮度 温度 频率 音量调节等参数控制 三只脚中的C脚接地 AB脚接上拉电阻后 当左转或右转时 AB脚就有脉冲信号输出 S1和S2脚为按压开关 按下时导通 旋转编码器的引脚
  • 基于nb-iot和arduino的气象站(一)

    基于nb iot和arduino的气象站 一 温湿度和紫外线传感器 上一篇已经介绍了项目的大概情况 这一篇先讲温湿度传感器和紫外线传感器的使用 一 温湿度传感器 我使用的温度传感器为DHT21 DHT21数字温湿度传感器是一款含有已校准数字
  • Arduino的传感器使用教程1:PM2.5、温度和大气压传感器

    来自我的个人网站 http wangbch com ARDUINO SENSOR Arduino Temperature PM2 5 Atmos Arduino测定温度 PM2 5以及大气压 Temperature Measure and
  • 气压计MS5611编程操作流程

    文章更新版本 时间 备注 修订人 V0 1 发布于 2019 09 21 11 03 46 初始版本 libo 文章目录 一 开发笔记 二 初始化与工作流程 1 从PROM读取出厂校准值 2 启动温度AD转换 读取AD值 3 启动气压AD转
  • 【传感器课程设计——DHT11温湿度数据上传阿里云】课程设计论文大纲

    1 摘要 摘要可以分为中文和英文两部分 2 概述 2 1 课程设计背景 2 2 国内外研究现状 2 3 报告组织形式 3 系统设计 3 1 设计目标 3 2 设计方案 3 3 设计方案分析 3 4 程序结构 4 硬件设计 4 1 ESP82
  • 相机 - 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
  • 基于单片机三路信号故障诊断仿真设计(毕设课设资料)

    022 毕设课设 基于单片机三路信号故障诊断仿真设计 注 统一每路信号大于8则表示触发机构 灵敏度控制已经调节好 不需要调节 只需改变传感器信号大小调节来故障显示 包含ABC三路传感器 液晶实时采集三路传感器 资源下载 下载地址如下 htt

随机推荐

  • 分布式事务与锁

    事务基础概念 事物的回顾 事务的定义 是数据库的操作的最小工作单元 是作为单个逻辑工作单元执行的一系列操作 这些操作作为一个整体一起向系统提交 要么都执行 要么都不执行 事务是一组不可在分割的操作集合 事务的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 当加速度计和陀螺仪在全