![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 使用CAP4测量频率 如何处理溢出 | |||||
作者:Free 文章来源:本站原创 点击数: 更新时间:2007-12-9 ![]() |
|||||
|
问题如下:
我使用cap测量脉冲的频率。从10hz到50k,使用一个计数器的话会溢出,有什么方法自动换挡或者知道溢出了多少次呢 解答如下: 可以定义一个变量,累计溢出的次数。 问题如下: 这个不好累计吧,我觉得 ,cap中断是2个边沿才触发一次的,而且这次触发和下次触发不一定是相连续的吧,溢出是指cap触发后,两次的计数器相减已经溢出了,用个变量很难处理好吧 解答如下: 你不是有CAP中断吗?在中断里计数不就可以了。 问题如下: cap中断计数是不行的吧, 因为cap中断不是外部中断,并不是每个上升沿都会触发的(如果捕捉上升沿), cap是每2个上升沿触发一次, 而且中间可能空了几个上升沿, 这样cap中断计数也不行。 cap中断中读取timer可以发现,cap中断的触发的时间不是固定的, 我现在是使用了2个cap才解决了这个问题, 不知道有什么更好的解决方法, 其实不用cap 使用外部中断效果应该更好, 解答如下: 对cap的理解不对. 问题如下: 怎么解决的,我测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; } } 请指点那里设置的不对!!! 解答如下: 弄好了,是设置优点问题 |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|