秉火陀螺仪m模块汇总用户手册_第1页
秉火陀螺仪m模块汇总用户手册_第2页
秉火陀螺仪m模块汇总用户手册_第3页
秉火陀螺仪m模块汇总用户手册_第4页
秉火陀螺仪m模块汇总用户手册_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、BH-MPU6050 六轴传感器用户手册修订历史日期版本更新内容2015/9/211.0.0-2016/11/191.1新版配套程序使用不同的引脚添加程序说明。2017/8/51.2增加 F103-MINI 开发板的支持。文档说明本手册旨在帮助用户正确构建 BH-MPU6050 六轴传感器的使用环境,引导用户快速使用该模块。关于模块的原理图、机械模块结构图。等说明请参考MPU6050 模块原理图及MPU6050关于主控MPU6050 的硬件参数请参考固件库及资料里的文档。2 / 46目录BH-MPU6050 六轴传感器1用户手册1文档说明2目录31.MPU6050 模块说明41.1 MPU60

2、50 简介41.2 特性参数41.3 MPU6050 模块的引脚功能说明51.4 硬件原理图说明5硬件测试72.1 基本测试82.2.2 使用上位机查看姿态10配套程序说明123.1 硬件设计133.3.2 MPU6050获取原始数据实验133.2.1 软件设计133.2.2验证203.3 MPU6050利用 DMP 进行姿态解算203.3.1 硬件设计213.3.2 软件设计213.3.3验证及 python 上位机的使用303.4 MPU6050使用第上位机343.4.1 硬件设计343.4.2 软件设计343.4.3验证及飞控地面站的使用37附录40姿态检测的基本概念403.4.4 利用

3、陀螺仪检测角度423.4.5 利用度计检测角度433.4.6 利用磁场检测角度443.4.7 利用GPS 检测角度443.4.8 姿态融合与四元数45更新及售后支持463 / 461. MPU6050 模块说明1.1MPU6050 简介BH-MPU6050 是秉火科技推出的六轴传感器模块,见图 1-1,它采用 InvenSense 公司的 MPU6050 作为主,能同时检测三轴度、三轴陀螺仪(三轴角速度)的运动数据以及温度数据。利用 MPU6050内部的DMP 模块(Digital Motion Processor 数字运动处理器),可对传感器数据进行滤波、融合处理,直接通过 IIC 接口向主

4、控器输出姿态解算后的数据,降低主控器的运算量。其姿态解算频率最高可达 200Hz,非常适合用于对姿态控制实时要求较高的领域。常见应用于、智能手环、四轴飞行器、器等的姿态检测。图 1-1 MPU6050 模块外观1.2特性参数MPU6050 模块的特性参数见表 1-1表 1-1MPU6050 模块的特性参数。4 / 46参数说明供电3.3V-5V通讯接口IIC 协议,支持的 IIC 时钟最高频率为 400KHz测量维度度:3 维陀螺仪:3 维ADC 分辨率度:16 位陀螺仪:16 位度测量范围±2g、±4g、±8g、±16g其中 g 为重力度常数,g=9.

5、8m/s ²度最高分辨率16384 LSB/g度测量精度0.1g度输出频率最高 1000Hz1.3MPU6050 模块的引脚功能说明该模块引出的 8 个引脚功能说明见表 1-2。表 1-2 MPU6050 模块引脚说明其中的 SDA/SCL、XDA/XCL 通讯引脚分别为两组 I2C 信号线。当模块与外部主机通讯时,使用 SDA/SCL,如与 STM32通讯;而 XDA/XCL 则用于 MPU6050与其它I2C 传感器通讯时使用,例如使用它与磁场传感器连接,MPU6050 模块可以把从主机SDA/SCL 接收的数据或命令通过 XDA/XCL 引脚转发到磁场传感器中。但实际上这种功能

6、比较鸡肋,麻烦且效率低, 一般会直接把磁场传感器之类的 I2C 传感器直接与MPU6050 挂载在同一条总线上(即都连接到 SDA/SCL),使用主机直接。1.4硬件原理图说明MPU6050 模块的硬件原理图见图 1-2。5 / 46序号引脚名称说明1VCC3.3/5V 电源输入2GND地线3SCLI2C 从时钟信号线SCL (模块上已接上拉电阻)4SDAI2C 从数据信号线SDA (模块上已接上拉电阻)5XDAI2C 主串行数据信号线,用于外接传感器(模块上已接上拉电阻)6XCLI2C 主串行时钟信号线,用于外接传感器(模块上已接上拉电阻)7AD0从机地址设置引脚q接地或悬空时, 地址为:

7、0x68q接 VCC 时,地址为:0x698INT中断输出引脚陀螺仪测量范围±250 º/s 、±500 º/s 、±1000 º/s、±2000 º/s、陀螺仪最高分辨率131 LSB/( º/s)陀螺仪测量精度0.1 º/s陀螺仪输出频率最高 8000HzDMP 姿态解算频率最高 200Hz温度传感器测量范围-40 +85温度传感器分辨率340 LSB/温度传感器精度±1工作温度-40 +85功耗500uA3.9mA (工作电压 3.3V)图 1-2 MPU6050 模块原理图它的

8、硬件非常简单,SDA 与 SCL 被引出方便与外部 I2C 主机连接,看图中的右上角, 可知该模块的 I2C 通讯引脚 SDA 及 SCL 已经连接了上拉电阻,因此它与外部 I2C 通讯主机通讯时直接使用导线连接起来即可;而 MPU6050 模块与其它传感器通讯使用的 XDA、XCL 引脚没有接上拉电阻,要使用时需要注意。模块自身的 I2C 设备地址可通过 AD0 引脚的电平,当 AD0 接地时,设备地址为 0x68(七位地址),当 AD0 接电源时,设备地址为 0x69(七位地址)。另外,当传感器有新数据的时候会通过 INT 引脚通知 STM32。由于 MPU6050 检测时是基于自身中心坐

9、标系的,见图 1-3,它表示的坐标系及旋转符号标出了 MPU6050 传感器的 XYZ 轴的度有角速度的正方向。所以在安装模块时,您需要考虑它与所在设备的坐的关系。图 1-3 MPU6050 传感器的坐标及方向6 / 462. 硬件测试本模块配套 STM32 驱动程序,可直接使用秉火 F103 霸道、F103 指南者及 F429者开发板进试。按要求使用线把模块连接到开发板,并程序即可,其中秉火F429者开发板板载了 MPU6050,不需要外接模块,此处直接列出其引脚关系供使用 STM32F4 的用户参考。在测试前,先用线把 STM32 开发板与该 MPU6050 模块连接起来,见图 2-1 及

10、表2-1。图 2-1 STM32 与 MPU6050 的硬件连接 1(F103 霸道、F103 指南者、F429者开发板)7 / 46图 2-2 STM32 与 MPU6050 的硬件连接 2(F103-MINI 开发板)表 2-1 MPU6050 模块引脚说明F103 霸道、F103 指南者开发板与模块的连接关系一样,注意陀螺仪的 INT 引脚必须连接,否则程序更新数据。2.1 基本测试连接好模块后,找到配套资料里的例程“STM32-MPU6050_DMP 测试例程”),使用MDK 编译并该程序到开发板,复位开发板让程序运行。测试工程所在目录:“开发板配套例程F103 霸道版本或 F103

11、指南者、F429版本”。者1.正常运行的实验现象由于测试程序中串口输出的是特定格式的数据包,不是字符串,直接用串口调试助手查看是一堆乱码,不便于确认程序是否正常运行,可通过板子配套的液否运行正常。来查看程序是8 / 46序号引脚名称与 F103 霸道及F103 指南者开发板连接F103-MINI 开发板F429者板载的陀螺仪1VCC接 3.3V 或 5V接 3.3V 或 5V接 3.3V 或 5V2GNDGNDGNDGND3SCLPB6PA2 (软件 IIC)PB64SDAPB7PA3(软件 IIC)PB75AD0悬空或接地悬空或接地悬空或接地6INTPA11PA11PA8该测试程序开发板的液

12、晃动陀螺仪时到开发板并复位后,正常运行时液的实验现象如下:qq会显示Pitch、Roll、Yaw 姿态角以及温度,数,见图 2-3;Pitch、Roll、Yaw 数据会剧烈变化,这表明模块已经正常工作。若晃动模块姿态角数据不更新,可能是晃动的过程中连接线松了,这时请重新固定引脚连线, 并复位开发板,重新检测。屏幕上的 Temperature 表示模块检测到的温度数据。(精度不高,而且模块运行久了温度会比气温高,所以有误差时并不是模块有问题);qq屏幕的最后一项是数,拿起陀螺仪模仿摆臂运动,数会统计出steps 数据。(的模式匹配需要持续多次重复模仿摆臂运动,请耐心尝试);图 2-3 MPU60

13、50 模块正常运行时的液晶显示2.不正常运行时故障排查模块无法正常工作时,可能出现如下三种情况,请对照排查:q液以字显示“No MPU6050 detected!”,见图 2-4。这时说明开发板检测不到 MPU6050 模块,请参照引脚连接表重新检查模块与开发板之间的连线。图 2-4 模块检测不正常时的液晶显示9 / 46q若屏幕检测正常,但不显示各种姿态数据,见图 2-5。请检查模块的中断引脚 INT 是否与 STM32 开发板正常连接,连接好后复位开发板,重新检测。图 2-5 模块检测正常但没有接 INT 中断引脚时的情况若屏幕有显示姿态角等数据,但晃动模块姿态角数据不更新时,可能是晃动的

14、过程中连接线松了,这时请重新固定引脚连线,并复位开发板,重新检测。q2.2使用上位机查看姿态若通过液的信息了解到 MPU6050 模块已正常工作,则可进一步在电脑上使用“ANO_TC飞控地面站-0512.exe”(以下简称“上位机”)软件查看可视化数据。软件所在目录:“配套软件ANO_TC飞控地面站-0512”。配合该软件查看陀螺仪模块姿态的步骤如下:q确认开发板的 USB TO USART 接口已与电脑相连,确认电脑端能查看到该串口设备。q打开配套资料里的 “上位机”软件,在软件界面打开 开发板对应的串口(波特率为 115200),把“基本收码”、“高级收码”、“飞控波形”功能设置为 on

15、状态。点击上方图中的基本收发、波形显示、飞控状态图标,会弹出窗口。具体见下文软件配置图。在软件的“基本收发”、“波形显示”、“飞控状态”页面可看到滚动数据、随着模块晃动而变化的波形以及模块姿态的 3D 可视化图形。q10 / 46图 2-6 上位机配置图 2-7 基本收发11 / 46图 2-8 波形显示图 2-9 姿态显示3. 配套程序说明下面对 MPU6050 模块配套的几个实验做简单的说明。MPU6050 模块一共配套了四个例程,用户可根据需求选择相应的学习,各个例程的基本功能介绍见表 3-1。表 3-1 MPU6050 模块配套程序基本功能介绍12 / 46程序说明1.硬件STM32-

16、MPU6050硬件 I2C,MPU6050 基本驱动程序,不包含 DMP 功能,没有移植 驱动程序。本程序通过串口输出简单测量数据,没有驱动液晶显示。(不支持 上位机可视数据)。( 使用硬件 I2C 时不能与液 同时使用,因为FSMC 的 NADV 与 I2C1 的 SDA 是同一个引脚,互相影响了)2.软件STM32-MPU6050软件 I2C,MPU6050 基本驱动程序,不包含 DMP 功能,没有移植驱动程序。本程序通过串口和液输出简单测量数据。(不支持上位机可视数据)。其中,例程 1 和 2 的功能类似,都是简单地获取数据,但由于硬件 I2C 不支持同时使,所以后面的 2、3、4 例程

17、都默认使用软件 I2C 来驱动 MPU6050,底层的软件用液I2C 驱动跟 EEPROM 基本本一致,本实验重点讲述上层的 MPU6050 应用及接口。注意:本手册中介绍的程序包含有 F103 霸道、F103 指南者及 F429者开发板配套的版本,实验时请根据的实验平台来使用,各版本的程序原理类似,下文中不细述与平台相关的内容。(F103 霸道及指南者的液晶底层驱动不一样,F1 与 F4 的程序陀螺仪使用的引脚有差异,液晶显示函数也不同;F4 版本没有提供软件 I2C 基本读写的工程,直接使用 DMP 工程即可)。3.1硬件设计在实验前,先用线把 STM32 开发板与该 MPU6050 模块

18、连接起来,请参照前面“硬件测试”章节的说明连接模块。3.2MPU6050获取原始数据实验这一小节讲解如何使用 STM32MPU6050 传感器度、角速度及温度原始数据。在传感器时,使用到了 STM32 的 I2C 驱动,对 MPU6050 传感器的不同寄存器写入不同内容可以实现不同模式的,从特定的寄存器内容则可获取测量数据,这部分关于 MPU6050 具体寄存器的内容我们不再展开,请您查阅MPU-60X0 寄存器手册获知。3.2.1 软件设计本小节讲解的是“硬件 STM32-MPU6050”实验,请打开配套的代码工程阅读理解。为了方便展示及移植,我们把 STM32 的 I2C 驱动相关的代码都

19、编写到“bsp_i2c.c”及“bsp_i2c.h”文件中,与 MPU6050 传感器相关的代码都写到“mpu6050.c”及“mpu6050.h”文件中。1.程序设计要点(1)(2)初始化 STM32 的 I2C;使用 I2C 向 MPU6050 写入参数;13 / 463.STM32-MPU6050_DMP_python上位机移植自 驱动程序,使用了 DMP 功能,液 会显示基本数据,可使用 提供的 python 上位机控制, 不支持 上位机可视数据。默认使用软件I2C。4.STM32-MPU6050_DMP 测试例程移植自 驱动程序,使用了 DMP 功能,液 会显示基本数据,支持 上位机

20、可视数据。默认使用软件 I2C。(3) 定时度、角速度及温度数据。2.代码分析I2C 的硬件定义本实验中的 I2C 驱动与 MPU6050 驱动主要是考虑到扩展其它传感器时的通用性,如使用磁场传感器、气压传感器都可以使用同样一个 I2C 驱动,这个驱动只要给出同传感器时的不同读写接口即可。关于 STM32 的 I2C 驱动原理请参考秉火 STM32不零死角玩转 STM32中读写 EEPROM 的章节,本章讲解的 I2C 驱动主要接口封装讲解,细节不再赘述。本实验中的 I2C 硬件定义见代码代码3-1 I2C 的硬件定义(bsp_i2c.h 文件)3-1。1 #define2 #define3

21、#define4 #define5 #define6 #define7 #define8 #define9 #defineSENSORS_I2CxSENSORS_I2C_APBxClock_FUN SENSORS_I2C_CLK SENSORS_I2C_GPIO_APBxClock_FUN SENSORS_I2C_GPIO_CLK SENSORS_I2C_SCL_PORT SENSORS_I2C_SCL_PIN SENSORS_I2C_SDA_PORT SENSORS_I2C_SDA_PINI2C1RCC_APB1PeriphClockCmd RCC_APB1Periph_I2C1 RCC_A

22、PB2PeriphClockCmd RCC_APB2Periph_GPIOB GPIOBGPIO_Pin_6 GPIOBGPIO_Pin_7这些宏根据传感器使用的 I2C 硬件封装起来了。初始化 I2C接下来利用这些宏对 I2C 进行初始化,初始化过程与 I2C 读写 EEPROM 中的无异,见代码3-2。代码3-2 初始化 I2C(bsp_i2c.c 文件)123456789101112131415161718192021222324252627/*brief param retvalI2C1 I/O 配置无无*/static voidI2C_GPIO_Config(void)GPIO_In

23、itTypeDef GPIO_InitStructure;/* 使能与 I2C1 有关的时钟 */SENSORS_I2C_APBxClock_FUN ( SENSORS_I2C_CLK, ENABLE ); SENSORS_I2C_GPIO_APBxClock_FUN ( SENSORS_I2C_GPIO_CLK,ENABLE );/* PB6-I2C1_SCL、PB7-I2C1_SDA*/GPIO_InitStructure.GPIO_Pin = SENSORS_I2C_SCL_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPI

24、O_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(SENSORS_I2C_SCL_PORT, &GPIO_InitStructure);/ 开漏输出GPIO_InitStructure.GPIO_Pin = SENSORS_I2C_SDA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(SENSORS_I2C_SDA_PORT, &GPIO_I

25、nitStructure);/ 开漏输出/*14 / 46I2C 工作模式配置无无2829303132333435363738394041424344454647484950515253545556*brief param retval*/static voidI2C_Mode_Configu(void)I2C_InitTypeDef I2C_InitStructure;/* I2C 配置 */I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;/* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */ I2C_InitStructure.I2C_Dut

26、yCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;/* I2C 的寻址模式 */I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;/* 通信速率 */ I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;/* I2C1 初始化 */I2C_Init(SENSORS_I2

27、Cx, &I2C_InitStructure);/* 使能 I2C1 */ I2C_Cmd(SENSORS_I2Cx, ENABLE);对读写函数的封装初始化完成后就是编写 I2C 读写函数了,这部分跟 EERPOM 的一样,主要是调用STM32 标 准 库 函 数 读 写 数 据 寄 存 器 及 标 志 位 , 本 实 验 的 这 部 分 被 编 写 进ST_Sensors_I2C_WriteRegister 及 ST_Sensors_I2C_ReadRegister 中了,在它们之上,再封装成了 Sensors_I2C_WriteRegister 及 Sensors_I2C_Rea

28、dRegister,见代码3-3。代码3-3 对读写函数的封装(i2c.c 文件)123456789101112131415161718192021222324/*brief param param param param写寄存器(多次尝试),这是提供给上层的接口slave_addr: 从机地址reg_addr:寄存器地址 len:写入的长度 data_ptr:指向要写入的数据retval 正常为 0,不正常为非 0*/intSensors_I2C_WriteRegister(unsigned char slave_addr,unsigned char reg_addr, unsigned s

29、hort len,const unsigned char *data_ptr)char retries=0; int ret = 0;unsigned short retry_in_mlsec = Get_I2C_Retry();tryWriteAgain: ret = 0;ret = ST_Sensors_I2C_WriteRegister( slave_addr, reg_addr, len, data_ptr);if (ret && retry_in_mlsec) if ( retries+ > 4 )15 / 462526272829303132333435363

30、738394041424344454647484950515253545556575859606162return ret;Delay(retry_in_mlsec); goto tryWriteAgain;returnret;/*读寄存器(多次尝试),这是提供给上层的接口slave_addr: 从机地址reg_addr:寄存器地址brief param param param paramlen:要的长度data_ptr:指向要数据的指针retval 正常为 0,不正常为非 0*/intSensors_I2C_ReadRegister(unsigned char slave_addr,unsi

31、gned char reg_addr, unsigned short len, unsigned char *data_ptr)char retries=0; int ret = 0;unsigned short retry_in_mlsec = Get_I2C_Retry();tryReadAgain:ret = 0;ret = ST_Sensors_I2C_ReadRegister( slave_addr, reg_addr, len, data_ptr);if (ret && retry_in_mlsec) if ( retries+ > 4 )return ret

32、;Delay(retry_in_mlsec); goto tryReadAgain;return ret;封装后的函数主要是增加了错误重试机制,若读写出现错误,则会进行多次尝试,多次尝试均失败后会返回错误代码。这个函数作为 I2C 驱动对外的接口,其它使用 I2C 的传感器调用这个函数进行读写寄存器。MPU6050 的寄存器定义MPU6050 有各种各样的寄存器用于工作模式,我们把这些寄存器的地址、寄存器位使用宏定义到了mpu6050.h 文件中了,见代码代码3-4MPU6050 的寄存器定义(mpu6050.h)3-4。1 /模块的 A0 引脚接 GND,IIC 的 7 位地址为 0x68,

33、若接到 VCC,需要改为 0x692345671112#define #define #define #define#define #define #defineMPU6050_SLAVE_ADDRESS MPU6050_WHO_AM_I MPU6050_SMPLRT_DIV MPU6050_DLPF_CFGMPU6050_GYRO_OUT MPU6050_ACC_OUT MPU6050_RA_XG_OFFS_TC(0x68<<1) 0x750 /8000Hz0/MPU6050 器件读地址0x430x3B/MPU6050 陀螺仪数据寄存器地址/MPU6050度数据寄存器地址0x00

34、 /7 PWR_MODE, 6:1/*.以下部分省略*/16 / 46初始化 MPU6050根据 MPU6050 的寄存器功能定义,我们使用 I2C 往寄存器写入特定的参数,见代码3-5。代码3-5 初始化 MPU6050(mpu6050.c)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849/*brief写数据到 MPU6050 寄存器paramreg_add:寄存器地址paramreg_data:要写入的数据retval*/void MPU6050_WriteRe

35、g(u8 reg_add,u8 reg_dat)Sensors_I2C_WriteRegister(MPU6050_ADDRESS,reg_add,1,&reg_dat);/*brief param paramparam retval从 MPU6050 寄存器数据reg_add:寄存器地址Read: num:要数据的缓冲区的数据量*/void MPU6050_ReadData(u8 reg_add,unsigned char* Read,u8 num)Sensors_I2C_ReadRegister(MPU6050_ADDRESS,reg_add,num,Read);/*brief初始

36、化 MPU6050 paramretval*/void MPU6050_Init(void)int i=0,j=0;/在初始化之前要一段时间,若没有,则断电后再上电数据可能会出错for (i=0; i<1000; i+) for (j=0; j<1000; j+) ;/解除休眠状态MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);/陀螺仪采样率MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07); MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);/配置度传感器工作

37、在 16G 模式MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x01);/陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);这段代码首先使用 MPU6050_ReadData 及 MPU6050_WriteRed 函数封装了 I2C 的底层读写驱动,接下来用它们在 MPU6050_Init 函数中向 MPU6050 寄存器写入了 MPU6050 的采样率、量程(分辨率)。参数,设置17 / 46读传感器 ID初始化后,可通过它的“WHO A

38、M I”寄存器内容来检测硬件是否正常,该寄存器了 ID 号 0x68,见代码3-6。代码3-6传感器 ID(mpu6050.c)12345678910111213141516171819/* brief* paramMPU6050 的 ID* retval 正常返回 1,异常返回 0*/uint8_t MPU6050ReadID(void)unsigned char Re = 0; MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);if (Re != 0x68) /读器件地址MPU_ERROR("检测不到 MPU6050 模块,请检查模块

39、与开发板的接线"); return 0; else MPU_INFO("MPU6050 ID = %drn",Re);return 1;原始数据它数据寄存器获取采样数据了,见代码3-7。若传感器检测正常,就可以代码3-7传感器数据(mpu6050.c)12345678910111213141516171819202122232425262728293031/*MPU6050 的度数据brief param retval*/void MPU6050ReadAcc(short *accData)u8 buf6; MPU6050_ReadData(MPU6050_ACC

40、_OUT, buf, 6); accData0 = (buf0 << 8) | buf1; accData1 = (buf2 << 8) | buf3; accData2 = (buf4 << 8) | buf5;/*brief param retvalMPU6050 的角度数据*/void MPU6050ReadGyro(short *gyroData)u8 buf6; MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);gyroData0 = (buf0 << 8) | buf1; gyroData1 = (bu

41、f2 << 8) | buf3; gyroData2 = (buf4 << 8) | buf5;/*briefMPU6050 的原始温度数据18 / 46323334353637383940414243444546474849505152535455*param retval*/void MPU6050ReadTemp(short *tempData)u8 buf2; MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);*tempData = (buf0 << 8) | buf1;/温度值/*brief param r

42、etvalMPU6050 的温度数据,转化成摄氏度*/void MPU6050_ReturnTemp(float*Temperature)short temp3; u8 buf2;MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); temp3= (buf0 << 8) | buf1;*Temperature=(double) (temp3 /340.0)+36.53;/温度值其中前以上三个函数分别用于三轴度、角速度及温度值,这些都是原始的得的 ADC 值除以分辨率,即可求得实ADC 数值(16 位长),对于度和角速度,把际物理量数值。最后一

43、个函数 MPU6050_ReturnTemp 展示了温度 ADC 值与实际温度值间的转换,它是根据 MPU6050 的说明给出的转换公式进行换算的,注意陀螺仪检测的温度会受自身发热的影响,严格来说它测量的是自身的温度,所以用它来测量气温是不太准确的。对于度和角速度值我们没有进行转换,在下一小节中我们直接利用这些数据交给DMP 单元,求解出姿态角。main 函数最后我们来看看本实验的main 函数,见代码代码3-8 main 函数3-8。12345678910111213141516171819202122/*brief 主函数param 无retval 无*/intmain(void)shor

44、t Acel3; short Gyro3; float Temp;SysTick_Init();SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;/* LED 端口初始化 */ LED_GPIO_Config();/* 串口通信初始化 */ USART_Config();/I2C 初始化I2C_Bus_Init();/MPU6050 初始化19 / 46232425262728293031323334353637383940414243444546474849505152535455MPU6050_Init();/检测 MPU6050if(MPU6050Rea

45、dID() = 1) while (1) if(Task_Delay0=TASK_ENABLE) LED2_TOGGLE;Task_Delay0=1000;if(Task_Delay1=0) MPU6050ReadAcc(Acel);printf("度:%8d%8d%8d",Acel0,Acel1,Acel2);MPU6050ReadGyro(Gyro);printf("陀螺仪%8d%8d%8d",Gyro0,Gyro1,Gyro2);MPU6050_ReturnTemp(&Temp);printf("温度%8.2frn",T

46、emp);Task_Delay1=500;/更新一次数据,可根据的需求,提高采样频率,如 100ms 采样一次/* 下面是增加任务的格式*/if(Task_Delayi=0)Task(i); Task_Delayi=; else printf("rn 没有检测到 MPU6050 传感器!rn"); LED_RED;while (1);本实验中隔一段时间MPU6050 并没有使用中断检测,我们是利用 Systick 定时器进行,MPU6050 的数据寄存器获取采样数据的,代码中使用 Task_Delay 变量来定时时间,在 Systick 中断里会每隔 1ms 对该变量值减

47、1,所以当它的值为 0 时表示定时时间到。在 main 函数里,调用 I2C_Bus_Init、MPU6050_Init 及 MPU6050ReadID 函数后,就在whlie 循环里定时时间,定时时间到后就度、角速度及温度值,并使用串口打印信息到电脑端。3.2.2验证线连接好开发板和模块,用 USB 线连接开发板“USB TO UART”接口跟电使用脑,在电脑端打开串口调试助手,把编译好的程序MPU6050 采样得到的调试信息。到开发板。在串口调试助手可看到3.3MPU6050利用 DMP 进行姿态解算上一小节我们仅利用 MPU6050了原始的数据,如果您对姿态解算的算法深有研究,可以自行编

48、写姿态解算的算法,并利用这些数据,使用 STM32 进行姿态解算,解算后20 / 46输出姿态角。而由于 MPU6050 内部集成了 DMP,不需要 STM32 参与解算,可直接输出姿态角,也不需要对解算算法作深入研究,非常方便,本章讲解如何使用 DMP 进行解算。实验中使用的代码主体是从 MPU6050来的,该资料包里提供了基于 STM32F4提供的驱动motion_driver_6.12移植过器的源代码(本工程正是利用该代码移植到STM32F1 上的)及使用 python 语言编写的上位机,资料中还附带了说明文档,请您充分利用自带的资料学习。3.3.1 硬件设计硬件设计与上一小节实验中的完

49、全一样,且软件中使用了 INT 引脚产生的中断信号,本小节中的代码默认使用软件 I2C。3.3.2 软件设计本小节讲解的是“3.MPU6050_python 上位机”实验,请打开配套的代码工程阅读理解。本工程是从代码移植过来的(IAR 工程移植至 MDK),改动并不多,我们主要给读者讲解一下该驱动的设计思路,方便应用。由于本工程的代码十分庞大,在讲解到某些函数时,请MDK 的搜索功能,从而在工程中查找出对应的代码。1.程序设计要点(1)(2)(3)提供 I2C 读写接口、定时服务及 INT 中断处理; 从陀螺仪中获取原始数据并处理;更新数据并输出。2.代码分析的驱动主要是了 MPL 软件库(M

50、otion Processing Library),要移植该软件库我们需要为它提供 I2C 读写接口、定时服务以及 MPU6050 的数据更新标志。若需要输出调试信息到上位机,还需要提供串口接口。I2C 读写接口MPL 库的内部对 I2C 读写时都使用 i2c_write 及 i2c_read 函数,在文件“inv_mpu.c” 中给出了它们的接口格式,见代码 3-1。代码 3-9 I2C 读写接口(inv_mpu.c 文件)1 /* 以下函数需要定义成如下格式:2 * i2c_write(unsigned char slave_addr, unsigned char reg_addr,3 *unsigned char length, unsigned char const *data)4 * i2c_read(unsigned char slave_addr, unsigned char reg_addr,5 *6 */7unsigned char length, unsigned char *data)8 #define i2c_write9 #define i2c_readSensors_I2C_WriteRegister Sensors_I2C_ReadRegi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论