打印
[活动]

【多旋翼飞控】MPU6050 数据读取并进行欧拉角计算完毕

[复制链接]
4467|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 冷不丁 于 2016-1-23 17:58 编辑

写在前面:这次MPU6050数据读取的时候出现两个问题,希望大神看到能帮我分析一下原因。1,K64F官方例程,使用JLINK-SW或者CMSIS都不能在调试时进入main()函数,断电只会在上方显示。找了很多原因,感觉不是KEIL5配置上的问题而是程序本身的问题?我的芯片选型确定是对的。
2,K64作为M4系列芯片如何打开浮点运算功能?有没有大神有程序给我一份。





MPU6050作为一款常见的,而且具有很高性价比的模块,使用起来非常方便。

MPU6050可以输出三轴加速度,三轴角速度和温度。
当然我们只需要加速度和角速度就能完成飞控姿态的识别了。
至于,加速度和角速度如何计算成欧拉角,并为我们所用,只需要跟着我的程序走一遍,你就会很清楚了。
大致算法概念是:通过I2C读取MPU6050数据->数据进行滤波和实用处理->通过四元数进行一系列可怕的tan数**算得到x,y,z的欧拉角!I2C:
PTE24 -->I2C SCL
PTE25 -->I2C SDA
串口,波特率115200:
UART TX ->PB16
UART RX ->PB17



首先是我读取MPU6050数据后进行处理后的程序效果和主要处理程序:



  /*****************加速度***************************************/
               
                Accel_x=((short)((Buff[0]<<8)+Buff[1]) - 1100)*9.80/16384;
                Accel_y=((short)((Buff[2]<<8)+Buff[3]) - 1100)*9.80/16384;
                Accel_z=((short)((Buff[4]<<8)+Buff[5]) - 1100)*9.80/16384;
                               
                /*****************角速度***************************************/
                               
                Gyro_x=((short)((Buff[8]<<8)+Buff[9]) + 52)*1.0/16.4;
                Gyro_y=((short)((Buff[10]<<8)+Buff[11]) + 18)*1.0/16.4;
                Gyro_z=((short)((Buff[12]<<8)+Buff[13]) + 19)*1.0/16.4;
                               
                /*****************温度***************************************/

                Temp=((short)((Buff[6]<<8)+Buff[7]))*1.0/340+36.53;



然后,我进行数据滤波和四元素计算欧拉角后的得到了可用的数据:


处理的代码特别多,贴上来帖子就变丑了,大家自己下载吧。
int main(void)
{
        hardware_init();//硬件I2C和串口初始化
        Pit_Init();//定时器初始化
     OSA_Init();
        MPU6050_Init();//6050初始化
        Get_Offset();//校准零偏值
     PRINTF("\r\n====== START ======\r\n\r\n");
     while (1)
     {
                if (true == pitIsrFlag[0])//2ms一次计算
          {
               Prepare_Data();//数据提取
                        Recursive_Fliter(&MPU6050_GYRO_LAST,&MPU6050_GYRO_NOW ,5);//窗口滤波
                        Get_Attitude();                //姿态计算
                pitIsrFlag[0] = false;
          }
          if (true == pitIsrFlag[1])//1s输出一次
          {
                        printf("%.3fm/s2        %.3fm/s2        %.3fm/s2 \n",Q_ANGLE.X,Q_ANGLE.Y,Q_ANGLE.Z);
               pitIsrFlag[1] = false;
          }
    }
}



我debug就是进不去主函数,以前遇到过,是芯片型号选错了,这次究竟会是为什么。求大神解答,很急,在线等。
调试方式JLINK-SW。


i2c_MPU6050读取完毕.rar (2.63 MB)
欧拉角数据处理.rar (207.52 KB)

相关帖子

沙发
deviceplugs| | 2016-1-23 20:36 | 只看该作者
mpu6050的采样率是多少啊?更新速度有多快?

使用特权

评论回复
板凳
冷不丁|  楼主 | 2016-1-23 21:11 | 只看该作者
deviceplugs 发表于 2016-1-23 20:36
mpu6050的采样率是多少啊?更新速度有多快?

设置的MPU6050典型的125HZ采样率,周期就是8ms。

使用特权

评论回复
地板
Micachl| | 2016-1-24 19:54 | 只看该作者
你的debug设置那应该是有问题

使用特权

评论回复
5
冷不丁|  楼主 | 2016-1-24 20:56 | 只看该作者
Micachl 发表于 2016-1-24 19:54
你的debug设置那应该是有问题


这是我的设置,能帮我看看有什么问题吗?
还有,你现在还能上KEIL官网吗?我这段时间始终上不去了?被墙了?

使用特权

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

本版积分规则

个人签名:hungry

10

主题

36

帖子

7

粉丝