简易数字频率计的设计
频率测量的方法常用的有测频法和测周法两种。
测频法的基本思想是让计数器在闸门信号的控制下计数1秒时间,计数结果是1秒内被测信号的周期数,即被测信号的频率。若被测信号不是矩形脉冲,则应先变换成同频率的矩形脉冲。测频法的原理框图如图所示。
图中,秒脉冲作为闸门信号,当其为高电平时,计数器计数;低电平时,计数器停止计数。显然,在同样的闸门信号作用下,被测信号的频率越高,测量误差越小。当被测频率一定时,闸门信号高电平的时间越长,测量误差越小。但是闸门信号周期越长,测量的响应时间也越长。
2、当被测信号频率较低时,为保证测量精度,常采用测周法。即先测出被测信号的周期,再换算成频率。测周法的实质是把被测信号作为闸门信号。
在它的高电平的时间内,用一个标准频率的信号源作为计数器的时钟脉冲。若计数结果为N,标准信号频率为f1,则被测信号的周期为:T = T1·N。被测信号的频率为:f = 1/T1·N = f1/N。
利用测周法所产生的最大绝对误差,显然也等于±1个标准信号周期。如果被测信号周期的真值为T真= T1·N,则T测= T1·(N±1)σmax= (f测-f真)/ f真= T真/T测 – 1=±1/(N±1)由上式可知,对于一定的被测信号,标准信号的频率越高,则N的值越大,因而相对误差越小。
3、低频段的测量,鉴于上述困难,对于低频信号,为了达到规定的精度,要采取一些比较特殊的方法。例如,可考虑将被测信号倍频后再用测频法测量。
或将闸门信号展宽。由于倍频电路比较复杂,所以一般采用后一种方法,实际上闸门信号展宽与被测信号倍频在效果上是相同的。
闸门信号展宽比较容易做到,例如采用分频电路就可以实现。若闸门信号高电平时间从1秒展宽到10秒,则相对误差可以按比例下降,但响应时间也增大相同的比例。
4、显示方式:共用右边四个数码管,左三个显示数据,最右端一个显示单位,为0时单位为Hz,为1时单位为Khz
5、代码:
//#include<c8051F330.h>
#include<ZLG7289.h>
#include<init.h>
#define uint unsigned int
uint a,b,c,d
unsigned long x
unsigned long count
unsigned char flag=0
void Timer0_Init()interrupt 1
{
TH0=(65535-10000)/256
TL0=(65535-10000)%256
if(++count==40)
{
count=0
TR1=0
x=TH1*256+TL1
TH1=0
TL1=0
TR1=1
flag=1
}
}
void show(void)
{if(x>=10&&x<100)
{
a=0
b=x*10%100
c=x/10
d=x%10
ZLG7289_Download(1,7,0,a)
ZLG7289_Download(1,6,0,b)
ZLG7289_Download(1,5,1,d)
ZLG7289_Download(1,4,0,c)
}
else if(x>=100&&x<1000)
{
a=0
b=x/100
c=x%100/10
d=x%10
ZLG7289_Download(1,7,0,a)
ZLG7289_Download(1,6,1,d)
ZLG7289_Download(1,5,0,c)
ZLG7289_Download(1,4,0,b)
}
else if(x>=1000&&x<10000)
{
a=x/1000
b=x%1000/100
c=x%100/10
d=1
ZLG7289_Download(1,7,0,d)
ZLG7289_Download(1,6,0,c)
ZLG7289_Download(1,5,0,b)
ZLG7289_Download(1,4,1,a)
}
}
main(void)
{
system_init()
systemclk_init()
port_init()
ZLG7289_Init(40)
ZLG7289_Reset()
timer_init()
while(1)
{
if(flag==1)
{
show()
flag = 0
}
}}
#include <C8051F330.h>
#include <port.h>
void system_init()
{
PCA0MD&=~0x40
}
void systemclk_init()
{
OSCICL=OSCICL+42//设置内部振荡器为24MHZ
OSCICN|=0x01 //内部振荡器4分频
}
void port_init()
{
P0SKIP=0x00 //跳过P0.0做INT0.P0.1做INT1(P0.6,P0.7模拟输出不跳)
P1SKIP=0x00 //跳过P1.2,P1.3,P1.4
XBR0=0x00 //交叉开关使能UART0
XBR1=0x60 //打开交叉开关
//IT01CF=0x10 //INT0配置在P0.0,INT1配置在P0.1
P0MDIN=0xFF //数字输入
P1MDIN=0xFF
P0MDOUT=0xFF//推挽
P1MDOUT=0xFF
}
void timer_init()
{
TMOD=0x51
TH0=(65535-2500)/256
TL0=(65535-2500)%256
EA=1
ET0=1
TR1=1
TR0=1
}
#ifndef __port_H_
#define __port_H_
void system_init(void)
void systemclk_init(void)
void port_init(void)
void timer_init(void)
#endif
简易频率计
一、设计任务与要求
1.设计制作一个简易频率测量电路,实现数码显示。
2.测量范围:10Hz~99.99KHz
3.测量精度: 10Hz。
4. 输入信号幅值:20mV~5V。
5. 显示方式:4位LED数码。
二、方案设计与论证
频率计是用来测量正弦信号、矩形信号、三角形信号等波形工作频率的仪器,根据频率的概念是单位时间里脉冲的个数,要测被测波形的频率,则须测被测波形中1S里有多少个脉冲,所以,如果用一个定时时间1S控制一个闸门电路,在时间1S内闸门打开,让被测信号通过而进入计数译码器电路,即可得到被测信号的频率fx。
任务要求分析:
频率计的测量范围要求为10Hz~99.99KHz,且精度为10Hz,所以有用4片10进制的计数器构成1000进制对输入的被测脉冲进行计数;要求输入信号的幅值为20mV~5V,所以要经过衰减与放大电路进行检查被测脉冲的幅值;由于被测的波形是各种不同的波,而后面的闸门或计数电路要求被测的信号必须是矩形波,所以还需要波形整形电路;频率计的输出显示要经过锁存器进行稳定再通过4位LED数码管进行显示。
经过上述分析,频率计电路设计的各个模块如下图:
方案一:
根据上述分析,频率计定时时间1s可以通过555定时器和电容、电阻构成的多谐振荡器产生1000Hz的脉冲,再进行分频成1Hz即周期为1s的脉冲,再通过T触发器把脉冲正常高电平为1s;放大整形电路通过与非门、非门和二极管组成;闸门电路用一个与门,只有在定时脉冲为高电平时输入信号才能通过与门进入计数电路计数;计数电路可以通过5个十进制的计数器组成,计数器再将计的脉冲个数通过锁存器进行稳定最后通过4个LED数码显像管显示出来。
方案二:
频率计定时时间1s可以直接通过555定时器和电容、电阻构成的多谐振荡器产生1Hz的脉冲,再通过T触发器把脉冲正常高电平为1s;放大整形电路可以直接用一个具有放大功能的施密特触发器对输入的信号进行整形放大,其他模块的电路和方案一的相同。
通过对两种方案的分析,为了减少总的电路的延迟时间,提高测量精确度,所以选择元件少的第二种方案。
三、单元电路设计与参数计算
时基电路:
用555_VIRTUAL定时器和电容、电阻组成多谐振荡器产生1Hz的脉冲,根据书中的振荡周期 : T=(R1+R2)C*ln2 取C=10uF,R1=2KΩ,T=1s,计算得:R2=70.43KΩ,再通过T触发器T_FF把脉冲正常高电平为1s的脉冲,元件的连接如下:
经示波器仿真,产生的脉冲的高电平约为1S。
放大整形电路:
用一个74HC14D_4V的含放大功能的施密特触发器对输入脉冲进行放大整形,把输入信号放大整形成4V的矩形脉冲,其放大整形效果如下图:
闸门电路:
用一个与门74LS08作为脉冲能否通过的闸门,当定时信号Q为高电平时,闸门打开,输入信号进入计数电路进行计数,否则,其不能通过闸门。
计数电路:
计数电路用5(4)片74192N计数器组成100000(10000)进制的计数电路,74192N是上升沿有效的,来一个脉冲上升沿,电路记一次数,所以计数的范围为0~99999(5000)。但计数1S后要对计数器进行清零或置零,在这里用清零端,高电平有效,当计数1S后,Q为低电平,Q’为高电平,所以用Q’作为清零信号,接线图如下:
锁存显示电路:
当计数电路计数结束时,要把计得脉冲数锁存通过数码显示管稳定显示出来。锁存器用2片74ls273,时钟也是上升沿有效,当Q为下降沿时,Q’恰好是上升沿,所以用Q’作为锁存器的时钟,恰能在计数结束时把脉冲数锁存显示,电路的接线图如下:
四、总电路工作原理及元器件清单
1.总原理图
2.电路完整工作过程描述(总体工作原理)
555组成的多谐振荡器产生1Hz的脉冲,经过T触发器整形成高电平时间为1S的脉冲,高电平脉冲打开闸门74LS08N,让经施密特触发器74HC14D放大整形的被测脉冲通过,进入计数器进行1S的计数。当计数结束时,T触发器的Q为下降沿,Q’刚好为上升沿,触发锁存器工作,让计数器输出的信号通过锁存器锁存显示,同时,高电平的Q’信号对计数电路进行清零,此后,电路将循环上述过程,但对于同一个被测信号,在误差的允许范围内,LED上所显示的数字是稳定的。
3.元件清单
元件序号 型号 主要参数 数量 备注
1 74192 5 加法计数器
2 74LS273 2 锁存器
3 DCD_HEX 4 LED显示器
4 555_VIRTUAL 1 定时器
5 T_FF 1 T触发器
6 CAPACITOR_RATED 电容10Uf、额定电压50V 1 电容
7 CAPACITOR_RATED 电容10Nf、额定电压10V 1 电容
8 RES 阻值2KΩ 1
9 RES 阻值 1
10 74LS08 1 双输入与门
11 74HC14D_4V 1 施密特触发器,放大电压4V
12 AC_VOLTAGE 1 可调的正弦脉冲信号
五、仿真调试与分析
把各个模块组合起来后,进行仿真调试以达到任务要求。
① 在信号输入端输入10Hz的交流脉冲,仿真,结果如下:
说明仿真的结果准确
② 在信号输入端输入300Hz的交流脉冲,仿真,结果如下:
仿真结果准确
③ 在信号输入端输入3KHz正弦脉冲,仿真,结果如下:
④输入20KHz的正弦脉冲,仿真,结果如下:
仿真结果结果与实际的结果相差20Hz,这说明频率越高,误差越大。经分析,这是由于各个元器件存在着延迟时间,1S的脉冲,经过各个元器件的延迟,计数时间会大于1s,频率越高,误差越大,所以计数的时间要稍微小于1S,调小时基电路的R3为70.23KΩ,仿真,结果如下:
还是存在误差,经过多次调节R3仿真,最后确定R3为70.06 KΩ时对于各个频率的测试都比较准确,20KHz时仿真结果如下:
所以R3为70.06KΩ是测得的各个频率值都比较准确,且电路设计都符合测任务要求。
六、结论与心得
在这次课程设计的过程中,我收获不少。首先,我学会了把一个电路分成模块去设计,最后再整合,这样可以把一个复杂的电路简单化了,并且这样方便与调试与修改;其次,设计有助了我去自学一些元器件的功能,去运用它;再次,我也初步会用multisim软件设计电路;最后,这次课程设计也提高了我查找问题、思考问题和解决问题的能力,还锻炼了我的耐性。
在这次课程设计中也遇到了很多问题,首先,是对元器件了解不多,对于要实现某种功能不知道用那一种元件,所以问同学,上网收索,再了解这种元件的逻辑功能,学会去用它;其次,不大会用电路设计软件,一开始用EWB软件设计,对模块仿真可以,但整合整个原理图仿真却不行,通过示波器观察输出波形发现脉冲走了一小段却停止了,以为是电路有问题,就查找了很多遍才找出问题,原来在那个软件仿真时是不允许存在两个信号,所以重新用multisim设计,才可以;最后,在用multisim仿真高频率时仿真速度极慢,所以调整了软件的仿真最大步长,但问题又出现了,信号紊乱,数码管显示数字不一,然后就猜想会不会是元件的问题,太高频率元件来不及反应就输出结果,但上网寻找答案,原来是软件的仿真步长会影响仿真的精确度,所以,某一范围的频率仿真,要用相应的最大仿真步长。
这个题目的设计花了自己不少心血,有时甚至一整天在弄,但是当自己成功地设计出电路时所获得的那一份成就感是无法表达的,所以整个电路的设计过程充满着苦恼与乐趣。
七、参考文献
[1] 阎石 《数字电子技术基本教程》第一版 ,清华大学出版社,2007.08
数码管台古老了,你用这个吧,看着还稍微有点可以,代码和电路都给你了,没有做不出来的理由,有问题加我QQ11422376745
#include "d:\c51\reg51.h"
#include "d:\c51\intrins.h"
sbit LCM_RS=P3^0
sbit LCM_RW=P3^1
sbit LCM_EN=P3^7
#define BUSY 0x80 //常量定义
#define DATAPORT P1
#define uchar unsigned char
#define uint unsigned int
#define L 50
uchar str0[16],str1[16],count
uint speed
unsigned long time
void ddelay(uint)
void lcd_wait(void)
void display()
void initLCM()
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
void STR()
void account()
void int0_isr(void) interrupt 0
{
unsigned int temp
time=count
TR0=0
temp=TH0
temp=((temp <<8) | TL0)
TH0=0x3c
TL0=0xaf
count=0
TR0=1
time=time*50000+temp
}
void time0_isr(void) interrupt 1
{
TH0 =0x3c
TL0 =0xaf
count++
}
void main(void)
{
TMOD=0x01
IP|=0x01
TCON|=0x11
IE|=0x83
TH0=0x3c
TL0=0xaf
initLCM()
WriteCommandLCM(0x01,1) //清显示屏
for()
{
account()
display()
}
}
void account()
{
unsigned long a
if (time!=0)
{
a=L*360000000/time
}
speed=a
}
void STR()
{
str0[0]='S'
str0[1]='p'
str0[2]='e'
str0[3]='e'
str0[4]='d'
str0[5]=' '
str0[6]=(speed%100000)/10000+0x30
str0[7]=(speed%10000)/1000+0x30
str0[8]=(speed%1000)/100+0x30
str0[9]='.'
str0[10]=(speed%100)/10+0x30
str0[11]=speed%10+0x30
str0[12]='k'
str0[13]='m'
str0[14]='/'
str0[15]='h'
}
void ddelay(uint k)
{
uint i,j
for(i=0i<ki++)
{
for(j=0j<60j++)
{}
}
}
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)lcd_wait()
DATAPORT=WCLCM
LCM_RS=0
LCM_RW=0 // 写模式
LCM_EN=1
_nop_()
_nop_()
_nop_()
LCM_EN=0
}
void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ) //检测忙信号
DATAPORT=WDLCM
LCM_RS=1
LCM_RW=0 // 写模式
LCM_EN=1
_nop_()
_nop_()
_nop_()
LCM_EN=0
}
void lcd_wait(void)
{
DATAPORT=0xff //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
LCM_EN=1
LCM_RS=0
LCM_RW=1
_nop_()
_nop_()
_nop_()
while(DATAPORT&BUSY)
{ LCM_EN=0
_nop_()
_nop_()
LCM_EN=1
_nop_()
_nop_()
}
LCM_EN=0
}
void initLCM( )
{
DATAPORT=0
ddelay(15)
WriteCommandLCM(0x38,0) //三次显示模式设置,不检测忙信号
ddelay(5)
WriteCommandLCM(0x38,0)
ddelay(5)
WriteCommandLCM(0x38,0)
ddelay(5)
WriteCommandLCM(0x38,1) //8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCM(0x08,1) //关闭显示,检测忙信号
WriteCommandLCM(0x01,1) //清屏,检测忙信号
WriteCommandLCM(0x06,1) //显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1) //显示屏打开,光标不显示,不闪烁,检测忙信号
}
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1
X&=15
if(Y)X|=0x40 //若y为1(显示第二行),地址码+0x40
X|=0x80 //指令码为地址码+0x80
WriteCommandLCM(X,0)
WriteDataLCM(DData)
}
void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
uchar ListLength=0
Y&=0x01
X&=0x0f
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength])
ListLength++
X++
}
}
void display()
{
STR()
DisplayListChar(0,0,str0)
DisplayListChar(0,1,str1)
}
你的频率测量范围较宽,采用两个定时器的思路是对的。不过,没有必要限制在1S内对方波进行计数。一般思路是,对于较高频率的信号测量,采用固定时间T(不一定是1S)对脉冲数N进行计数,频率F=N/T。对于较低频率的信号测量,对固定周期数的脉冲(脉冲数为N,N常取1或更大的数)进行计时(时间为T),频率F=N/T。这样做的好处是,高频时,可以测量较快,低频时,测量较慢(这是必然的,最快就是N=1时),但是,都可以获取较高的测量精度。低频时,精度远远高于1Hz。
没按你的要求发程序,打搅勿怪,有疑问欢迎交流!
关键词:EDA;VHDL;数字频率计;波形仿真;CPLD�
1引言
VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(The Institute of Electrical and Electronics Engineers)的一种工业标准硬件描述语言。相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(Top to Down)和基于库(LibraryBased)的设计的特点,因此设计者可以不必了解硬件结构。从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的CPLD器件中去,从而实现可编程的专用集成电路(ASIC)的设计。
数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言。将使整个系统大大简化。提高整体的性能和可靠性。
本文用VHDL在CPLD器件上实现一种8 b数字频率计测频系统,能够用十进制数码显示被测信号的频率,不仅能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。具有体积小、可靠性高、功耗低的特点。
2数字频率计的基本设计原理
数字频率计的原理框图如图1所示。他主要由5个模块组成,分别是:脉冲发生器电路、测频控制信号发生器电路、计数模块电路、锁存器、译码驱动电路。�
当系统正常工作时,脉冲发生器提供的1 Hz的输入信号,经过测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。在数码显示管上可以看到计数结果。�
3设计实现�
3.1系统方框图的划分和结构设计
根据数字频率计的系统原理框图(图1虚线框内),设计系统的顶层电路图如图2所示。�
图2中TESTCTL为测频控制信号发生器。TESTCTL的计数使能信号TSTEN能产生一个1 s宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制:当TSTEN高电平时允许计数、低电平时停止计数。
REG32B为锁存器。在信号Load的上升沿时,立即对模块的输入口的数据锁存到REG32B的内部,并由REG32B的输出端输出,然后,七段译码器可以译码输出。在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。
CNT10为十进制计数器。有一时钟使能输入端ENA,用于锁定计数值。当高电平时允许计数,低电平时禁止计数。图2中将8个十进制计数器CNT10级联起来实现8 b十进制计数功能。
SEVYM为七段译码显示驱动电路,可以将频率计数的结果译成能在数码管上显示相对应的阿拉伯数字,便于读取测量的结果。
为了实现系统功能,测频控制信号发生器TESTCTL、计数器CNT10、锁存器REG32B存在一个工作时序的问题,设计时需要综合考虑。
图3给出了系统的工作时序。图3中CLK是由图1中脉冲发生器产生的频率为1 Hz的标准时钟信号,当测频控制信号发生器TESTCTL的TSTEN端为高电平时允许计数、低电平时停止计数,在停止计数期间,测频控制信号发生器TESTCTL的Load端产生一个上升沿,将计数器在前1 s的计数值锁存进32 b锁存器REG32B中,并由8个7段译码器将计数结果译出稳定显示。锁存信号之后经过半个CLK周期,测频控制信号发生器TESTCTL的CLR�_CNT端产生一个上升沿,对计数器进行清零。为下1 s的计数操作做准备。
为了产生这个时序图,首先有一个D触发器构成二分频器,在每次时钟CLK的上升沿到来使其值翻转。D触发器的输出高电平正好是1 s,因此可以作为测频控制信号发生器TESTCTL的TSTEN端,用来控制计数。而Load信号正好是TSTEN端信号的翻转。在计数结束后半个CLK周期,CLK与TSTEN都为低电平,这时CLR�_CNT产生一个上升沿作为清零信号。�
3.2各模块的VHDL源程序
采用VHDL描述数字频率计的电路时,根据图2所示的数字频率计系统顶层电路图,按照自顶向下的设计思路,编写各个模块的VHDL源程序,最后再对各个模块进行组合,编写顶层描述的VHDL源程序,由于篇幅所限,本文仅介绍数字频率计顶层描述的源程序,各个模块的VHDL源程序编写较为简单,可以根据各自的功能,相应地写出。
8位数字频率计的顶层描述VHDL源程序为:
4系统的功能仿真
Lattice公司推出的Isp Expert的数字系统设计软件,是一套完整的EDA软件,能够对所设计的数字电子系统进行时序仿真和功能仿真。
采用Lattice公司推出的Isp Expert EDA软件,对所编写数字频率计VHDL源程序进行编译、逻辑综合,自动地把VHDL描述转变为门级电路。然后进行波形仿真,编写的仿真测试向量文件如下(为仿真简单起见,测试一个66 Hz的周期信号):
仿真后得到的波形图如图4所示,从仿真波形上看测量的结果是准确的。还可以进一步修改测试向量文件,进行波形仿真。最后通过编程电缆,将所设计的内容下载到CPLD器件中,进行实物仿真。�
5结语
本文介绍了使用VHDL语言设计数字频率计的方法,并下载到CPLD中组成实际电路,这样可以简化硬件的开发和制造过程,而且使硬件体积大大缩小,并提高了系统的可靠性。同时在基本电路模块基础上,不必修改硬件电路,通过修改VHDL源程序,增加一些新功能,满足不同用户的需要,实现数字系统硬件的软件化。
1)设计闸门电路:
精度要求不是很高的话,可以用555搭;
精度要求高的话,用晶体振荡器,晶体可选用电子表使用的32768Hz晶体,价格很便宜,电子市场随处可见;集成电路采用非门即可,同时,后续处理方便,直接用多级二进制分频就可获得准确的1s闸门。
2)计数电路:
用四个十进制计数器
3)显示电路
用四个七段译码器驱动四个LED数码管
设计所需要的器件在美国德州仪器公司的网站上均可找到(SN74LS系列,SN74HC/HCT系列 通用数字逻辑器件)
网址:www.TI.COM
这些器件均可在其它公司找到替代,而且市场上也可很容易获得。
如果你把计数器稍微改动一下,就可以做一个数字钟了。