MPU6050(MPU6050)

宏定义

宏定义注释
PRINT_ACCEL(0x01)打印加速度数据
PRINT_GYRO(0x02)打印陀螺仪数据
PRINT_QUAT(0x04)打印四元数数据
ACCEL_ON(0x01)加速度传感器使能
GYRO_ON(0x02)陀螺仪传感器使能
MOTION(0)运动状态(0表示无运动)
NO_MOTION(1)非运动状态(1表示有运动)
DEFAULT_MPU_HZ(200)默认采样频率,单位为 Hz
FLASH_SIZE(512)闪存大小,单位为字节
FLASH_MEM_START((void*)0x1800)闪存起始地址
q301073741824.0f用于四元数和加速度/陀螺仪数据的标度因子

全局变量

全局变量类型注释
gyroshort[3]陀螺仪数据数组,包含 x、y、z 轴数据
accelshort[3]加速度数据数组,包含 x、y、z 轴数据
sensorsshort传感器状态标志
Rollfloat横滚角
Pitchfloat俯仰角
Yawfloat偏航角
q0float四元数 q0 部分
q1float四元数 q1 部分
q2float四元数 q2 部分
q3float四元数 q3 部分
bufferuint8_t[14]缓冲区用于存储数据
MPU6050_FIFOint16_t[6][11]数据缓存数组,用于滤波处理
Gx_offsetint16_t滚转轴偏移量
Gy_offsetint16_t俯仰轴偏移量
Gz_offsetint16_t偏航轴偏移量

静态变量

静态变量类型注释
gyro_orientationsigned char[9]陀螺仪方向矩阵

方法

MPU6050_Init()

初始化 MPU6050 以进入可用状态

返回值类型
void

MPU6050_getDate(int way)

2024-11-25 更新

整合了获取姿态的算法

读取 MPU6050 姿态信息

  • way: 1.DMP 2.卡尔曼滤波 3.互补滤波

  • 使用卡尔曼滤波和互补滤波获取姿态信息时,读取到的Yaw值为无效数据(即返回值下标为2处的值无效)

参数类型注释
wayint读取姿态信息的算法: 1.DMP 2.卡尔曼滤波 3.互补滤波
返回值类型
姿态信息float*
返回值顺序: Roll, Pitch, Yaw, gyro(x轴), gyro(y轴),gyro(z轴), accel(x轴),accel(y轴),accel(z轴)

Read_DMP(void)

读取 MPU6050 内置 DMP 的姿态信息

2024-11-18 更新

1. 返回值添加了原始数据gyro和accel


2024-11-22 更新

1. 修复了返回值顺序的错误问题

返回值类型
姿态信息float*
返回值顺序: Roll, Pitch, Yaw, gyro(x轴), gyro(y轴),gyro(z轴), accel(x轴),accel(y轴),accel(z轴)

Read_Temperature(void)

读取 MPU6050 内置温度传感器数据

返回值类型
摄氏温度int
其它函数返回值功能
static unsigned short inv_row_2_scale(const signed char *row)unsigned short行向量标度转换函数
static unsigned short inv_orientation_matrix_to_scalar(const signed char *mtx)unsigned short方向矩阵标度转换函数
static void run_self_test(void)void运行自检并设置偏置
void MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz)void更新 FIFO 数组并进行滤波处理
void MPU6050_setClockSource(uint8_t source)void设置 MPU6050 时钟源
void MPU6050_setFullScaleGyroRange(uint8_t range)void设置陀螺仪全量程范围
void MPU6050_setFullScaleAccelRange(uint8_t range)void设置加速度计的最大量程
void MPU6050_setSleepEnabled(uint8_t enabled)void设置 MPU6050 是否进入睡眠模式
uint8_t MPU6050_getDeviceID(void)uint8_t读取 MPU6050 WHO_AM_I 标识
uint8_t MPU6050_testConnection(void)uint8_t检测 MPU6050 是否已经连接
void MPU6050_setI2CMasterModeEnabled(uint8_t enabled)void设置 MPU6050 是否为AUX I2C线的主机
void MPU6050_setI2CBypassEnabled(uint8_t enabled)void设置 MPU6050 是否为AUX I2C线的主机
void MPU6050_initialize(void)void初始化 MPU6050 以进入可用状态
DMP_Init(void)voidMPU6050内置DMP的初始化
float* Read_DMP(void)float*读取 MPU6050 内置 DMP 的姿态信息
int Read_Temperature(void)int读取 MPU6050 内置温度传感器数据
void MPU6050_EXTI_Init(void)void初始化中断

使用示例

MPU6050依赖于Delay模块作为前置


//新版只需导入这两个头文件
#include "delay.h"
#include "MPU6050.h"

//旧版还需导入这些个头文件
#include "IOI2C.h"
#include "dmpKey.h"
#include "dmpmap.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
int main() {
    MPU6050_Init();
    while(1);
    return 0;
}
void EXTI15_10_IRQHandler() {
    if(MPU6050_INT==0)		
    {   
        EXTI->PR=1<<12;
        // 新版本推荐使用 MPU6050_getDate(1) 
        // 旧版本使用 Read_DMP(); 
        MPU6050_getDate(1);
    }
}