4 软件设计
4.1 实现一秒定时
采用12 MHz的晶体振荡器的情况下,一秒的定时已超过了定时器可提供的最大定时值。为了实现一秒的定时,采用定时和计数相结合的方法实现。选用定时/计数器TO作定时器,工作于方式1产生50 ms的定时,再用软件计数方式对它计数20次,就可得到一秒的定时。
4.2 计数部分
将定时器/计数器的方式寄存器TMOD,用软件赋初值51H,即01010001B。这时定时器/计数器1采用工作方式1,方式选择位C/T设为1,即设T1为16位计数器。定时器/计数器O采用工作方式1,C/T设为0,即设TO为16位定时器。
计算计数初值:设计数初值为X,本设计采用12 MHz的晶振。机器周期=12×(1/晶振频率)=12×(1/12×10。)一1×10一。,(2M—X)×1×10—0—50×10_。,X一15 536。
所以计数初值为15 536,用十六进制表示为3CBOH。
当定时器/计数器T1设定为计数方式时,其计数脉冲是来源T1端口的外部事件。当T1端口上出现由“1”(高电平)到“0”(低电平)的负跳变脉冲时,计数器则加1计数。计算机是在每个机器周期的S5P2状态时采样T1端口,当前一个机器周期采样为1且后一个机器周期采样为0时,计数器加1计数。计算机需用两个机器周期来识别1次计数,因而最大计数速率为振荡频率的1/24。在采用12 MHz晶振的情况下,单片机最大计数速度为0.5 MHz即500 kHz。
另外,此处对外部事件计数脉冲的占空比(即脉冲的持续宽度)无特殊要求,但必须保证所给出的高电平在其改变之前至少被采样1次,即至少保持1个完整的机器周期。由此可见,从T1口输入脉冲信号,T1可实现对脉冲个数的计数。
4.3 程序流程图
计时采用定时T0中断完成,其余状态循环调用显示子程序。主程序流程如图3所示。
5 测量结果及误差分析
5.1 测量结果
给电路加+5 V电压,输入信号,按动开关,即可得到频率值。将所测频率值与示波器测量结果比较,如表1所示。
5.2 误差来源分析
(1)单片机计数速率的限制引起误差。从表l测量数据可以看出被测信号频率越高,测量误差越大,且所测信号频率不能超过480 kHz。这是因为采用的是12 MHz的晶振,单片机最大计数速度为500 kHz,所以当被测信号越接近500 kHz时,测量结果与实际频率的误差就越大。而当被测信号大于500 kHz时,频率计将测不出信号频率。
(2)原理上存在±1误差。由于该设计是在计数门限时间一秒内的频率信号脉冲数,所以定时开始时的第一个脉冲和定时时间到时的最后一个脉冲信号是否被记录,存在随机性。这种误差对测量频率低的信号影响较大。其误差原理示意图如图4所示。
(3)晶振的准确度会影响一秒定时的准确度,从而引起测量结果误差。
5.3 减小误差措施
(1)选用频率较高和稳定性好的晶振。如选24 kHz的晶振可使测量范围扩大,稳定性好的晶振可以减小误差。
(2)测量频率低的信号时,可适当调整程序,延长门限时间,减少原理上±1的相对误差。
(3)测量频率较高的信号时,可先对信号进行分频,再进行测量。
6 结 语
基于单片机设计的数字频率计具有原理简单、易于调试和测量方便等优点,主要用来测量低频信号的频率。由于其测量范围会受单片机计数速率的限制,其测量量程较小,所以可以从原理上进行改进以提高其测频范围,比如通过增加分频电路,就可实现对高频信号的测量。