【灵动MM32-姿态角解算】移植MPU6050-DMP库实现姿态角PRY解算

MM32使用DMP库处理MPU6050数据、姿态解算

实现途径:

①MM32F3277G9P单片机 ②MPU6050模块 ③智能车逐飞MM32开源库 ④正点原子dmp开源库

开源库链接: 逐飞科技MM32F327X_G9P开源库

一、mpu6050介绍

MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件,相较于多组件
方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。

MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口(本
模块未引出),可用于连接外部磁力传感器,并利用自带的数字运动处理器( DMP: Digital
Motion Processor)硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。
我们可以使用 InvenSense 公司提供的运动处理DMP资料库,非常方便的实现姿态算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。

在这里插入图片描述

MPU6050 的特点包括:
① 以数字形式输出 6 轴或 9 轴(需外接磁传感器)的旋转矩阵、四元数(quaternion)、
欧拉角格式(Euler Angle forma)的融合演算数据(需 DMP 支持)
② 具有 131 LSBs/° /sec 敏感度与全格感测范围为±250、±500、±1000 与±2000°
/sec 的 3 轴角速度感测器(陀螺仪)
③ 集成可程序控制,范围为±2g、±4g、±8g 和±16g 的 3 轴加速度传感器
④ 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移
⑤ 自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演
算数据、感测器同步化、姿势感应等的负荷
⑥ 内建运作时间偏差与磁力感测器校正演算技术, 免除了客户须另外进行校正的需求
⑦ 自带一个数字温度传感器
⑧ 带数字输入同步引脚(Sync pin)支持视频电子影相稳定技术与 GPS
⑨ 可程序控制的中断(interrupt),支持姿势识别、摇摄、画面放大缩小、滚动、快速
下降中断、 high-G 中断、零动作感应、触击感应、摇动感应功能
⑩ VDD 供电电压为 2.5V±5%、 3.0V±5%、 3.3V±5%; VLOGIC 可低至1.8V±5%
⑪ 陀螺仪工作电流: 5mA,陀螺仪待机电流: 5uA;加速器工作电流: 500uA,加速
器省电模式电流: 40uA@10Hz
⑫ 自带 1024 字节 FIFO,有助于降低系统功耗
⑬ 高达 400Khz 的 IIC 通信接口
⑭ 超小封装尺寸: 4x4x0.9mm(QFN)
在这里插入图片描述

二、灵动MM32-DMP库移植

InvenSense 提供的 MPU6050 运动驱动库是基于 MSP430 的,我们需要将其移植一下,
才可以用到 MM32上面。

1、添加库文件

首先需要添加这六个文件到工程中,这六个文件是我从正点原子那里复制过来的,里边大部分不需要改动,只有下面少数几个地方。最后我会将工程文件上传到百度网盘。

在这里插入图片描述

2、官方 DMP 驱动库移植

主要是实现这 4 个函数: i2c_write, i2c_read,delay_ms 和 get_ms

#define i2c_write   MPU_Write_Len
#define i2c_read    MPU_Read_Len
#define delay_ms    systick_delay_ms
#define get_ms      mget_m

其中MPU_Write_Len是我根据逐飞库改变而来,位置在SEEKREE_IIC.c文件之中

//IIC连续写
//addr:器件地址 
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
//    其他,错误代码
uint8_t MPU_Write_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
   
   
	uint8_t i; 
    simiic_start();
	send_ch((addr<<1)|0);//发送器件地址+写命令	
    send_ch(reg);	//写寄存器地址
	for(i=0;i<len;i++)
	{
   
   
		send_ch(buf[i]);	//发送数据		
	}    
    simiic_stop();	 
	return 0;	
} 

MPU_Read_Len是我根据逐飞库改变而来,位置在SEEKREE_IIC.c文件之中

//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
//    其他,错误代码
uint8_t MPU_Read_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
   
    
 	simiic_start();
	send_ch((addr<<1)|0);//发送器件地址+写命令	
    send_ch(reg);	//写寄存器地址
	
    simiic_start();
	send_ch((addr<<1)|1);//发送器件地址+读命令	
	
	while(len)
	{
   
   
		if(len==1)*buf=read_ch(0);	//读数据,发送nACK 
		else *buf=read_ch(1);		//读数据,发送ACK  
		len--
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值