【MPU6050】姿态传感器 工作原理

前言

笔者最近学习了mpu6050姿态传感器,现做以总结
推荐资料:
B站 铁头山羊【mpu6050寄存器讲解 PAL库解算 一阶互补滤波】
优快云 卡尔曼滤波原理【卡尔曼滤波算法思想 公式理解】
优快云 卡尔曼滤波原理【我总结的,基于优快云 卡尔曼滤波原理
DMP库移植【STM32 HAL库】
卡尔曼滤波解算【STM32 HAL库】
一阶互补滤波解算【STM32 HAL库】

前置知识

欧拉角

在这里插入图片描述

MPU6050简介

简介

MPU6050内部整合了三轴陀螺仪三轴加速度计DMP数字运动处理器(Digital Motion Processor)和温度传感器,此外还可以外接一个第三方的三轴磁力计。
在不外接磁力计的情况下,MPU6050可作为六轴姿态传感器(包含三轴陀螺仪和三轴加速度计);若外接三轴磁力计,则可作为九轴姿态传感器。

陀螺仪
测得三轴的角速度
通过对时间积分,得到yaw、roll、pitch
在这里插入图片描述

加速度计
测得三轴角加速度。(也即重力加速度g在X、Y、Z三轴上的分量)
通过反正切,计算加速度计测得的三轴角加速度,得到yaw、roll、pitch
在这里插入图片描述

优缺点比较

加速度传感器陀螺仪
测量结果3轴加速度3轴角速度
短期噪声严重不受震动影响
长期无漂移漂移严重

DMP
在这里插入图片描述
DMP(Digital Motion Processor)是 MPU6050 内置的一个数字运动处理器,用于自动处理传感器数据并融合加速度计和陀螺仪的数据,进行姿态解算,输出稳定的角度信息(如四元数)。他可以减轻主控制器的计算负担(类似DMA)。

框图

在这里插入图片描述

引脚说明

在这里插入图片描述
使用 I2C1 进行通信

引脚说明
VCC接 3.3V
GND接 GND
SCLI2C1 的时钟引脚
SDAI2C1 的数据引脚
XDA辅助 I2C 数据引脚(未使用,悬空)
XCL辅助 I2C 时钟引脚(未使用,悬空)
AD0地址选择引脚,接 GND。I2C 地址为 0x68,硬件地址为 0xD0
INT中断引脚(未使用,悬空)

寄存器概述

寄存器英文名中文名作用描述
WHO_AM_I_REG设备识别寄存器用于读取设备 ID,验证连接的设备是否为 MPU6050
PWR_MGMT_1_REG电源管理 1 寄存器配置电源模式、选择时钟源、复位设备以及唤醒模块
SMPLRT_DIV_REG采样率分频寄存器设置数据输出速率的分频系数,影响采样速率
ACCEL_CONFIG_REG加速度计配置寄存器设置加速度计的量程范围(例如 ±2g、±4g 等)
ACCEL_XOUT_H_REG加速度计 X 轴数据寄存器存储 X、Y、Z 轴加速度的原始数据
TEMP_OUT_H_REG温度传感器数据寄存器存储内部温度传感器的高字节数据
GYRO_CONFIG_REG陀螺仪配置寄存器设置陀螺仪的量程范围(例如 ±250°/s、±500°/s 等)
GYRO_XOUT_H_REG陀螺仪 X 轴数据寄存器读取 X、Y、Z 轴角速度的原始数据

MPU6050 数据处理和姿态解算 概述

常见有三种MPU6050的姿态解算方式:一阶互补滤波、卡尔曼滤波、DMP库四元数解算
一阶互补滤波
一种简单的数据融合方法,用于融合加速度计和陀螺仪的数据,既保留加速度计的长时间稳定性,又利用陀螺仪的短期精度。通过低通和高通滤波器实现数据的互补,是一种易实现的姿态解算算法。
卡尔曼滤波
一直较为复杂的递归滤波算法,常用于姿态解算。卡尔曼滤波能高效地融合加速度计和陀螺仪的数据,抑制噪声并减少漂移误差,提供更加精准的角度和姿态信息。
DMP 库四元数解算
DMP库可以自动融合传感器数据并直接输出四元数,用于姿态计算。它减轻了主控制器的计算压力,提供稳定的姿态解算结果,适用于实时性要求较高的应用。

### STM32 I2C 使用教程 #### 初始化设置 为了在STM32上使用I2C通信,首先需要通过STM32CubeMX工具完成基本配置。具体操作是在STM32CubeMX中新建项目并选择相应的微控制器型号,在“Pinout & Configuration”标签页下找到I2C外设(如I2C1),随后进入右侧的“Configuration”标签页调整各项参数,比如时钟频率、地址模式以及从设备地址等[^2]。 #### 软件I2C实现 对于软件方式模拟I2C总线的操作而言,这涉及到直接控制GPIO引脚来模仿SCL和SDA信号的变化过程。这种方式虽然灵活性较高,但是编程复杂度较大,并且可能影响到传输效率。下面给出一段简单的代码片段用于说明如何利用GPIO库函数构建起基础的数据交换流程: ```c void Software_I2C_Start(void){ GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET); // SDA拉低开始条件 Delay_us(5); } void Software_I2C_Stop(void){ GPIO_WriteBit(GPIOB, GPIO_Pin_7, Bit_SET); // SCL保持高电平时释放SDA结束条件 } ``` 这段程序展示了启动与停止状态下的位级处理逻辑[^3]。 #### 硬件I2C实现 相比之下,采用内置硬件模块来进行数据交互则更加简便高效。这里以读取MPU6050传感器为例展示具体的实践方法。当选用硬件I2C时,仅需调用HAL库中的API即可轻松达成目的。以下是部分核心源码摘录: ```c // 发送寄存器地址准备接收数据 HAL_I2C_Master_Transmit(&hi2c1, MPU6050_ADDRESS << 1, (uint8_t*)&Register_Address, 1, HAL_MAX_DELAY); // 接收来自MPU6050的数据包 HAL_I2C_Master_Receive(&hi2c1, MPU6050_ADDRESS << 1, Buffer, Length, HAL_MAX_DELAY); ``` 上述例子表明了借助于官方提供的驱动层接口可以极大简化实际开发工作量的同时提高系统的稳定性和可靠性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值