[STM8] STM8能捕获的最高频率

[复制链接]
13116|24
 楼主| amonghappy 发表于 2010-3-26 14:50 | 显示全部楼层 |阅读模式
本人新手。
自己在做捕获的小实验,发现输入频率1M就不行了,512K是可以的。
用的内置振荡器,16M,8个周期更新一次。
1M信号输入,连捕获的中断都进不去了。
是不是捕获本身执行就需要一些时间啊,比如说us级的。
win2000_li 发表于 2010-3-26 15:04 | 显示全部楼层
还是要看你定时器设置吧??分辨率?
 楼主| amonghappy 发表于 2010-3-26 15:26 | 显示全部楼层
16bit timer 无分频,也就是说定时器是按照16M计数的。分辨率已经最高了。
香水城 发表于 2010-3-26 15:49 | 显示全部楼层
捕获本身不需要时间,否则无法保证精确性。

请检查你的程序是否正确。
 楼主| amonghappy 发表于 2010-3-26 16:29 | 显示全部楼层
因为程序没有改变,只是输入频率变化引起了结果的差异,所以才想到了这点。
我再仔细看看。捕获应该是硬件执行,时间非常短。谢谢。
zhaoxinzxzx 发表于 2010-3-29 14:27 | 显示全部楼层
中断的执行是us级的
 楼主| amonghappy 发表于 2010-3-29 23:22 | 显示全部楼层
我把程序简化了,就单独测这个功能,还是不能捕获到1M的信号。
是不是我捕获进入中断后,中断处理时间长了呢?
中断处理就只是清标志位而已。要测一个信号的周期需要捕获两次的。
但是现在是输入1M的话,连中断都进不去了。:(
香水城 发表于 2010-3-30 09:35 | 显示全部楼层
你用的是什么型号?
 楼主| amonghappy 发表于 2010-3-30 21:12 | 显示全部楼层
STM8S208MB,用的STM8的评估板。我把内部16M的RC分频到1M输出到CCO管脚,然后输入到芯片的TIM捕捉。如果分到512k,没问题的。麻烦香主了。 :)
香水城 发表于 2010-3-31 10:00 | 显示全部楼层
请问你是如何配置、如何操作的?

如果输入信号频率较高,使用2个通道同时捕获比较好,如下图:
STM8_Input_PWM.GIF
 楼主| amonghappy 发表于 2010-4-1 15:16 | 显示全部楼层
香主,谢谢你的帮助。
对捕获的配置如下,
TIM3_ICInit(TIM3_CHANNEL_1, TIM3_ICPOLARITY_RISING, TIM3_ICSELECTION_DIRECTTI, TIM3_ICPSC_DIV8, 0);  //8个事件触发一次捕获中断,Channel1,上升沿。
TIM3_ITConfig(TIM3_IT_CC1, ENABLE);          //捕获功能使能。
TIM3_Cmd(ENABLE);   //使能TIM3计数
key=0;
while(1)
{
;
}

中断部分程序如下:
@near @interrupt @svlreg void TIM3_CAP_COM_IRQHandler (void)
{
        if ( TIM3_GetFlagStatus(TIM3_FLAG_CC1) == SET )
        {
        switch (key)
        {
        case 0: firstcapture = TIM3_GetCapture1();
        key=1;
        break;
               
        case 1: lastcapture = TIM3_GetCapture1();
        key=2;
        break;
       
        default:TIM3_ITConfig(TIM3_IT_CC1, DISABLE);
        break;       
        }
        TIM3_ClearITPendingBit(TIM3_IT_CC1);
        TIM3_ClearFlag(TIM3_FLAG_CC1);
  }
        return;
}

用PD2脚捕获,捕获的话应该不需要对IO配置的吧。

另外PD2最高输出频率为2M,不知道对输入有没有限制呢。
O3 = Fast/slow programmability with slow as default state after reset
PD2特性。

谢谢。
zwll 发表于 2010-4-1 15:19 | 显示全部楼层
对输入应该有限制
香水城 发表于 2010-4-1 15:48 | 显示全部楼层
可能你还是没有理解我的意思。

你应该使用2个通道按照我在10楼给出的图中所示,把输入信号同时送入2个通道,然后一个通道捕获上升沿,另一个通道捕获下降沿;这样就可以准确地测量输入的脉冲宽度,在输入信号的占空比为50%时,可以方便地转换为频率。如果输入信号的占空比不是50%,则在捕获中断中应能读到捕获上升沿的那个通道的再次捕获值,2次捕获值之差就是输入信号的频率。
 楼主| amonghappy 发表于 2010-4-1 17:02 | 显示全部楼层
香主,我按你的方法试了一下,频率到1M还是不行,中断能进去,读出来为0。
过捕获置1了。TIM3_SR1, TIM3_SR2 寄存器值变成0x06.  :(
按道理,值已经被捕捉了,但是确是0.

请知悉。
香水城 发表于 2010-4-1 17:37 | 显示全部楼层
如果中断中读出的捕获值为0,则可以肯定这不是真正的捕获值,可能是设置上还有问题。
xsgy123 发表于 2010-4-1 21:26 | 显示全部楼层
先确定512K捕获值是对的,不要只看有没值
 楼主| amonghappy 发表于 2010-4-2 13:43 | 显示全部楼层
512k, 抓下来就是256,准确。
8*16M/512k=256。
谢谢。
 楼主| amonghappy 发表于 2010-4-18 23:22 | 显示全部楼层
问题有新的进展,不用中断程序,可以最高捕捉2M速度的信号。
具体原因我会在这周做进一步的分析。谢谢大家。
行不改名 发表于 2010-4-19 11:18 | 显示全部楼层
期待你的进一步的分析:lol
06082314 发表于 2010-5-2 16:04 | 显示全部楼层
期待楼主的分析结果,哈哈~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部