打印

TIM8捕获低频时测量结果不正确

[复制链接]
3080|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
806849108|  楼主 | 2013-2-26 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在用TIM8的输入捕获功能时,发现低频捕获时 的测量不正确。不正确的原因是计数器溢出了,我在捕获中断中进行了溢出处理,但是大部分时候 溢出中断处理没得到执行!偶尔发现测量结果是正确的!请问这是怎么回事?
沙发
uet_cache| | 2013-2-26 10:17 | 只看该作者
你把分频值加大点,能不溢出就不要溢出。。。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
806849108 + 2
板凳
806849108|  楼主 | 2013-2-26 11:18 | 只看该作者
这个我已经试过了可以,不溢出计算结果正确!溢出了 计算结果 就不对了。

使用特权

评论回复
地板
806849108|  楼主 | 2013-2-26 11:20 | 只看该作者
因为我要测量 频率比较高的波 ,加大分频值 可能会影响测量的准确度。

使用特权

评论回复
5
bobo5650| | 2013-2-26 11:27 | 只看该作者
肯定是ISR写的有错误,我都是这么用的,溢出10次8次测出来都是对的

使用特权

评论回复
6
奔牛滚滚| | 2013-2-26 11:27 | 只看该作者
806849108 发表于 2013-2-26 11:20
因为我要测量 频率比较高的波 ,加大分频值 可能会影响测量的准确度。

说说你的测量值范围,或者说频率

使用特权

评论回复
7
806849108|  楼主 | 2013-2-26 11:30 | 只看该作者
200hz 到 40Khz

使用特权

评论回复
8
806849108|  楼主 | 2013-2-26 11:32 | 只看该作者
我也觉得我的ISR程序有错误   

使用特权

评论回复
9
奔牛滚滚| | 2013-2-26 11:43 | 只看该作者
连续计数,溢出的时候产生中断,根本不会有误差

使用特权

评论回复
10
806849108|  楼主 | 2013-2-26 11:47 | 只看该作者
说下我中断里的思路,进入中断后,检测是否有溢出中断,有的话 将溢出变量Ov+1,清楚相应状态位,然后检测是否发生了 捕获中断,发生了 捕获中断后,清楚相应状态标志位,取出CCRx中的值,然后将计数器中的值清零。计算频率:Freq=72M/(65535*Ov+CCRx),计算完之后将Ov清零。请问将计数值清零那一步 会存在问题吗?

使用特权

评论回复
11
uet_cache| | 2013-2-26 11:56 | 只看该作者
你可以通过定时器举出判断你的测量频率是否超出范围时, 再把分频值改下,程序动态调整分频值。

使用特权

评论回复
12
806849108|  楼主 | 2013-2-26 12:59 | 只看该作者
uet_cache 发表于 2013-2-26 11:56
你可以通过定时器举出判断你的测量频率是否超出范围时, 再把分频值改下,程序动态调整分频值。 ...

这个能具体点吗? 不是很清楚你说的意思

使用特权

评论回复
13
uet_cache| | 2013-2-26 15:11 | 只看该作者
你不是有溢出中断吗?溢出的时候,把分频值加大不就行了,

使用特权

评论回复
14
806849108|  楼主 | 2013-2-26 15:35 | 只看该作者
uet_cache 发表于 2013-2-26 15:11
你不是有溢出中断吗?溢出的时候,把分频值加大不就行了,

我的溢出中断 有问题啊 , 有些时候 溢出中断 没得到执行! 我测量一个 500HZ的波 ,定时1S。发现就只有22次溢出中断得到了执行 ,还有478 次没有执行,也就是 只有22次测量结果正确。

使用特权

评论回复
15
bobo5650| | 2013-2-26 17:38 | 只看该作者
1、你应该把ISR贴出来,至少贴出来你说的思路里关键的那些部分
2、你的思路里至少有一点错误,就是算周期的时候忘记减上一次捕捉的CCRx了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
806849108 + 2
16
806849108|  楼主 | 2013-2-26 18:00 | 只看该作者
void TIM8_CC_IRQHandler(void)
{
        u32 IC3Value=0;
        if(TIM3->SR & 0x0001)      //检测是否发生了溢出中断
        {
                OvNum++;
                                tmp_sr=TIM3->SR;
                TIM3->SR = tmp_sr&0xfffe;    //清除溢出中断的标志
            
        }
        if(TIM_GetITStatus(TIM8, TIM_IT_CC3) != RESET)                  //如果产生了捕获中断
        {
                TIM_ClearITPendingBit(TIM8, TIM_IT_CC3);           //清标志位
       
                IC3Value = TIM_GetCapture3(TIM8);                           //读取CCR3中的值
                TIM_SetCounter(TIM8, 0);                                          //将计数器清零
               
                if(IC3Value)
                {
                    Frequency = 72000000 / (65535*OvNum+IC3Value);         //计算频率
                    OvNum=0;       
                }
        }
}

我没减是觉得 ,我第一次测量结果不正确 我可以不要 。但后面的结果 应该是正确的 。

使用特权

评论回复
17
平常人| | 2013-2-26 18:06 | 只看该作者
提个简单的办法:配置甲乙2个定时器,甲的分频值小点测高频率,乙的分频值大点测低频率,如果甲没有溢出就以甲为准,如果甲溢出就以乙为准。

使用特权

评论回复
18
806849108|  楼主 | 2013-2-26 19:17 | 只看该作者
17楼的 方法 可以   我还是 想找到 我的方法为什么不行

使用特权

评论回复
19
hawksabre| | 2013-2-26 21:08 | 只看该作者
通过调用外部晶振试一下   这样应该相对来说准确一点

使用特权

评论回复
20
806849108|  楼主 | 2013-2-26 23:01 | 只看该作者
hawksabre 发表于 2013-2-26 21:08
通过调用外部晶振试一下   这样应该相对来说准确一点

调用 外部晶振干吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

120

帖子

0

粉丝