原创 等精度频率计设计

2009-1-16 21:27 5558 5 8 分类: MCU/ 嵌入式
https://static.assets-stash.eet-china.com/album/old-resources/2009/1/16/f7b91239-ea29-4ea3-b4a7-8b12be555fe4.rar

等精度频率计设计<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


基于传统测频原理的频率计的测量精度将随被测信号的频率的下降而降低,在实用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个频率区域能保持恒定的测试精度。在此完成的设计项目可达到的指针为:


(1)   频率测试功能:频率范围0.1Hz~100MHz。测量精度:测频全域相对误差恒为百万分之一。


(2)   脉宽测试功能:测试范围0.1μs~1μs,测量精度0.01μs


(3)   占空比测试功能:测试精度1%~99%


 


主系统组成


等精度频率计的主系统如图1所示,主要有5个部分构成:


(1)   信号整形电路。用于对待测信号进行放大很和整形,以便作为PLD器件的输入信号。


(2)   测频电路。是测频的核心电路模块,可以由FPGAPLD器件担任。100MHz的标准频率信号(如果是由于优化问题,可接50M或更低频率的晶振)直接进入FPGA


(3)   单片机电路模块。由于控制FPGA的测频操作和读取测频数据,并作出相应处理。单片机的P0口直接读取测试数据,P2口向FPGA发控制命令。


(4)   键盘模块。可以用5个键执行测试控制,一个是复位键,其余是命令键。


(5)   数码管显示模块。可以用7个数码管显示测试结果,最高可表示百万分之一的精度。考虑到提高单片机IO口的利用率,降低编程复杂性,提高单片机的计算速度以及降低数码显示器对主系统的干扰,可以采用串行静态现实方式。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />1  频率计主系统电路组成


测频原理


等精度测频的实现方法可以简单地用图2和波形图3来说明。图2中预置门信号CL可由单片机发出,CL的时间宽度对测频精度较小,所以可以在1秒至0.1秒间选择,在此设其宽度为TprBZHTF是两个可控的32位高速计数器,BENAENA分别是它们的计数允许信号端,高电平有效。标准频率信号从BZH的时钟输入端BCLK输入,设其频率为Fs;经整形后的被测信号从与BZH相似的32位计数器TF的时钟输入端BCLK输入,设其频率为Fxe,测量频率为Fx



2   等精度频率计主控结构


测频开始前,首先发出一个清0信号CLR,使两个计数器和D触发器置0,然后由单片机发出允许测频命令,即令预置门控信号CL为高电平,这时D触发器要一直等到被测信号的上沿通过时Q端才被置1(即令START为高电平),与此同时,将同时启动计数器BHZTF,进入图3所示的“计数允许周期”。


在次期间,BHTTF分别对被测信号(频率为Fx)和标准频率信号(频率为Fs)同时计数。当Tpr秒后,预置门信号被单片机置为低电平,但此时两个计数器仍没有停止计数,一直等到随后而至的被测信号的上升沿来到时,才通过D触发器将这两个触发器同时关闭。由图3可见,CL的宽度和发生的时间都不会影响计数能使信号(STRAT)允许计数的周期总是恰好等于待测信号TCLK的完整周期数,这正是确保TCLK在任何频率条件下都能保持恒定精度的关键。而且,CL宽度的改变以及随机的出现时间造成的误差最多只有BCLK信号的一个时钟周期,如果BCLK由精确稳定的晶体振荡器(100MHz)发出,则任何时刻的绝对测量误差只有1亿分之一秒。


设在一次预置门时间Tpr中被测信号计数值为Nx,对标准频率信号的计数值为Ns,则下式成立:


                 Fx/Nx = Fs/Ns


不难看到测得的频率为:


             Fx = (Fs/Ns)*Nx


 


最后通过控制SEL选择信号和64位至8位的多路选择器MUX64-8,将计数器BHZTF中的两个32位数据分8次读入单片机并按式1-2进行计算和结果显示。


FPGA/CPLD开发的VHDL设计


   根据一逻辑原理图2、功能波形图3,以及以上给出的测频原理声明,可以比较容易地写出相应的VHDL功能描述了。例1即为等精度频率计的VHDL完整描述,以通过了综合和硬件测试,可直接应用。例1中还包括了脉宽和占空比的测试功能。


根据图1的连接方式,例1与单片机可以按照如下方式接口:


(1) 单片机的P0口接8为数据DATA[7..0],负责读取测频数据。


(2) 单片机可以通过信号START,了解计数是否结束,以确定何时可以读取数据。


(3) EEND的功能与START基本相同,当其由低电平变到高电平时指示脉宽计数结束。


(4) P2.2P2.1P2.0、和SEL[..]相接,用于控制多路通道的数据选择。当SEL分别为“100”、“101”、“110”、“111”时,由低8位到高8位读出标准频率计数值;当SEL分别为“100”、“101”、“110”、“111”时,由低8位到高8位读出标准频率计数值。


(5) P2.4接清0信号CLR,高电平有效。每一测频率周期开始时,都应该首先清0


(6) P2.5P2.6分别接控制信号CLSPULCSPUL协同控制测试操作。即当SUPL为‘1’时,CL作为预置门控信号,用于测频计数的时间控制(如可取0.5秒);当SPUL为‘0’时,CL作为测脉宽控制信号。这时,CL若为‘1’,测TCLK的高电平脉宽,而当CL为‘0’时,则测TCLK的低电平脉宽。然后分别从DATA 数据口读出BZH对标准频率的计数,即只需令SEL的取值分别为“000”、“001”、“010”、“011”即可。


对于占空比的测量,可以通过测量正反两个脉宽的计数值来获取。设BZH对正脉宽的计数值为N1,对负脉宽的计数值为N2,则周期计数值为N1+N2,于是占空比:


        占空比 = N1/(N1+N2)*100%                    1-3


1


LIBRARY  IEEE;


USE IEEE.STD_LOGIC_1164.ALL;


USE IEEE.STD_LOGIC_UNSIGNED.ALL;


ENTITY  GWDVPB  IS


      PROT  (BCLK  : IN  STD_LOGIC;


TCLK   :  IN  STD_LOGIC;


CL   :  IN  STD_LOGIC;


SPUL :  IN  STD_LOGIC;


START :  OUT  STD_LOGIC;


EEND :  OUT  STD_LOGIC;


SEL  :  IN   STD_LOGIC_VECTOR ( 2  DOWNTO  0 );


DATA  :  OUT  STD_LOGIC_VECTOR ( 7  DOWNTO  0 );


END  GWDVPB;


ARCHITECTURE  BEHAV   OF   GWDVPB  IS


     SIGNAL  BZQ,TSQ  :  STD_LOGIC_VECTOR (31  DOWNTO  0 );


     SIGNAL  ENA,PUL  :  STD_LOGIC;


     SIGNAL  MA,CLK1,CLK2,CLK3  : STD_LOGIC ;


     SIGNAL  Q1,Q2,Q3,BENA  :  STD_LOGIC ;


     SIGNAL  SS  :  STD_LOGIC_VECTOR( 1 DOWNTO  0 );


  BEGIN


   START <=ENA;


   DATA <=BZQ ( 7 DOWNTO  0 ) WHEN  SEL  =  “000” ELSE


 BZQ ( 15 DOWNTO  8 ) WHEN  SEL  =  “001” ELSE


BZQ ( 23 DOWNTO  16 ) WHEN  SEL  =  “010” ELSE


BZQ ( 31  DOWNTO  24 ) WHEN  SEL  =  “011” ELSE


TSQ ( 7  DOWNTO  0 ) WHEN  SEL  =  “100” ELSE


TSQ ( 15  DOWNTO  8) WHEN  SEL  =  “101” ELSE


TSQ ( 23 DOWNTO  16 ) WHEN  SEL  =  “110” ELSE


TSQ ( 31 DOWNTO  24 ) WHEN  SEL  =  “111” ELSE


         TSQ (31 DOWNTO  24 ) ;


BZH  :  PROCESS ( BCLK , CLR )


      BEGIN


        IF  CLR  = ‘1’ THEN  BZQ <= ( OTHERS=>’0’ ) ;


        ELSIF  BCLK’ EVENT  AND  BCLK  = ‘1’  THEN


           IF   BENA  =  ‘1’  THEN  BZQ  <=  BZQ + 1 ;


                 END  IF ;


           END  IF;


      END  PROCESS ;


TF  :  PROCESS ( TCLK , CLR ,ENA )


       BEGIN 


          IF   CLR  = ‘1’  THEN  TSQ  <= (  OTHERS =>’0’ );


     ELSIF   TCLK’EVENT  AND  TCLK  =  ‘1’ THEN


         IF   ENA  =  ‘1’  THEN  TSQ  <= TSQ +1 ;


         END IF ;


     END  IF ;


  END  PROCESS;


PROCESS ( TCLK, CLR )


      BEGIN


        IF  CLR  =  ‘1’  THEN  ENA  <= ‘0’ ;


        ELSIF  TCLK’EVENT  AND  TCLK  = ‘1’  THEN  ENA  <= CL ;


      END IF ;


   END PROCESS;


  MA  <=  ( TCLK  AND  CL )  OR  NOT  (TCLK OR CL ) ;


  CLK1 <=  NOT  MA ; CLK2 <= MA  AND  Q1 ;  CLK3  <=  NOT CLK2 ; 


            SS  <= Q2 &  Q3  ;


DD1 :  PROCESS ( CLK1 ,CLR )


         BEGIN


           IF  CLR  =  ‘1’  THEN  Q1  <=  ‘0’ ;


             ELSIF  CLK1’EVENT  AND  CLK1 = ‘1’ THEN  Q1  <= ‘1’ ;


           END  IF ;


      END  PROCESS;


DD2 :PROCESS ( CLK2 ,CLR )


          BEGIN


            IF  CLR  =  ‘1’  THEN  Q2  <=  ‘0’ ;


             ELSIF  CLK2’EVENT  AND  CLK2 = ‘1’ THEN  Q2  <= ‘1’ ;


           END  IF ;


      END  PROCESS;


DD3 :  PROCESS ( CLK3 ,CLR )


         BEGIN


           IF  CLR  =  ‘1’  THEN  Q3  <=  ‘0’ ;


             ELSIF  CLK3’EVENT  AND  CLK3 = ‘1’ THEN  Q3  <= ‘1’ ;


           END  IF ;


      END  PROCESS;


PUL  <= ‘1’  WHEN  SS = “10” ELSE


         ‘0’ ;


EEND  <=  ‘1’  WHEN  SS = “11” ELSE


         ‘0’ ;


BENA  <= ENA  WHEN  SPUL = ‘1’  ELSE


             PUL  WHEN   SPUL = ‘0’ ELSE


             PUL ;


END  BEHAV ;


 


单片机程序中可以根据以上给出的控制方法进行测量控制,在读取相应的数据后,按照式1213进行计算,可以用浮点或定点方法计算。

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户1644825 2009-10-16 13:17

afdasfa

用户217962 2009-8-22 11:16

用户176734 2009-5-15 09:31

有没有C语言写的呢?
相关推荐阅读
我要评论
3
5
关闭 站长推荐上一条 /3 下一条