频率计系统设计.docx
《频率计系统设计.docx》由会员分享,可在线阅读,更多相关《频率计系统设计.docx(17页珍藏版)》请在冰豆网上搜索。
频率计系统设计
河南机电高等专科学校
《职业技能培训》结课大作业
频率计系统设计
姓名:
专业班级:
学号:
任课教师:
时间:
成绩:
频率计系统设计
医电08级1班任课老师:
摘要:
随着电子信息产业的不断发展,信号频率的测量在科技研究和实际应用中的作用日益重要。
传统的频率计通常是用很多的逻辑电路和时序电路来实现的,这种电路一般运行缓慢,而且测量频率的范围比较小。
考虑到上述问题,本论文设计一个基于单片机技术的数字频率计。
首先,我们把待测信号经过放大整形;然后把信号送入单片机的定时计数器里进行计数,获得频率值;最后把测得的频率数值送入显示电路里进行显示。
本文从频率计的原理出发,介绍了基于单片机的数字频率计的设计方案,选择了实现系统得各种电路元器件,并对硬件电路进行了仿真。
关键词:
单片机,频率计,测量
目录
1.概述3
2.设计要求3
3.总体构思4
4.各单元电路的设计和实现5
5.功能仿真及其结果7
6.编译下载及调试8
7.总结与展望17
参考文献18
1.概述
随着电子信息产业的发展,信号作为其最基础的元素,其频率的测量在科技研究和实际应用中的作用日益重要,而且需要测频的范围也越来越宽。
传统的频率计通常采用组合电路和时序电路等大量的硬件电路构成,产品不但体积较大,运行速度慢,而且测量范围低,精度低。
因此,随着对频率测量的要求的提高,传统的测频的方法在实际应用中已不能满足要求。
因此我们需要寻找一种新的测频的方法。
随着单片机技术的发展和成熟,用单片机来做为一个电路系统的控制电路逐渐显示出其无与伦比的优越性。
因此本论文采用单片机来做为电路的控制系统,设计一个能测量高频率的数字频率计。
用单片机来做控制电路的数字频率计测量频率精度高,测量频率的范围得到很大的提高。
2.设计要求
测频方法主要有以下几种:
脉冲数定时测频法(M法)、脉冲周期测频法(T法)、脉冲数倍频测频法(AM法)、脉冲数分频测频法(AT法)、脉冲平均周期测频法(M/T法)、多周期同步测频法。
下面是几种方案的具体方法介绍。
脉冲数定时测频法(M法):
此法是记录在确定时间Tc内待测信号的脉冲个数Mx,则待测频率为:
Fx=Mx/Tc
脉冲周期测频法(T法):
此法是在待测信号的一个周期Tx内,记录标准频率信号变化次数Mo。
这种方法测出的频率是:
Fx=Mo/Tx
脉冲数倍频测频法(AM法):
此法是为克服M法在低频测量时精度不高的缺陷发展起来的。
通过A倍频,把待测信号频率放大A倍,以提高测量精度。
其待测频率为:
Fx=Mx/ATo
脉冲数分频测频法(AT法):
此法是为了提高T法高频测量时的精度形成的。
由于T法测量时要求待测信号的周期不能太短,所以可通过A分频使待测信号的周期扩大A倍,所测频率为:
Fx=AMo/Tx
脉冲平均周期测频法(M/T法):
此法是在闸门时间Tc内,同时用两个计数器分别记录待测信号的脉冲数Mx和标准信号的脉冲数Mo。
若标准信号的频率为Fo,则待测信号频率为:
Fx=FoMx/Mo
根据频率的定义,频率是单位时间内信号波的个数,因此采用上述各种方案都能实现频率的测量。
但是本次设计的是一个用单片机做为电路控制系统的数字式频率计,采用脉冲定时测频法,则在低频率的测量时误差会大一些。
本次设计由于个人水平有限,因此,本次设计根据需要,采用脉冲定时测频法。
3.总体构思
为了得到一个高性能的数字频率计,本次设计采用单片机来做为数字频率计的核心控制电路,辅之于少数的外部控制电路。
因此本此设计的系统包括信号放大整形电路、分频电路、单片机AT89C51和显示电路等。
本系统让被测信号经过放大整形后,进入单片机开始计数,利用单片机内部定时计数器定时,在把所记得的数经过相关处理后送到显示电路中显示。
其系统框图如图3.1所示。
图3-1系统框图
由上面的内容可看到,本次设计的基于单片机的数字式频率计包括波形整形电路、分频电路、多路数据选择器、单片机和显示电路等几个模块。
所以本次设计的数字式频率计的电路由以下几块构成:
由施密特触发器构成的波形整形放大电路、由74LS90构成的分频电路、由74LS153四选一电路构成的四选一电路、AT89C51单片机以及由74LS138译码电路、三极管上拉电路和八段数码显示电路构成的数码显示电路构。
4.各单元电路的设计和实现
4.1信号放大整形电路
因为在单片机计数中只能对脉冲波进行计数,而实际中需要测量频率的信号是多种多样的,有脉冲波、还有可能有正弦波、三角波等,所以需要一个电路。
把待测信号转化为可以进行计数的脉冲波。
该部分由LM358和一级高频信号放大电路以及由74LS00连接成的施密特触发器组成。
其电路如下图所示。
图4-1电路图
4.2分频电路
本次设计采用的是脉冲定时测频法,由于考虑到单片机的定时计数器得计数能力有限,无法对过高频进行测量,所以我们对待测信号进行了分频,这样能提高测量频率的范围,还能相应的提高频率测量的精度。
所以我们需要把待测信号进行分频。
在本次设计中,因为我们要进行的是十分频、一百分频,所以我们选用74LS90电路,经过正确的连接后就可以进行十分频,进行二次十分频就可以得到分频一百次的信号。
信号经过分频电路74LS90,其频率将减小到原信号的十分之一和百分之一。
其组成电路如下图所示。
图4-2组成电路
4.3四选一电路
本次设计需要用到一个四选一电路,用来选择输入单片机进行计数的待测信号。
数据选择器有多个输入,一个输出。
其功能类似于单刀多掷开关,故又称为多路开关(MUX)。
在控制端的作用下可从多路并行数据中选择一路送输出端。
74LS153是双四选一数据选择器,其中有两个四选一数据选择器,它们各有四个数据输入端:
1C3、1C2、1C1、1C0和2C3、2C2、2C1、2C0。
一个输出端1Y、2Y和一个控制许可端G。
系统控制端G为低电平有效。
当控制许可端G=1时,传输通道被封锁,芯片被禁止,Y=0,输入的数据不能传送出去;当控制许可端G=0时,传输通道打开,芯片被选中,处于工作状态,输入的数据被传送出去A、B是地址选择端,两路选择器共用。
4.451单片机部分
单片机作为控制系统和计数器,是本次设计的最重要的部分,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
所以本次设计采用AT89C51单片机。
4.5显示电路
这次设计中采用LED数码管,采用一个74LS138译码器来控制各个数码管,采用三极管来做上拉电路,使数码显示管有足够的电压进行显示。
显示电路由数码管和74LS138组成,在本次设计中,由74LS138连接数码管的接地端,由此来控制数码管的亮和灭。
74LS138译码器有三个地址输入端A、B、C和八个译码输出端Y0~Y7,当输入为000时,Y0输出端为0,其他输出端都为1;同理可推出其他输出状态,即只有输出变量下标对应的二进制代码与输入代码相等的输出端为0,其他的输出端都为1。
由于单片机输出的显示数据电压不够高,无法直接送到数码管上直接显示,因此需要用一个上拉电路来提高输出数据的电压值,以便送到数码管。
图4-5LED显示电路
5.功能仿真及其结果
5.1测频软件实现原理
测频软件的实现是基于电路系统来进行设计的。
本次设计采用的是脉冲定时测频法,所以在软件实现上基本遵照系统的设计原理,进行测频软件设计的基本思路是:
1、把要用到的内部存储器的地址运用伪指令标号,方便后面设计中运用;2、跳转到中断程序进行初步数据采集;3、开始主程序,首先判断是否有待测信号,无信号就等待信号,有信号则进行下一步;4、判断是否定时到1S,若没有到达1S定时,则执行下面的5和6步得操作,若达到1S,则执行第6步以后的操作;5、判断是否第一次,若是,则判断当前的档位是否设置合适,若合适则直接跳转到返回主程序,若不合适,则进入第6步;6、调整档位,重新进入中断开始初步计数;7、判断档位是否合适,合适则把测得的数据转换为十进制数据,根据当前的档位相应的调整数位,并取表找到相应的显示数据,然后执行第10步操作;8、若上一步中判断出档位不合适,则根据频率进行相应的档位调整。
9、恢复初值,重新开始计数;10、返回主程序。
5.2软件流程图
根据上一节所叙述的电路设计的基本思路,我们可画出系统流程图如图5-1所示。
图5-1系统框图
5.3系统的仿真和调试
为了保证系统能正常工作,我们需要对电路中关键的电路部分进行仿真,下面我们对波
Proteus是一款非常不错的单片机模拟软件。
虽然电子模拟软件不少,但是能很好的模拟单片机的只有proteus软件。
该软件能模拟51单片机,avr单片机,pic单片机,以及部分arm芯片。
支持的外围器件也很多包括A/d,LCD,LED数码管,温度,时钟等芯片。
本次设计所有的电路都采用proteus对电路进行仿真。
5.4系统的改善
本次设计由于本人知识的有限,所以设计的系统并不是最理想的。
例如可以采用脉冲数定时测频法和脉冲周期测频法相结合,在高频的时候采用脉冲数定时测频法,在低频率的时候采用周期测频法。
此法可保证测频过程中精度一直很高,但实现的电路和程序都将很复杂。
还可以用外部计数器和单片机定时计数器共同计数来代替用单片机的定时计数器来进行定时,这样测量的精度可以进一步提高,但相对的端口分配和控制会相对复杂一些。
由于时间紧迫,还有部分元件没有提供。
所以很多应该完成的工作并没有完成。
使得系统的性能不能通过硬件电路来实际的显示出来。
而且,还有很多好的想法无法实现,所以系统还有很大的改进空间。
6.编译下载及调试
四选一选择器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMUX41AIS
PORT(D3,D2,D1,D0,A1,A0:
INSTD_LOGIC;
Y:
OUTSTD_LOGIC);
ENDENTITYMUX41A;
ARCHITECTUREONEOFMUX41AIS
BEGIN
Y<=D0WHENA1='0'ANDA0='0'ELSE
D1WHENA1='0'ANDA0='1'ELSE
D2WHENA1='1'ANDA0='0'ELSE
D3;
ENDARCHITECTUREONE;
3-8译码器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDECODER38AIS
PORT(A2,A1,A0,S1,S2,S3:
INSTD_LOGIC;
Y:
OUTSTD_LOGIC_VECTOR(7downto0));
ENDENTITYDECODER38A;
ARCHITECTUREONEOFDECODER38AIS
BEGIN
Y<="11111110"WHENA2='0'ANDA1='0'ANDA0='0'ANDS1='1'ANDS2='0'ANDS3='0'
ELSE"11111101"WHENA2='0'ANDA1='0'ANDA0='1'ANDS1='1'ANDS2='0'ANDS3='0'
ELSE"11111011"WHENA2='0'ANDA1='1'ANDA0='0'ANDS1='1'ANDS2='0'ANDS3='0'
ELSE"11110111"WHENA2='0'ANDA1='1'ANDA0='1'ANDS1='1'ANDS2='0'ANDS3='0'
ELSE"11101111"WHENA2='1'ANDA1='0'ANDA0='0'ANDS1='1'ANDS2='0'ANDS3='0'
ELSE"11011111"WHENA2='1'ANDA1='0'ANDA0='1'ANDS1='1'ANDS2='0'ANDS3='0'
ELSE"10111111"WHENA2='1'ANDA1='1'ANDA0='0'ANDS1='1'ANDS2='0'ANDS3='0'
ELSE"01111111";
ENDARCHITECTUREONE;
D触发器
libraryieee;
useieee.std_logic_1164.all;
entitydff1is
port(clk:
instd_logic;
d:
instd_logic;
clr:
instd_logic;
set:
instd_logic;
q:
outstd_logic);
enddff1;
architecturebhvofdff1is
begin
process(clk,clr,set)
begin
ifset='1'thenq<='1';
elsifclk'eventandclk='1'
then
ifclr='0'thenq<='0';
elseq<=d;
endif;
endif;
endprocess;
endbhv;
Jk触发器
libraryIEEE;
useIEEE.std_logic_1164.all;
entityJKis
port(Jk:
instd_logic_vector(1downto0);
Clock,Reset,Clear:
instd_logic;
Q,Qbar:
outstd_logic);
endentityJK;
architecturesigofJKis
signalstate:
std_logic;
begin
p0:
process(Clock,Reset,Clear)is
begin
ifClear='1'thenstate<='0';
elsifClock'eventandclock='1'
then
ifReset='0'thenstate<='1';
elsecasejkis
when"11"=>state<=notstate;
when"10"=>state<='1';
when"01"=>state<='0';
whenothers=>null;
endcase;
endif;
endif;
endprocessp0;
Q<=state;
Qbar<=notstate;
endarchitecturesig;
RS触发器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYRS_clkIS
PORT(S,R,res:
INstd_logic;
Q,NOT_Q:
outstd_logic);
ENDRS_clk;
ARCHITECTUREbehavOFRS_clkIS
signalsel1,sel2:
std_logic;
BEGIN
process(res,sel1,sel2)
begin
ifres='0'thensel1<='0';
sel2<='1';
elsif(S='1'andR='0')thensel1<='1';
sel2<='0';
elsif(S='0'andR='1')thensel1<='0';
sel2<='1';
elsif(S='0'andR='0')thensel1<=sel1;
sel2<=sel2;
endif;
Q<=sel1;
NOT_Q<=sel2;
endprocess;
ENDbehav;
七段码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDISPLY_DECODERIS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYDISPLY_DECODER;
ARCHITECTUREONEOFDISPLY_DECODERIS
BEGIN
DOUT<="0000001"WHENA="0000"
ELSE"1001111"WHENA="0001"
ELSE"0010010"WHENA="0010"
ELSE"0000110"WHENA="0011"
ELSE"1001100"WHENA="0100"
ELSE"0100100"WHENA="0101"
ELSE"0100000"WHENA="0110"
ELSE"0001111"WHENA="0111"
ELSE"0000000"WHENA="1000"
ELSE"0011000"WHENA="1001"
ELSE"1111111";
ENDARCHITECTUREONE;
十进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,EN,RST,SET:
INSTD_LOGIC;
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT10;
ARCHITECTUREBEHAVOFCNT10IS
BEGIN
PROCESS(CLK,EN,RST,SET)
VARIABLECQI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='0'THENCQI:
=(OTHERS=>'0');
ELSIFCLK'EVENTANDCLK='1'THEN
IFEN='1'andset='0'THEN
IFCQI<9THENCQI:
=CQI+1;
ELSECQI:
=(OTHERS=>'0');
ENDIF;
ENDIF;
ENDIF;
ifcqi=9thencout<='1';
elsecout<='0';
ENDIF;
CQ<=CQI;
ENDPROCESS;
ENDBEHAV;
endprocess;
q<=cout2&cout1;
endaa;
Q22为高四位,Q11为低四位
76进制
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycdu_76is
port(clk:
instd_logic;
q:
outstd_logic_vector(7downto0));
endcdu_76;
architectureaaofcdu_76is
signalcout2,cout1:
std_logic_vector(3downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(cout2=7andcout1=5)thencout2<="0000";cout1<="0000";
elseif(cout1=9)thencout2<=cout2+1;cout1<="0000";
elsecout2<=cout2;cout1<=cout1+1;
endif;
endif;
endif;
endprocess;
q<=cout2&cout1;
endaa;
Q22为高四位,Q11为低四位
7位左移移位寄存器
libraryieee;
useieee.std_logic_1164.all;
entityshfrtis
port(clk,load:
instd_logic;
din:
instd_logic_vector(6downto0);
qb:
outstd_logic);
endshfrt;
architecturebehavofshfrtis
begin
process(clk,load)
variablereg7:
std_logic_vector(6downto0);
begin
ifclk'eventandclk='1'then
ifload='1'thenreg7:
=din;
elsereg7(6downto1):
=reg7(5downto0);
reg7(0):
='1';
endif;
endif;
qb<=reg7(6);
endprocess;
endbehav;
8位左移移位寄存器
libraryieee;
useieee.std_logic_1164.all;
entityshfrtis
port(clk,load:
instd_logic;
din:
instd_logic_vector(7downto0);
qb:
outstd_logic_vector(7downto0));
endshfrt;
architecturebehavofshfrtis
begin
process(clk,load)
variablereg8:
std_logic_vector(7downto0);
begin
ifclk'eventandclk='0'then
ifload='1'thenreg8:
=din;
elsereg8(7downto1):
=reg8(6downto0);
reg8(0):
='1';
endif;
endif;
qb<=reg8;
endprocess;
endbehav;
7.总结与展望
本次设计的过程和结果都给了我很多感触。
在设计的过程中,我一方面澄清了先前的一些错误理解,另一方面也真正的体会到了书本知识转化为实践时的困难,往往很不起眼的一件事情,就是设计的关键,必须得搞清楚。
为了查找相关的技术文献资料,我们上网,去学校图书馆查找资料,虽然辛苦一点,但是令人欣慰的