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

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

现在打包的是将IC的初始化ic_init()和pbca_init(void)初始化均打开,最后只有IOC0_wData采集到了周期值,plus_data[0]的值却不正常(在跳动),我希望是能够“‘IC算周期’和‘脉冲累积器算频率’共同计算同一个输入信号的频率”http://bbs.chinaecnet.com/uploadImages/plus_test2.rar
plus_test2.rar 中,如果单个初始化,如只进行脉冲捕捉ic_init()初始化,或者之将B通道的脉冲累积器使能pbca_init(void),则结果正常。是不是该PTO对于这两个功能不能复用?
我看了你前面的程序。你的问题出在这一句:
plus_data[0] = abs(PACN10 - oldValue);
你只用一个单元,即plus_data[0]来记录PACN10的差值。后一个值总会把前一个值覆盖。当查询频率快于信号频率时,你想想看会发生什么情况?plus_data[0]必然会在很多时间都为0,你自然是感觉“不敏感”了。如果你只读PACN10的值,就会发现,实际上它的值是一直在递增的,直到溢出后翻转。
海纳百川  有容乃大
首先谢谢strongchen的解答,^_^
是的,我后来也发现问题之所在,“当查询频率快于信号频率时”,PACN10=oldValue,结果是统计不出当前脉冲的,不过我总是要类似的方法来计算频率吧,如果要求有比较好的实时性,采集并且滤波之后不致于滞后太多。如果把输入频率调至1Hz并实时监控PACN10的值,确实能够看到该累积器是从0至0xFFFF在递增的。

另外,PAC和IC共享相同的引脚,用它来对同一引脚进行记录,为何我让其一同工作的时候(前者用于记录脉冲数量,后者记录脉冲周期)在plus_test2.rar 中,得到的脉冲数量却不正常,但是偶尔能够采集到正常,问题又出在哪里呢?

[此贴子已经被作者于2007-7-4 8:57:03编辑过]

plus_test2.rar的main.c中发现,读取TC0H的值对脉冲累积器的值PCN10有影响,怎么解决呢?
我设置PT0脚输入捕捉和脉冲累积器B使能,当我读取TC0H的值对脉冲累积器的值PCN10有影响(把PCN10清零了),不知这种做法是否妥当,有没用办法不让PCN10被清零。我看说明文档中,只是ICSYS中的LATQ位设为1(锁存方式)时候,才会在捕捉到内容并转移至保存寄存器,才会将8为的脉冲累积器清零。然而,我设置的是队列方式,而且用的是级联后的累计其B。有点不明白了
我觉得你的方法有问题。如果你最终的目的是得到脉冲的频率,而非只是要计脉冲的个数,建议你就采用输入捕捉的方式,通过脉冲周期来计算脉冲频率。而且应采用中断的方式。这样响应速度也快,频率计算也精确。
海纳百川  有容乃大
版主的回复好快啊,谢谢

首先想比较充分利用PT0的资源,因为毕竟它有这个功能,而且针对一个脉冲信号,不同频率下(低频段,高频段)我根据需要精度和实时性的要求,可以采用“脉冲周期来计算脉冲频率”或者用记脉冲的个数。
另外,最初我是用中断方式来进行输入捕捉(IC),但发现输入脉冲在1K以上之后,非常占用MCU的资源,我想如果MCU还需要进行较多的上层其他控制计算的话,这样的中断方式似乎很不可取,除非我专门进行脉冲采集。呵呵

刚才,我试了只用PT0进行脉冲累计,PT3进行输入捕捉,对同一信号进行采集,结果是相互毫无影响,能正常工作。

[此贴子已经被作者于2007-7-5 11:01:52编辑过]

其实最开始我也挺怀疑这种方法的,但是在一本书上看到“由于PAC0~3与IC0~3共享相同的引脚,而且共享入口的逻辑,因此在两者方式下,PAI与IC都可以同事工作,对同一引脚进行记录,前者记录脉冲或者边沿的数量,后者记录具体的时刻”(该MCU文档中我还没用找到有没有这样的说明),所以呢,想尝试一下。
有这么多高手在论坛上,无论这种方式的对错,我想都会有解决的。
或许只是说由于“PAC0~3与IC0~3”,而非“PACA和IC0”?
最后一句改正:
或许只是说由于“PAC0~3与IC0~3共享相同的引脚”,而非“PACB和IC0”?

[此贴子已经被作者于2007-7-5 11:11:54编辑过]

目前采取的办法就是用脉冲捕捉的时候不读取脉冲累积器的值,如果在30~2Khz范围,用脉冲捕捉得到周期再算频率的方法还是很准确的。
谢谢stongchen的跟帖和解答。还要,我在有个帖子中看到了stongchen写的有关PE的操作,很实用,真是热心啊
我一直在看你的project,我觉得有这几个方面的问题:
1. ICSYS的BUFEN=1而LATQ=0。根据数据手册,此时每当发生输入捕捉事件时,TC10和TC10H的值会刷新;但是此时PACN10和PACN10H的值如何变化却没有说明;实际上,PACN10和PACN10H的值应该在LATQ=1的情况下,与MCCNT的动作同步;所以输入捕捉和脉冲计数不能同时采用缓冲锁存的方式计数;
2. 你对输入捕捉和脉冲计数的读数都是在主循环中根据MDC的定时进行的。输入捕捉和脉冲计数都没有采用中断。这样,你的读数与输入信号是不同步的。这在高频而且频率稳定的情况下可能没有问题,但是如果输入信号频率较低,或者输入信号的频率变化较快的情况下,读数就会出现错误。
海纳百川  有容乃大
早上一来,又仔细看了strongchen昨天的留言,谢谢你的关注,让我对于ECT内部的一些工作细节又有了深入的了解。我再看看文档,在脉冲捕捉中,对于周期的计算,还碰到一些问题,我先想一想,不明白再向各位请教
我现在知道PACN10被清零的原因了。因为BUFEN=1而LATQ=0,脉冲计数处于QUEUE模式。按照数据手册的说明,此时当读脉冲计数锁存寄存器时,会将脉冲计数器的值传到锁存器中,并将脉冲计数器清零。你的程序虽然没有读脉冲计数锁存器,但在调试时,每当运行停止、遇到中断或周期性刷新显示时,BDM都会去读所有寄存器的值,从而导致脉冲计数器被清零。
海纳百川  有容乃大
返回列表