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条回答
MYSRTP
1楼-- · 2019-07-20 19:05
 精彩回答 2  元偷偷看……
MYSRTP
2楼-- · 2019-07-21 00:45
刚刚在定时器中断中读取陀螺仪的值,结果delay也失效了
only
3楼-- · 2019-07-21 04:07
最差的方法,原子的delay不能用的话,自己写一个delay不就行了么,最简单的for循环格式。。。。。。
:)
MYSRTP
4楼-- · 2019-07-21 06:18
 精彩回答 2  元偷偷看……
Coder
5楼-- · 2019-07-21 09:19
感觉是有问题,我在定时器中断里5ms读一次欧拉角数据,过一会就会死机,重新移植并优化下dmp库就好了
小天使
6楼-- · 2019-07-21 14:08
我也有这情况  但是我在中断里重新定义了一个变量 自己有写了个delay函数 但是延时不太准   我是把 MPU6050读取、显示的那部分程序放到了中断服务函数里面 每1ms或者10ms进一次中断都可以

一周热门 更多>