搜索
bottom↓
回复: 20

求助:AVR读取MPU6050数据卡住

[复制链接]

出0入0汤圆

发表于 2013-2-5 20:50:10 | 显示全部楼层 |阅读模式
最近在使用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;                               //
}

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-2-5 21:01:33 | 显示全部楼层
进入定时器中断后 先关闭中断?

出0入0汤圆

发表于 2013-2-5 21:06:00 | 显示全部楼层
建议在中断中做标志量,在主循环中操作数据

出0入0汤圆

 楼主| 发表于 2013-2-5 21:15:51 | 显示全部楼层
leicai05 发表于 2013-2-5 21:06
建议在中断中做标志量,在主循环中操作数据

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

出0入0汤圆

发表于 2013-2-5 22:00:08 | 显示全部楼层
lyreliu 发表于 2013-2-5 21:15
这个我也想过,不过主循环中我加了延时的函数来输出数据,否则数据输出太快了,这样就没办法了吧 ...

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

出0入0汤圆

 楼主| 发表于 2013-2-6 10:11:59 | 显示全部楼层
leicai05 发表于 2013-2-5 22:00
什么太快,输出节奏同过定时中断来控制啊,怎么会太快了?

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

出0入0汤圆

发表于 2013-2-6 11:27:01 | 显示全部楼层
lyreliu 发表于 2013-2-6 10:11
嗯,这样也行。谢谢啦。不过这个问题还是没有找到原因。不知道是不是单片机计算能力不够,或者是硬件有问 ...

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

出0入0汤圆

 楼主| 发表于 2013-2-6 14:40:17 | 显示全部楼层
leicai05 发表于 2013-2-6 11:27
有计算过 中断中处理全部的数据需要多少时间吗?起码中断中尽量少的代码和时间占用 ...

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

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

出0入0汤圆

发表于 2013-2-6 14:46:33 | 显示全部楼层
lyreliu 发表于 2013-2-6 14:40
具体的没有算过,但是20ms有16万个机器周期,我那几条指令应该没问题吧。
最开始我定的时间是5ms,就是因 ...

没啥问题 你的意思是好了吗?

出0入0汤圆

 楼主| 发表于 2013-2-6 18:06:29 | 显示全部楼层
leicai05 发表于 2013-2-6 14:46
没啥问题 你的意思是好了吗?

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-2-6 19:16:44 | 显示全部楼层
和我遇到的差不多的问题。

出0入0汤圆

 楼主| 发表于 2013-2-6 21:13:20 | 显示全部楼层
i_kkyu 发表于 2013-2-6 19:16
和我遇到的差不多的问题。

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

出0入0汤圆

发表于 2013-2-6 21:21:38 | 显示全部楼层
lyreliu 发表于 2013-2-6 21:13
那解决了吗?如果解决的一定告诉我一下啊

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

出0入0汤圆

发表于 2013-2-6 21:41:29 | 显示全部楼层
lyreliu 发表于 2013-2-6 21:13
那解决了吗?如果解决的一定告诉我一下啊

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

出0入0汤圆

发表于 2013-2-12 20:38:01 | 显示全部楼层
猜测问题出在 MPU_Read, 此函数不能在中断中执行

出0入0汤圆

发表于 2013-3-11 17:53:21 | 显示全部楼层
楼主,我能问一下你的MPU6050的初始化程序是怎么写的么?我的的中断总是有问题,谢谢!

出0入0汤圆

发表于 2013-8-1 14:18:57 | 显示全部楼层
想必楼主现在已经弄好了吧,可否把程序分享一下,俺已经被这玩意困扰一周多了

出0入0汤圆

发表于 2013-8-16 16:49:36 | 显示全部楼层
今天刚开始做陀螺仪加速度传感器这方面,lz有没有代码共享下啊。谢谢了

出0入0汤圆

发表于 2013-8-17 09:46:13 | 显示全部楼层
cdd329958 发表于 2013-8-1 14:18
想必楼主现在已经弄好了吧,可否把程序分享一下,俺已经被这玩意困扰一周多了 ...

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

出0入0汤圆

发表于 2013-8-17 12:32:29 | 显示全部楼层
寻找钢叉的猹 发表于 2013-8-17 09:46
你的弄好了么?我今天刚开始弄啊。求交流。Q1113240207  求联系啊

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

出0入0汤圆

发表于 2014-4-3 00:18:10 | 显示全部楼层
前辈,求分享,被同样的问题卡住了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 19:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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