利用stm32f4单片机的mpu6050六轴加速度传感器获取姿态角详解(有代码)

利⽤stm32f4单⽚机的mpu6050六轴加速度传感器获取姿态⾓详解(有代码)mpu6050简介:
MPU-6000(6050)为全球⾸例整合性6轴运动处理组件,相较于多组件⽅案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了⼤量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端⼝(SPI仅在MPU-6000上可⽤)。
MPU6050, 该芯⽚内部集成⼀个三轴加速度传感器和⼀个三轴陀螺仪,并且⾃带 DMP(Digital Motion Processor),该传感器可以⽤于四轴飞⾏器的姿态控制和解算。
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%变动的振荡器。
其功能如图所⽰:
mup6050原理图:
STM32F4 开发板⾃带了 MPU6050 传感器。我们将使⽤ STM32F4 来驱动 MPU6050,读取其原始数据,并利⽤其⾃带的 DMP 实现姿态解算。MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有⼀个第⼆ IIC 接⼝ ,可⽤于连接外部磁⼒传感器,并利⽤⾃带的数字运动处理器(DMP: Dig
ital Motion Processor)硬件加速引擎,通过主 IIC 接⼝,向应⽤端输出完整的 9 轴融合演算数据。有了 DMP,我们可以使⽤ InvenSense 公司提供的运动处理资料库,⾮常⽅便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时⼤⼤降低了开发难度。
对于姿态⾓的理解:
姿态⾓和⾃由度相关联,在控制和机械领域⼴泛使⽤,它是⽤航向⾓、俯仰⾓和圆滚⾓三个欧拉⾓表⽰。
pitch是围绕X轴旋转,也叫做俯仰⾓。
yaw是围绕Y轴旋转,也叫偏航⾓。野兔的生活习性
roll是围绕Z轴旋转,也叫横滚⾓(翻滚⾓)。
pitch:
机体坐标系X轴与⽔平⾯的夹⾓。
当X轴的正半轴位于过坐标原点的⽔平⾯之上(抬头)时,俯仰⾓为正,否则为负。
pitch是围绕X轴旋转,也叫做俯仰⾓。
yaw:
机体坐标系xb轴在⽔平⾯上投影与地⾯坐标系xg轴(在⽔平⾯上,指向⽬标为正)之间的夹⾓,
由xg轴逆时针转⾄机体xb的投影线时,偏航⾓为正,即机头右偏航为正,
反之为负。
yaw是围绕Y轴旋转,也叫偏航⾓。
rool:
机体坐标系zb轴与通过机体xb轴的铅垂⾯间的夹⾓,机体向右滚为正,
卢启迪反之为负。
roll是围绕Z轴旋转,也叫翻滚⾓。
DMP简介:
我们可以读出 MPU6050 的加速度传感器和⾓速度传感器的原始数据。不过这些原始数据,对想搞四轴之类的初学者来说,⽤处不⼤,我们期望得到的是姿态数据,也就是欧拉⾓:航向⾓(yaw)、横滚⾓(roll)和俯仰⾓(pitch)。有了这三个⾓,我们就可以得到当前四轴的姿态,这才是我们想要的结果。要得到欧拉⾓数据,就得利⽤我们的原始数据,进⾏姿态融合解算,这个⽐较复杂,知识点⽐较多,初学者 不易掌握。⽽ MPU6050 ⾃带了数字运动处理器,即 DMP,并且, InvenSense提供了⼀个 MPU6050 的嵌⼊式运动驱动库,结合MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出,⽽得到四元数之后,就可以很⽅便的计算出欧拉⾓,从⽽得到yaw、roll 和 pitch。使⽤内置的 DMP,⼤⼤简化了四轴的代码设计,且 MCU 不⽤进⾏姿态解算过程,⼤⼤降低了 MCU 的负
担,从⽽有更多的时间去处理其他事件,提⾼系统实时性。使⽤ MPU6050 的 DMP 输出的四元数是 q30 格式的,也就是浮点数放⼤了 2 的 30次⽅倍。
姿态⾓测量原理:
硬件设计:
采⽤ STM32F4 的 3 个普通 IO 连接 MPU6050, 本次设计基本流程:程序先初始化MPU6050 等外设,然后利⽤ DMP 库,初始化MPU6050 及使能 DMP,最后,在死循环⾥⾯不停读取:温度传感器、加速度传感器、陀螺仪、 DMP 姿态解算后的欧拉⾓等数据,通过串⼝上报给上位机(温度不上报),利⽤上位机软件(ANO_Tech 匿名四轴上位机_),可以实时显⽰ MPU6050 的传感器状态曲线,并显⽰ 3D 姿态,可以通过 KEY0 按键开启/关闭数据上传功能。同时,在 LCD 模块上⾯显⽰温度和欧拉⾓等信息。 DS0 来指⽰程序正在运⾏。所要⽤到的硬件资源如下:
1) 指⽰灯 DS0
2) KEY0 按键
3) TFTLCD 模块
4) 串⼝
5) MPU6050
这⾥主要分析mup6050。
从上图可以看出, MPU6050 通过三根线与 STM32F4 开发板连接,其中 IIC 总线时和 24C02
以及 WM8978 共⽤,接在 PB8 和 PB9 上⾯。 MPU6050 的中断输出,连接在 STM32F4 的 PC0
脚,不过本例程我们并没有⽤到中断。另外, AD0 接的 GND,所以 MPU6050 的器件地址是:
0X68。
软件设计:
⾸先我们在⼯程中 HARDWARE 分组下⾸先添加了 IIC ⽀持的底层驱动⽂件 myiic.c 和源⽂件myiic.h,因为我们的 mpu6050 通信接⼝是 IIC。同时我们还增加了 mpu6050.c 源⽂件和对应的头⽂件 mpu6050 ⽤来编写 mpu6050 相关的底层驱动。最后我们还 添 加 了DMP 驱 动 库 代 码 到 我 们 实 验 ⼯ 程 , DMP 驱 动 库 代 码 包 含 inv_mpu.c 和inv_mpu_dmp_motion_driver.c 两个源⽂件,以及⼏个头⽂件。
由于 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;
}
该函数对 MPU6050 进⾏初始化,该函数执⾏成功后,便可以读取传感器数据了。
然后再看 MPU_Get_Temperature、 MPU_Get_Gyroscope 和 MPU_Get_Accelerometer 等三个
函数,源码如下:
//得到温度值
//返回值:温度值(扩⼤了 100 倍)
short MPU_Get_Temperature(void)
{
u8 buf[2];
short raw; float temp;
MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);
raw=((u16)buf[0]<<8)|buf[1];
temp=36.53+((double)raw)/340;
return temp*100;;
}
//得到陀螺仪值(原始值)
//gx,gy,gz:陀螺仪 x,y,z 轴的原始读数(带符号)
//返回值:0,成功
// 其他,错误代码
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{
u8 buf[6],res;
res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
if(res==0)
{
*gx=((u16)buf[0]<<8)|buf[1];
*gy=((u16)buf[2]<<8)|buf[3];
*gz=((u16)buf[4]<<8)|buf[5];
}
return res;;
}
//得到加速度值(原始值)
//gx,gy,gz:陀螺仪 x,y,z 轴的原始读数(带符号)
//返回值:0,成功
// 其他,错误代码
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
u8 buf[6],res;
res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
if(res==0)
验证性因子分析
{
*ax=((u16)buf[0]<<8)|buf[1];
合成氨反应*ay=((u16)buf[2]<<8)|buf[3];
*az=((u16)buf[4]<<8)|buf[5];
}
return res;;
}
其中 MPU_Get_Temperature ⽤于获取 MPU6050 ⾃带温度传感器的温度值,然后MPU_Get_Gyroscope 和MPU_Get_Accelerometer 分别⽤于读取陀螺仪和加速度传感器的原
始数据。
最后看 MPU_Write_Len 和 MPU_Read_Len 这两个函数,代码如下

本文发布于:2024-09-22 08:27:30,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/318311.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:传感器   姿态   运动   旋转   数据   加速度   温度   机体
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议