8.17 采用等精度测频原理的频率计程序与仿真
- 格式:doc
- 大小:172.00 KB
- 文档页数:8
等精度数字频率计测量方法:一、测频原理所谓“频率”,就是周期性信号在单位时间变化的次数。
电子计数器是严格按照f=N/T的定义进行测频,其对应的测频原理方框图和工作时间波形如图1 所示。
从图中可以看出测量过程:输入待测信号经过脉冲形成电路形成计数的窄脉冲,时基信号发生器产生计数闸门信号,待测信号通过闸门进入计数器计数,即可得到其频率。
若闸门开启时间为T、待测信号频率为fx,在闸门时间T内计数器计数值为N,则待测频率为:fx = N/T若假设闸门时间为1s,计数器的值为1000,则待测信号频率应为1000Hz或1.000kHz,此时,测频分辨力为1Hz。
图1 测频原理框图和时间波形二、方案设计2.1总体方案设计等频率计测频范围1Hz~100MHz,测频全域相对误差恒为百万分之一,故由此系统设计提供100MHz作为标准信号输入,被测信号从tclk端输入,由闸门控制模块进行自动调节测试频率的大小所需要的闸门时间,这样可以精确的测试到被测的频率,不会因闸门开启的时间快慢与被测频率信号变化快慢而影响被测频率信号导致误差过大,被测信号输入闸门控制模块后,在闸门控制模块开始工作时使encnt端口输出有效电平,encnt有效电平作用下使能标准计数模块(cnt模块)和被测计数模块(cnt模块),计数模块开始计数,直到encnt 重新回到无效电平,计数模块就将所计的数据送到下一级寄存模块,在总控制模块的作用下,将数据进行load(锁存),然后寄存器里的数据会自动将数据送到下一模块进行数据处理,最后送到数码管或者液晶显示屏(1602)进行被测信号的数据显示。
闸门、计数、寄存的总控制模块2.2理论分析采用等精度测量法,其测量原理时序如图1所示从图1中可以得到闸门时间不是固定的值,而是被测信号的整周期的倍数,即与被测信号同步,因而,不存在对被测信号计数的±1 误差,可得到:变形后可得:对上式进行微分,可得:由于 dn=± 1 ,因而可推出:从式(5)可以看出:测量误差与被测信号频率无关,从而实现了被测频带的等精度测量;增大T或提高fs可以提高测量精度;标准频率误差为dfs/fs,因为晶体的稳定度很高,再加上FPGA核心芯片里集成有PLL锁相环可对频率进一步的稳定,标准频率的误差可以进行校准,校准后的标准误差便可以忽略。
等精度频率计一:系统设计要求等精度频率计可以精测量,同时通过4位LED 数码管频率。
最小显示频率率为0.001,测量误差为 0.0002。
二:系统结构框图三:单元硬件设计说明(1)LED 显示电路:LED 显示电路采用7SEG-MPX4-CC 显示模块和八个上拉电阻组成。
单片机 AT89C51LED 显示时钟电路复位电路信号发生器显示数字的数量级(2)时钟电路:时钟电路由一个12M晶振,和两个3pF电容组成,产生12M赫兹的方波脉冲信号做为单片机的内部时钟(3)复位电路(4)信号发生器(5)显示选择器,用来指明当前频率选择的数量级单位。
四:软件设计与说明(包括在Protuse中的电路图)(1)连接完毕的电路图(2)主程序流程路复位电路:复位电路由一个1uF的电容和一个10K的电阻组成是毫秒级子程序(3)运行中的电路5: 程序代码//#include <at89x52.h>#include <reg51.h>#include <stdio.h>#define uint unsigned intsbit p20=P2^0;sbit p21=P2^1;sbit p22=P2^2;sbit p23=P2^3;sbit Q0=P2^4;sbit Q1=P2^5;sbit Q2=P2^6;sbit Q3=P2^7;sbit LED1=P0^1;sbit LED2=P0^2;sbit LED3=P0^3;uint t=0,number=0,count=0,k,a,b,c,d;float f=0.0,h=0.0,m=0.0;char table[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};void delay_ms(uint ms) //延时毫秒级子程序{uint i,j;for(i=0;i<ms;i++){ for(j=0;j<125;j++);}}void display0_ms(uint n){if(n==3 || n==2 || n==1 || n==0){number=f/(10^n);if(n==0)P1=table[number] & 0x7f;elseP1=table[number];p20=1;delay_ms(5);p20=0;}if(n==3 || n==2 || n==1){number=(uint)f%(10^n)/(10^(n-1));if(n==1)P1=table[number] & 0x7f;elseP1=table[number];p21=1;delay_ms(5);p21=0;}if(n==3 || n==2){number=(uint)f%(10^(n-1))/(10^(n-2));if(n==2)P1=table[number] & 0x7f;P1=table[number];p22=1;delay_ms(5);p22=0;}if(n==3){number=(uint)f%10;P1=table[number];p23=1;delay_ms(5);p23=0;}}void display1_khz(uint n){if(n==3 || n==2 || n==1 || n==0) {number=h/(10^n);if(n==0)P1=table[number] & 0x7f;elseP1=table[number];p20=1;delay_ms(5);p20=0;}if(n==3 || n==2 || n==1){number=(uint)h%(10^n)/(10^(n-1)); if(n==1)P1=table[number] & 0x7f;elseP1=table[number];p21=1;delay_ms(5);}if(n==3 || n==2){number=(uint)h%(10^(n-1))/(10^(n-2)); if(n==2)P1=table[number] & 0x7f;elseP1=table[number];p22=1;delay_ms(5);p22=0;}if(n==3){number=(uint)f%10;P1=table[number];p23=1;delay_ms(5);p23=0;}}void display2_mhz(uint n){if(n==3 || n==2 || n==1 || n==0){number=m/(10^n);if(n==0)P1=table[number] & 0x7f;elseP1=table[number];p20=1;delay_ms(5);p20=0;}if(n==3 || n==2 || n==1){number=(uint)h%(10^n)/(10^(n-1));if(n==1)P1=table[number] & 0x7f;elseP1=table[number];p21=1;delay_ms(5);p21=0;}if(n==3 || n==2){number=(uint)h%(10^(n-1))/(10^(n-2)); if(n==2)P1=table[number] & 0x7f;elseP1=table[number];p22=1;delay_ms(5);p22=0;}if(n==3){number=(uint)f%10;P1=table[number];p23=1;delay_ms(5);p23=0;}}void display3_ms(){LED1=0;LED2=1;LED3=1;f=(1.0/k)*1000;if(f==1000)display0_ms(3);else if(f>=100 && f<1000 ) {display0_ms(2);P1=table[(uint)(f*10)%10]; p23=1;delay_ms(5);p23=0;}else if(f>=10 && f<100){display0_ms(1);P1=table[(uint)(f*10)%10]; p22=1;delay_ms(5);p22=0;P1=table[(uint)(f*100)%10]; p23=1;delay_ms(5);p23=0;}else if(f>1 && f<10){display0_ms(0);P1=table[(uint)(f*10)%10]; p21=1;delay_ms(5);p21=0;P1=table[(uint)(f*100)%10]; p22=1;delay_ms(5);p22=0;P1=table[(uint)(f*1000)%10]; p23=1;delay_ms(5);p23=0;}}void display4_khz(){LED1=1;LED2=0;LED3=1;h=k/1000.0;if(h==1000)display1_khz(3);else if(h>=100 && h<1000 ) {display1_khz(2);P1=table[(uint)(h*10)%10];p23=1;delay_ms(5);p23=0;}else if(h>=10 && h<100) {display1_khz(1);P1=table[(uint)(h*10)%10];p22=1;delay_ms(5);p22=0;P1=table[(uint)(h*100)%10]; p23=1;delay_ms(5);p23=0;}else if(h>=1 && h<10) {display1_khz(0);P1=table[(uint)(h*10)%10];p21=1;delay_ms(5);p21=0;P1=table[(uint)(h*100)%10];p22=1;delay_ms(5);p22=0;P1=table[(uint)(h*1000)%10];p23=1;delay_ms(5);p23=0;}}void display5_mhz(){LED1=1;LED2=1;LED3=0;m=k/1000000.0;if(m>=1 && m<10){display2_mhz(0);P1=table[(uint)(m*10)%10];p21=1;delay_ms(5);p21=0;P1=table[(uint)(m*100)%10]; p22=1;delay_ms(5);p22=0;P1=table[(uint)(m*1000)%10]; p23=1;delay_ms(5);p23=0;}else if(m==10){display2_mhz(1);P1=table[0];p22=1;delay_ms(5);p22=0;P1=table[0];p23=1;delay_ms(5);p23=0;}}void timer0() interrupt 1 using 0 {TH0=0X3C;TL0=0XBF;if(t==20){t=0;a=Q0;b=Q1;c=Q2;d=Q3;k=count*16+d*8+c*4+b*2+a;EA=0;ET0=0;EA=1;ET0=1;TR0=1;count=0;}t++;}void int1() interrupt 2{count++;}void main(){TMOD=0X21;TH0=0X3C; /* 计数初值写入TH0 */TL0=0XBF; /* 写入计数初值到TL0 */ET0=1; /* 定时器0中断允许*/EA=1; /* 全局中断允许*/TF0=0; /* 定时器0中断标志位清0 */ TR0=1; /* 定时器0准备开始*/EX1=1;IT1=1;while(1){if(k>=1 && k<1000)display3_ms();else if(k>=1000 && k<1000000)display4_khz();else if(k>=1000000 && k<=10000000)display5_mhz();}}。
频率计设计Frequency count design1实验目的1.会运用电子技术课程所学到的理论知识,独立完成设计课题。
2.学会将单元电路组成系统电路的方法。
3.熟悉中规模集成电路和半导体显示器件的使用方法。
4.经过查阅手册和文件资料,培养独立解析和解决实责问题的能力。
培养严肃认真工作作风和慎重的科学发展。
2.实验原理算法设计频率是周期信号每秒钟内所含的周期数值。
可依照这必然义采用如图 1 所示的算法。
图 2 是依照算法成立的方框图。
图 1 算法被测信号输入电阀计数电阀门显示图2 算法方框图在测试电路中设置一个闸门产生电路,用于产生脉冲宽度为 1s 的闸门信号。
该闸门信号控制闸门电路的导通与开断。
让被测信号送入闸门电路,当 1s 闸门脉冲到来时闸门导通,被测信号经过闸门并到达后边的计数电路(计数电路用以计算被测输入信号的周期数),当 1s 闸门结束时,闸门再次关闭,此时计数器记录的周期个数为 1s 内被测信号的周期个数,即为被测信号的频率。
测量频率的误差与闸门信号的精度直接相关,因此,为保证在 1s 内被测信号的周期量误差为10 3 量级,则要求闸门信号的精度为 10 ? 量级。
比方,当被测信号为 1kHz 时,在 1s 的闸门脉冲时期计数器将计数 1000 次,由于闸门脉冲精度为 10 ? ,闸门信号的误差不大于,固由此造成的计数误差不会高出1,吻合5*10 3 的误差要求。
进一步解析可知,当被测信号频率增高时,在闸门脉冲精度不变的情况下,计数器误差的绝对值会增大,但是相对误差仍在5*10 3 范围内。
但是这一算法在被测信号频率很低时便表现出严重的缺点,比方,当被测信号为时其周期是 2s,这时闸门脉冲仍是 1s 显然是不能够的,故应加宽闸门脉冲宽度。
假设闸门脉冲宽度加至 10s,则闸门导通时期能够计数 5 次,由于数值 5 是 10s 的计数结果,故在显示之间必定将计数值除以 10。
整体方框及原理图 3 测量频率原理图图 4 测量周期原理图输入电路:由于输入的信号能够是正弦波,三角波。
摘要摘要频率测量是电子学测量中最为基本的测量之一。
频率计主要是由信号输入和放大电路、单片机模块、分频模块及显示电路模块组成。
AT89C52单片机是频率计的控制核心,来完成它待测信号的计数,译码,显示以及对分频比的控制。
利用它内部的定时/计数器完成待测信号频率的测量。
在整个设计过程中,所制作的频率计采用外部分频,实现1Hz-1kHz的频率测量及1ms-100ms的脉宽测量,而且可以实现量程自动切换流程。
以AT89C52单片机为核心,通过单片机内部定时/计数器的门控时间,方便对频率计的测量。
其待测频率值使用LCD液晶显示器显示,并可以自动切换量程。
本次采用单片机技术设计一种数字显示的频率计,具有测量准确度高,响应速度快,体积小等优点。
关键词:频率计,单片机,LCD液晶显示器。
I西安交通大学城市学院本科生毕业设计(论文)I IABSTRACTABSTRACTFrequency measurement is one of the most basic measurement electronics measurement. Frequency counter is dominated by the signal input and the amplifier circuit, microcontroller module, frequency module and the display circuit module. AT89C52 microcontroller is to control the core frequency meter to complete its measured signal counting, decoding, display and control divider ratio. Use its internal timer / counter to complete the test signal frequency measurements.Throughout the design process, by making use of external parts of the frequency meter frequency to achieve frequency measurement and pulse width measurement 1ms-100ms of 1Hz-1kHz, and can realize automatic range switching processes. To AT89C52 microcontroller as the core, through the internal microcontroller timer / counter gate time, easy measurement of the frequency meter. Its measured frequency value using the LCD display, and can automatically switch range. The use of microcomputer technology to design a digital display of frequency meter, have a measurement of high accuracy, fast response, small size and so on.KEYWORDS: Frequency meter, Single chip, LCD display.III西安交通大学城市学院本科生毕业设计(论文)I V目录目录1 绪论 (1)1.1 数字频率计简介 (1)1.2 单片机系统的研究现状 (2)1.3 频率计的研究现状 (2)1.4设计的技术要求和主要内容 (3)2 等精度频率计的原理与应用 (5)2.1 等精度频率计测量的原理 (5)2.2 脉冲宽度的测量方法 (6)2.3 等精度频率计的误差分析 (6)2.4 本章小结 (8)3 硬件电路设计 (9)3.1单片机周边电路 (9)3.2 51单片机及AT89C52介绍 (9)3.2.1 单片机简介 (9)3.2.2 AT89C52简介 (10)3.2.3 管脚说明 (11)3.2.4 AT89C52主要性能 (13)3.3 各部分电路图及电路工作原理分析 (13)3.3.1 时钟脉冲电路 (13)3.3.2 同步门逻辑控制电路 (14)3.3.3 LCD显示电路 (15)3.3.4 复位电路 (17)4 软件设计 (19)4.1 KEIL51软件简介 (19)4.2 软件的模块化设计及各部说明 (19)4.2.1 定时中断模块 (19)4.2.2 测量模块 (20)4.2.3 显示模块 (20)V西安交通大学城市学院本科生毕业设计(论文)V I 4.2.4 软件流程图 (20)5 系统仿真与调试 (21)5.1 Proteus软件简介 (21)5.2 Proteus的电路仿真 (22)5.3误差分析 (24)总结 (27)致谢 (29)参考文献 (31)附录 (33)1 程序 (33)2 附图 (41)3 外文翻译 (44)绪论1 绪论1.1 数字频率计简介数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
摘要基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在实用中有较大的局限性,本设计采用单片机AT89C51作为主要的控制单元,用来完成电路的信号测试控制、数据运算处理、键盘扫描和控制数码管显示等功能,待测信号经过LM358放大后又经过74HC14形成系统需要的矩形波,然后送入复杂可编程逻辑器件(CPLD),最后由可编程逻辑器件CPLD进行各种时序控制及计数测频功能,并用8位8段LED进行显示。
关键词单片机可编程逻辑器件频率计AbstractBased on the traditional principle of measuring the frequency of the frequency of measurement accuracy will be tested with thefrequency and reduce the decline in the more practical limitations.SCM AT89C51 use this design as the main control unit, the signals used to complete the circuit test control, data processing, keyboard scanning and digital control of the show, and other functions, under test signal LM358 Larger then after a 74 HC14 system needs Rectangular waves, and then into the complex programmable logic devices (CPLD), programmable logic devices by the end CPLD various control and timing count frequency measurement functions, and with eight 8 of the LED display.Keywords: SCMC CPLD Cymometer目录1 引言 (1)1.1课题分析 (1)1.2等精度频率计在国内外发展概况 (1)1.3M AX+P LUS II简介及VHDL语言简介 (3)1.4课题要求 (6)2 等精度频率计的方案选择及原理分析 (7)2.1等精度频率计测频原理 (7)2.2系统原理框图 (9)2.3周期测量 (9)2.4脉冲宽度测量 (10)2.5周期脉冲信号占空比的测量 (10)3 等精度频率计硬件设计 (11)3.1键盘控制模块 (11)3.2显示模块 (12)3.3主控模块 (13)3.4信号输入放大和整形模块 (16)3.5音频输出电路 (17)3.6CPLD功能模块描述 (18)4 等精度频率计软件设计方案 (19)4.1VHDL语言 (19)4.2VHDL软件设计方案 (21)4.3所需VHDL文件及波形仿真结果 (22)4.4单片机的汇编语言编程 (24)5 电路系统调试 (28)6 结论 (29)致谢 (33)附录一:元器件清单 (34)附录二:程序清单 (36)附录三:原理图 (36)1 引言1.1 课题分析在现代电子系统中,数字系统所占的比例越来越大。
数字频率计VHDL程序与仿真之宇文皓月创作一、功能:频率计。
具有4位显示,能自动根据7位十进制计数的结果,自动选择有效数据的高4位进行动态显示。
小数点暗示是千位,即KHz。
二、源程序及各模块和主要语句的功能library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity plj isport (start:in std_logic;--复位信号clk:in std_logic; --系统时钟clk1:in std_logic; --被测信号yy1:out std_logic_vector(7 downto 0); --八段码w1 :out std_logic_vector(3 downto 0)); --数码管位选信号end plj;architecture behav of PLj issignal b1,b2,b3,b4,b5,b6,b7:std_logic_vector(3 downto 0); --十进制计数器signal bcd:std_logic_vector(3 downto 0); --BCD码寄存器signal q :integer range 0 to 49999999; --秒分频系数signal qq : integer range 0 to 499999; --动态扫描分频系数signal en,bclk:std_logic; --使能信号,有效被测信号signal sss : std_logic_vector(3 downto 0); --小数点signal bcd0,bcd1,bcd2,bcd3 : std_logic_vector(3 downto0);--寄存7位十位计数器中有效的高4位数据beginsecond:process(clk) --此进程发生一个持续时间为一秒的的闸门信号beginif start='1' then q<=0;elsif clk'event and clk='1' thenif q<49999999 then q<=q+1;else q<=49999999;end if;end if;if q<49999999 and start='0' then en<='1';else en<='0';end if;end process;and2:process(en,clk1) --此进程得到7位十进制计数器的计数脉冲beginbclk<=clk1 and en;end process;com:process(start,bclk) --此进程完成对被测信号计脉冲数beginif start='1' then --复位b1<="0000";b2<="0000";b3<="0000";b4<="0000";b5<=" 0000";b6<="0000";b7<="0000";elsif bclk'event and bclk='1' thenif b1="1001" then b1<="0000"; --此IF语句完成个位十进制计数if b2="1001" then b2<="0000"; --此IF语句完成百位十进制计数if b3="1001" then b3<="0000"; --此IF语句完成千位十进制计数if b4="1001" then b4<="0000"; --此IF语句完成万位十进制计数if b5="1001" THEN b5<="0000"; --此IF语句完成十万位十进制计数if b6="1001" then b6<="0000"; --此IF语句完成百万位十进制计数if b7="1001" then b7<="0000"; --此IF语句完成千万位十进制计数else b7<=b7+1;end if;else b6<=b6+1;end if;else b5<=b5+1;end if;else b4<=b4+1;end if;else b3<=b3+1;end if;else b2<=b2+1;end if;else b1<=b1+1;end if;end if;end process;process(clk) --此进程把7位十进制计数器有效的高4位数据送入bcd0~3;并得到小数点信息beginif rising_edge(clk) thenif en='0' thenif b7>"0000" then bcd3<=b7; bcd2<=b6; bcd1<=b5; bcd0<=b4; sss<="1110";elsif b6>"0000" then bcd3<=b6; bcd2<=b5; bcd1<=b4; bcd0<=b3; sss<="1101";elsif b5>"0000" then bcd3<=b5; bcd2<=b4; bcd1<=b3; bcd0<=b2; sss<="1011";else bcd3<=b4; bcd2<=b3; bcd1<=b2; bcd0<=b1; sss<="1111";end if;end if;end if;end process;weixuan:process(clk) --此进程完成数据的动态显示beginif clk'event and clk='1' thenif qq< 99999 then qq<=qq+1;bcd<=bcd3; w1<="0111";if sss="0111" then yy1(0)<='0';else yy1(0)<='1';end if;elsif qq<199999 then qq<=qq+1;bcd<=bcd2; w1<="1011";if sss="1011" then yy1(0)<='0';else yy1(0)<='1';end if;elsif qq<299999 then qq<=qq+1;bcd<=bcd1; w1<="1101";if sss="1101" then yy1(0)<='0';else yy1(0)<='1';end if;elsif qq<399999 then qq<=qq+1;bcd<=bcd0; w1<="1110";if sss="1110" then yy1(0)<='0';else yy1(0)<='1';end if;else qq<=0;end if;end if;end process;m0: process (bcd) --译码begincase bcd iswhen "0000"=>yy1(7 downto 1)<="0000001"; when "0001"=>yy1(7 downto 1)<="1001111"; when "0010"=>yy1(7 downto 1)<="0010010"; when "0011"=>yy1(7 downto 1)<="0000110"; when "0100"=>yy1(7 downto 1)<="1001100"; when "0101"=>yy1(7 downto 1)<="0100100"; when "0110"=>yy1(7 downto 1)<="1100000"; when "0111"=>yy1(7 downto 1)<="0001111"; when "1000"=>yy1(7 downto 1)<="0000000"; when "1001"=>yy1(7 downto 1)<="0001100"; when others=>yy1(7 downto 1)<="1111111"; end case;end process;end behav;三、程序仿真图注:仿真中秒分频为50000,动态显示的分频系数也相应调小。
完整word版,数字频率计仿真实验报告编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(完整word版,数字频率计仿真实验报告)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为完整word版,数字频率计仿真实验报告的全部内容。
上海电力学院课题名称数字频率计课题代码 201 院(系)电力与自动化工程学院专业电气工程及其自动化班级学号及姓名时间指导教师签名:教研室主任(系主任)签名:任务书一、目的1、了解并掌握电子电路的一般设计方法,具备初步的独立设计能力.2、通过查阅手册和文献资料,进一步熟悉常用电子器件的类型和特性,并掌握合理选用的原则;进一步掌握电子仪器的正确使用方法。
3、学会使用EDA软件Multisim对电子电路进行仿真设计.4、初步掌握普通电子电路的安装、布线、调试等基本技能.5、提高综合运用所学的理论知识独立分析和解决问题的能力,学会撰写课程设计总结报告;培养严肃认真的工作作风和严谨的科学态度。
二、设计内容、要求及设计方案1、任务设计并制作1个数字式频率计。
2、基本要求1)被测信号为TTL脉冲信号。
2)显示的频率范围为00~99Hz。
3)测量精度为±1 Hz.4)用LED数码管显示频率数值.3、扩展部分1)输入信号为正弦信号、三角波,幅值为l0mV。
2)显示的频率范围为0000~9999Hz.3)提高测量的精度至0.1Hz.4、设计方案频率是指单位时间(1s)内信号振动的次数。
从测量的角度看,即单位时间测得的被测信号的脉冲数。
电路的方框图如图1所示。
被测信号送入通道,经放大整形后,使每个周期形成一个脉冲,这些脉冲加到主门的A输入端,门控双稳输出的门控信号加到主门的B输入端。
等精度频率计设计C程序下面是一个用C语言编写的精度频率计程序。
该程序使用了时钟计时器来测量输入信号的频率,并计算出其精确频率。
```c#include <stdio.h>#define MEASUREMENT_TIME 1 // 测量时间(单位:秒)unsigned long long getTickCounint maiunsigned long long startTick, endTick;double elapsedTime, frequency;printf("精度频率计\n");printf("请将输入信号连接到计算机的输入端口。
\n");printf("按下Enter开始测量,测量时间为%d秒...\n", MEASUREMENT_TIME);getchar(;//开始计时startTick = getTickCount(;//测量信号频率unsigned int pulseCount = 0;unsigned int prevState = 0;unsigned int currState;while (1)currState = /* 读取输入端口的状态值 */;if (prevState == 0 && currState == 1)pulseCount++;}prevState = currState;endTick = getTickCount(;elapsedTime = (endTick - startTick) * 1e-9; // 转换为秒if (elapsedTime >= MEASUREMENT_TIME)break;}}frequency = pulseCount / elapsedTime;printf("测量时间: %.2lf秒\n", elapsedTime);printf("测量得到的频率: %.2lf Hz\n", frequency);return 0;```以上程序基于以下假设:-输入信号的频率范围适合用计算机进行测量和计算。
8.17 采用等精度测频原理的频率计的程序与仿真
--文件名:PLJ.vhd。
--功能:4位显示的等精度频率计。
--最后修改日期:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity PLJ is
port(clk:in std_logic; --基准时钟(10KHz) tclk:in std_logic; --被测信号
start:in std_logic; --复位信号
alarm0,alarm1:out std_logic; --超量程,欠量程显示
dian:out std_logic_vector(3 downto 0); --小数点
data1:out integer range 0 to 9999); --频率数据
end PLJ;
architecture behav of PLJ is
signal q:integer range 0 to 9999; --预置闸门分频系数signal q1:integer range 0 to 10000; --被测信号计数器
signal q2:integer range 0 to 20000; --基准信号计数器
signal en,en1:std_logic; --预置闸门,实际闸门signal qq,qqq:integer range 0 to 200000000; --运算器
signal data0:integer range 0 to 9999; --频率数据中间信号
begin
process(clk) --此进程得到一个预置闸门信号
begin
if clk'event and clk='1' then
if start='1' then q<=0;en<='0';
elsif q=9999 then q<=9999;en<='0';
else q<=q+1;en<='1';
end if;
end if;
end process;
process(tclk) --此进程计被测信号脉冲数,和得到一个实际闸门信号
begin
if tclk'event and tclk='1' then
if start='1' then q1<=0;en1<='0';
elsif en='1' then q1<=q1+1;en1<='1';
else en1<='0';
end if;
end if;
end process;
process(clk) --此进程完成在实际闸门时间内,计基准脉冲数
begin
if clk'event and clk='1' then
if start='1' then q2<=0;
elsif en1='1' then
if q2=20000 then q2<=20000;
else q2<=q2+1;
end if;
end if;
end if;
end process;
process(clk) --此进程完成等精度频率计的运算
begin
if clk'event and clk='1' then
if start='1' then data0<=0;dian<="0000";alarm0<='0';alarm1<='0';qqq<=0;qq<=00;
elsif en1='0' then
if q1>=1000 then qq<=q1*10000; --根据q1的大小来判断小数点的位置if qqq<qq then qqq<=qqq+q2;data0<=data0+1;dian<="0000"; --完成数据运算
elsif data0>=10000 then alarm0<='1'; --超量程显示
else data1<=data0;
end if;
elsif q1>=100 then qq<=q1*100000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0000";
else data1<=data0;dian<="0010";
end if;
elsif q1>=10 then qq<=q1*1000000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0010";
else data1<=data0;dian<="0100";
end if;
elsif q1>=1 then qq<=q1*10000000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0100";
else data1<=data0;dian<="1000";
end if;
end if;
elsif q2>19999 then alarm1<='1'; --欠量程显示
else alarm1<='0';
end if;
end if;
end process;
end behav;
等精度频率计仿真图
说明:小数点dian在en1的下降沿就输出,在某些特殊情况(1000tclk=clk仿真图所示),只有当数据转换完成时,小数点dian的信号才能保证正确。
用数据作为闸门来控制小数点dian信号输出,这部分可以在译码部分完成。
等精度频率计仿真图—欠量程
等精度频率计仿真图—超量程
等精度频率计仿真图—5tclk=clk
等精度频率计仿真图—9tclk=clk
等精度频率计仿真图—50tclk=clk
等精度频率计仿真图—80tclk=clk
等精度频率计仿真图—300tclk=clk
等精度频率计仿真图—1000tclk=clk
等精度频率计仿真图—5000tclk=clk
等精度频率计仿真图—6000tclk=clk
等精度频率计仿真图—10000tclk=clk。