打印
[应用相关]

利用stm32f4单片机的mpu6050六轴加速度传感器

[复制链接]
3409|92
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
利用stm32f4单片机的mpu6050六轴加速度传感器获取姿态角详解(有代码)
mpu6050简介:

MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU-6000上可用)。

MPU6050, 该芯片内部集成一个三轴加速度传感器和一个三轴陀螺仪,并且自带 DMP(Digital Motion Processor),该传感器可以用于四轴飞行器的姿态控制和解算。


使用特权

评论回复
沙发
自动化陈稳|  楼主 | 2022-4-30 11:57 | 只看该作者
MPU-6000(6050)的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的IIC或最高达20MHz的SPI(MPU-6050没有SPI)。MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VDDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。

使用特权

评论回复
板凳
自动化陈稳|  楼主 | 2022-4-30 11:57 | 只看该作者
其功能如图所示:

使用特权

评论回复
地板
自动化陈稳|  楼主 | 2022-4-30 11:59 | 只看该作者
mup6050原理图:

使用特权

评论回复
5
自动化陈稳|  楼主 | 2022-4-30 12:00 | 只看该作者
STM32F4 开发板自带了 MPU6050 传感器。我们将使用 STM32F4 来驱动 MPU6050,读取其原始数据,并利用其自带的 DMP 实现姿态解算。MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口 ,可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。有了 DMP,我们可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。

使用特权

评论回复
6
自动化陈稳|  楼主 | 2022-4-30 12:01 | 只看该作者
对于姿态角的理解:

姿态角和自由度相关联,在控制和机械领域广泛使用,它是用航向角、俯仰角和圆滚角三个欧拉角表示。

使用特权

评论回复
7
自动化陈稳|  楼主 | 2022-4-30 12:02 | 只看该作者

使用特权

评论回复
8
自动化陈稳|  楼主 | 2022-4-30 12:06 | 只看该作者
pitch是围绕X轴旋转,也叫做俯仰角。
yaw是围绕Y轴旋转,也叫偏航角。
roll是围绕Z轴旋转,也叫横滚角(翻滚角)。

使用特权

评论回复
9
自动化陈稳|  楼主 | 2022-4-30 12:07 | 只看该作者
pitch:
机体坐标系X轴与水平面的夹角。
当X轴的正半轴位于过坐标原点的水平面之上(抬头)时,俯仰角为正,否则为负。
pitch是围绕X轴旋转,也叫做俯仰角。

使用特权

评论回复
10
自动化陈稳|  楼主 | 2022-4-30 12:10 | 只看该作者
yaw:
机体坐标系xb轴在水平面上投影与地面坐标系xg轴(在水平面上,指向目标为正)之间的夹角,
由xg轴逆时针转至机体xb的投影线时,偏航角为正,即机头右偏航为正,
反之为负。
yaw是围绕Y轴旋转,也叫偏航角。

使用特权

评论回复
11
自动化陈稳|  楼主 | 2022-4-30 12:12 | 只看该作者
rool:
机体坐标系zb轴与通过机体xb轴的铅垂面间的夹角,机体向右滚为正,
反之为负。
roll是围绕Z轴旋转,也叫翻滚角。

使用特权

评论回复
12
自动化陈稳|  楼主 | 2022-4-30 12:12 | 只看该作者
DMP简介:

我们可以读出 MPU6050 的加速度传感器和角速度传感器的原始数据。不过这些原始数据,对想搞四轴之类的初学者来说,用处不大,我们期望得到的是姿态数据,也就是欧拉角:航向角(yaw)、横滚角(roll)和俯仰角(pitch)。有了这三个角,我们就可以得到当前四轴的姿态,这才是我们想要的结果。要得到欧拉角数据,就得利用我们的原始数据,进行姿态融合解算,这个比较复杂,知识点比较多,初学者 不易掌握。而 MPU6050 自带了数字运动处理器,即 DMP,并且, InvenSense提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到 yaw、roll 和 pitch。使用内置的 DMP,大大简化了四轴的代码设计,且 MCU 不用进行姿态解算过程,大大降低了 MCU 的负担,从而有更多的时间去处理其他事件,提高系统实时性。使用 MPU6050 的 DMP 输出的四元数是 q30 格式的,也就是浮点数放大了 2 的 30 次方倍。

使用特权

评论回复
13
自动化陈稳|  楼主 | 2022-4-30 12:21 | 只看该作者
姿态角测量原理:

使用特权

评论回复
14
自动化陈稳|  楼主 | 2022-4-30 12:22 | 只看该作者
硬件设计:

采用 STM32F4 的 3 个普通 IO 连接 MPU6050, 本次设计基本流程:程序先初始化MPU6050 等外设,然后利用 DMP 库,初始化 MPU6050 及使能 DMP,最后,在死循环里面不停读取:温度传感器、加速度传感器、陀螺仪、 DMP 姿态解算后的欧拉角等数据,通过串口上报给上位机(温度不上报),利用上位机软件(ANO_Tech 匿名四轴上位机_V2.6.exe),可以实时显示 MPU6050 的传感器状态曲线,并显示 3D 姿态,可以通过 KEY0 按键开启/关闭数据上传功能。

使用特权

评论回复
15
自动化陈稳|  楼主 | 2022-4-30 12:22 | 只看该作者
同时,在 LCD 模块上面显示温度和欧拉角等信息。 DS0 来指示程序正在运行。所要用到的硬件资源如下:
1) 指示灯 DS0
2) KEY0 按键
3) TFTLCD 模块
4) 串口
5) MPU6050
这里主要分析mup6050。

使用特权

评论回复
16
自动化陈稳|  楼主 | 2022-4-30 12:23 | 只看该作者

使用特权

评论回复
17
自动化陈稳|  楼主 | 2022-4-30 12:24 | 只看该作者
从上图可以看出, MPU6050 通过三根线与 STM32F4 开发板连接,其中 IIC 总线时和 24C02
以及 WM8978 共用,接在 PB8 和 PB9 上面。 MPU6050 的中断输出,连接在 STM32F4 的 PC0
脚,不过本例程我们并没有用到中断。另外, AD0 接的 GND,所以 MPU6050 的器件地址是:
0X68。

使用特权

评论回复
18
自动化陈稳|  楼主 | 2022-4-30 12:24 | 只看该作者
软件设计:

首先我们在工程中 HARDWARE 分组下首先添加了 IIC 支持的底层驱动文件 myiic.c 和源文件myiic.h,因为我们的 mpu6050 通信接口是 IIC。同时我们还增加了 mpu6050.c 源文件和对应的头文件 mpu6050 用来编写 mpu6050 相关的底层驱动。最后我们还 添 加 了 DMP 驱 动 库 代 码 到 我 们 实 验 工 程 , DMP 驱 动 库 代 码 包 含 inv_mpu.c 和inv_mpu_dmp_motion_driver.c 两个源文件,以及几个头文件。

使用特权

评论回复
19
自动化陈稳|  楼主 | 2022-4-30 12:25 | 只看该作者
由于 mpu6050.c 里面代码比较多,这里我就不全部列出来了,仅介绍几个重要的函数。
首先是: MPU_Init,该函数代码如下:
//初始化 MPU6050
//返回值:0,成功 其他,错误代码
u8 MPU_Init(void)
{
u8 res;
IIC_Init();//初始化 IIC 总线
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);//复位 MPU6050
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);//唤醒 MPU6050
MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps
MPU_Set_Accel_Fsr(0); //加速度传感器,±2g
MPU_Set_Rate(50); //设置采样率 50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C 主模式关闭
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭 FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT 引脚低电平有效
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
if(res==MPU_ADDR)//器件 ID 正确
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);//设置 CLKSEL,PLL X 轴参考
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);//加速度与陀螺仪都工作
MPU_Set_Rate(50); //设置采样率为 50Hz
}else return 1;
return 0;
}

使用特权

评论回复
20
自动化陈稳|  楼主 | 2022-4-30 12:26 | 只看该作者
该函数对 MPU6050 进行初始化,该函数执行成功后,便可以读取传感器数据了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

1220

帖子

1

粉丝