OpenEdv-开源电子网

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

mpu6050 初始化问题

[复制链接]

12

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2016-8-11
在线时间
77 小时
发表于 2017-3-3 14:45:58 | 显示全部楼层 |阅读模式
20金钱
在学习mpu6050的时候出现一个问题:mpu6050初始化失败,当程序执行到res=MPU_Read_Byte(MPU_DEVICE_ID_REG); 这段程序时,得到的结果为零。

硬件上我是这么连接的,用的是stm32vbt6的芯片,mpu6050模块的SCL引脚和SDA引脚分别与PB6,PB7连接,AD0引脚和PB5连接,INT引脚与PB4连接。

用了很多种方法,比如IIC初始化后延时几百毫秒,模块放平,初始化过程禁掉所有中断,将连接mpu6050的线变短,这些方法我都试过,依然没有读出ID(依然为0),而且mpu6050模块我也换了模块,还是不行。程序我是用原子哥的mpu6050的程序(各个版本我都试过),我只是改了相应的引脚,其他的基本没动,往mpu6050写入数据到是可以,由于读出来的数是0(地址是0x68),所以我也不懂是不是IIC初始化有问题,还是其他什么问题,这个问题弄了一周依然没有解决,所以求助大家,希望能提供一个解决办法,这里谢谢大家

下面是mpu6050初始化代码
[mw_shl_code=c,true]u8 MPU_Init(void)
{
        u8 res;
//  GPIO_InitTypeDef  GPIO_InitStructure;
//       
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//ê1ÄüAFIOê±Öó
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//Ïèê1ÄüíaéèIO PORTBê±Öó
//       
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;         // ¶Ë¿úÅäÖÃ
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //íÆíìêä3ö
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿úËù¶èÎa50MHz
//  GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //¸ù¾Yé趨2Îêy3õê¼»ˉGPIOB

//        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//½ûÖ1JTAG,′ó¶&#248A15¿éòÔ×öÆÕí¨IOê1óÃ,·ñÔòPB52»Äü×öÆÕí¨IO!!!
//       
//        MPU_AD0_CTRL=0;                        //¿ØÖÆMPU6050μÄAD0½ÅÎaμíμçÆ½,′ó»úμØÖ·Îa:0X68
       
        MPU_IIC_Init();//3õê¼»ˉIIC×üÏß
        delay_ms(1000);
        printf("delay 1S \r\n");
        res = MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //¸′λMPU6050
        if(res)
                printf("1\r\n");
  delay_ms(100);
        res = MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //»½DÑMPU6050
        if(res)
                printf("2\r\n");
        res = MPU_Set_Gyro_Fsr(3);                                        //íóÂYòÇ′«¸DÆ÷,¡à2000dps
        if(res)
                printf("3\r\n");
        res = MPU_Set_Accel_Fsr(0);                                        //¼óËù¶è′«¸DÆ÷,¡à2g
        if(res)
                printf("4\r\n");
        res = MPU_Set_Rate(50);                                                //éèÖÃ2éÑùÂê50Hz
        if(res)
                printf("5\r\n");
        res = MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //1رÕËùóDÖD¶Ï
        if(res)
                printf("6\r\n");
        MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2CÖ÷Ä£ê½1رÕ
        if(res)
                printf("7\r\n");
        MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //1رÕFIFO
        if(res)
                printf("8\r\n");
        res = MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INTòy½ÅμíμçÆ½óDD§
        if(res)
                printf("9\r\n");
        res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
        printf("res = %x\r\n",res);
        if(res==MPU_ADDR)//Æ÷¼tIDÕyè·
        {
                res = MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //éèÖÃCLKSEL,PLL XÖáÎa2ο¼
                if(res)
                        printf("10\r\n");
                res = MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //¼óËù¶èóëíóÂYòǶ¼1¤×÷
                if(res)
                        printf("11\r\n");
                res = MPU_Set_Rate(50);                                                //éèÖÃ2éÑùÂêÎa50Hz
                if(res)
                        printf("12\r\n");
        }
        else
        {       
                printf("mpu Init faild\r\n");
                return 1;
        }
        printf("mpu init succsse\r\n");
        return 0;
}[/mw_shl_code]
这个是IIC初始化代码
[mw_shl_code=c,true]//初始化IIC
void MPU_IIC_Init(void)
{                                             
  GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外部IO PORTB时钟
               
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;         // 配置端口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO初始速度为50MHZ
  GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIO
       
        MPU_IIC_SCL=1;
        MPU_IIC_SDA=1;                           
//  GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);                                                 //PB6,PB7 输出高电平
        printf("mpu iic init succsse!\r\n");

}[/mw_shl_code]

io操作函数
[mw_shl_code=c,true]//IO方向设置
#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<12;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<12;}

//IO操作函数
#define MPU_IIC_SCL    PBout(6)                 //SCL
#define MPU_IIC_SDA    PBout(7)                 //SDA         
#define MPU_READ_SDA   PBin(7)                 //输出SDA [/mw_shl_code]

AD0控制
[mw_shl_code=c,true]//MPU6050 AD0控制脚
#define MPU_AD0_CTRL                        PBout(5)        //控制AD0电平,从而控制MPU地址[/mw_shl_code]

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

使用道具 举报

12

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2016-8-11
在线时间
77 小时
 楼主| 发表于 2017-3-3 15:18:01 | 显示全部楼层
回复

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2017-1-11
在线时间
12 小时
发表于 2017-3-3 15:40:35 | 显示全部楼层
哥哥我也是这个问题
回复

使用道具 举报

12

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2016-8-11
在线时间
77 小时
 楼主| 发表于 2017-3-3 15:54:28 | 显示全部楼层
为中国自豪 发表于 2017-3-3 15:40
哥哥我也是这个问题

之前看寄存器还有数据存在,之后用串口打印数据就一直为零了...还有dmp初始化时加载dmp映像也是失败的  ╮(╯▽╰)╭
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-3-3 16:02:08 | 显示全部楼层
本帖最后由 东北小辉辉 于 2017-3-3 16:03 编辑

原子哥的程序,应该不会有问题,先用原子哥的默认程序,试一下可不可以读到Who am I,如果可以,那应该是是引脚的配置问题导致的。
你是如何判定“往mpu6050写入数据到是可以”的?
读取Who am I并不需要什么设置,只要硬件连接正确且I2C通了,就可以从Who am I中读到数据。
仔细检查一下引脚配置,手头有示波器的话,挂上看看时序。
AD0先接地吧,排除额外的因素影响。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

12

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2016-8-11
在线时间
77 小时
 楼主| 发表于 2017-3-3 18:38:48 | 显示全部楼层

用mpu6050 dmp读出的四元数转欧拉角后还需要滤波吗?

东北小辉辉 发表于 2017-3-3 16:02
原子哥的程序,应该不会有问题,先用原子哥的默认程序,试一下可不可以读到Who am I,如果可以,那应该是是 ...

我把SDA和SCL的引脚换成了原子哥默认的引脚,ad0也接地了,读Who am i 的数据不是0xff就是0x7f,0x68是偶尔可以得到的。

得到的数据

得到的数据

波形图01

波形图01

波形图02

波形图02
回复

使用道具 举报

12

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2016-8-11
在线时间
77 小时
 楼主| 发表于 2017-3-4 09:52:16 | 显示全部楼层
顶顶顶~~~~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-3-4 12:10:14 | 显示全部楼层
是什么硬件平台?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2016-8-11
在线时间
77 小时
 楼主| 发表于 2017-3-4 15:59:21 | 显示全部楼层
正点原子 发表于 2017-3-4 12:10
是什么硬件平台?

自己DIY的一个实验版
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-7-30
在线时间
2 小时
发表于 2019-8-11 22:23:27 | 显示全部楼层
I2C引脚改变,其输入输出方向寄存器配置也要改变,对应相应的高八位和低八位IO寄存器位配置。
建议你看一下这两个链接,你会找到你要的答案(附件里):

MPU6050_I2C代码移植问题.rar

220 Bytes, 下载次数: 16

回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-7-3
在线时间
2 小时
发表于 2020-12-4 16:25:49 | 显示全部楼层
o操作函数
[mw_shl_code=c,true]//IO方向设置
#define MPU_SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<12;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<12;}

//IO操作函数
#define MPU_IIC_SCL    PBout(6)                 //SCL
#define MPU_IIC_SDA    PBout(7)                 //SDA         
#define MPU_READ_SDA   PBin(7)                 //输出SDA [/mw_shl_code]
这段代码的IO口PB7输入输出配置就是不对呀!!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 16:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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