记录关于使用MPU6050遇到的各种问题


注意:我的代码基于正点原子官方提供的MPU6050实验代码,使用到了dmp库求欧拉角。

一、问题一:MPU6050的初始化失败,不进入while循环

原因:MPU6050在上电初始化时需要自检,如果硬件是一个很倾斜的状态,就导致卡住,必须保证平放,或者不乱晃动。

二、问题二:MPU6050需要接AD0引脚吗?

答:AD0引脚如果接地,则硬件地址为0x68,如果接3V3,则地址为0x69,这里没必要接线,代码里面定义了地址为0x68,同时,在MPU6050的初始化函数里,也可以把关于AD0的引脚的初始化语句注释掉。

三、问题三:MPU6050供电接5V或者3V3可以吗?

答:我买的这个普遍版本都是可以两个都接的。

四、问题四:MPU6050的IIC通信是使用硬件IIC好还是软件IIC好?

答:只能说根据情况来看。对于 MPU6050 来说,硬件 IIC 具有更高的速度和更少的 CPU 占用率。软件 IIC 通信则需要更多的 CPU 时间和计算资源,但是硬件IIC网上说不稳定,容易出问题,这里我用软件IIC模拟更好,因为我要求的传输速度不高。如果需要更高速的传输,那就上硬件IIC。
这是硬件IIC的初始化函数:

void IIC_Init( u32 bound , u16 address )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	I2C_InitTypeDef I2C_InitTSturcture;

	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );
//	GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C2, ENABLE );

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init( GPIOB, &GPIO_InitStructure );

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init( GPIOB, &GPIO_InitStructure );

	I2C_InitTSturcture.I2C_ClockSpeed = bound;
	I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C;
	I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_16_9;
	I2C_InitTSturcture.I2C_OwnAddress1 = address;
	I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;
	I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_Init( I2C2, &I2C_InitTSturcture );
	I2C_Cmd( I2C2, ENABLE );
	I2C_AcknowledgeConfig( I2C2, ENABLE );
}

这是软件IIC的初始化函数:

//初始化IIC接口引脚
void IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    //GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_6);
}

硬件IIC方便的是可以调用现成的成员变量和库函数进行通信和读写操作,软件IIC方便的是可以自定义SCL和SDA引脚,用GPIO的高低电平模拟IIC效果,需要自己写start、stop、ack等函数,不过现在网上相关代码很容易找到。

五、问题五:一处建议修改的代码

源代码为:

  if(mpu_dmp_get_data(&Pitch, &Roll, &Yaw)==0){
     //xxxxxx
           }

现在改为:

  while(mpu_dmp_get_data(&Pitch, &Roll, &Yaw)!=0){

           }

这样修改后,可以有效防止新的数据进缓存区过快导致FIFO溢出,防止MPU6050出现卡死的情况。

六、问题六:一个十分玄学的问题:接线

问题说明:我正常上电,当MPU6050不晃动时,正常打印数据,但是一旦晃动过快,就会卡死。我首先就想到是线的问题,于是换了线,结果还是会出现这个问题。然后,我又怀疑是代码的问题,但是调试时也不会卡死在特定的某个程序,而是完全随机中断。之后,我把VCC、GND、SCL、SDA端口和杜邦线用热熔胶粘牢,还会有这个问题。很玄学。

解决方法:更加玄学。经过好几天的测试,发现居然跟杜邦线的长短有关系。我一直使用的是40cm长的杜邦线,总出问题。而当我换成20cm的短杜邦线时,居然没问题了!!!离谱的是,长杜邦线接SCL和SDA没问题,但是不能接VCC和GND,VCC和GND二者必须有至少一个要接短线才能正常运行不卡死。…

七、关于软件IIC的端口配置问题

代码如下:

//IO方向设置
#define SDA_IN() {GPIOB->CFGLR&=0X0FFFFFFF;GPIOB->CFGLR|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CFGLR&=0X0FFFFFFF;GPIOB->CFGLR|=(u32)3<<28;}

//IO操作函数
//#define IIC_SCL PBout(6)
//#define IIC_SDA PBout(7)
//#define READ_SDA PBin(9)

#define IIC_SCL_0 GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define IIC_SDA_0 GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define IIC_SCL_1 GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define IIC_SDA_1 GPIO_SetBits(GPIOB,GPIO_Pin_7)


鉴于stm32的位带操作移植到其他平台是不太行的,所以要进行改写,改写形式如上。

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
正点原子MPU6050是一种常用的惯性测量单元(IMU),可以通过感知和测量物体的运动和姿态。如果要将MPU6050移植到其他硬件平台上,可以参考以下步骤: 1. 硬件连接:首先,根据MPU6050的引脚定义,将其正确连接到目标硬件平台上。确保电源和地线的正确连接,并使用适当的电平转换器(如果需要)来匹配平台的电平要求。 2. 引脚定义:查阅MPU6050的数据手册,了解其引脚功能和寄存器的作用。根据目标硬件平台的引脚分配,将引脚定义和寄存器地址进行适配。可能需要对代码进行修改,以保证正确的引脚和寄存器访问。 3. I2C通信:MPU6050使用I2C来与主控芯片进行通信。在移植过程中,需要根据目标硬件平台的I2C接口定义,修改MPU6050库中的相关代码。确保正确的I2C引脚和初始化配置,并处理好I2C通信的错误。 4. 硬件中断配置:MPU6050可以通过硬件中断来提醒主控芯片有新的数据可用。在移植过程中,需要根据目标硬件平台上的外部中断引脚进行配置,并修改MPU6050库中的相关代码,以便处理中断触发和相应的数据读取。 5. 校准和滤波:为了获得更精确和稳定的数据,可以进行MPU6050的校准和滤波。参考MPU6050库中的相关函数,并根据实际需求和平台特性进行适当的修改。 6. 数据处理和应用:一旦MPU6050成功移植到目标硬件平台上,可以根据需要进行数据处理和应用开发。使用MPU6050提供的姿态和运动测量数据,可以实现姿态传感、动作识别等功能。 总之,将MPU6050移植到其他硬件平台上需要进行硬件连接、引脚定义、I2C通信、硬件中断配置、校准和滤波等步骤。在移植过程中,需要根据目标平台的特性进行相关代码的修改,以确保MPU6050在新平台上能够正常工作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值