MPU6050中断以及delay失效

2019-07-20 13:08发布

使用mpu6050中断,结果一在中断处理函数中调用函数读取陀螺仪的原始值,整个系统的delay函数就会失效,请问有人遇到过这种情况吗?这是中断初始化函数

u8 MPU_Init(void)
{
        u8 res;
        IIC_Init();//初始化IIC总线
        MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //复位MPU6050
  delay_ms(100);
        MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //唤醒MPU6050
        MPU_Set_Gyro_Fsr(3);                                        //陀螺仪传感器,±2000dps
        MPU_Set_Accel_Fsr(0);                                        //加速度传感器,±2g
        MPU_Set_Rate(1000);                                                //设置采样率1000Hz
        MPU_Write_Byte(MPU_INT_EN_REG,0X01);        //开启中断
        MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式关闭
        MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //关闭FIFO
        MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引脚低电平有效
        res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
        if(res==MPU_ADDR)//器件ID正确
        {
                MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //设置CLKSEL,PLL X轴为参考
                MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度与陀螺仪都工作
                MPU_Set_Rate(1000);                                                //设置采样率为1000Hz  *****xr****:这里原来是50,修改为1000
        }else return 1;
        return 0;
}



这是在中断中调用的问题函数(一调用delay就失效了,但是中断外调用却没有问题)
int MPU6050_ReadData(void)
{
        //读取寄存器原生数据
        MPU_Get_Gyroscope(&MPU6050_Raw_Data.Gyro_X,&MPU6050_Raw_Data.Gyro_Y,&MPU6050_Raw_Data.Gyro_Z);
        MPU_Get_Accelerometer(&MPU6050_Raw_Data.Accel_X,&MPU6050_Raw_Data.Accel_Y,&MPU6050_Raw_Data.Accel_Z);
       
  //将原生数据转换为实际值,计算公式跟寄存器的配置有关
        //****xr****:由于我们设置的是加速度传感器±2g,陀螺仪量程±2000dps,所以需要修改
  MPU6050_Real_Data.Accel_X = (float)(MPU6050_Raw_Data.Accel_X)/16384.0;
  MPU6050_Real_Data.Accel_Y = (float)(MPU6050_Raw_Data.Accel_Y)/16384.0;  
  MPU6050_Real_Data.Accel_Z = (float)(MPU6050_Raw_Data.Accel_Z)/16384.0;
  MPU6050_Real_Data.Temp    = (float)(MPU6050_Raw_Data.Temp)/340.0+36.53;     
        MPU6050_Real_Data.Gyro_X  = (float)(MPU6050_Raw_Data.Gyro_X - gyroADC_X_offset)/16.4;  
  MPU6050_Real_Data.Gyro_Y  = (float)(MPU6050_Raw_Data.Gyro_Y - gyroADC_Y_offset)/16.4;     
  MPU6050_Real_Data.Gyro_Z  = (float)(MPU6050_Raw_Data.Gyro_Z - gyroADC_Z_offset)/16.4;
        return 0;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
小天使
1楼-- · 2019-07-21 15:39
 精彩回答 2  元偷偷看……
MYSRTP
2楼-- · 2019-07-21 16:19
小天使 发表于 2016-4-21 10:44
我也有这情况  但是我在中断里重新定义了一个变量 自己有写了个delay函数 但是延时不太准   我是把 MPU6050 ...

我的中断频率为1000Hz,估计是太频繁了,不过自己写了一个IIC_delay后问题就解决了
NKU2015
3楼-- · 2019-07-21 20:08
 精彩回答 2  元偷偷看……

一周热门 更多>