第错误!未定义书签。页共10页MPU6050教程1.1MPU6050简介如果你想玩四轴,想搞什么空中鼠标,平衡车等待,那么MPU6050真的是太强大了,能做很多东西。玩MPU6050的步骤:1.学习I2C,I2C就是MPU6050传送数据到单片机的一种协议,类似于USB,当然USB还是比较有难度的。2.了解MPU6050相关寄存器,有中文版本的,一边学一边看例程就可以获取数据了。3.把获取的数据进行各种处理。1.2IIC简介IIC可以去看下我们野火相关的教程,在这里只是简单地介绍下,先看下我们的书或者教程,从EEPROM里面写入和读取数据,因为EEPROM写入和读取数据也是根据I2C协议来的。I2C有分软件和硬件,软件就你通过对I2C的时钟线和数据线,可能你不知道时钟线和数据线,那还是先去学I2C的基础教程。软件模拟I2C就是根据下面的图然后再适当的时候给时钟线和数据线高低,具体可以看I2C的协议见图1-1。图1-1IIC起始字节时序图第错误!未定义书签。页共10页这部分学习的诀窍就是:先写下I2C通讯的一个环节就好了,比如起始字节,其他的也是大同小异,直接上网找例程就好了,想要用软件模拟出全部的时序当然也可以。还有一个方式可以用I2C读写数据,就是硬件I2C,硬件I2C就是单片机内部的电路,可以将I2C的时序用硬件电路搞出来,这样子你读写数据就方便很多了。STM32硬件I2C可以去看我们野火的教程。1.3读取MPU6050原始数据我们先来认识下MPU6050的硬件,这是MPU6050模块的图片,注意是模块,中间那个才是MPU6050,只有MPU6050是不够的,还要有一些外围电路才行,这就跟51芯片跟最小系统的区别一样。图1-2MPU6050模块正面第错误!未定义书签。页共10页图1-3MPU6050模块背面管脚名称说明VCC3.3-5V(内部有稳压芯片)GND地线SCLMPU6050作为从机时IIC时钟线SDAMPU6050作为从机时IIC数据线XCLMPU6050作为主机时IIC时钟线XDAMPU6050作为主机时IIC数据线AD0地址管脚,该管脚决定了IIC地址的最低一位INT中断引脚这里重点讲解AD0的作用,I2C通讯中从机是要有地址的,以区别多个从机。当AD0管脚接低电平的时候,从机地址是0xD0。从MPU6050的寄存器中我们可以得到答案,MPU6050作为一个IIC从机设备的时候,有8位地址,高7位的地址是固定的,就是WHOAMI寄存器的默认——0x68,最低的一位是由AD0的连线决定的。第错误!未定义书签。页共10页图1-40x68和0xD0的二进制图1-5WHOAMI寄存器读取原始数据这个过程中一个很重要的思路就是一步一步,确保每步都对之后就很容易读出正确的数据。我们对MPU6050进行读写传感器数据就是对MPU6050的寄存器用I2C进行读写。我们还要了解下MPU6050的寄存器,这个过程跟学习52单片机没有什么区别,就是配置寄存器,读取数据。先来看下软件IIC读取MPU6050例程里面的初始化MPU6050的函数,1voidMPU6050_Init(void)2{3inti=0,j=0;4//在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错6for(i=0;i1000;i++){7for(j=0;j1000;j++){8;9}10}11PMU6050_WriteReg(MPU6050_RA_PWR_MGMT_1,0x00);12//解除休眠状态13PMU6050_WriteReg(MPU6050_RA_SMPLRT_DIV,0x07);14//陀螺仪采样率,1KHz15PMU6050_WriteReg(MPU6050_RA_CONFIG,0x06);16//低通滤波器的设置,截止频率是1K,带宽是5K1718PMU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG,0x00);19//配置加速度传感器工作在2G模式,不自检2021PMU6050_WriteReg(MPU6050_RA_GYRO_CONFIG,0x18);22//陀螺仪自检及测量范围,典型值:0x1238(不自检,2000deg/s)24}下面这句为什么可以解除休眠状态呢?至于为什么要接触休眠状态就要看MPU6050的datasheet。1PMU6050_WriteReg(MPU6050_RA_PWR_MGMT_1,0x00);第错误!未定义书签。页共10页2//解除休眠状态首先Single_WriteI2C();是给MPU6050寄存器写入数据的一个函数,需要有寄存器的地址,关于寄存器的描述,教程的文件夹有两个文档。一个是中文版,一个是英文版,中文版看得不是很明白,可能翻译得不好,英语可以的可以看下英文版本的。首先找到PWR_MGMT_1是某个寄存器的地址,其值如下1#defineMPU6050_RA_PWR_MGMT_10x6B我们在文档中找到地址为0x6B的寄存器,看下说明,可以知道为什么发送0x00给这个寄存器。慢慢地这样子去读,配合MPU6050的寄存器文档。获取数据也是差不多的。这个过程自己慢慢去看MPU6050的datasheet就好了,方法已经介绍。如果整个过程顺利的话,你可以用串口获得类似下面的数据。怎么检验这些数据是不是对的,我直接将手放在MPU6050上面,可以看到温度稍微会升高,而且我移动MPU6050的时候,数据会变化。初步证明数据是对的。图1-6串口数据读取原始数据第错误!未定义书签。页共10页1.4读取MPU6050原始数据分析为什么要获取这些数据呢?看完下一个小节你就会明白。这个要配合一个第七实验室的文档《MPU6050原始数据分析》。我们看在初始化化MPU6050时配置MPU60501PMU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG,0x00);2//配置加速度传感器工作在2G模式,不自检3PMU6050_WriteReg(MPU6050_RA_GYRO_CONFIG,0x18);4//陀螺仪自检及测量范围,典型值:0x158(不自检,2000deg/s)查英文寄存器的手册可以知道我配置的陀螺仪的量程是±2000°/s,再查可知灵敏度是16.4LSB°/s。这里还要知道量程越大,测量精度越低。LSB的意思是最小有效位,为数字输出方式下使用;一般我们可以用mg/LSB来表示灵敏度,例如:mpu6050输出的位数为16位(2的16次方共65536个LSB)对应满量程,当量程为±8g时对应灵敏度就为16g/65536LSB=0.244140625mv/g,取倒数为4096LSB/g,因为mpu6050只能16位输出,所以测量范围越大,对应精度就越低。根据第七实验室的描述一除可以知道我的陀螺仪绕3个轴的角速度最小是不够1°/s,最多是6°/s左右。当时我是保持静止测得的。图1-7陀螺仪配置跟量程的关系图1-8第七实验室文档中对于读取陀螺仪数据的意义的解析接下来是加速度的分析,同样查英文寄存器手册可以知道我设置的加速度例程是±2g,灵敏度是16384LSB/g,这样子下来加速度在y轴上面是1g,这个是重力加速度,说明我放的时候是y轴在竖直方向上的,其他的两周加速度第错误!未定义书签。页共10页是接近于0,说明我放得很垂直啊,你也可以换其他的轴在竖直方向上,看那个轴显示出来的值是否是16384左右,我试了,结果是。更加说明我们的结果很对啦。图1-9加速度配置跟量程的关系图1-10第七实验室文档中对于读取加速度数据的意义的解析软件IIC读取原始数据的例程接线和验证方法如下:VCC:连接到板子5V或者3.3VGND:连接到板子的地SCL:连接到板子的B10SDA:连接到板子的B11AD0:连接到地然后用串口助手看数据即可硬件IIC读取原始数据的例程接线由于硬件IIC是固定的两个硬件管脚,B6和B7,所以要改下上面的SCL和SDA到B6和B7即可1.5圆点博士DMP移植先让大家看一个DMP数据上传到电脑通过上位机来显示的视频你如果是初学者,只是获取了原始数据,那只能告诉你,其实原始数据没有处理没有多大的用处。我们还需要将那些数据根据数学方面的东西转化为姿第错误!未定义书签。页共10页态有关的四元数和欧拉角。这个过程有两种办法,一种你可以去学下数学,然后编程把我们上面获取的原始数据转化为四元数和欧拉角;另一种是直接用MPU6050内部的DMP。这里我们介绍后者。DMP是什么意思?DMP就是指MPU6050内部集成的处理单元,可以直接运算出四元数和姿态,而不再需要另外进行数学运算。DMP的使用大大简化了四轴的代码设计。DMP是数字运动处理器的缩写,顾名思义mpu6050并不单单是一款传感器,其内部还包含了可以独立完成姿态解算算法的处理单元。如在设计中使用DMP来实现传感器融合算法优势很明显。首先,invensense官方提供的姿态解算算法应该比像楼主这样的小白要可靠的多。其次,由DMP实现姿态解算算法将单片机从算法处理的压力中解放出来,单片机所要做的是等待DMP解算完成后产生的外部中断,在外部中断里去读取姿态解算的结果。这样单片机有大量的时间来处理诸如电机调速等其他任务,提高了系统的实时性。直接上E文吧。标准一点。DMPandDMPfeatures:TheDMPisauniquehardwarefeatureofInvenSenseMPUdeviceswhichiscapableofcomputingquaterniondatafromsensorreadings,performingdevicecalibration,andalsoincludesapplicationspecificfeaturessuchaspedometerstep-counting.TheDMPimage(firmware)isheldinvolatilememoryontheMPUandneedstobeupdatedtotheDMPeverytimethechippowersuptoleveragethisfunctionality.四元数和欧拉角是什么?我简单理解,简单解释。标准的自己去查下概念。四元数就是4个数,经过DMP或数学+软件你就可以得到四元数,四元数就是4个数,可以表征姿态,经过几个数学公式之后就可以的出姿态,姿态包括pitch,roll,yaw。我们移植的并不是官方的库,而是圆点博士的库,还包括他的I2C,两者是配套使用的。这个移植要比官方的简单。添加例程文件里面的圆点博士的文件到工程里面,该include的就include。先进行初始化1uart_init(115200);//串口初始化为1152002//引用圆点博士的I2C程序,这里跟我们平常没有什么区3别4ANBT_I2C_Configuration();//IIC初始化5AnBT_DMP_MPU6050_Init();//6050DMP初始化定义一些相关的变量1shortgyro[3],accel[3],sensors;2//陀螺仪存放数组,加速度存放数组,返回状态量3unsignedcharmore;4longquat[4];//四元数存放数组5floatYaw=0.00,Roll,Pitch;//欧拉角6floatq0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;7//计算姿态过程用到的变量接着用库函数读出四元数1dmp_read_fifo(gyro,accel,quat,&sensor_timestamp,&sensors,&more);计算欧拉角,里面包含了上面所说的将四元数转化为欧拉角的公式。1if(sensors&INV_WXYZ_QUAT)第错误!未定义书签。页共10页2{3q0=quat[0]/q30;4q1=quat[1]/q30;5q2=quat[2