4558|11

151

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

在项目设计中测量频率!如何才能不陷入死循环! [复制链接]

另外,在一个项目中设计捕获信号的频率,想法就是捕获相邻两个脉冲的下降沿,计算出频率,加上while语句是为了防止执行其他程序时有漏掉一个或几个脉冲的情况,但是现在的问题就是如果正好在捕获两个脉冲中间,信号消失,就在陷入wihle中出不来,请问有什么好方法测这个频率么!

 

 

  if((CCIFG&TACCTL1))   // Wait for first signal from photodiode
  {
    for(i=0;i<Num_of_result;i++)
    {
      testloop=0;
      while(!(CCIFG&TACCTL1));// Exit after capture 8 times
      frequencyWidth[index]=CCR1;
      index=(index+1)%Num_of_result;
      if((TAIFG&TACTL))
      {
        overflow++;
        TACTL &=~ TAIFG;
      }
      TACCTL1 &=~ CCIFG;
    }
    _NOP();
  }

最新回复

具体来说,就是 在 捕获脉冲的中断里才打开定时器,然后下一次进来,再计一个 静态变量定时器。 这样,每次来每次计数,而定时器一直开着,直到第N次,你才把两个中断都关掉,然后计算定时值,这种精确程度很高,我试过。 等,我上一段代码。 UINT test(void) { //设置计数器1初值     TH1 = COUNT_HIGH;     TL1 = COUNT_LOW; //设置定时器0初值     TL0 = 0;         TH0 = 0; //开计数器1,开始计数     TR1 = 1; //立即启动定时器0,开始定时     TR0 = 1; //等待计数器溢出     while(TF1 == 0); //关闭定时器0,再关闭计数器1     TR0 = 0;     TR1 = 0; //软件清溢出标志位     TF1 = 0;     TF0 = 0;                 return (256 * TH0 + TL0); } 我这里没使用定时中断——因为我测的频率比较高,几百K,我也没打算定时器会溢出,更没打算让它没事去定时中断里跑几圈,影响精度。 同理,我也没开启 计数器中断。 这里我牺牲了主程序的流畅度,去换取最大可能的精度——当然,这是我对测量面对的频率有把握,几百K,就是一次测100个,也就10来个毫秒,对于人的反应来说,这个已经是等于没差别了。  详情 回复 发表于 2011-10-16 00:54
 
点赞 关注

回复
举报

69

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
可以使用捕获中断。每次捕获了一个下降沿中断以后记下时间,重新开始等待捕获并设置为下降沿,等到下一次捕获发生时记下时间。两者做减法就可以。
或者IO中断也可以。
 
 

回复

151

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

回复 沙发 Main函数 的帖子

如果用捕获的方式,如何从中断中跳出呢,这样说吧,假设中断是测8个数据,求平均得出频率,那么写程序等待这段时间,因为之后的程序需要用到频率。
 
 
 

回复

1729

帖子

0

TA的资源

五彩晶圆(初级)

4
 
看看,学习一下啊!
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

5
 
建议使用IO中断或者捕获中断,中断的时延是确定的,所以可以比较准确的测量频率
 
 
 

回复

151

帖子

0

TA的资源

纯净的硅(初级)

6
 

回复 5楼 wstt 的帖子

我现在设计的项目测量频率只是一个子程序,有一个很关键的问题就是,如果在量测过程中信号源离开了,程序就会一直死在while(!(CCIFG&TACCTL1));这条语句上,但是如果不加,就担心中间会有漏测脉冲。请指点!

  if((CCIFG&TACCTL1))   // Wait for first signal from photodiode
  {
    for(i=0;i     {
      testloop=0;
      while(!(CCIFG&TACCTL1));// Exit after capture 8 times
      frequencyWidth[index]=CCR1;
      index=(index+1)%Num_of_result;
      if((TAIFG&TACTL))
      {
        overflow++;
        TACTL &=~ TAIFG;
      }
      TACCTL1 &=~ CCIFG;
    }
    _NOP();
  }
   
  averageFrequency = ((overflow*65536)+frequencyWidth[Num_of_result-1]-frequencyWidth[0])/(Num_of_result-1);
 
 
 

回复

151

帖子

0

TA的资源

纯净的硅(初级)

7
 

回复 5楼 wstt 的帖子

不用中断的原因是无法控制量测时机!
 
 
 

回复

1469

帖子

0

TA的资源

五彩晶圆(中级)

8
 
开始测量的时候开一个定时器,然后设定一个等待时间(大于信号的最大周期),测到信号后计时清零,否则计时溢出就跳出循环
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

9
 

回复 楼主 零晨 的帖子

如果可以用中断的话,把捕获做成中断,在中断里计数,同时启动定时器。那就不用担心遗漏了。
而且不必用while卡住程序。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

10
 

回复 7楼 零晨 的帖子

啊?
用了中断反而怕这个?
那不用中断咋办?
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

158

帖子

0

TA的资源

纯净的硅(初级)

11
 
中断嵌套~
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

12
 

回复 板凳 零晨 的帖子

具体来说,就是
在 捕获脉冲的中断里才打开定时器,然后下一次进来,再计一个 静态变量定时器。
这样,每次来每次计数,而定时器一直开着,直到第N次,你才把两个中断都关掉,然后计算定时值,这种精确程度很高,我试过。

等,我上一段代码。
UINT test(void)
{
//设置计数器1初值
    TH1 = COUNT_HIGH;
    TL1 = COUNT_LOW;
//设置定时器0初值
    TL0 = 0;
        TH0 = 0;
//开计数器1,开始计数
    TR1 = 1;
//立即启动定时器0,开始定时
    TR0 = 1;
//等待计数器溢出
    while(TF1 == 0);
//关闭定时器0,再关闭计数器1
    TR0 = 0;
    TR1 = 0;
//软件清溢出标志位
    TF1 = 0;
    TF0 = 0;
       
        return (256 * TH0 + TL0);
}

我这里没使用定时中断——因为我测的频率比较高,几百K,我也没打算定时器会溢出,更没打算让它没事去定时中断里跑几圈,影响精度。

同理,我也没开启 计数器中断。
这里我牺牲了主程序的流畅度,去换取最大可能的精度——当然,这是我对测量面对的频率有把握,几百K,就是一次测100个,也就10来个毫秒,对于人的反应来说,这个已经是等于没差别了。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表