MPU6050驱动

news/2024/11/8 17:43:28/

使用的模拟IIC接口驱动的MPU6050,最后使用官方的mpu_dmp计算的最终数据存在偏移,估计是没有电子罗盘进行校准,时间长了方向偏移特别严重。

//MPU6050

/************************************************************************************************************** 文件名:		MPU6050.c* 功能:		MPU6050驱动* 作者:		cp1300@139.com* 邮箱:		cp1300@139.com* 创建时间:	2020-10-19* 最后修改时间:2020-10-19* 详细:	
*************************************************************************************************************/
#include "SYSTEM.h"
#include "MPU6050.h"
#include "SoftwareIIC.h"/*************************************************************************************************************************
*函数        	:	bool MPU6050_Init((MPU6050_HANDLE *pHandle, u8 SlaveAddr)
*功能        	:	MPU6050初始化
*参数        	:	pHandle:句柄;SlaveAddr:芯片IIC地址
*返回        	:	TRUE:初始化成功;FALSE:初始化失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	需要先初始化IIC
*************************************************************************************************************************/
bool MPU6050_Init(MPU6050_HANDLE *pHandle, u8 SlaveAddr)
{u8 id;if(pHandle == NULL) {DEBUG("无效的句柄\r\n");SYS_DelayMS(5000);return FALSE;}pHandle->SlaveAddr = SlaveAddr;								//记录通讯地址MPU6050_WriteOneReg(pHandle, MPU6050_PWR_MGMT1_REG,0X80);	//复位MPU6050SYS_DelayMS(100);MPU6050_WriteOneReg(pHandle, MPU6050_PWR_MGMT1_REG,0X00);	//唤醒MPU6050 MPU6050_SetGyroFS(pHandle, MP6050_GYRO_FS_SEL_500);			//MPU6050陀螺仪量程设置MPU6050_SetAccelFS(pHandle, MP6050_ACCEL_FS_SEL_2g);		//MPU6050加速度量程设置MPU6050_SetRate(pHandle, 50);								//设置采样率MPU6050_WriteOneReg(pHandle, MPU6050_INT_EN_REG,0X00);		//关闭所有中断MPU6050_WriteOneReg(pHandle, MPU6050_USER_CTRL_REG,0X00);	//I2C主模式关闭MPU6050_WriteOneReg(pHandle, MPU6050_FIFO_EN_REG,0X00);		//关闭FIFOMPU6050_WriteOneReg(pHandle, MPU6050_INTBP_CFG_REG,0X80);	//INT引脚低电平有效-此处并未使用INTif(MPU6050_ReadOneReg(pHandle, MPU6050_DEVICE_ID_REG, &id) == FALSE){DEBUG("MPU6050初始化失败,读取芯片ID失败\r\n");return FALSE;}if(id==MPU6050_ADDR)//器件ID正确{MPU6050_WriteOneReg(pHandle, MPU6050_PWR_MGMT1_REG,0X01);	//设置CLKSEL,PLL X轴为参考MPU6050_WriteOneReg(pHandle, MPU6050_PWR_MGMT2_REG,0X00);	//加速度与陀螺仪都工作MPU6050_SetRate(pHandle, 50);								//设置采样率为50Hzuart_printf("MPU6050初始化成功,ID:0x%X\r\n", id);return TRUE;}else {DEBUG("MPU6050初始化失败,无效的ID:0x%d\r\n", id);return FALSE;}
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_SetGyroFS(MPU6050_HANDLE *pHandle, MP6050_GYRO_FS fs)
*功能        	:	MPU6050陀螺仪量程设置
*参数        	:	pHandle:句柄;fs:量程设置,见MP6050_GYRO_FS
*返回        	:	无
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	
*************************************************************************************************************************/
void MPU6050_SetGyroFS(MPU6050_HANDLE *pHandle, MP6050_GYRO_FS fs)
{MPU6050_WriteOneReg(pHandle, MPU6050_GYRO_CFG_REG,(fs&0x03) << 3);
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_SetGyroFS(MPU6050_HANDLE *pHandle, MP6050_ACCEL_FS fs)
*功能        	:	MPU6050加速度量程设置
*参数        	:	pHandle:句柄;fs:量程设置,见MP6050_ACCEL_FS
*返回        	:	无
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	会关闭滤波器
*************************************************************************************************************************/
void MPU6050_SetAccelFS(MPU6050_HANDLE *pHandle, MP6050_ACCEL_FS fs)
{MPU6050_WriteOneReg(pHandle, MPU6050_ACCEL_CFG_REG,(fs&0x03) << 3);
}/*************************************************************************************************************************
*函数        	:	void MPU6050_SetRate(MPU6050_HANDLE *pHandle, u16 rate)
*功能        	:	MPU6050设置采样率
*参数        	:	pHandle:句柄;rate:采样率4-1000Hz
*返回        	:	无
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	需要将DLPF启用,将陀螺仪输出速率固定为1KHz
*************************************************************************************************************************/
void MPU6050_SetRate(MPU6050_HANDLE *pHandle, u16 rate)
{u8 data;if(rate>1000) rate=1000;	//限制为4-1000Hzif(rate<4) rate=4;data=1000/rate-1;MPU6050_WriteOneReg(pHandle, MPU6050_SAMPLE_DIV_REG, data);MPU6050_SetDLPF(pHandle, rate/2);							//MPU6050数字低通滤波器设置-设置为采样率的1/2
}/*************************************************************************************************************************
*函数        	:	void MPU6050_SetDLPF(MPU6050_HANDLE *pHandle, u16 dlpf)
*功能        	:	MPU6050数字低通滤波器设置
*参数        	:	pHandle:句柄;rate:采样率4-1000Hz
*返回        	:	无
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	DLPF_CFG = 1-6 对应FS频率为1KHz
*************************************************************************************************************************/
void MPU6050_SetDLPF(MPU6050_HANDLE *pHandle, u16 dlpf)
{u8 data;if(dlpf>=188)data=1;else if(dlpf>=98)data=2;else if(dlpf>=42)data=3;else if(dlpf>=20)data=4;else if(dlpf>=10)data=5;else data=6; MPU6050_WriteOneReg(pHandle, MPU6050_CFG_REG, data);	
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_ReadOneReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 *pData)
*功能        	:	MPU6050读取一个寄存器
*参数        	:	pHandle:句柄;RegAddr:寄存器地址;pData:寄存器值
*返回        	:	TRUE:读取成功;FALSE:读取失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	
*************************************************************************************************************************/
bool MPU6050_ReadOneReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 *pData)
{SIIC_Start(&pHandle->IIC_Handle);								//产生IIC起始信号if(SIIC_SendByte(&pHandle->IIC_Handle, pHandle->SlaveAddr) == FALSE)	//发送设备地址+写信号{DEBUG("没有收到ACK\r\n");return FALSE;}SIIC_SendByte(&pHandle->IIC_Handle, RegAddr);					//发送寄存器地址SIIC_Start(&pHandle->IIC_Handle);								//产生IIC起始信号SIIC_SendByte(&pHandle->IIC_Handle, pHandle->SlaveAddr|BIT0);	//发送设备地址+读信号*pData = SIIC_ReadByte(&pHandle->IIC_Handle, TRUE);				//SIIC读取一个字节SIIC_Stop(&pHandle->IIC_Handle);								//产生IIC停止信号return TRUE;
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_ReadMultReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 RegNum, u8 DataBuff[])
*功能        	:	MPU6050读取多个寄存器
*参数        	:	pHandle:句柄;RegAddr:寄存器地址;RegNum:寄存器数量;DataBuff:返回结果缓冲区
*返回        	:	TRUE:读取成功;FALSE:读取失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	
*************************************************************************************************************************/
bool MPU6050_ReadMultReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 RegNum, u8 DataBuff[])
{u8 i;SIIC_Start(&pHandle->IIC_Handle);									//产生IIC起始信号if(SIIC_SendByte(&pHandle->IIC_Handle, pHandle->SlaveAddr) == FALSE)	//发送设备地址+写信号{DEBUG("没有收到ACK\r\n");return FALSE;}SIIC_SendByte(&pHandle->IIC_Handle, RegAddr);						//发送寄存器地址SIIC_Start(&pHandle->IIC_Handle);									//产生IIC起始信号SIIC_SendByte(&pHandle->IIC_Handle, pHandle->SlaveAddr|BIT0);		//发送设备地址+读信号for(i = 0;i < RegNum;i ++){if(i == (RegNum-1))	//最后一字节不响应ACK{DataBuff[i] = SIIC_ReadByte(&pHandle->IIC_Handle, FALSE);	//SIIC读取一个字节-NAK}else{DataBuff[i] = SIIC_ReadByte(&pHandle->IIC_Handle, TRUE);	//SIIC读取一个字节-ACK}	}SIIC_Stop(&pHandle->IIC_Handle);									//产生IIC停止信号return TRUE;
}/*************************************************************************************************************************
*函数        	:	void MPU6050_WriteOneReg(MPU6050_HANDLE *pHandle,u8 RegAddr,u8 data)
*功能        	:	MPU6050写一个寄存器
*参数        	:	pHandle:句柄;RegAddr:寄存器地址;data:要写入的值
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-19
*最后修改时间	:	2020-10-19
*说明        	:	
*************************************************************************************************************************/
bool MPU6050_WriteOneReg(MPU6050_HANDLE *pHandle,u8 RegAddr,u8 data)
{SIIC_Start(&pHandle->IIC_Handle);								//产生IIC起始信号if(SIIC_SendByte(&pHandle->IIC_Handle, pHandle->SlaveAddr) == FALSE)	//发送设备地址+写信号{DEBUG("没有收到ACK\r\n");return FALSE;}SIIC_SendByte(&pHandle->IIC_Handle, RegAddr);					//发送寄存器地址SIIC_SendByte(&pHandle->IIC_Handle, data);						//发送要写入的数据SIIC_Stop(&pHandle->IIC_Handle);								//产生IIC停止信号return FALSE;
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_WriteMultReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 RegNum, u8 DataBuff[])
*功能        	:	MPU6050写多个寄存器
*参数        	:	pHandle:句柄;RegAddr:寄存器地址;RegNum:寄存器数量;DataBuff:要写入的数据
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-20
*最后修改时间	:	2020-10-20
*说明        	:	
*************************************************************************************************************************/
bool MPU6050_WriteMultReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 RegNum, u8 DataBuff[])
{u8 i;SIIC_Start(&pHandle->IIC_Handle);										//产生IIC起始信号if(SIIC_SendByte(&pHandle->IIC_Handle, pHandle->SlaveAddr) == FALSE)	//发送设备地址+写信号{DEBUG("没有收到ACK\r\n");return FALSE;}SIIC_SendByte(&pHandle->IIC_Handle, RegAddr);							//发送寄存器地址for(i = 0;i < RegNum;i ++){if(SIIC_SendByte(&pHandle->IIC_Handle, DataBuff[i]) == FALSE) {SIIC_Stop(&pHandle->IIC_Handle);									//产生IIC停止信号	return FALSE;}}SIIC_Stop(&pHandle->IIC_Handle);									//产生IIC停止信号return TRUE;
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_GetTemper(MPU6050_HANDLE *pHandle, s16 *pTemp)
*功能        	:	MPU6050读取温度
*参数        	:	pHandle:句柄;pTemp:读取的温度值,扩大100倍
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-20
*最后修改时间	:	2020-10-20
*说明        	:	
*************************************************************************************************************************/
bool MPU6050_GetTemper(MPU6050_HANDLE *pHandle, s16 *pTemp)
{u8 buff[2];float ftemp;if(MPU6050_ReadMultReg(pHandle, MPU6050_TEMP_OUTH_REG, 2, buff) == FALSE) return FALSE;ftemp = ((u16)buff[0]<<8)|buff[1];ftemp /= 340.0f;ftemp += 36.53f;*pTemp = ftemp*10;return TRUE;
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_GetGyroData(MPU6050_HANDLE *pHandle, s16 *gx, s16 *gy ,s16 *gz)
*功能        	:	MPU6050读取陀螺仪原始数据
*参数        	:	pHandle:句柄;gx,gy,gz:三个轴原始数据
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-20
*最后修改时间	:	2020-10-20
*说明        	:	
*************************************************************************************************************************/
bool MPU6050_GetGyroData(MPU6050_HANDLE *pHandle, s16 *gx, s16 *gy ,s16 *gz)
{u8 buff[6];if(MPU6050_ReadMultReg(pHandle, MPU6050_GYRO_XOUTH_REG, 6, buff) == FALSE) return FALSE;*gx=((u16)buff[0]<<8)|buff[1];  *gy=((u16)buff[2]<<8)|buff[3];  *gz=((u16)buff[4]<<8)|buff[5];return TRUE;	
}/*************************************************************************************************************************
*函数        	:	bool MPU6050_GetAccelData(MPU6050_HANDLE *pHandle, s16 *ax, s16 *ay ,s16 *az)
*功能        	:	MPU6050读取加速度原始数据
*参数        	:	pHandle:句柄;ax,ay,az:三个轴原始数据
*返回        	:	TRUE:成功;FALSE:失败
*依赖			: 	底层宏定义
*作者       	:	cp1300@139.com
*时间     		:	2020-10-20
*最后修改时间	:	2020-10-20
*说明        	:	
*************************************************************************************************************************/
bool MPU6050_GetAccelData(MPU6050_HANDLE *pHandle, s16 *ax, s16 *ay ,s16 *az)
{u8 buff[6];if(MPU6050_ReadMultReg(pHandle, MPU6050_ACCEL_XOUTH_REG, 6, buff) == FALSE) return FALSE;*ax=((u16)buff[0]<<8)|buff[1];  *ay=((u16)buff[2]<<8)|buff[3];  *az=((u16)buff[4]<<8)|buff[5];return TRUE;	
}

//MPU6050.h

/************************************************************************************************************** 文件名:		MPU6050.h* 功能:		MPU6050驱动* 作者:		cp1300@139.com* 邮箱:		cp1300@139.com* 创建时间:	2020-10-19* 最后修改时间:2020-10-19* 详细:	
*************************************************************************************************************/
#ifndef __MPU6050_H_
#define __MPU6050_H_
#include "system.h"
#include "SoftwareIIC.h"//MPU6050 句柄
typedef struct
{SIIC_HANDLE IIC_Handle;u8 SlaveAddr;
}MPU6050_HANDLE;#define MPU6050_UX_VDDIO			0x01	//MP6050 IIC空闲高电平上拉电源设置,0:VLOGIC;1:VDD 由于都是3.3V,无所谓这个值的设置
#define MPU6050_SELF_TESTX_REG		0X0D	//自检寄存器X
#define MPU6050_SELF_TESTY_REG		0X0E	//自检寄存器Y
#define MPU6050_SELF_TESTZ_REG		0X0F	//自检寄存器Z
#define MPU6050_SELF_TESTA_REG		0X10	//自检寄存器A
#define MPU6050_SAMPLE_DIV_REG		0X19	//采样频率分频器
#define MPU6050_CFG_REG				0X1A	//配置寄存器
#define MPU6050_GYRO_CFG_REG		0X1B	//陀螺仪配置寄存器
#define MPU6050_ACCEL_CFG_REG		0X1C	//加速度计配置寄存器
#define MPU6050_MOTION_DET_REG		0X1F	//运动检测阀值设置寄存器
#define MPU6050_FIFO_EN_REG			0X23	//FIFO使能寄存器
#define MPU6050_I2CMST_CTRL_REG		0X24	//IIC主机控制寄存器
#define MPU6050_I2CSLV0_ADDR_REG	0X25	//IIC从机0器件地址寄存器
#define MPU6050_I2CSLV0_REG			0X26	//IIC从机0数据地址寄存器
#define MPU6050_I2CSLV0_CTRL_REG	0X27	//IIC从机0控制寄存器
#define MPU6050_I2CSLV1_ADDR_REG	0X28	//IIC从机1器件地址寄存器
#define MPU6050_I2CSLV1_REG			0X29	//IIC从机1数据地址寄存器
#define MPU6050_I2CSLV1_CTRL_REG	0X2A	//IIC从机1控制寄存器
#define MPU6050_I2CSLV2_ADDR_REG	0X2B	//IIC从机2器件地址寄存器
#define MPU6050_I2CSLV2_REG			0X2C	//IIC从机2数据地址寄存器
#define MPU6050_I2CSLV2_CTRL_REG	0X2D	//IIC从机2控制寄存器
#define MPU6050_I2CSLV3_ADDR_REG	0X2E	//IIC从机3器件地址寄存器
#define MPU6050_I2CSLV3_REG			0X2F	//IIC从机3数据地址寄存器
#define MPU6050_I2CSLV3_CTRL_REG	0X30	//IIC从机3控制寄存器
#define MPU6050_I2CSLV4_ADDR_REG	0X31	//IIC从机4器件地址寄存器
#define MPU6050_I2CSLV4_REG			0X32	//IIC从机4数据地址寄存器
#define MPU6050_I2CSLV4_DO_REG		0X33	//IIC从机4写数据寄存器
#define MPU6050_I2CSLV4_CTRL_REG	0X34	//IIC从机4控制寄存器
#define MPU6050_I2CSLV4_DI_REG		0X35	//IIC从机4读数据寄存器#define MPU6050_I2CMST_STA_REG		0X36	//IIC主机状态寄存器
#define MPU6050_INTBP_CFG_REG		0X37	//中断/旁路设置寄存器
#define MPU6050_INT_EN_REG			0X38	//中断使能寄存器
#define MPU6050_INT_STA_REG			0X3A	//中断状态寄存器#define MPU6050_ACCEL_XOUTH_REG		0X3B	//加速度值,X轴高8位寄存器
#define MPU6050_ACCEL_XOUTL_REG		0X3C	//加速度值,X轴低8位寄存器
#define MPU6050_ACCEL_YOUTH_REG		0X3D	//加速度值,Y轴高8位寄存器
#define MPU6050_ACCEL_YOUTL_REG		0X3E	//加速度值,Y轴低8位寄存器
#define MPU6050_ACCEL_ZOUTH_REG		0X3F	//加速度值,Z轴高8位寄存器
#define MPU6050_ACCEL_ZOUTL_REG		0X40	//加速度值,Z轴低8位寄存器#define MPU6050_TEMP_OUTH_REG		0X41	//温度值高八位寄存器
#define MPU6050_TEMP_OUTL_REG		0X42	//温度值低8位寄存器#define MPU6050_GYRO_XOUTH_REG		0X43	//陀螺仪值,X轴高8位寄存器
#define MPU6050_GYRO_XOUTL_REG		0X44	//陀螺仪值,X轴低8位寄存器
#define MPU6050_GYRO_YOUTH_REG		0X45	//陀螺仪值,Y轴高8位寄存器
#define MPU6050_GYRO_YOUTL_REG		0X46	//陀螺仪值,Y轴低8位寄存器
#define MPU6050_GYRO_ZOUTH_REG		0X47	//陀螺仪值,Z轴高8位寄存器
#define MPU6050_GYRO_ZOUTL_REG		0X48	//陀螺仪值,Z轴低8位寄存器#define MPU6050_I2CSLV0_DO_REG		0X63	//IIC从机0数据寄存器
#define MPU6050_I2CSLV1_DO_REG		0X64	//IIC从机1数据寄存器
#define MPU6050_I2CSLV2_DO_REG		0X65	//IIC从机2数据寄存器
#define MPU6050_I2CSLV3_DO_REG		0X66	//IIC从机3数据寄存器#define MPU6050_I2CMST_DELAY_REG	0X67	//IIC主机延时管理寄存器
#define MPU6050_SIGPATH_RST_REG		0X68	//信号通道复位寄存器
#define MPU6050_MDETECT_CTRL_REG	0X69	//运动检测控制寄存器
#define MPU6050_USER_CTRL_REG		0X6A	//用户控制寄存器
#define MPU6050_PWR_MGMT1_REG		0X6B	//电源管理寄存器1
#define MPU6050_PWR_MGMT2_REG		0X6C	//电源管理寄存器2 
#define MPU6050_FIFO_CNTH_REG		0X72	//FIFO计数寄存器高八位
#define MPU6050_FIFO_CNTL_REG		0X73	//FIFO计数寄存器低八位
#define MPU6050_FIFO_RW_REG			0X74	//FIFO读写寄存器
#define MPU6050_DEVICE_ID_REG		0X75	//器件ID寄存器//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU6050_ADDR				0X68//陀螺仪满量程设置
typedef enum
{MP6050_GYRO_FS_SEL_250		=	0,	//±250°/sMP6050_GYRO_FS_SEL_500		=	1,	//±500°/sMP6050_GYRO_FS_SEL_1000		=	2,	//±1000°/sMP6050_GYRO_FS_SEL_2000		=	3,	//±2000°/s
}MP6050_GYRO_FS;//加速度传感器满量程设置
typedef enum
{MP6050_ACCEL_FS_SEL_2g		=	0,	//±2gMP6050_ACCEL_FS_SEL_4g		=	1,	//±4gMP6050_ACCEL_FS_SEL_8g		=	2,	//±8gMP6050_ACCEL_FS_SEL_16g		=	3,	//±16g
}MP6050_ACCEL_FS;bool MPU6050_Init(MPU6050_HANDLE *pHandle, u8 SlaveAddr);						//MPU6050初始化
void MPU6050_SetGyroFS(MPU6050_HANDLE *pHandle, MP6050_GYRO_FS fs);				//MPU6050陀螺仪量程设置
void MPU6050_SetAccelFS(MPU6050_HANDLE *pHandle, MP6050_ACCEL_FS fs);			//MPU6050加速度量程设置
void MPU6050_SetRate(MPU6050_HANDLE *pHandle, u16 rate);						//MPU6050设置采样率
void MPU6050_SetDLPF(MPU6050_HANDLE *pHandle, u16 dlpf);						//MPU6050数字低通滤波器设置
bool MPU6050_GetTemper(MPU6050_HANDLE *pHandle, s16 *pTemp);					//MPU6050读取温度
bool MPU6050_GetGyroData(MPU6050_HANDLE *pHandle, s16 *gx, s16 *gy ,s16 *gz);	//MPU6050读取陀螺仪原始数据
bool MPU6050_GetAccelData(MPU6050_HANDLE *pHandle, s16 *ax, s16 *ay ,s16 *az);	//MPU6050读取加速度原始数据
bool MPU6050_ReadOneReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 *pData);								//MPU6050读取一个寄存器
bool MPU6050_ReadMultReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 RegNum, u8 DataBuff[]);				//MPU6050读取多个寄存器
bool MPU6050_WriteOneReg(MPU6050_HANDLE *pHandle,u8 RegAddr,u8 data);								//MPU6050写一个寄存器
bool MPU6050_WriteMultReg(MPU6050_HANDLE *pHandle,u8 RegAddr, u8 RegNum, u8 DataBuff[]);			//MPU6050写多个寄存器#endif //__MPU6050_H_

//官方数据融合所需接口

/************************************************************************************************************** 文件名:		inv_mpu_interface.c* 功能:		MPU6050 dmp数据融合所需接口* 作者:		cp1300@139.com* 邮箱:		cp1300@139.com* 创建时间:	2020-10-20* 最后修改时间:2020-10-20* 详细:	
*************************************************************************************************************/
#include "typedef.h"
#include "inv_mpu_interface.h"
#include "mpu6050.h"MPU6050_HANDLE g_MPU6050_Handle;//IIC写数据接口(返回0:正常)
int i2c_write(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char const *data)
{if(MPU6050_WriteMultReg(&g_MPU6050_Handle, reg_addr, length, (u8*)data) == TRUE) return 0;else return 1;
}//IIC读取数据接口(返回0:正常)
int i2c_read(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data)
{if(MPU6050_ReadMultReg(&g_MPU6050_Handle, reg_addr, length, data) == TRUE) return 0;else return 1;
}//获取时间戳,单位ms
void get_ms(unsigned long *time)
{unsigned long t = SYS_GetOSRunTime();*time = t;
}//延时接口
void delay_ms(u32 ms)
{SYS_DelayMS(ms);
}

数据融合测试


//mpu6050测试
void mpu6050_test(void)
{s16 Temp;s16 GyroData[3];s16 AccelData[3];SIIC_Init(&g_MPU6050_Handle.IIC_Handle, GPIOG, GPIOG, 0, 1, 10);		//软件IIC初始化while(MPU6050_Init(&g_MPU6050_Handle, 0xD0) == FALSE)					//MPU6050初始化{Sleep(1000);}if(MPU6050_GetTemper(&g_MPU6050_Handle, &Temp) == TRUE)			//MPU6050读取温度{uart_printf("[MP6050]温度:%s%d.%02d℃\r\n",(Temp<0)?"-":"", abs(Temp)/100, abs(Temp)%100);}else{uart_printf("[MP6050]温度:ERROR\r\n");}if(MPU6050_GetGyroData(&g_MPU6050_Handle,  &GyroData[0], &GyroData[1] , &GyroData[2]) == TRUE)	//MPU6050读取陀螺仪原始数据{uart_printf("[MP6050]陀螺仪:%d %d %d\r\n", GyroData[0],GyroData[1],GyroData[2]);}else{uart_printf("[MP6050]陀螺仪:ERROR\r\n");}if(MPU6050_GetAccelData(&g_MPU6050_Handle,  &AccelData[0], &AccelData[1] , &AccelData[2]) == TRUE)	//MPU6050读取加速度原始数据{uart_printf("[MP6050]加速度:%d %d %d\r\n", AccelData[0],AccelData[1],AccelData[2]);}else{uart_printf("[MP6050]加速度:ERROR\r\n");}//数据融合测试while(mpu_dmp_init()){uart_printf("mpu_dmp_init error\r\n");Sleep(1000);}	while(1){if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0){ uart_printf("俯仰角:%f ", pitch);uart_printf("横滚角:%f ", roll);uart_printf("航向角:%f \r\n", yaw);}Sleep(300);}}

 


http://www.ppmy.cn/news/381764.html

相关文章

HMI-65-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移环境配置

HMI-65-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移环境配置 文章目录 HMI-65-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移环境配置环境搭建开发板环境搭建上位机环境搭建01 安装Qt02 添加设备03 添加Kit套件 代码迁移◕目前项目进展▶第三阶段 液晶仪表节…

WDM驱动

WDM英文Windows Driver Model(WDM)的缩写。 简介 WDM WDM是WINDOWS2000认证的驱动程序&#xff0c;WIN2000由NT发展而来&#xff0c;所以对于设备的支持功能有限&#xff0c;同时为了最大限度的保障稳定性&#xff0c;所以推崇WDM驱动&#xff0c;但同时WDM驱动也就是功能最少…

SQL Server 中count方法和case when语句配合使用中的问题

概要 我们在使用SQL Server生成报表统计数据的时候&#xff0c;经常使用sum&#xff0c;count等聚合函数&#xff0c;有时候还会配合case when语句一边执行过滤操作&#xff0c;一边进行聚合。 本文介绍一个在使用中的常见的错误和解决方法。 设计和实现 下面是一张订单记录…

HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移

HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移 文章目录 HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移摘要修改Pro文件设置CPU亲缘性后面的解决思路1 只用大量属性动画&#xff0c;替换部分效果&#xff0c;现在使用了定时器2 使用新的框架&…

嗨,这里有一个满足ISO 26262 ASIL-D功能安全的整车控制器,你不了解一下吗?

背景介绍 为了保证汽车电子电气的可靠性设计&#xff0c;在2011年发布了ISO 26262&#xff08;道路车辆功能安全标准&#xff09;&#xff0c;ISO 26262标准横向视角来看&#xff0c;解决的问题是&#xff1a;减少汽车电子电气系统发生系统性失效的可能性&#xff0c;采用的方…

汇川H5U和三菱Q系列内置以太网做MODBUS通讯

汇川H5U和三菱Q系列内置以太网做MODBUS通讯 PLC型号&#xff1a; 汇川H5U-1614MTD&#xff0c;三菱Q03UDV 主从方式&#xff1a; 汇川做modbus/tcp从站&#xff0c;三菱做主站读取。 3配置方式&#xff1b; 1、汇川做modbus/tcp从站&#xff0c;H5U默认开启modbus/tcp从站服…

M65

算起来等这部手机也等了我半年了&#xff0c;先等着它上市&#xff0c;再等着它降价。不知道西门子搞什么鬼&#xff0c;大陆就是不降。只好上澳门买了&#xff0c;两地差价最少500RMB&#xff0c;算上来回路费&#xff0c;还是赚了。可惜没有买到数据线还有耳机&#xff0c;还…

网络安全|渗透测试入门学习,从零基础入门到精通—收集信息篇

目录 前面的话 1、收集域名信息 1.1、Whois查询 ​编辑1.2、备案信息查询 2、收集敏感信息 3、收集子域名信息 3.1、子域名检测工具 3.2、搜索引擎枚举 3.3、第三方聚合应用枚举 3.4、证书透明度公开日志枚举 本章小结 前面的话 本人喜欢网络完全的一些知识&#xff…