MPU6050配置低功耗和中断

前言

各位铁子们啊,当你们看到这篇博客的时候说明你很有可能和我碰到了一样的问题,然后犯了一样的错误。
我在使用MPU6050的时候参考着寄存器手册(最新的寄存器手册会发现很多寄存器,文档上都没有提)和博客一点点的去做休眠和中断,花了好几天终于弄好了,结果发现在官方提供的相关的驱动库中有这部分的代码。

  • 例如:

		int mpu_lp_motion_interrupt(unsigned short thresh, unsigned char time,
    unsigned char lpa_freq)//进入低功耗模式,并且可以设置motion 触发中断的阀值
    	int mpu_lp_accel_mode(unsigned char rate) //进入低功耗仅加速器工作模式



代码位置

  • 代码获取方式:
    • http://www.openedv.com/docs/boards/stm32/zdyz_stm32f103_mini.html
    • 这部分主要参考的正点原子的范例如果有需要的可以去正点原子的资料库里去拿。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

功耗

MPU6050的两种低功耗方式

  • sleep
    如果处于sleep状态下的话,这时候功耗确实很低,但是如果想要利用移动/自由落体等这些动作去进行唤醒的话,基本上就不可能了。
  • cycle
    我们常说的低功耗应该是处于该状态下的,它是唤醒和休眠交替执行的,例如唤醒频率5HZ,那么就是每200ms唤醒一次去采集数据,判断是否达到了中断唤醒的条件。唤醒频率越高,那么各种动作触发的中断也就更加灵敏。

各状态下的工作电流

我在使用MPU6050的过程中,对其低功耗状态下的电流进行了测量,这里大致和大家分享一下。

电压:3.3V	

下面的MPU6050功耗数据不包含模块上的LED灯的功耗,各位在测量的时候要注意LED灯的影响。

MPU6050 sleep状态下电流:0.13ma
MPU6050 cycle模式时不同频率下的电流消耗(三轴陀螺仪均处于待机状态下,同时这里减去了LED灯的电流消耗):
	*	1.25HZ时 	电流为:0.135ma
	*	5HZ时		电流为:0.15ma
	*	20HZ时		电流为:0.23ma
	*	40HZ时		电流为:0.32ma

注意:
	三轴陀螺仪,每开一轴电流的就会增大3ma,所以当你三轴陀螺仪全开时,电流消耗将会增加12个ma左右。

整体来看MPU6050的低功耗状态下电流消耗还是有点高的。

关于移植时注意的事项

  • 地址问题
    • 读写时
      这里要注意自己的I2C驱动使用的是硬件I2C还是软件模拟I2C,如果是软件实现的话直接使用正点原子的范例就行了,如果不是的话要注意地址这块,正点原子所使用的addr=0x68,这其实是MPU6050的地址的前7位,实际地址应该是0xD0/0xD1(看你的AD0引脚是低/高)。
      另外读寄存器0x75 读出来的地址是0x68/0x69。
      正点原子的实现:
u8 MPU_Read_Len(u8 addr, u8 reg, u8 len, u8 *buf)
{
	MPU_IIC_Start();
	MPU_IIC_Send_Byte((addr << 1) | 0);
	if (MPU_IIC_Wait_Ack())	
	{
		MPU_IIC_Stop();
		return 1;
	}
	MPU_IIC_Send_Byte(reg);
	MPU_IIC_Wait_Ack();	
	MPU_IIC_Start();
	MPU_IIC_Send_Byte((addr << 1) | 1); //这里会将地址向左移动后根据“读/写”补上“0/1“
	MPU_IIC_Wait_Ack();			
	while (len)
	{
		if (len == 1)
			*buf = MPU_IIC_Read_Byte(0);
		else
			*buf = MPU_IIC_Read_Byte(1);
		len--;
		buf++;
	}
	MPU_IIC_Stop();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Dr_chaser/article/details/109726324