微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 使用cap4测量频率,如何处理溢出

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

时间:10-02 整理:3721RD 点击:


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

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

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

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

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

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

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

对cap的理解不对.

确实是我弄错了,
现在知道了
3x

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

怎么解决的,我测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;
}


}

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

弄好了,是设置优点问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top