MPU6050/MPU6000中断配置解决

MPU6050 / MPU6000配置中断寄存器后INT电平一直不变(为高),解决办法:
第一步:初始化模块

//初始化MPU6050
//返回值: 0,成功
//        其他,错误代码
uint8_t MPU_Init(void)
{   
      uint8_t res;
      MCU6000_INT_Init()
      IIC_Init();                                       //初始化IIC总线
      MPU_Write_Byte(MPU6050_RA_PWR_MGMT_1,0X80);           //复位MPU6050
      delay_ms(100);
      MPU_Write_Byte(MPU6050_RA_PWR_MGMT_1,0X00);           //唤醒MPU6050
      MPU_Set_Gyro_Fsr(3);                              //陀螺仪传感器,±2000dps
      MPU_Set_Accel_Fsr(0);                             //加速度传感器 ±2g
      MPU_Set_Rate(200);                                //设置采样率200-50HZ
      MPU_Write_Byte(MPU6050_RA_INT_ENABLE,0X00);              //关闭所有中断
      MPU_Write_Byte(MPU6050_RA_USER_CTRL,0X00);           //I2C主模式关闭
      MPU_Write_Byte(MPU6050_RA_FIFO_EN,0X00);             //关闭FIFO
      MPU_Write_Byte(MPU6050_RA_INT_PIN_CFG,0X80);         //中断的逻辑电平模式,设置为0,中断信号为高电;设置为1,中断信号为低电平时。
      res=MPU_Read_Byte(MPU6050_RA_WHO_AM_I);
      if(res==MPU_ADDR)                                 //器件ID正确
      {
            MPU_Write_Byte(MPU6050_RA_PWR_MGMT_1,0X02);     //设置CLKSEL,PLL X 轴为参考
            MPU_Write_Byte(MPU6050_RA_PWR_MGMT_2,0X00);     //加速度陀螺仪都工作
            MPU_Set_Rate(200);                          //设置采样率为200-50HZ
      }else return 1;
      return 0;
}

第二部:设置中断

void MPU_INT_Init(void)
{
//数据就绪中断
//    MPU_Write_Byte(MPU6050_RA_CONFIG,0x06);         //配置外部引脚采样和DLPF数字低通滤波器
//    MPU_Write_Byte(MPU6050_RA_INT_PIN_CFG,0X1C);    //INT引脚低电平平时
//    MPU_Write_Byte(MPU6050_RA_INT_ENABLE,0x01);     //中断使能寄存器

  
//自由落体、运动、静止中断 三选一  
//    Free_Fall_Interrupt();                          //自由落体中断
    Motion_Interrupt();                               //运动中断
//    Zero_Motion_Interrupt();                        //静止中断
    MPU_Write_Byte(MPU6050_RA_CONFIG,0x04);           //配置外部引脚采样和DLPF数字低通滤波器
    MPU_Write_Byte(MPU6050_RA_ACCEL_CONFIG,0x1C);     //加速度传感器量程和高通滤波器配置
    MPU_Write_Byte(MPU6050_RA_INT_PIN_CFG,0X1C);      //INT引脚低电平平时
    MPU_Write_Byte(MPU6050_RA_INT_ENABLE,0x40);       //中断使能寄存器
}

void Free_Fall_Interrupt(void)          //自由落体中断
{
    MPU_Write_Byte(MPU6050_RA_FF_THR,0x01);             //自由落体阈值 
    MPU_Write_Byte(MPU6050_RA_FF_DUR,0x01);             //自由落体检测时间20ms 单位1ms 寄存器0X20
}
void Motion_Interrupt(void)             //运动中断
{
    MPU_Write_Byte(MPU6050_RA_MOT_THR,0x01);            //运动阈值 
    MPU_Write_Byte(MPU6050_RA_MOT_DUR,0x14);            //检测时间20ms 单位1ms 寄存器0X20
}
void Zero_Motion_Interrupt(void)        //静止中断
{
    MPU_Write_Byte(MPU6050_RA_ZRMOT_THR,0x20);          //静止阈值 
    MPU_Write_Byte(MPU6050_RA_ZRMOT_DUR,0x20);          //静止检测时间20ms 单位1ms 寄存器0X20
}

应用层调用代码:

    MPU_Init();
    MPU_INT_Init();

进入低功耗:

MPU_Set_Low_power();

中断配置关键位置:

MPU_Write_Byte(MPU6050_RA_CONFIG,0×04); //配置外部引脚采样和DLPF数字低通滤波器

数据就绪中断使能中断配置MPU_Write_Byte(MPU6050_RA_CONFIG,0x06); //此次我开启加速度与陀螺仪

运动检测中断配置MPU_Write_Byte(MPU6050_RA_CONFIG,0x04); //开启加速度

/ *配置外部引脚采样和DLPF数字低通滤波器* /
#define MPU6050_RA_CONFIG 0x1A
// bit5-bit3一个连接到FSYNC端口的外部信号可以通过配置EXT_SYNC_SET来采样
//也就是说,这里设置之后,FSYNC的电平0或1进入最终数据
寄存器,具体如下// 0不使用 
// 1 FSYNC电平进入所有数据 
寄存器
// 2 FSYNC电平进入GYRO_XOUT_L  // 3 FSYNC电平进入GYRO_YOUT_L
// 4 FSYNC电平进入GYRO_ZOUT_L 
// 5 FSYNC电平进入ACCEL_XOUT_L 
// 6 FSYNC电平进入ACCEL_YOUT_L
// 7 FSYNC电平进入SYNC_ACCEL_ZOUT_L
// bit2-bit0数字低通滤波器用于滤除高频干扰高于这个频率的干扰被滤除掉
/ *对应关系如下
 * * | 加速度传感器| 陀螺仪
 * * DLPF_CFG | 带宽| 延迟| 带宽| 延迟| 采样率
 * ------------- + -------- + ------- + -------- + ------ + - -----------
 * 0 | 260Hz | 0ms | 256Hz | 0.98ms | 8kHz
 * 1 | 184Hz | 2.0ms | 188Hz | 1.9ms | 1kHz
 * 2 | 94Hz | 3.0ms | 98Hz | 2.8ms | 1kHz
 * 3 | 44Hz | 4.9ms | 42Hz | 4.8ms | 1kHz
 * 4 | 21Hz | 8.5ms | 20Hz | 8.3ms | 1kHz
 * 5 | 10Hz | 13.8ms | 10Hz | 13.4ms | 1kHz
 * 6 | 5Hz | 19.0ms | 5Hz | 18.6ms | 1kHz
 * 7 | 保留| 保留| 保留
 * * /

其他代码:

//设置MPU6050陀螺仪传感器满量程范围
//fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
//返回值:0,设置成功
//    其他,设置失败 
uint8_t MPU_Set_Gyro_Fsr(uint8_t fsr)
{
      return MPU_Write_Byte(MPU6050_RA_GYRO_CONFIG,fsr<<3);   //设置陀螺仪满量程范围
}

//设置MPU6050加速度传感器满量程范围
//fsr:0,±2g;1,±4g;2,±8g;3,±16g
//返回值:0,设置成功
//    其他,设置失败 
uint8_t MPU_Set_Accel_Fsr(uint8_t fsr)
{
      return MPU_Write_Byte(MPU6050_RA_ACCEL_CONFIG,fsr<<3);  //设置加速度传感器满量程范围
}

//设置MPU6050的数字低通滤波器
//lpf:数字低通滤波频率(Hz)
//返回值:0,设置成功
//    其他,设置失败 
uint8_t MPU_Set_LPF(uint16_t lpf)
{
      uint8_t data=0;
      if(lpf>=188) data=1;
      else if(lpf>=98) data=2;
      else if(lpf>=42) data=2;
      else if(lpf>=42) data=3;
      else if(lpf>=20) data=4;
      else if(lpf>=10) data=5;
      else data=6; 
      return MPU_Write_Byte(MPU6050_RA_CONFIG,data);          //设置数字低通滤波器  
}

//设置MPU6050的采样率(假定Fs=1KHz)
//rate:4~1000(Hz)
//返回值:0,设置成功
//    其他,设置失败 
uint8_t MPU_Set_Rate(uint16_t rate)
{
      uint8_t data;
      if(rate>1000)rate=1000;
      if(rate<4)rate=4;
      data=1000/rate-1;
      data=MPU_Write_Byte(MPU6050_RA_SMPLRT_DIV,data);    //设置数字低通滤波器
      return MPU_Set_LPF(rate/2);	                //自动设置LPF为采样率的一半
}

//IIC写一个字节 
//reg:		寄存器地址
//data:		数据
//返回值:	0,正常
//    		其他,错误代码
uint8_t MPU_Write_Byte(uint8_t reg,uint8_t data)
{
      IIC_Start();
      IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	
      if(IIC_Wait_Ack())	//等待应答
      {
            IIC_Stop();	
            return 1;		
      }
      IIC_Send_Byte(reg);	//写寄存器地址
      IIC_Wait_Ack();		//等待应答 
      IIC_Send_Byte(data);//发送数据
      if(IIC_Wait_Ack())	//等待ACK
      {
            IIC_Stop();	 
            return 1;		 
      }		 
      IIC_Stop();	 
      return 0;
}

//IIC读一个字节 
//reg:寄存器地址 
//返回值:读到的数据

uint8_t MPU_Read_Byte(uint8_t reg)
{
      uint8_t res;
      IIC_Start();
      IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	
      IIC_Wait_Ack();//等待应答
      IIC_Send_Byte(reg);//写寄存器地址
      IIC_Wait_Ack();//等待应答
      IIC_Start();
      IIC_Send_Byte((MPU_ADDR<<1)|1);//发送期间地址+读命令
      IIC_Wait_Ack();//等待应答
      res=IIC_Read_Byte(0);//读取数据,发送nACK
      IIC_Stop();//产生一个停止条件
      return res;
}

//IIC连续写
//addr:器件地址
//reg: 寄存器地址
//len: 写入长度
//buf: 数据区
//返回值: 0,正常
//  			其他,错误代码
uint8_t MPU_Write_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
      uint8_t i;
      IIC_Start();
      IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令
      if(IIC_Wait_Ack())//等待应答
      {
            IIC_Stop();
            return 1;
      }
      IIC_Send_Byte(reg);//写寄存器地址
      IIC_Wait_Ack();//等待应答
      for(i=0;i

 

 

 

 

 

你可能感兴趣的:(MPU6050中断配置解决,中断阈值判断,自由落体,运动中断,静止中断)