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的分享

相关推荐
cjy_Somnr2 小时前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰3 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤5 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟7 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞7 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲7 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up8 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
纳祥科技17 小时前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
单片机日志18 小时前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
松涛和鸣19 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法