智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2850|回复: 9
打印 上一主题 下一主题

寄存器的值能读取正确,但是MPU6050数据跳变厉害

[复制链接]

16

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2289
威望
1178
贡献
699
兑换币
556
注册时间
2012-11-26
在线时间
206 小时
跳转到指定楼层
1#
发表于 2015-9-22 10:23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神指导,有遇到这个问题的吗

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

16

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2289
威望
1178
贡献
699
兑换币
556
注册时间
2012-11-26
在线时间
206 小时
2#
 楼主| 发表于 2015-9-22 10:45:06 | 只看该作者
la9998372 发表于 2015-9-22 10:26
你是什么类型的数据?应该是int16吧?
你先用iar在线调试看看变量的值,在看看是不是串口发数据的时候,高 ...

是int16_t型的数据
回复 支持 反对

使用道具 举报

16

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2289
威望
1178
贡献
699
兑换币
556
注册时间
2012-11-26
在线时间
206 小时
3#
 楼主| 发表于 2015-9-22 11:55:20 | 只看该作者
求指导   有哪位知道吗
回复 支持 反对

使用道具 举报

24

主题

492

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13138
威望
5341
贡献
1645
兑换币
2222
注册时间
2012-3-9
在线时间
3076 小时
毕业学校
嘉兴学院
4#
发表于 2015-9-22 12:39:04 | 只看该作者
提供下程序
回复 支持 反对

使用道具 举报

16

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2289
威望
1178
贡献
699
兑换币
556
注册时间
2012-11-26
在线时间
206 小时
5#
 楼主| 发表于 2015-9-22 15:54:49 | 只看该作者
la9998372 发表于 2015-9-22 12:14
你拿iar看数值了吗?数值稳定吗?

但不运行了几十次,加速度计x轴的值分别为0x3434,0x342e,0x342a,0x340e,0x332c,0x3430,0x3420,0x3422,0x3402,0x3428,0x343a,0xfff6,0x3404,0x3436,0x330c,0x3438,0x3442,0x3412,0x3400,0x3408,0x3422,0x343c,0x3414,0x3434,0x3420,0x342a,0x342c,0x3422,0x3424,0x342c,0x3446,0x3400,也不稳定,有的差很多的啊
回复 支持 反对

使用道具 举报

16

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2289
威望
1178
贡献
699
兑换币
556
注册时间
2012-11-26
在线时间
206 小时
6#
 楼主| 发表于 2015-9-22 15:56:39 | 只看该作者

#include "I2C.h"

GPIO_InitTypeDef GPIO_InitStructure;
void I2c_Init()
{
       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        SDA_HIGH();
        SCL_HIGH();
}


void I2c_Start(void)
{
        SDA_OUT();
        SDA_HIGH();
        SCL_HIGH();
        Delay_I2c();
        SDA_LOW();
        Delay_I2c();
        SCL_LOW();
        Delay_I2c();
}

void I2c_Stop(void)
{
        SCL_LOW();
        SDA_OUT();
        SDA_LOW();
//        Delay_I2c();
        SCL_HIGH();
        Delay_I2c();
        SDA_HIGH();
        Delay_I2c();
        SCL_LOW();//oó¼ó
}

//μè′yó|′eDÅoÅ£¬·μ»Ø0±íê¾Î′êÕμ½ó|′e£¬1±íê¾êÕμ½ó|′e
u8 I2c_Wait_Ack()
{
        u8 i=0;
        //SCL_LOW();
        SDA_IN();
        SCL_HIGH();
//        Delay_I2c();
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11))
        {
                i++;
                if(i>250)
                {
                        I2c_Stop();
                        return 0;
                }
        }
        SCL_LOW();
        return 1;       
}

void I2c_Ack()
{
        SCL_LOW();
        SDA_OUT();
        //SCL_LOW();
        SDA_LOW();
        Delay_I2c();
        SCL_HIGH();
        Delay_I2c();
        SCL_LOW();       
}

void I2c_NAck()
{
        SCL_LOW();
        SDA_OUT();
        SDA_HIGH();
        Delay_I2c();
        SCL_HIGH();
        Delay_I2c();
        SCL_LOW();               
}

void I2c_SendByte(u8 data)
{
        u8 i;
        SDA_OUT();
        SCL_LOW();
        for(i = 0;i<8;i++)
        {
                GPIO_WriteBit(GPIOB,GPIO_Pin_11,(data&0x80)>>7);
                data<<=1;
                Delay_I2c();
                SCL_HIGH();
                Delay_I2c();
                SCL_LOW();
                Delay_I2c();
        }
}

int8_t I2c_ReadByte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();
        SCL_LOW();
        for(i = 0;i<8;i++)
        {
                SCL_HIGH();
                Delay_I2c();
                receive<<=1;
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11))
                         receive++;
                SCL_LOW();
                Delay_I2c();       
        }
        if(!ack)
                I2c_NAck();
        else
                I2c_Ack();
        return receive;
}

void Delay_I2c()
{
        u16 count;
        for(count = 50;count>0;count--);
}

u8 MPU_Init()
{
        I2c_Init();
        MPU_Delay();
        MPU_Delay();
        MPU_Delay();
        MPU_Delay();
        while(!MPU_Write_Data(MPU6050_RA_PWR_MGMT_1,0x00));
        MPU_Delay();
        while(!MPU_Write_Data(MPU6050_RA_SMPLRT_DIV,0x07));
        MPU_Delay();
        while(!MPU_Write_Data(MPU6050_RA_CONFIG,0x03));//06
        MPU_Delay();
        while(!MPU_Write_Data(MPU6050_RA_GYRO_CONFIG,0x00));  // 00á¿3ì£o500
        MPU_Delay();
        while(!MPU_Write_Data(MPU6050_RA_ACCEL_CONFIG,0x00)); //á¿3ì 4g
        MPU_Delay();
       
        return 1;
}

u8 MPU_Read()
{
        int8_t buf[14];
        if(MPU_Read_Len(MPU6050_RA_ACCEL_XOUT_H,14,buf))
        {
                Acc_XYZ.X = ((int16_t)buf[0])<<8 | buf[1] -Acc_OFFSET.X;
                Acc_XYZ.Y = ((int16_t)buf[2])<<8 | buf[3] - Acc_OFFSET.Y;
                Acc_XYZ.Z = ((int16_t)buf[4])<<8 | buf[5] - Acc_OFFSET.Z;
                Gyro_XYZ.X = ((int16_t)buf[8])<<8 | buf[9] - Gyro_OFFSET.X;
                Gyro_XYZ.Y = ((int16_t)buf[10])<<8 | buf[11] - Gyro_OFFSET.Y;
                Gyro_XYZ.Z = ((int16_t)buf[12])<<8 | buf[13] - Gyro_OFFSET.Z;               
        }

        else return 0;
  return 1;
}
//μÃμ½íóÂYòÇÔ-ê¼Öμ
u8 MPU_Get_Gyro()
{
        u8 buf[6];
        if(MPU_Read_Len(MPU6050_RA_GYRO_XOUT_H,6,buf))
        {
                Gyro_XYZ.X = ((u16)buf[0]<<8)|((u16)buf[1]);
                Gyro_XYZ.Y = ((u16)buf[2]<<8)|((u16)buf[3]);
                Gyro_XYZ.Z = ((u16)buf[4]<<8)|((u16)buf[5]);
        }
        else return 0;
  return 1;               
}

//μÃμ½¼óËù¶è¼ÆμÄÔ-ê¼Öμ
u8 MPU_Get_Acce(MPU6050_XYZ Acce_XYZ)
{
        u8 buf[6];
        if(MPU_Read_Len(MPU6050_RA_ACCEL_XOUT_H,6,buf))
        {
                Acce_XYZ.X = ((u16)buf[0]<<8)|((u16)buf[1]);
                Acce_XYZ.Y = ((u16)buf[2]<<8)|((u16)buf[3]);
                Acce_XYZ.Z = ((u16)buf[4]<<8)|((u16)buf[5]);
        }
        else return 0;
  return 1;               
}

//á¬DøD′
u8 MPU_Write_Len(u8 reg,u8 len,u8* buf)
{
        u8 i;
        I2c_Start();
        I2c_SendByte(MPU6050_ADD<<1|0); //·¢ËíÆ÷¼tμØÖ·+D′Ãüáî
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        I2c_SendByte(reg);
        I2c_Wait_Ack();
        for(i = 0;i < len;i++)
        {
        I2c_SendByte(buf);
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        }
        I2c_Stop();
        return 1;
}

//á¬Dø¶á
u8 MPU_Read_Len(u8 reg,u8 len,int8_t* buf)
{
        u8 i;
        I2c_Start();
        I2c_SendByte(MPU6050_ADD<<1|0); //·¢ËíÆ÷¼tμØÖ·+D′Ãüáî
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        I2c_SendByte(reg);
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        I2c_Start();
        I2c_SendByte(MPU6050_ADD<<1|1); //·¢ËíÆ÷¼tμØÖ·+¶áÃüáî
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        while(len)
        {
                if (len==1) *buf = I2c_ReadByte(0); //·¢ËíNACK
                else
                *buf = I2c_ReadByte(1); //·¢ËíACK
                buf++;
                len--;
        }
        I2c_Stop();
        return 1;
}

//Ïò¼Ä′æÆ÷D′μ¥×Ö½ú
u8 MPU_Write_Data(u8 reg,u8 data)
{
        I2c_Start();
        I2c_SendByte(MPU6050_ADD<<1|0); //·¢ËíÆ÷¼tμØÖ·+D′Ãüáî
       
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        I2c_SendByte(reg);
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
       
        I2c_SendByte(data);
       
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        I2c_Stop();
        return 1;
}

//Ïò¼Ä′æÆ÷¶áμ¥×Ö½ú
int8_t MPU_Read_Data(u8 reg)
{
        u8 res;
        I2c_Start();
        I2c_SendByte(MPU6050_ADD<<1|0); //·¢ËíÆ÷¼tμØÖ·+D′Ãüáî
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        I2c_SendByte(reg);
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        I2c_Start();
        I2c_SendByte(MPU6050_ADD<<1|1); //·¢ËíÆ÷¼tμØÖ·+¶áÃüáî
        if(!I2c_Wait_Ack())
        {
                I2c_Stop();
                return 0;
        }
        res = I2c_ReadByte(0); //2»·¢ËíACK
        I2c_Stop();
        return res;
}
void MPU_Delay()
{
        u16 i=500;
        while(i)
        {
                i--;
        }
}
能帮忙看看吗,用的是stm32,SDA输入的时候是浮空输入

回复 支持 反对

使用道具 举报

16

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2289
威望
1178
贡献
699
兑换币
556
注册时间
2012-11-26
在线时间
206 小时
7#
 楼主| 发表于 2015-9-22 16:02:58 | 只看该作者
la9998372 发表于 2015-9-22 12:14
你拿iar看数值了吗?数值稳定吗?

静止和动的时候的波形如下图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

24

主题

492

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13138
威望
5341
贡献
1645
兑换币
2222
注册时间
2012-3-9
在线时间
3076 小时
毕业学校
嘉兴学院
8#
发表于 2015-9-23 08:44:57 | 只看该作者
yzx 发表于 2015-9-22 15:56
#include "I2C.h"

GPIO_InitTypeDef GPIO_InitStructure;

Gyro_XYZ.X = (int16)(((u16)buf[0]<<8&0xff00)|((u16)buf[1])); 不行的话 可能是读多个字节有问题,先试试单字节读写。



回复 支持 反对

使用道具 举报

16

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2289
威望
1178
贡献
699
兑换币
556
注册时间
2012-11-26
在线时间
206 小时
9#
 楼主| 发表于 2015-9-23 08:59:13 | 只看该作者
机遇 发表于 2015-9-23 08:44
Gyro_XYZ.X = (int16)(((u16)buf[0]

读单字节也是不行,还是波动很大,不知道是不是模块有问题了,打算再买一个试试
回复 支持 反对

使用道具 举报

24

主题

492

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13138
威望
5341
贡献
1645
兑换币
2222
注册时间
2012-3-9
在线时间
3076 小时
毕业学校
嘉兴学院
10#
发表于 2015-9-23 11:20:34 | 只看该作者
本帖最后由 机遇 于 2015-9-23 11:27 编辑
yzx 发表于 2015-9-23 08:59
读单字节也是不行,还是波动很大,不知道是不是模块有问题了,打算再买一个试试
可能是IIC时序有问题,你用示波器看下吧,或者你那个上位机 用法用错了,我看你图像最小刻度才几十,实际上加速度计 静止的数字 应该很大吧,你可以先 在上位机画条正弦函数。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-8 06:36 , Processed in 0.046235 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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