10分钟速通!你没看错,就是10min,从0基础到灵活运用mpu6050。
不信?往下看看就会:嗷~原来如此
下载github开源代码。
https://github.com/leech001/MPU6050
首先声明,此代码不是本人所写,为某俄罗斯大佬提供。
如果你访问不了github不用担心,我在文章最后附上下载下来的文件
根据github开源项目的Readme内容,进行工程配置:
开启i2c
将下载下来的.c和.h文件加入到工程内。(有运用mpu6050需求的同学,应该这部都会知道怎么做吧?
在需要调用mpu6050接口的地方,包含mpu6050.h就可以。此处和项目作者一样,在“第三步”中以在main.c调用为例举例说明。
接下来我将手摸手带大家连接电路
单片机引脚 | 6050引脚 | |
---|---|---|
3.3V | VCC | 3.3V供电 |
GND | GND | 地 |
B10 | SCL | I2C时钟 |
B11 | SDA | I2C数据 |
GND | AD0 | AD0为6050地址控制引脚,接地就可以 |
包含mpu6050.h头文件
/ * USER CODE BEGIN Includes * /
#include "mpu6050.h"
/ * USER CODE END Includes * /
定义mpu6050结构体
/ * USER CODE BEGIN PV * /
MPU6050_t MPU6050;
/ * USER CODE END PV * /
在main函数开头,初始化mpu6050
/ * USER CODE BEGIN 2 * /
while (MPU6050_Init(&hi2c1) == 1);
/ * USER CODE END 2 * /
调用MPU6050_Read_All函数,读取所有参数
/ * USER CODE BEGIN WHILE * /
while (1)
{
/ * USER CODE END WHILE * /
/ * USER CODE BEGIN 3 * /
MPU6050_Read_All(&hi2c1, &MPU6050);
HAL_Delay (100);
}
/ * USER CODE END 3 * /
那么问题来了,我如何访问这些参数呢?比如读取z轴加速度。
这就要看mpu6050.h里面的MPU6050_t结构体了。
typedef struct
{
int16_t Accel_X_RAW; // 原始数值,忽略
int16_t Accel_Y_RAW;
int16_t Accel_Z_RAW;
double Ax; // x方向加速度,单位为重力加速度g (也就是9.8)
double Ay; // y方向加速度
double Az; // z方向加速度
int16_t Gyro_X_RAW;
int16_t Gyro_Y_RAW;
int16_t Gyro_Z_RAW;
double Gx; // x方向陀螺仪加速度
double Gy; // y方向陀螺仪加速度
double Gz; // z方向陀螺仪加速度
float Temperature; // 温度
double KalmanAngleX; // 卡尔曼滤波过后的角度
double KalmanAngleY; // 卡尔曼滤波过后的角度
} MPU6050_t;
那么如何访问z轴加速度呢?
a = MPU6050.Az;
除了一口气读取所有参数的MPU6050_Read_All函数,作者还提供了其他的函数,总有一款适合你。详细请参见mpu6050.h
函数名 | 作用 |
---|---|
MPU6050_Read_All | 读取所有参数 |
MPU6050_Read_Accel | 读取加速度参数 |
MPU6050_Read_Gyro | 读取陀螺仪数据 |
MPU6050_Read_Temp | 读取温度 |
main函数前
#include "mpu6050.h"
MPU6050_t MPU6050;
main函数内
while (MPU6050_Init(&hi2c2) == 1)
;
// 读取所有参数
MPU6050_Read_All(&hi2c2, &MPU6050);
printf("加速度 x:%.2f \t y:%.2f \t z:%.2f\n",MPU6050.Ax,MPU6050.Ay,MPU6050.Az);
printf("陀螺仪 x:%.2f \t y:%.2f \t z:%.2f\n",MPU6050.Gx,MPU6050.Gy,MPU6050.Gz);
printf("温度 %.2f\n",MPU6050.Temperature);
// 读取加速度
MPU6050_Read_Accel(&hi2c2, &MPU6050);
printf("只更新加速度 x:%.2f \t y:%.2f \t z:%.2f\n",MPU6050.Ax,MPU6050.Ay,MPU6050.Az);
// 读取陀螺仪
MPU6050_Read_Gyro(&hi2c2, &MPU6050);
printf("只更新陀螺仪 x:%.2f \t y:%.2f \t z:%.2f\n",MPU6050.Gx,MPU6050.Gy,MPU6050.Gz);
// 读取温度
MPU6050_Read_Temp(&hi2c2, &MPU6050);
printf("只更新温度 %.2f\n",MPU6050.Temperature);
下面解读加速度参数含义
加速度
:加速度计可以测量物体在三维空间中的加速度,单位通常是m/s²。MPU6050能够在三个轴上分别测量出物体的加速度。当物体处于静止状态时,加速度计会受到重力作用而显示一个9.8m/s²的常数值。当物体发生运动时,加速度计会显示物体在各轴上的加速度变化。
此处桌上平放着mpu6050,因此测出来xy方向加速度几乎为0,z方有一个g的重力加速度,也就是9.8m/s²。(显示1.12而不是1,是因为我没有真正放水平)
什么还是不懂?好吧,真拿你没办法,我建立了一个简单工程,以供参考使用。就在文末的文件里面。
此文旨在最快的使用出来mpu6050,极具功利性,说真的我并不喜欢这样的速通,他剥夺了一步步征服mpu6050模块所带来的畅快和成就,以及通过阅读数据手册来掌握模块的能力。
如果根据本博客顺利调试出来mpu6050,笔者希望你能明白自己并没有真正掌握mpu6050,它的通信时许、寄存器配置等对你来说,都是不明所以的,这些都要读者根据数据手册和他人的教程逐个攻破。戒骄戒躁!
配套资源,0积分免费下载