标题: 51单片机怎么使用MPU6050读取角度值程序 ? [打印本页]

作者: 1145167054    时间: 2017-4-8 10:40
标题: 51单片机怎么使用MPU6050读取角度值程序 ?
目前只能初始化mpu6050,如何通过程序使陀螺仪和加速度计的初始值转化成角度??

作者: mr_zhangpupu    时间: 2017-4-8 19:01

#include <REG52.H>       
#include <math.h>    //Keil library  
#include <stdio.h>   //Keil library       
#include <INTRINS.H>


typedef unsigned char  uchar;
typedef unsigned short ushort;
typedef unsigned int   uint;

//******功能模块头文件*******
//#include "DELAY.H"                    //延时头文件
#include "lcd1602.H"                        //LCD1602文件
#include "MPU6050.H"                //MPU6050头文件

//******角度参数************
float Accel_ax;
float Accel_az;             //X轴加速度值暂存
float Angle;         //小车最终倾斜角度
uchar value;                 //角度正负极性标记
//float  Accel_x;
//float  Angle_ax;
//float Gyro_y;        //Y轴陀螺仪数据暂存
//*********************************************************
// 倾角计算(卡尔曼融合)
//*********************************************************

float Angle_Calcu(void)         
{
        //------加速度--------------------------

        //范围为2g时,换算关系:16384 LSB/g
        //角度较小时,x=sinx得到角度(弧度), deg = rad*180/3.14
        //因为x>=sinx,故乘以1.3适当放大

        Accel_ax  = GetData(ACCEL_XOUT_H);          //读取X轴加速度
        Accel_az  = GetData(ACCEL_ZOUT_H);          //读取X轴加速度
        Angle = (int)(atan(Accel_ax/Accel_az)*180/3.14);
/*        Accel_x  = GetData(ACCEL_XOUT_H);          //读取X轴加速度
        Angle_ax = (Accel_x - 1100) /16384;   //去除零点偏移,计算得到角度(弧度)
        Angle_ax = Angle_ax*1.2*180/3.14;     //弧度转换为度,
    return        Angle_ax;
        Gyro_y = GetData(GYRO_YOUT_H);              //静止时角速度Y轴输出为-30左右
        Gyro_y = -(Gyro_y + 30)/16.4;         //去除零点偏移,计算角速度值,负号为方向处理
        Angle  = Angle + Gyro_y*0.01;  //角速度积分得到倾斜角度.*/       
        return         Angle;                                                                                                          
}

void main()
{         //float ax,ay,az,xx,yy,zz;
    float xx;
        delay(500);                //上电延时               
        InitLcd();                //液晶初始化
        InitMPU6050();        //初始化MPU6050
        delay(150);
        while(1)
        {               
                xx=Angle_Calcu();
                lcd_printf(dis,xx);                        //转换数据显示
            DisplayListChar(2,0,dis,4);  
        }
}



这是我写的程序希望能解决
作者: 1145167054    时间: 2017-4-9 10:40
mr_zhangpupu 发表于 2017-4-8 19:01
#include        
#include     //Keil library  
#include    //Keil library       

差了好多东西啊
作者: 你像风儿来了    时间: 2017-4-10 21:00
陀螺仪直接读出来的值是没有任何意义的,但是可以通过四元数计算得到角度,这个角度就反应陀螺仪的实际角度
作者: caojunchocjc    时间: 2017-4-10 22:31
你需要使用模拟IIC来模拟时序 ,进行6轴原始数据读取,买模块的店家连接应该有程序,你直接移植过来
作者: 1145167054    时间: 2017-4-19 10:52
caojunchocjc 发表于 2017-4-10 22:31
你需要使用模拟IIC来模拟时序 ,进行6轴原始数据读取,买模块的店家连接应该有程序,你直接移植过来

可以读取原始值,我想通过算法输出一个方向的角度,51用dmp没有必要
作者: 1145167054    时间: 2017-4-19 10:53
你像风儿来了 发表于 2017-4-10 21:00
陀螺仪直接读出来的值是没有任何意义的,但是可以通过四元数计算得到角度,这个角度就反应陀螺仪的实际角度

不会啊
作者: helios    时间: 2017-4-19 23:28
本帖最后由 helios 于 2017-4-19 23:32 编辑

角度的话可以用反三角函数,假设你把加速度计初始化为2g,那x轴的角度=180.0*asin((float)x/16384)/3.1416;
然后假设你把陀螺仪初始化为+-2000度/s,那x轴的角速度=gy/16.4
当然你会发现静止时角速度不为0,需要调零

作者: sgp    时间: 2017-7-25 16:02
用stc12c5a60s2写,怎样 用互补滤波?

作者: 你像风儿来了    时间: 2017-7-25 20:21
这里面有,我自己测试过

IAP15W4K58S4-小四轴DIY.zip

577.07 KB, 下载次数: 433


作者: 守护灵    时间: 2017-7-26 00:48
我这有基于51单片,在1602显示角度的陀螺仪gy 271程序
作者: 没有永别    时间: 2017-8-3 09:15
启动MPU6050自带的DMP,从DMP中得到四元数,再进行欧拉公式换算,就能得到角度
作者: insightx    时间: 2017-10-15 22:50
参考参考
作者: insightx    时间: 2017-10-15 22:50
我也在找,51用DMP空间不够,不知道有没有更简单的方法
作者: 一些事一些情    时间: 2019-8-2 20:57
守护灵 发表于 2017-7-26 00:48
**** 作者被禁止或删除 内容自动屏蔽 ****

1361267482@qq.com,麻烦发一份

作者: xiaozhong1314    时间: 2019-8-3 09:10
有没有原始数据转换的
作者: brave_ruan    时间: 2019-8-14 00:22
楼主,你好请问一下你这个问题解决了吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1