MPU6050六轴传感器模块初始化教程

发布者:RadiantSerenity最新更新时间:2024-06-26 来源: elecfans关键字:MPU6050  初始化 手机看文章 扫描二维码
随时随地手机看文章

本期介绍的是六轴传感器6050,之前在网上CSDN上看了许多关于MPU6050的介绍,感觉许多都是空话,真正实用的东西并不多,下面该模块的程序我是先看的正点原子stm32单片机的例程之后一点一点移植到FPGA中的。这里只移植了初始化和读取陀螺仪原始数据部分的程序,关于DMP嘛,因为个人能力不够移植不了。


01六轴传感器

本期介绍的ATK-MPU6050是一款高性能三轴加速度加三轴陀螺仪的六轴传感器模块,该模块采用InvenSense公司的MPU6050芯片作为核心,该芯片内部整合了3轴陀螺仪和3轴加速度传感器,并可利用自带的数字运动处理器DMP硬件加速引擎,该模块与外界的通信方式为IIC协议,向应用后台输出姿态解算后的数据。

ATK-MPU6050模块自带DMP,通信协议为IIC、通信速率为400KHz、兼容3.3V和5V系统、陀螺仪和加速度测量维度均为3维。

02器件初始化

在使用MPU6050获取数据之前首先需要对MPU6050进行初始化。MPU6050与控制器之间的通信方式为IIC通信,所以也需要先例化IIC协议。

图片

对于IIC协议的几个状态,此处我事先定义了几个参数,wr写状态,sta起始状态,rd读状态,sto停止状态,ack有应答,nack无应答。

图片

然后便开始编写初始化MPU6050的时序,程序如下图所示,最上面那几行是复位后全部清零,en是一个计数器的使能端,en为0时停止计数,为1时开始计数。tx_data为IIC将要发送的数据寄存器。go为IIC通信的启动端。cmd为当前IIC状态的选择端,因为有时IIC通信中需要起始位或结束位有时不需要,这里的cmd便可以作为选择这些的端口。en_ms为毫秒计数的使能端。

首先要做的便是复位IIC,需要发送的数据有三部分,首先是发送器件ID和写命令,然后就是发送复位地址,最后便是发送复位数据。

下图为IIC写入第一个数据,器件ID和写命令,该模块的器件ID为0x68(在5V系统中),将其器件ID左移一位后与0进行按位与运算,0x68的二进制值为0110_1000,左移一位后便是1101_0000,与0进行按位与运算后还是自己本身,这便是IIC需要写入MPU6050的器件地址与写状态的值。

写入数据之前,首先设置状态cmd为起始信号sta和写状态wr,将sta与wr进行按位或便是选择执行这两项,sta与wr进行按位或后cmd的值便为6'b000_011。然后go赋值为1启动IIC,tx_data写入当前要传输的数据8'b1101_0000,然后跳转到下一个状态。

等tx_data寄存器内写入数据后便可以关闭go,将go端口置0。然后等待IIC一个字节发送成功的标志信号,当trans_done置1后表示IIC一个字节发送完成。

图片

接着便开始发送下一个数据,写入复位地址,cmd选择写状态,此处不需要起始信号所以直接将wr的值赋给cmd,然后开启go将其置1,tx_data写入复位的地址,该地址为0x6B,在此处写为8'h6B,h表示十六进制,地址赋给tx_data寄存器成功后便可以关闭go将其置0,然后等待IIC一个字节发送成功,同样trans_done为1是IIC一个字节发送完成,这时便跳转置下一个状态。

复位地址发送完成之后便发送复位数据,同样的道理,先给cmd写入需要的状态,此处需要写状态wr和停止信号sto,将wr与sto进行按位或,cmd的值便为6'b001_001,复位数据为0x80,此处写为8'h80。

图片

然后延时100ms。将en置1使能计数器,cnt_full为1时表示100ms计数值满,然后关闭en停止计数。

图片

此部分便是100ms计数器的写法。

图片

100ms延时之后复位MPU6050便结束了,然后便开始唤醒MPU6050。和上面一样,首先发送器件地址和写命令,即二进制的1101_0000。然后等待一次发送结束后便开始下一次发送,器件ID发送之后便是发送唤醒地址,该地址为8'h6B,唤醒地址发送完成之后便是发送唤醒数据0x00,这里我写的是8'h00。

图片

详细步骤已经在第一部分详细阐述了,后面几乎都大同小异,首先是对cmd的状态进行选择,即有无起始信号或结束信号、是写命令还是读命令。然后便是需要写入的数据tx_data,一次数据写入完成之后标志信号trans_done置1后便可以跳转到下一次数据的发送或读取。

此处为陀螺仪量程设置,首先是发送器件地址和写命令,然后便是发送陀螺仪地址,该地址为8'h1B,然后设置的陀螺仪量程,这里量程设置为±2000dps所以需要发送的数据为八位的0001_1000。

图片

接下来便是加速度计的量程设置,首先还是发送器件地址和写命令。然后便是发送加速度计的地址,该地址为8'h1C,地址数据发送完成之后便是发送设置加速度计量程的数据,这里加速度的量程设置为±2g,所以需要发送的数据为0x00。

图片

然后便是配置数字低通滤波器的采样率,首先发送器件地址和写命令,然后写入采样频率分频器地址0x19。因为这里配置的是数字低通滤波器的采样率为50HZ,所以发送的数据便为1000/50-1=19,最后发送设置采样率的参数为十进制的19。

图片

设置完采样率后还需配置数字低通滤波频率,此处我们设置为采样率的一半,即25HZ,首先还是先发送器件地址和写命令,然后发送配置寄存器地址0x1A,最后是配置数字低通滤波频率的数据即发送十进制数据4。

图片

然后是关闭使能中断,首先还是发送器件地址和写命令,然后发送使能中断地址8'h38,最后发送关闭使能数据8'h00。

图片

关闭使能中断后便是设置IIC主模式,首先发送器件地址和写命令,然后发送控制寄存器地址8'h6A,最后发送关闭IIC主模式命令8'h00。

图片

关闭FIFO,首先也是发送器件地址和写命令,然后发送FIFO使能寄存器地址8'h23,最后发送关闭FIFO命令8'h00。

图片

然后便是配置INT端口,此处INT需为低电平有效,首先还是先发送器件地址和写命令,然后写中断/旁路设置寄存器地址8'h37,最后发送数据8'h80对INT进行设置。

图片

接下来便需要读取器件ID,用来检测上诉配置是否正确以及MPU6050是否初始化成功。首先还是先发送器件地址以及写命令二进制数据1101_0000,然后写入器件ID寄存器地址0x75,然后便需要配置读命令了,器件ID 0x68左移一位之后与1进行按位与运算,运算结果为8'h1101_0001,该值变为器件地址和读命令,然后cmd配置为rd | sto,读取状态与停止信号按位或运算,cmd的值为6'b001_100,IIC通信的SDA数据端便开始读取IIC传输过来的数据,读取结束之后IIC产生一个结束位,此次读取便结束了。然后便开始验证读取到的器件ID是否正确,若读取的器件ID正确则开始进行下一步。

图片

图片

读取的数据ID存储在rx_data这个8位的寄存器中,读取结束后便判断读取的对不对,若读取的ID正确便可以进行下一步配置,初始化即配置完成。

首先是设置CLKSEL、PLL的X轴为参考,先发送器件地址和写命令,然后便发送设置管理寄存器的地址8'h6B,最后便是发送配置的数据8'h01。

图片

然后便是配置加速度与陀螺仪都工作,首先还是先发器件地址与写命令,然后发送管理地址8'h6C,最后发送配置数据8'h00。

图片

这里需要再次设置一下数字低通滤波器的采样率与滤波频率。设置方式与参数和上面一模一样。采样率为50Hz,滤波频率为采样率的一半。

图片

图片

03数据的读取

然后便可以开始读数据了,这里我读的是三轴陀螺仪的数据,三轴加速度的数据读取和这个是一样的。

这里我在初始化成功后延时了400ms,然后发送了器件地址和写命令,然后写入读取陀螺仪值的地址8'h43,然后便是写入器件地址和读数据,即器件地址左移一位后与1进行按位或运算,运算得到的值为8'b1101_0001。接下来便可以开始读取数据了。

图片

图片

图片

此处读取数据一共有6组,理论上三轴传感器即X轴Y轴Z轴的数据应该是3组数据,这里之所以是6组数据是因为这三组数据都是16位的,而IIC读取的数据都是8位的,所以相当于将这三组数据拆开读的,先读一组数据的前八位再读这组数据的后八位,所以才有6组数据,上图中程序的最后面便是将这6组数据重新组合成三组数据。


关键字:MPU6050  初始化 引用地址:MPU6050六轴传感器模块初始化教程

上一篇:如何转换Keil工程为ECloudIDE工程
下一篇:单片机最小系统介绍及电路设计

推荐阅读最新更新时间:2024-11-13 06:02

STM32F4 SPI2初始化及收发数据使用库函数
我的STM32F4 Discovery上边有一个加速度传感器LIS302DL。在演示工程中,ST的工程师使用这个传感器做了个很令人羡慕的东西:解算开发板的姿态。当开发板倾斜时候,处于最上边的LED点亮,其他LED不亮。同时,用MicroUSB数据线将开发板连接电脑时,开发板就会虚拟成一个鼠标。倾斜开发板时,鼠标指针会向倾斜的方向移动。归根结底,就是牛B的ST工程师用加速度传感器完成了姿态解算。 在开发板上,加速度传感器使用了SPI方式用STM32F4芯片进行通信。STM32F4的SPI1 作为主机,与LIS302Dl进行通信,读取或者写入数据。由于我没有使用过STM32的SPI口,因此在板子的空余资源中找到了SPI2接口来
[单片机]
初始化ARM处理器各模式下的堆栈指针SP(R13)
程序设计思路:通过状态寄存器与通用寄存器之间数据传输指令MRS/MSR实现,修改时应采用“读取-修改-写回”三个步骤来实现。每次只需修改相应的域即可,如本次程序只修改C控制域。同时应注意系统模式与用户模式共用SP,只需初始化其一即可。 程序代码如下: (1)在GNU ARM开发环境下编程: .equ _ISR_STARTADDRESS, 0xC7FF000 @设置栈的内存基地址 .equ UserStack, _ISR_STARTADDRESS @用户模式堆栈地址0x7FF000 .equ SVCStack, _ISR_STARTADDRESS+256 @管理模式堆栈地址0x7FF100 .equ UndefStac
[单片机]
stm8L 初始化系统时钟
库函数编写程序时,在main中首先是调用sys_clock_init() sys_clock_init()函数用于配制芯片时钟,代码如下: /* 初始化系统时钟 */ void sys_clock_init(void) { /* High speed internal clock prescaler: 1 */ CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); /* Select HSE as system clock source */ CLK_SYSCLKSourceSwitchCmd(ENABLE); CLK_SYSCLKSourceConfig(CLK_SYSCLKSourc
[单片机]
STM8串口初始化寄存器配置
//库函数配置 UART1_DeInit(); UART1_Init((u32)1000000, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO , UART1_SYNCMODE_CLOCK_DISABLE , UART1_MODE_TXRX_ENABLE); UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE ); UART1_Cmd(ENABLE ); //寄存器配置 //UART1- CR1 |= 0X00; //UART1- CR3 |= 0X00; UART1- CR2 = 0X2C; UAR
[单片机]
mini2440内存初始化
S3C2440芯片对外提供的引脚上,只给出了27根地址线,单靠芯片上的27根引脚只能访问128M的外设空间。为了扩大外设的访问范围,S3C2440芯片又提供了8个片选信号nGCS0~nGSC7。当某个片选信号nGSCx有效时,则可通过27根地址线去访问对应这个片选的128MB空间。由于有8个片选,所以2440能访问的外设空间总共为128*8=1G,而1G(0X40000000)以上的空间,则安排给了2440内部的寄存器,访问这些内部的寄存器,这是通过32位的处理器内部总线来完成的。 查看S3C2440的芯片手册第五章存储器控制,对芯片进行内存初始化,需要配置13个寄存器地址为0X48000000到0X48000030。编写汇编代码
[单片机]
mini2440内存<font color='red'>初始化</font>
s3c44b0存储器初始化简介
s3c44b0存储器初始化的问题困扰已久,今天总算是搞明白了点,如下总结吧。 贴段代码先: SMRDATA DATA DCD BWSCON_val ;bank0=OM bank1-bank7=16bit bank2=8bit DCD ((B0_Tacs 13)+(B0_Tcos 11)+(B0_Tacc 8)+(B0_Tcoh 6)+(B0_Tah 4)+(B0_Tacp 2)+(B0_PMC));bankcon0 DCD ((B1_Tacs 13)+(B1_Tcos 11)+(B1_Tacc 8)+(B1_Tcoh 6)+(B1_Tah 4)+(B1_Tacp 2)+(B1_PMC));bankcon1 DCD
[单片机]
迅为4412开发板Linux驱动教程之GPIO的初始化
视频下载地址: http://pan.baidu.com/s/1c06oiti GPIO的初始化 • 在内核源码目录下使用命令“ls drivers/gpio/*.o”,可以看到“gpio-exynos4”被编译进了内核 – 生成.o文件代表最终被编译进了内核 – 除了menuconfig配置文件,还可以通过.o文件来判定该文件是否编译进了 内核 • 在“gpio-exynos4.c”文件最下面一行 – core_initcall(exynos4_gpiolib_init); – core_initcall代表在linux初始化过程中会调用 – 初始化函数是在源码目录下“include/linux/init.h”文件中定义
[单片机]
迅为4412开发板Linux驱动教程之GPIO的<font color='red'>初始化</font>
第十二章、Tiny4412 U-BOOT移植十二 DDR3初始化顺序
现在网上很难搜到Exynos4412的源码,基本上我没有找到任何资料有过分析DDR3的内存初始化代码的。在看U-Boot的这段代码时,也徘徊了很久,不知道如下手,很多文章或资料都将这一段分析过程有意无意的隐藏掉了,最多也只是提一下说参考裸板的代码,在找不到任何资料的情况下,我只能依靠芯片手册上,三星在内存控制器这一章,写的关于DDR3的初始化顺序的21个步骤来一条一条去读去看,在安静下来看了芯片手册以后,我发现三星给的U-Boot的DDR初始化代码和芯片手册上的初始化步骤完全一致,有的时候,最好的资料其实就在手边,只是我一直在想着找捷径,学习哪有那么多捷径? 好好研读手册吧,第18章中有下面一段关于初始化的说明: 图12-
[单片机]
第十二章、Tiny4412 U-BOOT移植十二 DDR3<font color='red'>初始化</font>顺序
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved