OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6980|回复: 10

MPU6050中断以及delay失效

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-1
在线时间
10 小时
发表于 2016-4-18 22:21:57 | 显示全部楼层 |阅读模式
10金钱
使用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;
}


最佳答案

查看完整内容[请看2#楼]

我想我可能找到问题所在了。读取mpu6050的时候需要使用IIC,而原子的IIC读mpu6050用的是软件模拟,其中会用到delay_us,而delay_us似乎会影响到delay_ms。但是具体是为什么我还不太明白,求各位大神解答
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-1
在线时间
10 小时
 楼主| 发表于 2016-4-18 22:21:58 | 显示全部楼层
我想我可能找到问题所在了。读取mpu6050的时候需要使用IIC,而原子的IIC读mpu6050用的是软件模拟,其中会用到delay_us,而delay_us似乎会影响到delay_ms。但是具体是为什么我还不太明白,求各位大神解答
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-1
在线时间
10 小时
 楼主| 发表于 2016-4-18 22:28:39 | 显示全部楼层
刚刚在定时器中断中读取陀螺仪的值,结果delay也失效了
回复

使用道具 举报

23

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2015-2-19
在线时间
32 小时
发表于 2016-4-19 09:27:45 | 显示全部楼层
最差的方法,原子的delay不能用的话,自己写一个delay不就行了么,最简单的for循环格式。。。。。。
:)
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-1
在线时间
10 小时
 楼主| 发表于 2016-4-19 11:20:51 | 显示全部楼层
only 发表于 2016-4-19 09:27
最差的方法,原子的delay不能用的话,自己写一个delay不就行了么,最简单的for循环格式。。。。。。
: ...

可以尝试一下,我现在是把读取mpu6050数据放到主函数while循环里面了,感觉有点蛮。最主要的是我想知道出问题的原因
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2014-6-12
在线时间
54 小时
发表于 2016-4-19 11:47:36 | 显示全部楼层
感觉是有问题,我在定时器中断里5ms读一次欧拉角数据,过一会就会死机,重新移植并优化下dmp库就好了
回复

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-4-3
在线时间
15 小时
发表于 2016-4-21 10:44:49 | 显示全部楼层
我也有这情况  但是我在中断里重新定义了一个变量 自己有写了个delay函数 但是延时不太准   我是把 MPU6050读取、显示的那部分程序放到了中断服务函数里面 每1ms或者10ms进一次中断都可以
回复

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-4-3
在线时间
15 小时
发表于 2016-4-21 10:46:12 | 显示全部楼层
void TIM3_IRQHandler(void)
{
          u8 t=0;               
          short aacx,aacy,aacz;                //加速度传感器原始数据
          short gyrox,gyroy,gyroz;        //陀螺仪原始数据
          short temp;                                        //温度
       
        time++;
        if(time>=1000000) time = 0;
       
               
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
        {
         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位       
               
         if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
                {
//                        temp=MPU_Get_Temperature();        //得到温度值
//                        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度传感器数据
                        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺仪数据

                        if((t%10)==0)
                        {
//                                if(temp<0)
//                                {
//                                        LCD_ShowChar(30+48,200,'-',16,0);                //显示负号
//                                        temp=-temp;                //转为正数
//                                }else LCD_ShowChar(30+48,200,' ',16,0);                //去掉负号
//                                LCD_ShowNum(30+48+8,200,temp/100,3,16);                //显示整数部分            
//                                LCD_ShowNum(30+48+40,200,temp%10,1,16);                //显示小数部分
//                                temp=pitch*10;
//                                if(temp<0)
//                                {
//                                        LCD_ShowChar(30+48,220,'-',16,0);                //显示负号
//                                        temp=-temp;                //转为正数
//                                }else LCD_ShowChar(30+48,220,' ',16,0);                //去掉负号
//                                LCD_ShowNum(30+48+8,220,temp/10,3,16);                //显示整数部分            
//                                LCD_ShowNum(30+48+40,220,temp%10,1,16);                //显示小数部分
//                                temp=roll*10;
//                                if(temp<0)
//                                {
//                                        LCD_ShowChar(30+48,240,'-',16,0);                //显示负号
//                                        temp=-temp;                //转为正数
//                                }else LCD_ShowChar(30+48,240,' ',16,0);                //去掉负号
//                                LCD_ShowNum(30+48+8,240,temp/10,3,16);                //显示整数部分            
//                                LCD_ShowNum(30+48+40,240,temp%10,1,16);                //显示小数部分
                                temp=yaw*10;
                                if(temp<0)
                                {
                                        LCD_ShowChar(30+48,260,'-',16,0);                //显示负号
                                        temp=-temp;                //转为正数
                                }else LCD_ShowChar(30+48,260,' ',16,0);                //去掉负号
                                LCD_ShowNum(30+48+8,260,temp/10,3,16);                //显示整数部分            
                                LCD_ShowNum(30+48+40,260,temp%10,1,16);                //显示小数部分  
                                t=0;
                        }
                }
                t++;     
        }       
}
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-9-1
在线时间
10 小时
 楼主| 发表于 2016-4-21 12:36:23 | 显示全部楼层
小天使 发表于 2016-4-21 10:44
我也有这情况  但是我在中断里重新定义了一个变量 自己有写了个delay函数 但是延时不太准   我是把 MPU6050 ...

我的中断频率为1000Hz,估计是太频繁了,不过自己写了一个IIC_delay后问题就解决了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-7-25
在线时间
0 小时
发表于 2017-7-25 15:14:49 | 显示全部楼层
请问你中断服务函数是什么?
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-10-17
在线时间
8 小时
发表于 2020-7-22 13:57:41 | 显示全部楼层
调试中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 23:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表