多功能测量表的第二部分就是频率测量。先试试最简单的测频法,就是定时固定时间(这里先选用了100ms),对被测信号计数。为了方便起见,集中测试mcu部分,被测信号选用了0-5v的方波。这里的计数考虑了两种方案,方案一是用外中断,这也是本来最先考虑的方案,这样可以保留另一路定时器给后续拓展等精度测量用。方案二是采用定时器的外部事件计数方案。这个方案不需要外中断,但是两路定时器全部被占用了。具体采用何种方案,还要测试下来才知道。
首先使用timer0,定时100ms,用外中断INTP1(P0.0)对输入的方波计数。Cg配置如下:
在高频段,测量精度不错。0.2%左右的误差。在低频段,误差较大。一般100以下精度就开始快速下降(理论分析误差要大于1%)。但是可能受中断处理速度影响(中断里面就是对cnt++),高频测量高限在650KHz左右(对于cnt,使用了long 和int,int能上到800Khz左右,但是这是在对int型不做溢出处理得到的,如果处理溢出,可能就不行了)。
可能要考虑使用外部事件计数,这样可测量的频率大概能到主频率的一半,如果选20M,也就是可以工作到10M。
然后试了下方案二,使用timer0定时100ms,在TI01(P0.4)口输入方波,使用外部事件计数。方案二的CG配置。
非常帅,可以上到9.9M。当然,低频段的误差还是比较大的。测试结果在几百hz以上,误差小于1%,100Hz以下,误差变大。这和方案一一样,受原理影响较大。
不过从测试数据中可以发现,高频段并没有因为频率变大而误差变小,这可能是因为频率高时,stop ch1是指令执行时间增加的计数也较多。
因此综合考虑,决定用方案二测频,测量范围要大很多。至于低频段的误差问题,有两种解决方式。一个是使用更长的时间闸门,比如500ms,可以使低频分辨率达到2Hz;一种是在低频段采用测周法,或者整个频段采用等精度法。后者要消耗更多的外设(定时器用完了,可能还要加外中断)和IO口资源,考虑到后面还要做显示需要IO口,因此此处简单处理使用500ms时间闸门的方法,取得测量速度和精度之间的折中。
注:以上测量结果通过变量窗口获得。
下面来捉bug,CG在生成外部事件计数时,默认是没法开启P0.4的数字功能的,(选了数字口,tau里面就不能选外部计数功能)选了外部计数,P04就变成了unused ,而In是不能选的了。
因此需要自己来一句PMC0 &=~0x10;看起来很小,可是这是个很重的概念错误,希望后面版本能够改进。如果没有这一句,P0.4口是没有办法对外部方波计数的。
最后附上代码供大家参考,后缀1和2代表两种方案