基于51单片机的频率计设计
4 系统软件设计
频率计开始工作或者完成一次频率测量,系统软件都进行测量初始化。测量初始化模块设置堆栈指针(SP)、工作寄存器、中断控制和定时/计数器的工作方式。定时/计数器的工作首先被设置为计数器方式,即用来测量信号频率。首先定时/计数器的计数寄存器清0,运行控制位TR置1,启动对待测信号的计数。计数闸门由软件延时程序实现,从计数闸门的最小值(即测量频率的高量程)开始测量,计数闸门结束时TR清0,停止计数。计数寄存器中的数值经过数制转换程序从十六进制数转换为十进制数。判断该数的最高位,若该位不为0,满足测量数据有效位数的要求,测量值和量程信息一起送到显示模块;若该位为0,将计数闸门的宽度扩大10倍,重新对待测信号的计数,直到满足测量数据有效位数的要求。
当上述测量判断过程直到计数闸门宽度达到1 s(对应的频率测量范围为100~999 Hz)时测量结果仍不具有3位有效数字,频率计则使用定时方法测量待测信号的周期。定时/计数器的工作被设置为定时器方式,定时/计数器的计数寄存器清0,在判断待测信号的上跳沿到来后,运行控制位TR置为1,以单片机工作周期为单位进行计数,直至信号的下跳沿到来,运行控制位TR清0,停止计数。16位定时/计数器的最高计数值为65 535,当待测信号的频率较低时,定时/计数器将发生溢出。产生溢出时,程序进入定时器中断服务程序,对溢出次数进行计数。待测信号的周期由3个字节组成:定时/计数器溢出次数、定时/计数器的高8位和低8位。信号的频率f与信号的周期T之间的关系为: f=1/T
完成信号的周期测量后,需要做一次倒数运算才能获得信号的频率。为提高运算精度,采用浮点数算术运算。浮点数由3个字节组成:第1字节最高位为数符,其余7位为阶码;第2字节为尾数的高字节;第3字节为尾数的低字节。待测信号周期的3个字节定点数通过截取高16位、设置数符和计算阶码转换为上述格式的浮点数。然后浮点数算术运算对其进行处理,获得用浮点数格式表达的信号频率值。再通过浮点数到BCD码转换模块把用浮点数格式表达的信号频率值变换成本频率计的显示格式,送到显示模块显示待测信号的频率值。完成显示后,频率计都开始下一次信号的频率测量。系统软件流程图如图2所示。
系统软件设计采用模块化设计方法。整个系统由初始化模块、显示模块和信号频率频率测量模块等各种功能模块组成。上电后,进入系统初始化模块,系统软件开始运行。在执行过程中,根据运行流程分别调用各个功能模块完成频率测量、量程自动切换、周期测量和测量结果显示。
5 实测结果和误差分析
为了衡量这次设计的频率计的工作情况和测量精度,我们对系统进行了试验。以南京电讯仪器厂制造的E312B型通用计数器为基准,用这次设计的频率计对信号源进行了测量,测量数据如表1所示。
如图1信号预处理电路所示,待测信号在进入单片机之前经过了10×2次分频。频率计以进入单片机时的信号频率=100 Hz为基准(即待测信号频率为2 kHz),大于此频率采用频率测量,小于此频率采用周期测量。由表1频率测量对比表可以看出,频率测量的测量精度大于周期测量的测量精度。
采用计数法实现频率测量,误差来源主要有计数误差和闸门误差2部分。误差表达式为:
其中:N为计数值,t为闸门时间。
闸门时间相对误差dt/t主要取决于单片机晶振的频率稳定度,选择合适的石英晶体和振荡电路,误差一般可<10-6。当仅显示3位有效数字时,该项误差可以忽略。对于dN/N部分,无论闸门时间长短,计数法测频总存在1个单位的量化误差。在表1中,待测信号频率>2 kHz时的误差就来源于计数误差。增加显示的有效数字位数可降低该项误差的影响。
当待测信号频率<2 kHz时,直接测量的是信号的周期。周期测量的误差表达式为:
其中:dN/N为量化误差,dτ0/τ0为单片机晶振的频率稳定度。
进行周期测量时进入单片机的信号频率<100 Hz,使用12 MHz时钟时的最小计数值为10 000。当仅显示3位有效数字时,该项误差现在也可以忽略。待测信号的周期测量值通过浮点数运算变换成频率值,这时的误差来源于浮点数运算和数制转换所带来的误差。
6 结 语
介绍了一种基于单片机89C51制作的频率计的设计方法,所制作的频率计需要外围器件较少,适宜用于嵌入式系统。该频率计应用周期测量和相应的数学处理实现低频段的频率测量,因此很容易扩展实现信号的周期测量和占空比测量。该频率计被应用于笔者设计的“高频实验装置”之中,用来对LC振荡器和RC振荡器输出信号的频率稳定度进行测量,取得良好的应用效果。
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)