5130|9

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

使用cap4测量频率,如何处理溢出 [复制链接]

本帖最后由 dontium 于 2015-1-23 13:28 编辑

我使用cap测量脉冲的频率。从10hz到50k,使用一个计数器的话会溢出,有什么方法自动换挡或者知道溢出了多少次呢,

最新回复

弄好了,是设置优点问题  详情 回复 发表于 2008-11-7 01:53
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
本帖最后由 dontium 于 2015-1-23 13:28 编辑

可以定义一个变量,累计溢出的次数。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
引用:

可以定义一个变量,累计溢出的次数。
这个不好累计吧,
我觉得 ,
cap中断是2个边沿才触发一次的,
而且这次触发和下次触发不一定是相连续的吧,
溢出是指cap触发后,两次的计数器相减已经溢出了,
用个变量很难处理好吧
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
高频好测,低频就相当困难了.我在10Hz以下测的速度有一半不准.
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
你不是有CAP中断吗?在中断里计数不就可以了。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用:

你不是有CAP中断吗?在中断里计数不就可以了。
cap中断计数是不行的吧,
因为cap中断不是外部中断,并不是每个上升沿都会触发的(如果捕捉上升沿),
cap是每2个上升沿触发一次,
而且中间可能空了几个上升沿,
这样cap中断计数也不行。
cap中断中读取timer可以发现,cap中断的触发的时间不是固定的,


我现在是使用了2个cap才解决了这个问题,
不知道有什么更好的解决方法,
其实不用cap
使用外部中断效果应该更好,
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
对cap的理解不对.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用:

对cap的理解不对.
确实是我弄错了,
现在知道了
3x

[ 本贴由 coolfei 于 2007-9-14 11:04 PM 最后编辑 ]
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 

使用cap4测量频率,如何处理溢出

怎么解决的,我测50HZ的信号,有跳变,我是在CAP中断里读CAPFIFO进行计算的,那样跳变的厉害,我又该成在CAP中断里读T3CNT的数进行计算,条变好点,还是解决不了问题,我是T3为时基,检测上升沿,中断程序为:
unsigned char  k=0,flag1=0,frec1=0,frec=0,f_flag=0x66,ff=0,d=0;
float f=0,temp=0;       
                                        // 定义的中断次数值
// 系统初始化子程序
void  initial()
{
          asm(\" setc   INTM\";                // 禁止所有中断
        asm(\" setc        SXM\";                                // 抑制符号位扩展
        asm(\" clrc        OVM\";                                // 累加器中结果正常溢出
        asm(\" clrc        CNF\");                        // B0被配置为数据存储空间
        SCSR1=0x81FE;                        // CLKIN=10M,CLKOUT=4CLKIN=40M
        WDCR=0x0E8;                        // 不使能看门狗,因为SCSR2中的WDOVERRIDE
                                                             // 即WD保护位复位后的缺省值为1,故可以用
                                                              // 软件禁止看门狗
        IMR=0x0000;                                        //  禁止所有中断
        IFR=0x0FFFF;                        // 清除全部中断标志,\"写1清0\"
}
// 捕获单元4初始化子程序       
void  CAP4INT()   
{   
    MCRC=MCRC|0X0080;
    PEDATDIR=0X0000;
    T3PR=0X0FFFF;                        // 通用定时器3的周期寄存器为0XFFFF
        T3CON=0x1400;                        // 通用定时器3为连续增计数模式 X/16;
        T3CNT=0X00;                                // 计数器清0
    WSGR=0x0000;                        // 禁止所有等待状态
        CAPCONB=0X0A240;                // 设置捕获单元4为检测上升沿,且选择TIMER3为时钟
        asm(\" clrc   INTM\");                // 开总中断
        IMR=0X08;                                  // 允许中断优先级4的中断
        EVBIMRC=EVBIMRC|0X0001;        // 允许CAPTURE1中断  
        EVBIFRC=EVBIFRC|0X0FFFF;

}

// 主程序
main()
{
        initial();                                                // 系统初始化
        CAP4INT();                                        // 捕获单元4初始化
        T3CON=T3CON|0X0040;                 // 启动定时器3
        while(1)
        {
         ;;//        if(k==10)  break;                        // k保存中断次数值,是全局变量
        }
//        asm(\" setc  INTM\");                        // 捕捉10次后,禁止再中断
}
// 若是由于干扰引起其它中断,则执行此子程序         
void  interrupt nothing()
{
        asm(\" clrc  INTM\");                                // 返回前开中断
        return;
}
// 捕捉中断服务程序
void  interrupt  capint()
{
     int   flag,i=0;
          
      flag=EVBIFRC&0X01;                        // 判断是否是CAP4中断
      if(flag!=0x01)
      {
         asm(\" clrc  INTM\");                        // 返回前开中断
         return;                                // 如果不是CAP4中断,则直接返回
       }
     else
      {
              i=PEDATDIR&0x0080;
           d=0;
        d=i;//(i&0x80);
        if(d==0)
        {
                 EVBIFRC=EVBIFRC|0x01;
                 asm(\" clrc  INTM\");
                return;
        }
        EVBIFRC=EVBIFRC|0x01;                // 写\"1\"清除CAP4中断标志
       if(f_flag==0x66)
        {
           frec=T3CNT;
           f_flag=0;
        }
        else
         {
            frec1=T3CNT;
         
          if(frec1>frec)
           {
                     temp=(frec1-frec);
            }
         else
          {
                            temp=frec1+(0xffff-frec);
                 }
              f=2500000/(float)temp;  //f= 40M/16/temp
             f_flag=0x66;
     }
        asm(\" clrc  INTM\");                        // 返回前开中断
        return;       
    }       

   
}

请指点那里设置的不对!!!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

10
 

你好使用cap4测量频率,如何处理溢出

弄好了,是设置优点问题
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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