6回答

0收藏

[求助] 求助给位大神~~~~~

英飞凌 英飞凌 3160 人阅读 | 6 人回复 | 2013-09-20

请问计数器的计数输入端输入信号,然后我用readcounter()读取,显示出来的数是什么意思啊?是上升沿个数,下降沿个数还是上升和下降沿个数之和还是其他的?我用PWM输入信号,1s周期,然后占空比50%,想显示出1S内的脉冲个数,为什么显示出来的1S时间内的readcounter为47呢?如图显示。

QQ截图20130920113126.png (61.49 KB, 下载次数: 71)

QQ截图20130920113126.png
分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

leonard

发表于 2013-9-21 13:41:12 | 只看该作者

本帖最后由 leonard 于 2013-9-21 13:47 编辑

47是没错的。
首先是PWM和counter的时钟不是同步时钟,会有一定的误差,理论上来说readcounter=500(ms),也就是PWM输出的高电平时间。
楼主把PWM接Counter的使能,就是让counter计数PWM高电平时间。楼主说用PWM输入信号,1s周期,然后占空比50%,那么高电平时间也就是0.5s了。
counter的时钟是100hz,就是0.01s的周期,0.5/0.01=50,也就是readcounter的读书。

是上升沿个数,下降沿个数还是上升和下降沿的问题要自己在设置面板内设置,或者API实现,具体是:
双击打开counter的configure选项,configure标签下有分辨率(resolution),PSoC4貌似只有UDB实现,掠过,周期(period),最后是ClockMode,就是计数方向了,请自行阅读英文选项选择上升计数,下降技术,或其他。顺便的,counter不是按沿计数的。

要显示出1S内的脉冲个数,要技术周期大于脉冲周期,在相同时钟下计数值除以脉冲宽度就是脉冲数了,比如楼主的就是:(0.01s*47)/(1s*50%)=0.94,近似为一个
板凳

wasd890228

发表于 2013-9-22 09:02:53 | 只看该作者

leonard 发表于 2013-9-21 13:41
47是没错的。
首先是PWM和counter的时钟不是同步时钟,会有一定的误差,理论上来说readcounter=500(ms),也 ...

其实图中的PWM是我用来控制时间的,PWM的周期为2S,占空比50%,就是1S高电平使counter使能,1s低电平使它停止,方便记录LCD上的数。我其实在做一个霍尔传感器,用来测转速,我肯定不知道它的脉宽啊,怎么办呢?
地板

leonard

发表于 2013-9-22 10:56:48 来自手机 | 只看该作者

楼主是要测单位时间的脉冲数来计算转速吗?如果是就可以简化一下。
分为两部分:计时和计数。
楼主的方案是用pwm高电平计时,但是问题在于counter在不使能时寄存器是清零的,所以要在pwm进入低电平前对counter读数。
如果脉冲高度在3.3v系统里能当作高电平,那么可以用脉冲信号作为counter时钟,让counter计数。counter响应时钟上升沿,参考文档PSoC4架构技术参考手册 文档编号001-86886。
如果psoc4提供2个counter(好像有二个),那么就一个用来计时,一个用来计数。
counter1时钟接Pin接脉冲信号,用作计数,设置分辨率大于脉冲数的估算值,或者利用计数溢出OV产生高电平来测量用时。
counter2开启compare模式,comp值设置为1s对应的值,当计时达到1s(counter=comp)时,comp引脚输出d高电平,标志计时结束。
5#

wasd890228

发表于 2013-9-22 11:22:10 | 只看该作者

leonard 发表于 2013-9-22 10:56
楼主是要测单位时间的脉冲数来计算转速吗?如果是就可以简化一下。
分为两部分:计时和计数。
楼主的方案是 ...

恩,是的,你又QQ吗?咱们单独聊聊,我是新手,所以不太熟悉
6#

leonard

发表于 2013-9-22 11:42:28 来自手机 | 只看该作者

流程:
Counter1-start,计数器初始化
Counter2-start,计时器初始化并开始计时
while(!comp),在1s中内计数
Counter2-readcount,读取脉冲数
counter1-stop,
counter2-stop,

如果不用counter计时的话就用CyDelay(1000)来延时1s,但可能不准。

当单位脉冲数很高时,利用counter满量程后计时来计算。流程如下:
设置counter1为8位分辨率,用counter2测量255个脉冲所用时间,
counter1-start,计数器计数
counter2-start,计时器计时
while((counter1-readstatusregister()&counter-status-overflow)!=counter-status-overflow),等待counter1上溢
counter2-readcounter,读取计时时间
单位脉冲数就是255/read counter

7#

leonard

发表于 2013-9-22 11:43:47 来自手机 | 只看该作者

wasd890228 发表于 2013-9-22 11:22
恩,是的,你又QQ吗?咱们单独聊聊,我是新手,所以不太熟悉

2284685392,验证写psoc4
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条