wfOrzbai

wfOrzbai

0个粉丝

21

问答

0

专栏

17

资料

wfOrzbai  发布于  2013-08-23 12:36:57
采纳率 0%
21个问答
25729

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;       
}
我来回答
回答7个
时间排序
认可量排序

wfOrzbai

0个粉丝

21

问答

0

专栏

17

资料

wfOrzbai 2013-08-23 12:37:41
认可0
额,出来看图片有点大啊,要点击才能看全貌

wfOrzbai

0个粉丝

21

问答

0

专栏

17

资料

wfOrzbai 2013-08-23 15:43:19
认可0
嘿嘿,一点小认识吧,武汉纺织大学创新实验室版主就坐我旁边呢:lol

wfOrzbai

0个粉丝

21

问答

0

专栏

17

资料

wfOrzbai 2013-08-23 15:43:59
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=3701&ptid=1941]david 发表于 2013-8-23 14:29[/url]
感谢 原创。[/quote]

嘿嘿,一点小认识吧,武汉纺织大学创新实验室版主就坐我旁边呢:lol

tigergatlin

0个粉丝

0

问答

0

专栏

0

资料

tigergatlin 2016-05-31 17:10:57
认可0
这个算法里的INTEGRAL_TIME是通过怎么计算得出来的?应该是一个常量吧?

da_xiong

0个粉丝

0

问答

0

专栏

0

资料

da_xiong 2017-02-14 21:26:12
认可0
最后一个函数有点看不懂
这段代码的  X_Current_A += (Y_Angle_acceleration - G_Offset_Y+X_Angle_Feedback)*INTEGRAL_TIME;是不是错了
应该是        X_Current_A += (X_Angle_acceleration - G_Offset_X+X_Angle_Feedback)*INTEGRAL_TIME;?????
但是即便改成我想的这样也还是看不懂啊:Q

david

8个粉丝

36

问答

24

专栏

58

资料

david 2013-08-23 14:29:27
认可0
感谢 原创。

jipd

0个粉丝

14

问答

0

专栏

0

资料

jipd 2018-08-08 15:43:16
认可0
:lol:lol:lol
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区