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) | 闪存起始地址 |
| q30 | 1073741824.0f | 用于四元数和加速度/陀螺仪数据的标度因子 |
全局变量
| 全局变量 | 类型 | 注释 |
|---|---|---|
| gyro | short[3] | 陀螺仪数据数组,包含 x、y、z 轴数据 |
| accel | short[3] | 加速度数据数组,包含 x、y、z 轴数据 |
| sensors | short | 传感器状态标志 |
| Roll | float | 横滚角 |
| Pitch | float | 俯仰角 |
| Yaw | float | 偏航角 |
| q0 | float | 四元数 q0 部分 |
| q1 | float | 四元数 q1 部分 |
| q2 | float | 四元数 q2 部分 |
| q3 | float | 四元数 q3 部分 |
| buffer | uint8_t[14] | 缓冲区用于存储数据 |
| MPU6050_FIFO | int16_t[6][11] | 数据缓存数组,用于滤波处理 |
| Gx_offset | int16_t | 滚转轴偏移量 |
| Gy_offset | int16_t | 俯仰轴偏移量 |
| Gz_offset | int16_t | 偏航轴偏移量 |
静态变量
| 静态变量 | 类型 | 注释 |
|---|---|---|
| gyro_orientation | signed char[9] | 陀螺仪方向矩阵 |
方法
MPU6050_Init()
初始化 MPU6050 以进入可用状态
| 返回值 | 类型 |
|---|---|
| 无 | void |
MPU6050_getDate(int way)
2024-11-25 更新
整合了获取姿态的算法
读取 MPU6050 姿态信息
way: 1.DMP 2.卡尔曼滤波 3.互补滤波
使用卡尔曼滤波和互补滤波获取姿态信息时,读取到的Yaw值为无效数据(即返回值下标为2处的值无效)
| 参数 | 类型 | 注释 |
|---|---|---|
| way | int | 读取姿态信息的算法: 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) | void | MPU6050内置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);
}
}