MPU6050 计算角度

short MPU6050_Get_Angle(float x,float y,float z,u8 dir)

{

float temp;

float res=0;

switch(dir)

{

case 0://与自然Z轴的角度

temp=sqrt((x*x+y*y))/z;

res=atan(temp);

break;

case 1://与自然X轴的角度

temp=x/sqrt((y*y+z*z));

res=atan(temp);

break;

case 2://与自然Y轴的角度

temp=y/sqrt((x*x+z*z));

res=atan(temp);

break;

}

return res*1800/3.14;//把弧度转换成角度

}

(18.21 KB, 下载次数: 130)

有更简单的

accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

angleAx=atan2(ax,az)*180/PI;

计算量更少,而且atan2返回值范围-PI~PI

角速度传感器输出的是某个轴的角速度,所以,如果想计算某个轴的角度(一般是相对于自

然坐标轴),那么只需要对角速度进行积分就可以了,举例来说,我们现在要测量X轴的角度,那么先假设起始状态x轴和自然坐标轴的角度为0,那么现在你可以将x轴想象成一辆只有速度仪表的汽车,汽车按照一定的速度行驶在一段时间后,如果你要计算汽车(x轴)到起始点的距离(x轴和自然周的角度),那么你只需要用车速(x轴的角速度)*时间就可以算出来了。

当然,传感器的角速度输出严格来说是一个瞬时值,实际中不太可能是一个匀速值,所以需要做一些处理。

希望对你有帮助。我也是刚接触这个东西,共同学习吧。

你好,请问mpu6050的传感器,既可以求加速度,也可以算出角度?如果我想消除重力加速度的影响,有木有什么办法?

具体的我也没做过,根据我了解的一些信息提供以下几个方法:第一通过滤波器,过滤掉重力角速度的影响;第二看你需要计算那个轴的加速度,想办法保持这个轴和重力成90度角;第三将两个陀螺仪安装到一个平面,其中一个作为测量平面的倾斜角度,另外一个作为测量加速度,通过角度来反推消除重力加速度对其他各轴的影响。第四如果你需要测量的加速度远大于重力加速度,那么这个基本就不是个问题了。

你可以查阅一下重力加速度计的手册,一般都推荐第一种方式。

以上摘自

mpu6050角度换算

如果觉得我是小白,勿喷,直接忽视即可,这其中也有我个人一些鄙薄的理解。如有错误欢迎指正,有交流才有进步。

其实原理很简单,但是对刚开始接触6050的人来说,了解其原理应该会比直接移植代码理解更深刻吧。

大家可以直接把6050的加速度计部分的检测元件想象成一个方盒子,方盒子里面放着个小球,小球因重力作用会在盒子的各个面上产生垂直于作用面的力,

各个力矢量合成就是和重力相平衡的力了(不考虑除重力加速度以外的加速度) 上图是一个手绘的,水平不咋样别见怪。上图是6050绕Y轴旋转一定角度产生的力的合成图,绕一个轴旋转哈理解一些。

gx = g重*cosΦ2;

gz = g重*cosΦ1;

同理gy = g重*cosΦ3;(该图上Φ3 = 90°)

gx就是X轴输出的数值除以最小分辨率。如±2g时,最小分辨率是2^16/4 =16384 LSB/g;(资料上是16384LSB/mg当时我怎么看都不能明白,这里就提醒下,如果都懂就当我没说)

很多人以为都以为角度是加速度读出来的值除以180°-0°的线性关系,其实用在飞思卡尔

平衡车上的线性关系只是相对一个很小角度变换范围里的线性,在0-360的范围里肯定是不适用的, 只有根据反余切变换才能得到他的真是角度。 说明一下,如果是用在飞控上,如果某个方向上出现了除重力加速度分量以外的加速度时,单单加速度读出的值是比该角度对应的加速度值大的。

附上我根据飞思卡尔官方出的陀螺仪和加速度计融合而写的程序,自己写的,如有错误欢迎指正

void Offset_alignment(void) {

static s32 A_Temp_X,A_Temp_Y,A_Temp_Z,G_Temp_X,G_Temp_Y,G_Temp_Z; static u8 Cnt=0;

if(Calibration_Flag != 1)

{

A_Temp_X += (s32)X_Angle;

A_Temp_Y += (s32)Y_Angle;

A_Temp_Z += (s32)Z_Angle;

G_Temp_X += (s32)X_Angle_acceleration; G_Temp_Y += (s32)Y_Angle_acceleration;

G_Temp_Z += (s32)Z_Angle_acceleration;

Cnt++;

}

if(Cnt == 200)

{

A_Offset_X = A_Temp_X/Cnt;

A_Offset_Y = A_Temp_Y/Cnt; A_Offset_Z = A_Temp_Z/Cnt;

G_Offset_X = G_Temp_X/Cnt;

G_Offset_Y = G_Temp_Y/Cnt;

G_Offset_Z = G_Temp_Z/Cnt;

Cnt = 0;

Calibration_Flag = 1;

}

}

void Data_Fusion(float P_Component)

{

float X_Angle_Feedback,Y_Angle_Feedback,Z_Angle_Feedback;

X_Angle_Feedback = (X_Angle - A_Offset_X - X_Current_A)*P_Component; X_Current_A += (Y_Angle_acceleration

G_Offset_Y+X_Angle_Feedback)*INTEGRAL_TIME;

Y_Angle_Feedback = (Y_Angle - A_Offset_Y - Y_Current_A)*P_Component; Y_Current_A += (Y_Angle_acceleration

G_Offset_Y+Y_Angle_Feedback)*INTEGRAL_TIME;

Z_Angle_Feedback = (Z_Angle - A_Offset_Z - Z_Current_A)*P_Component; Z_Current_A += (Z_Angle_acceleration

G_Offset_Z+Z_Angle_Feedback)*INTEGRAL_TIME;

}

摘自

- - -

注意:本模块采用的是IIC通信方式,所以我们只需要连接四跟线就可以完成电路的连接,简单方便!

1.关于6050 陀螺仪和加速度计 的角速度和角度计算。

A.陀螺仪角度计算,很多帖子中都提到了用的是积分,但是我这里还是重新讲下。

angle_n = angle_n-1 + (Gyro-C_Gyro)*R_Gyro;

(1)angle_n 当前角度值,它的单位是度(°)

(2)angle_n-1 上一次计算出的角度值 (3)Gyro 陀螺仪敏感轴偏转值,也就是当前敏感轴读数

(4)C_Gyro 陀螺仪零点偏移值,这个值的测量方法是:将陀螺仪敏感轴水平放置静止时的读数,我的零点偏移值是水平、垂直、倒置,分别取1024次,作平均值得出的,读数是-177.8865041,但是最后在程序实践中,调整到-99.90。或许还有别的办法,自己看着办吧。

(5)R_Gyro 是陀螺仪比例。飞思卡尔的参考中提到这个值是可以计算出来的,下面我会提供下载,大家自己去看看怎么算的,但是在其论坛和调试手册中都提到,这个比例值还是实验法测量出来的比较准确。

B.加速度仪 角度计算。

加速度仪的角度计算有很多方法,论坛里就有2中。但是都用到了三角函数,数学没学好,照抄了也不行。参考了飞思卡尔的计算方法后大概是这样的。 Angle_Z = (az-C_Z)*R_Z;

(1)angle_z 加速度计敏感轴Z轴产生倾角计算出的角度,单位度(°)

(2)az 是加速度仪 Z轴读数

(3)C_Z Z轴零点偏移量 测量方法和陀螺仪的一样。

(4)R_Z 加速度计Z轴比例

C.反复试验,MPU6050加速度计Z轴对应的是陀螺仪的X轴。不知道是不是我的有问题,还是就这么设计的?

摘自:

http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/09/11/2680211.html

short MPU6050_Get_Angle(float x,float y,float z,u8 dir)

{

float temp;

float res=0;

switch(dir)

{

case 0://与自然Z轴的角度

temp=sqrt((x*x+y*y))/z;

res=atan(temp);

break;

case 1://与自然X轴的角度

temp=x/sqrt((y*y+z*z));

res=atan(temp);

break;

case 2://与自然Y轴的角度

temp=y/sqrt((x*x+z*z));

res=atan(temp);

break;

}

return res*1800/3.14;//把弧度转换成角度

}

(18.21 KB, 下载次数: 130)

有更简单的

accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

angleAx=atan2(ax,az)*180/PI;

计算量更少,而且atan2返回值范围-PI~PI

角速度传感器输出的是某个轴的角速度,所以,如果想计算某个轴的角度(一般是相对于自

然坐标轴),那么只需要对角速度进行积分就可以了,举例来说,我们现在要测量X轴的角度,那么先假设起始状态x轴和自然坐标轴的角度为0,那么现在你可以将x轴想象成一辆只有速度仪表的汽车,汽车按照一定的速度行驶在一段时间后,如果你要计算汽车(x轴)到起始点的距离(x轴和自然周的角度),那么你只需要用车速(x轴的角速度)*时间就可以算出来了。

当然,传感器的角速度输出严格来说是一个瞬时值,实际中不太可能是一个匀速值,所以需要做一些处理。

希望对你有帮助。我也是刚接触这个东西,共同学习吧。

你好,请问mpu6050的传感器,既可以求加速度,也可以算出角度?如果我想消除重力加速度的影响,有木有什么办法?

具体的我也没做过,根据我了解的一些信息提供以下几个方法:第一通过滤波器,过滤掉重力角速度的影响;第二看你需要计算那个轴的加速度,想办法保持这个轴和重力成90度角;第三将两个陀螺仪安装到一个平面,其中一个作为测量平面的倾斜角度,另外一个作为测量加速度,通过角度来反推消除重力加速度对其他各轴的影响。第四如果你需要测量的加速度远大于重力加速度,那么这个基本就不是个问题了。

你可以查阅一下重力加速度计的手册,一般都推荐第一种方式。

以上摘自

mpu6050角度换算

如果觉得我是小白,勿喷,直接忽视即可,这其中也有我个人一些鄙薄的理解。如有错误欢迎指正,有交流才有进步。

其实原理很简单,但是对刚开始接触6050的人来说,了解其原理应该会比直接移植代码理解更深刻吧。

大家可以直接把6050的加速度计部分的检测元件想象成一个方盒子,方盒子里面放着个小球,小球因重力作用会在盒子的各个面上产生垂直于作用面的力,

各个力矢量合成就是和重力相平衡的力了(不考虑除重力加速度以外的加速度) 上图是一个手绘的,水平不咋样别见怪。上图是6050绕Y轴旋转一定角度产生的力的合成图,绕一个轴旋转哈理解一些。

gx = g重*cosΦ2;

gz = g重*cosΦ1;

同理gy = g重*cosΦ3;(该图上Φ3 = 90°)

gx就是X轴输出的数值除以最小分辨率。如±2g时,最小分辨率是2^16/4 =16384 LSB/g;(资料上是16384LSB/mg当时我怎么看都不能明白,这里就提醒下,如果都懂就当我没说)

很多人以为都以为角度是加速度读出来的值除以180°-0°的线性关系,其实用在飞思卡尔

平衡车上的线性关系只是相对一个很小角度变换范围里的线性,在0-360的范围里肯定是不适用的, 只有根据反余切变换才能得到他的真是角度。 说明一下,如果是用在飞控上,如果某个方向上出现了除重力加速度分量以外的加速度时,单单加速度读出的值是比该角度对应的加速度值大的。

附上我根据飞思卡尔官方出的陀螺仪和加速度计融合而写的程序,自己写的,如有错误欢迎指正

void Offset_alignment(void) {

static s32 A_Temp_X,A_Temp_Y,A_Temp_Z,G_Temp_X,G_Temp_Y,G_Temp_Z; static u8 Cnt=0;

if(Calibration_Flag != 1)

{

A_Temp_X += (s32)X_Angle;

A_Temp_Y += (s32)Y_Angle;

A_Temp_Z += (s32)Z_Angle;

G_Temp_X += (s32)X_Angle_acceleration; G_Temp_Y += (s32)Y_Angle_acceleration;

G_Temp_Z += (s32)Z_Angle_acceleration;

Cnt++;

}

if(Cnt == 200)

{

A_Offset_X = A_Temp_X/Cnt;

A_Offset_Y = A_Temp_Y/Cnt; A_Offset_Z = A_Temp_Z/Cnt;

G_Offset_X = G_Temp_X/Cnt;

G_Offset_Y = G_Temp_Y/Cnt;

G_Offset_Z = G_Temp_Z/Cnt;

Cnt = 0;

Calibration_Flag = 1;

}

}

void Data_Fusion(float P_Component)

{

float X_Angle_Feedback,Y_Angle_Feedback,Z_Angle_Feedback;

X_Angle_Feedback = (X_Angle - A_Offset_X - X_Current_A)*P_Component; X_Current_A += (Y_Angle_acceleration

G_Offset_Y+X_Angle_Feedback)*INTEGRAL_TIME;

Y_Angle_Feedback = (Y_Angle - A_Offset_Y - Y_Current_A)*P_Component; Y_Current_A += (Y_Angle_acceleration

G_Offset_Y+Y_Angle_Feedback)*INTEGRAL_TIME;

Z_Angle_Feedback = (Z_Angle - A_Offset_Z - Z_Current_A)*P_Component; Z_Current_A += (Z_Angle_acceleration

G_Offset_Z+Z_Angle_Feedback)*INTEGRAL_TIME;

}

摘自

- - -

注意:本模块采用的是IIC通信方式,所以我们只需要连接四跟线就可以完成电路的连接,简单方便!

1.关于6050 陀螺仪和加速度计 的角速度和角度计算。

A.陀螺仪角度计算,很多帖子中都提到了用的是积分,但是我这里还是重新讲下。

angle_n = angle_n-1 + (Gyro-C_Gyro)*R_Gyro;

(1)angle_n 当前角度值,它的单位是度(°)

(2)angle_n-1 上一次计算出的角度值 (3)Gyro 陀螺仪敏感轴偏转值,也就是当前敏感轴读数

(4)C_Gyro 陀螺仪零点偏移值,这个值的测量方法是:将陀螺仪敏感轴水平放置静止时的读数,我的零点偏移值是水平、垂直、倒置,分别取1024次,作平均值得出的,读数是-177.8865041,但是最后在程序实践中,调整到-99.90。或许还有别的办法,自己看着办吧。

(5)R_Gyro 是陀螺仪比例。飞思卡尔的参考中提到这个值是可以计算出来的,下面我会提供下载,大家自己去看看怎么算的,但是在其论坛和调试手册中都提到,这个比例值还是实验法测量出来的比较准确。

B.加速度仪 角度计算。

加速度仪的角度计算有很多方法,论坛里就有2中。但是都用到了三角函数,数学没学好,照抄了也不行。参考了飞思卡尔的计算方法后大概是这样的。 Angle_Z = (az-C_Z)*R_Z;

(1)angle_z 加速度计敏感轴Z轴产生倾角计算出的角度,单位度(°)

(2)az 是加速度仪 Z轴读数

(3)C_Z Z轴零点偏移量 测量方法和陀螺仪的一样。

(4)R_Z 加速度计Z轴比例

C.反复试验,MPU6050加速度计Z轴对应的是陀螺仪的X轴。不知道是不是我的有问题,还是就这么设计的?

摘自:

http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/09/11/2680211.html


相关内容

  • 风力摆最终版
  • 2015年全国大学生电子设计竞赛 风力摆控制系统(B题) 2015年8月15日 风力摆控制系统 摘要 STC89C52是单片机里应用比较广泛的一款,在自动控制领域里享有很高的价值.本设计采用STC89C52单片机作为主控制芯片,设计并制作一套风力摆控制系统.该系统主要是以单片机最小系统模块.电源模块 ...

  • 一种手指姿态识别系统设计
  • Computer Science and Application 计算机科学与应用, 2016, 6(11), 648-656 Published Online November 2016 in Hans. Design of Finger Gesture Recognition System Ho ...

  • 风力摆控制系统
  • 2015年全国大学生电子设计竞赛 风力摆控制系统(B题) 2015年8月15日 摘要 本系统采用STC12C5A60S2为主控芯片,通过MPU6050传感器提供反馈信息.采用PID控制算法调整轴流风机的工作状态.在液晶和按键的作用下显示并切换工作模式,形成一闭环测控系统.该测控系统通过控制驱动各风机 ...

  • 重力加速度陀螺仪传感器MPU-6050
  • 配置MPU6050: 1)陀螺仪和加速度计测量范围 每个量程都对应了一个灵敏度,在得到原始数据后,除以这个灵敏度就是单位格式量. 例如:Rang设置为正负8g,1g加速度对应的采样值就是4096,采集到的数据/4096得到的数据重力单位为g:再*9.8单位就变成了加速度m/s^2. 2)设置采样率. ...

  • 两轮平衡车姿态检测系统设计
  • 两轮平衡车姿态检测系统设计 李振全1,何波贤2,赵凤全3,张可3 (1. 中国东方航空技术有限公司山东分公司,山东青岛266108:2. 92724部队,山东青岛266108: 3. 92886部队,山东青岛266300) 摘 要:针对双轮平衡车姿态检测系统单独采用陀螺存在干扰和随机漂移等问题,基于 ...

  • 风力摆控制系统程序设计
  • 科技论坛·41· 风力摆控制系统程序设计 周晓龙 魏颖 (沈阳工学院,辽宁抚顺113112) 摘要:本系统为由STM32单片机控制模块.姿态采集模块.风力摆模块.液晶显示模块.人机交互系统以及风力摆机械结构组成的单片机处理姿态角数据后通过PID精确算法调节直流风机以控制风力摆.闭环控制系统.MPU6 ...

  • 四轴飞行器飞行原理与双闭环PID控制
  • 四轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的运用前景.四轴飞行器关键技术在于控制策略.由于智能控制算法在运行复杂的浮点型运算以及矩阵运算时,微处理 ...

  • 一种嵌入式MPU指令译码器设计
  • 2001年2月第19卷第1期西北工业大学学报 JournalofNorthwesternPolytechnicalUniversityFeb.2001Vol.19No.1 一种嵌入式MPU指令译码器设计 刘诗斌,高德远,樊晓桠,李树国 (西北工业大学航空微电子中心,陕西西安 710072) α 摘 ...

  • 永大NTVF电梯故障代码分析 TCD11
  • 永大NTVF 电梯故障代码分析 TCD11-15 一. 查阅故障履历的方法 操作模式: MODE - 2 - SET 用法: 1.按 INC 钮使故障资料由 01 读取直到 99 後,按下 RESET 钮直至正常显示才放手,故障记录清除 2.可先按 MODE - 10 - SET 后才再按 MODE ...