OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3603|回复: 8

MPU6050代码帮忙分析一下 红字部分需要改吗???

[复制链接]

3

主题

11

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-5-25
在线时间
11 小时
发表于 2016-6-2 17:36:28 | 显示全部楼层 |阅读模式
5金钱
6轴陀螺仪加速度传感器MPU6050驱动

MCU:STM32F103CBT6,硬件IIC,库函数版本:3.5.0 KEIL

秋阳2013-01-16

*************************************************/
#include "stm32f10x.h"
#include "IIC.h"
#include "var_global.h"
#include "delay.h"
#include "HMC5883.H"


#define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
#define        CONFIG                          0x1A        //低通滤波频率,典型值:0x06(5Hz)
#define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define        ACCEL_XOUT_H        0x3B
#define        ACCEL_XOUT_L        0x3C
#define        ACCEL_YOUT_H        0x3D
#define        ACCEL_YOUT_L        0x3E
#define        ACCEL_ZOUT_H        0x3F
#define        ACCEL_ZOUT_L        0x40
#define        TEMP_OUT_H                0x41
#define        TEMP_OUT_L                0x42

#define        GYRO_XOUT_H                0x43
#define        GYRO_XOUT_L                0x44       
#define        GYRO_YOUT_H                0x45
#define        GYRO_YOUT_L                0x46
#define        GYRO_ZOUT_H                0x47
#define        GYRO_ZOUT_L                0x48

#define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)


#define        MPU6050_Addr   0xD0          //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改 0x68

int16_XYZ ACC_RealData;
int16_XYZ GRY_RealData;
u8 Offset=0;


void MPU_GetData(u8 id,u8 reg,u8 len,u8 *buff);

void Init_MPU6050(void)
{

  I2C_WriteByte(MPU6050_Addr,PWR_MGMT_1, 0x00);        //解除休眠状态
        I2C_WriteByte(MPU6050_Addr,SMPLRT_DIV, 0x07); //采样分频7
        I2C_WriteByte(MPU6050_Addr,CONFIG, 0x04);     //25Hz低通
        I2C_WriteByte(MPU6050_Addr,GYRO_CONFIG,  2<<3); //陀螺仪量程1000/s
        I2C_WriteByte(MPU6050_Addr,ACCEL_CONFIG, 1<<3); //加速度量程2G
  delay_ms(10);
       
}


void READ_MPU6050(void)
{
u8 BUF_6050_buff[14];//6050所有测量参数
       
MPU_GetData(MPU6050_Addr,ACCEL_XOUT_H,14,BUF_6050_buff);//连续读取14个字节用时500us
       
ACC_RealData.Y=-(( ((int16_t)BUF_6050_buff[0]) <<8) |BUF_6050_buff[1]);
ACC_RealData.X=-(( ((int16_t)BUF_6050_buff[2]) <<8) |BUF_6050_buff[3]);                
ACC_RealData.Z=-(( ((int16_t)BUF_6050_buff[4]) <<8) |BUF_6050_buff[5]);       
               
GRY_RealData.Y=-(( ((int16_t)BUF_6050_buff[8]) <<8)  |BUF_6050_buff[9]);
GRY_RealData.X=-(( ((int16_t)BUF_6050_buff[10]) <<8) |BUF_6050_buff[11]);
GRY_RealData.Z=-(( ((int16_t)BUF_6050_buff[12]) <<8) |BUF_6050_buff[13]);       

        if(Offset)
        {
    ACC_RealData.X-=-ACC_Offset.X;
    ACC_RealData.Y-=-ACC_Offset.Y;
                ACC_RealData.Z-=-ACC_Offset.Z;
               
                GRY_RealData.X-=GRY_Offset.X;
                GRY_RealData.Y-=GRY_Offset.Y;
                GRY_RealData.Z-=GRY_Offset.Z;
  }



}

//设置陀螺仪零偏,不校准不能正常使用


//采集2013-11-16 鼠标PCB
void Set_Offset()
{
  ACC_Offset.X=127;
        ACC_Offset.Y=-259;

  GRY_Offset.X=5;
        GRY_Offset.Y=287;
        GRY_Offset.Z=190;         
       
        Offset=1;
}


void Get_Offset()
{ u8 i;

        vs32 ACC_XTemp=0,ACC_YTemp=0,ACC_ZTemp=0;
        vs32 GRY_XTemp=0,GRY_YTemp=0,GRY_ZTemp=0;
        MAG_Offset=0;
       
       
        ACC_Offset.X=0;
        ACC_Offset.Y=0;       
        Offset=0;
  MAG_Ofs_OK=0;
        GPIO_SetBits(GPIOB,GPIO_Pin_0);

        for(i=0;i<60;i++)       
        {
        READ_MPU6050();


        ACC_XTemp+=ACC_RealData.X;
        ACC_YTemp+=ACC_RealData.Y;
        ACC_ZTemp+=ACC_RealData.Z;
               
        GRY_XTemp+=GRY_RealData.X;
        GRY_YTemp+=GRY_RealData.Y;
        GRY_ZTemp+=GRY_RealData.Z;

        delay_ms(5);
        }
       
        ACC_XTemp/=60;
        ACC_YTemp/=60;
        ACC_ZTemp/=60;         
       
        GRY_XTemp/=60;
        GRY_YTemp/=60;
        GRY_ZTemp/=60;
       
        //MAG_Offset/=60;
       
        ACC_Offset.X=ACC_XTemp;
        ACC_Offset.Y=ACC_YTemp;
//ACC_Offset.Z=ACC_ZTemp;
       
        GRY_Offset.X=GRY_XTemp;
        GRY_Offset.Y=GRY_YTemp;
        GRY_Offset.Z=GRY_ZTemp;
               
  GPIO_ResetBits(GPIOB,GPIO_Pin_0);
        Offset=1;
  //MAG_Ofs_OK=1;
}



void MPU_GetData(u8 id,u8 reg,u8 len,u8 *buff)

{ //启动传输发送首寄存器地址
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  I2C_GenerateSTART(I2C1, ENABLE);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  I2C_Cmd(I2C1, ENABLE);
  I2C_SendData(I2C1,reg);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        //开始接受
  I2C_GenerateSTART(I2C1, ENABLE);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  I2C_Send7bitAddress(I2C1, id, I2C_Direction_Receiver);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       

        while (len)
        {   while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)));

                  *buff =I2C_ReceiveData(I2C1);   

                 if(len==2){
                             I2C_AcknowledgeConfig(I2C1, DISABLE);//最后一个不应答
                           }                            
                        buff++;
      len--;
  }
       
       
       
        I2C_AcknowledgeConfig(I2C1, ENABLE);
        I2C_GenerateSTOP(I2C1, ENABLE);

}











正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-5-25
在线时间
11 小时
 楼主| 发表于 2016-6-2 17:38:19 | 显示全部楼层
求大神 真的快疯的,做的空中鼠标   鼠标不受控制 往固定的方向拉动 动6050也没反应
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-5-25
在线时间
11 小时
 楼主| 发表于 2016-6-2 17:40:15 | 显示全部楼层
该上面红字部分 只能改变鼠标自己动的方向 照理说 6050不动鼠标也是不动的 为什么会自己往一个方向拉动呢?而且动6050也控制不了鼠标
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-5-25
在线时间
11 小时
 楼主| 发表于 2016-6-2 19:07:25 | 显示全部楼层
有没有大神啊???拜托
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-6-12 00:45:37 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2016-8-25
在线时间
50 小时
发表于 2016-8-25 14:46:27 | 显示全部楼层
帮顶!!!!!
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-25 15:24:02 | 显示全部楼层
帮顶!!!!!
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-8-25 16:19:25 | 显示全部楼层
红字部分要加呀,加速度计和陀螺仪水平放置不动时,加速度计理论X轴为0,Y轴为0,Z轴为1(g)。陀螺仪理论XYZ三轴都是0。红色部分是对它的校准,如果不是理论值,就让它变成理论值。这样理论上鼠标就不会乱动了,就算动也是一分钟能动一点点。陀螺仪要进行校正,加速度计最好也校正,不然整个初始姿态就是一个歪的,不过对鼠标来说影响好像不太大。
没仔细看你的代码,好像是只有初始化和数据采集部分,没有数据处理和传输部分。简单点儿就是加速度二次积分变成平面上的位移,再将数据上传到电脑?你说它不按手势来动,那你有看过它最终得到的位移或者姿态对吗?
。。。。要不要这样,沉了两个月被顶上来了,哈哈
自在随心
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-8-25 16:52:06 | 显示全部楼层
这个坟挖的。。。。
没看具体代码,按说是要的,不动的时候需要清除掉,使用时的漂移会越来越大的,最终还是不准
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 13:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表