STM32之MPU6050实战

  1. MPU6050

MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景

3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度

3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

ADC和数据存储

  • 16位ADC :MPU6050集成了16位的ADC,用于将模拟信号转换为数字信号,量化范围为-32768到32767。
  • 量化过程 :ADC将模拟信号转换为数字信号,并以两个字节进行存储。

加速度计满量程示例:

±16g:

读取的ADC值为最大值32768时,对应实际加速度为16g。

ADC值为32768的一半(16384)时,对应加速度为8g。

±2g:

读取的ADC值为最大值32768时,对应实际加速度为2g。

ADC值为32768的一半(16384)时,对应加速度为1g。

满量程选择

  • 剧烈运动 :选择较大的满量程,确保测量范围足够大。
  • 平缓运动 :选择较小的满量程,提升测量分辨率精度。

测量分辨率

  • 满量程越小,测量分辨率越高,测量越精细。
  • 满量程越大,测量范围越广。
  • ADC值与加速度值呈线性关系,可以通过乘一个系数从ADC值计算出实际加速度。

I2C从机地址配置

二进制地址转换为十六进制:

以从机地址1101000为例。

把7位二进制数1101000转换为十六进制,即分割低4位和高3位:0110 1000,转换后为0x68。

I2C时序中的地址格式:

在I2C通信时,需要发送7位从机地址1101000加上1位读写位。

认为0x68是从机地址,需要将0x68左移1位,再加上读写位(0或1)。

转换步骤:

将0x68左移1位:1101 0000(即0xD0)。

再与读写位(0或1)进行或操作:(0x68 << 1) | 0 或 (0x68 << 1) | 1。

实际应用:

写操作时,从机地址为0xD0。

读操作时,从机地址为0xD1。

硬件电路

2.代码实现

PB6---------SCL

PB7---------SDA

GND---------AD0

2.1读取mpu6050数据并转换成角速度和角度

遇到一个奇怪的现象,用HAL库直接读取I2C数据,第一次的mpu6050数据是正确的,while(1)循环读取,第二次及以后出现错误。

用引脚模拟I2C通讯,while(1)循环读取正确。

2.2 mpu6050简单校准

【STM32+cubemx】0027 HAL库开发:MPU6050陀螺仪和加速度计数据的获取和校准_cubemx陀螺仪-CSDN博客

一般来说,MEMS(微机电系统)器件由于制造工艺精度问题,都会存在一定的误差。上图是静止在水平面的条件下测试得到的数值。可见,水平静止的情况下,陀螺仪输出应该为0,加速度计Z轴输出应为1g。所以出现了较大误差。

1.陀螺仪校准

陀螺仪的校准相对简单。在静止的情况下,将多个采样的平均值作为偏置值。测量后减去这个零偏即为真实值。若存在零偏,即使在静止的情况下,得出的数据会认为正在旋转,随着时间累积会出现较大误差。

|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| const float gyro_offest[3] = {-0.96,0.902,-1.05}; pRogy->x -= gyro_offest[0]; pRogy->y -= gyro_offest[1]; pRogy->z -= gyro_offest[2]; //校准 |

2.加速度计校准

加速度计校准可建立以下数学模型。

陀螺仪加速度计MPU6050程序与校准方法_mpu6050校准-CSDN博客

2.3 mpu6050使用Dmp

STM32F103HAL库移植MPU6050的DMP库_empl库-CSDN博客

原始数据的读取对于MPU6050的使用而言只是第一步,要想取得俯仰角(pitch),横滚角(roll),航偏角(yaw)的数据,还需要使用官方给出的DMP库或者卡尔曼滤波。

通过百度网盘分享的文件:0812

链接:https://pan.baidu.com/s/1LE2MlbJsbt6H7kmD2dAPnw?pwd=1tnx

提取码:1tnx

--来自百度网盘超级会员V2的分享

相关推荐
马浩同学1 小时前
【GD32】从零开始学GD32单片机 | DAC数模转换器 + 三角波输出例程
c语言·单片机·嵌入式硬件·mcu
最后一个bug4 小时前
STM32MP1linux根文件系统目录作用
linux·c语言·arm开发·单片机·嵌入式硬件
wenchm5 小时前
细说STM32F407单片机IIC总线基础知识
stm32·单片机·嵌入式硬件
嵌入式lover5 小时前
STM32项目之环境空气质量检测系统软件设计
stm32·单片机·嵌入式硬件
kenwblack6 小时前
STM32 SPI读取SD卡
stm32·单片机
兰_博6 小时前
51单片机驱动1602液晶显示
单片机·嵌入式硬件·51单片机
深圳市青牛科技实业有限公司 小芋圆6 小时前
开关电源特点、分类、工作方式
前端·科技·单片机·物联网·分类·数据挖掘·新能源
我qq不是451516527 小时前
单片机优先级
单片机·嵌入式硬件
相醉为友8 小时前
在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题
单片机·嵌入式硬件·51单片机
1101 11019 小时前
STM32-笔记10-手写延时函数(SysTick)
笔记·stm32·单片机