首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教脉冲累计器的“分辨率”

你说的定期读取PACN10的值,是如何定期的呢?周期是多长?
海纳百川  有容乃大
100Hz的周期正好是10mS。100Hz以下频率的信号也有问题吗?把你的project整个打包贴出来看看吧。
海纳百川  有容乃大
如果你在运算中确实采用了÷100的运算,那么会有很多数值会被丢掉。实际上在应用程序中,这样的运算不推荐使用,也没有必要。你不必非要得到以Hz为单位的频率值。
海纳百川  有容乃大
建议你先做一个最简单的脉冲计数程序试试,不要任何运算。如果还有问题,可以将这个project贴出来看看。
海纳百川  有容乃大
把整个project打包贴出来吧。
海纳百川  有容乃大
我看了你前面的程序。你的问题出在这一句:
plus_data[0] = abs(PACN10 - oldValue);
你只用一个单元,即plus_data[0]来记录PACN10的差值。后一个值总会把前一个值覆盖。当查询频率快于信号频率时,你想想看会发生什么情况?plus_data[0]必然会在很多时间都为0,你自然是感觉“不敏感”了。如果你只读PACN10的值,就会发现,实际上它的值是一直在递增的,直到溢出后翻转。
海纳百川  有容乃大
我觉得你的方法有问题。如果你最终的目的是得到脉冲的频率,而非只是要计脉冲的个数,建议你就采用输入捕捉的方式,通过脉冲周期来计算脉冲频率。而且应采用中断的方式。这样响应速度也快,频率计算也精确。
海纳百川  有容乃大
我一直在看你的project,我觉得有这几个方面的问题:
1. ICSYS的BUFEN=1而LATQ=0。根据数据手册,此时每当发生输入捕捉事件时,TC10和TC10H的值会刷新;但是此时PACN10和PACN10H的值如何变化却没有说明;实际上,PACN10和PACN10H的值应该在LATQ=1的情况下,与MCCNT的动作同步;所以输入捕捉和脉冲计数不能同时采用缓冲锁存的方式计数;
2. 你对输入捕捉和脉冲计数的读数都是在主循环中根据MDC的定时进行的。输入捕捉和脉冲计数都没有采用中断。这样,你的读数与输入信号是不同步的。这在高频而且频率稳定的情况下可能没有问题,但是如果输入信号频率较低,或者输入信号的频率变化较快的情况下,读数就会出现错误。
海纳百川  有容乃大
我现在知道PACN10被清零的原因了。因为BUFEN=1而LATQ=0,脉冲计数处于QUEUE模式。按照数据手册的说明,此时当读脉冲计数锁存寄存器时,会将脉冲计数器的值传到锁存器中,并将脉冲计数器清零。你的程序虽然没有读脉冲计数锁存器,但在调试时,每当运行停止、遇到中断或周期性刷新显示时,BDM都会去读所有寄存器的值,从而导致脉冲计数器被清零。
海纳百川  有容乃大
返回列表