lyreliu 发表于 2013-2-5 20:50:10

求助:AVR读取MPU6050数据卡住

最近在使用MPU6050传感器,能够顺利地读取加速度以及陀螺仪的数值。
并且通过定时器中断,每隔20ms读取一次陀螺仪的值,并积分计算角度。也使用了互补滤波获得了角度。

在各个部分分开工作时没有任何问题。
我想同时输出加速度值、陀螺仪积分角度、互补滤波角度进行比较,但是发现同时开启三个函数以后,只能传出有限的几组数据。之后单片机就会卡住,必须复位。

开始我以为是程序计算量过大,然后我精简了代码,避免了所有浮点数运算,但是没有改观。而且有时候能正常运行的时间长,有时候短。

使用的单片机是atmega128a,应该是avr较高端的芯片了。

下面附上部分的程序:

这个是读取z轴角速度
void GYRO_Z(void)
{
        int DATA,gyro;                                                                //gyro存储角速度,数值是10倍的真实速度                                                       
        signed char offset;
        offset = GYRO_Z_OFFSET;                                             //设置零漂移
                DATA = MPU_Read(GYRO_ZOUT_H);
        DATA = (DATA<<8)+MPU_Read(GYRO_ZOUT_L);
       
        gyro = (long)DATA * GYRO_FACTOR/10000L - offset*10L;         //乘除相应的系数,换算成标准单位
}
这个是定时器初始化
void TIMER1_Init(void)
{
        TCCR1A = 0x00;
        TCCR1B = 0x00;
        TCCR1C = 0x00;
       
        TCNT1H = 0xF6;      //定时20ms
        TCNT1L = 0x3C;
       
        TIMSK |= 0x04;
       
        TCCR1B = 0x03;       //设置为64分频,定时器开始工作
}

这个是定时器中断,用来积分计算角度
#pragma interrupt_handler TIMER1_Interrupt:15
void TIMER1_Interrupt(void)
{
        int DATA,gyro;                                                                //gyro存储角速度,是100倍的实际角速度                                               
        signed char offset;
       
        TCNT1H = 0xF6;
        TCNT1L = 0x3C;
       
        offset = GYRO_Y_OFFSET;
                DATA = MPU_Read(GYRO_YOUT_H);
        DATA = (DATA<<8)+MPU_Read(GYRO_YOUT_L);
       
        gyro = (long)DATA * GYRO_FACTOR/1000L - (long)offset*100L;
       
        angle_test = (long)angle_test + (long)gyro * 20L/1000L;                               //
}

单独工作都没有问题,就是不能一起工作,很纳闷,有没有人能帮忙解决下,不胜感激!

~just_yy 发表于 2013-2-5 21:01:33

进入定时器中断后 先关闭中断?

leicai05 发表于 2013-2-5 21:06:00

建议在中断中做标志量,在主循环中操作数据

lyreliu 发表于 2013-2-5 21:15:51

leicai05 发表于 2013-2-5 21:06 static/image/common/back.gif
建议在中断中做标志量,在主循环中操作数据

这个我也想过,不过主循环中我加了延时的函数来输出数据,否则数据输出太快了,这样就没办法了吧

leicai05 发表于 2013-2-5 22:00:08

lyreliu 发表于 2013-2-5 21:15 static/image/common/back.gif
这个我也想过,不过主循环中我加了延时的函数来输出数据,否则数据输出太快了,这样就没办法了吧 ...

什么太快,输出节奏同过定时中断来控制啊,怎么会太快了?

lyreliu 发表于 2013-2-6 10:11:59

leicai05 发表于 2013-2-5 22:00 static/image/common/back.gif
什么太快,输出节奏同过定时中断来控制啊,怎么会太快了?

嗯,这样也行。谢谢啦。不过这个问题还是没有找到原因。不知道是不是单片机计算能力不够,或者是硬件有问题。有机会换一个芯片试试

leicai05 发表于 2013-2-6 11:27:01

lyreliu 发表于 2013-2-6 10:11 static/image/common/back.gif
嗯,这样也行。谢谢啦。不过这个问题还是没有找到原因。不知道是不是单片机计算能力不够,或者是硬件有问 ...

有计算过 中断中处理全部的数据需要多少时间吗?起码中断中尽量少的代码和时间占用

lyreliu 发表于 2013-2-6 14:40:17

leicai05 发表于 2013-2-6 11:27 static/image/common/back.gif
有计算过 中断中处理全部的数据需要多少时间吗?起码中断中尽量少的代码和时间占用 ...

具体的没有算过,但是20ms有16万个机器周期,我那几条指令应该没问题吧。
最开始我定的时间是5ms,就是因为卡住改成20ms了,但是我发现情况没有啥变化。

我把中断中的程序改成标志了,运行没啥问题

leicai05 发表于 2013-2-6 14:46:33

lyreliu 发表于 2013-2-6 14:40 static/image/common/back.gif
具体的没有算过,但是20ms有16万个机器周期,我那几条指令应该没问题吧。
最开始我定的时间是5ms,就是因 ...
没啥问题 你的意思是好了吗?

lyreliu 发表于 2013-2-6 18:06:29

leicai05 发表于 2013-2-6 14:46 static/image/common/back.gif
没啥问题 你的意思是好了吗?

嗯,好了。不过至于为什么中断里面写东西不行,还是不明白。
顺便附上一个做出来的图标。

i_kkyu 发表于 2013-2-6 19:16:44

和我遇到的差不多的问题。

lyreliu 发表于 2013-2-6 21:13:20

i_kkyu 发表于 2013-2-6 19:16 static/image/common/back.gif
和我遇到的差不多的问题。

那解决了吗?如果解决的一定告诉我一下啊

i_kkyu 发表于 2013-2-6 21:21:38

lyreliu 发表于 2013-2-6 21:13 static/image/common/back.gif
那解决了吗?如果解决的一定告诉我一下啊

还没有哦.搜索到您的帖子的..呵呵.

i_kkyu 发表于 2013-2-6 21:41:29

lyreliu 发表于 2013-2-6 21:13 static/image/common/back.gif
那解决了吗?如果解决的一定告诉我一下啊

还没有哦.搜索到您的帖子的..呵呵.

aaaa1967 发表于 2013-2-12 20:38:01

猜测问题出在 MPU_Read, 此函数不能在中断中执行

zhongguocs 发表于 2013-3-11 17:53:21

楼主,我能问一下你的MPU6050的初始化程序是怎么写的么?我的的中断总是有问题,谢谢!

cdd329958 发表于 2013-8-1 14:18:57

想必楼主现在已经弄好了吧,可否把程序分享一下,俺已经被这玩意困扰一周多了

寻找钢叉的猹 发表于 2013-8-16 16:49:36

{:biggrin:}今天刚开始做陀螺仪加速度传感器这方面,lz有没有代码共享下啊。{:titter:}谢谢了

寻找钢叉的猹 发表于 2013-8-17 09:46:13

cdd329958 发表于 2013-8-1 14:18 static/image/common/back.gif
想必楼主现在已经弄好了吧,可否把程序分享一下,俺已经被这玩意困扰一周多了 ...

你的弄好了么?我今天刚开始弄啊。求交流。Q1113240207求联系啊

cdd329958 发表于 2013-8-17 12:32:29

寻找钢叉的猹 发表于 2013-8-17 09:46 static/image/common/back.gif
你的弄好了么?我今天刚开始弄啊。求交流。Q1113240207求联系啊

我已经转向STM32了,用别人的程序直接读取,AVR两周没弄好,,太丢人了

xizoukou 发表于 2014-4-3 00:18:10

前辈,求分享,被同样的问题卡住了
页: [1]
查看完整版本: 求助:AVR读取MPU6050数据卡住