等精度频率计

  • 执念
  • LV4工程师
  • |      2015-03-29 20:35:22
  • 浏览量 3072
  • 回复:26

 等精度频率计实现功能包括:测频、测周、测占空比三种功能,用可编程逻辑门器件FPGA作为核心器件进行编程和采集信号以及数据运算输出,实验采用等精度法和测周法进行数据采集和处理,最大达到兆赫兹最小达到零点几赫兹,测量范围很广,采集数据的准确度很高。      以下是实物图:

等精度频率计

等精度频率计等精度频率计


从图中可以看出程序分成六个模块,分别为分频(CP)、测周(CZ)、测频(CP)、测占空比(C_PWM)、显示(display)、功能转换(func_switch)。

分频模块:

等精度频率计


module FP (clk,rst,clk_5mhz,clk_1mhz);

input clk,rst;                                    //已知信号 clk  复位  rst

output clk_5mhz;                                  //5m赫兹分频   

output clk_1mhz;                                  //1m赫兹分频  

reg cnt_fp5m;                               //产生5MHZ计数

reg clk_5mhz;

always@(posedge clk or negedge rst)

      begin

           if(!rst)

                 begin

                      cnt_fp5m<=0;

                 end

           else

                 begin

                      cnt_fp5m<=cnt_fp5m+8\'d1;

                      if(cnt_fp5m==8\'d5)

                            begin

                                  clk_5mhz<=~clk_5mhz;

                                  cnt_fp5m<=0;

                            end

                 end

      end

reg cnt_fp1m;                               //产生1MHZ计数

reg clk_1mhz;

always@(posedge clk or negedge rst)

      begin

           if(!rst)

                 begin

                      cnt_fp1m<=0;

                 end

           else

                 begin

                      cnt_fp1m<=cnt_fp1m+5\'d1;

                      if(cnt_fp1m==5\'d24)

                            begin

                                  clk_1mhz<=~clk_1mhz;

                                  cnt_fp1m<=0;

                            end

                 end

      end

endmodule

 

本模块通过对标准信号clk(50M)的计数,当计数个数达到所对应的时间则标志位进行反转达到分频作用,用两个计数器cnt_fp1m和cnt_fp5m分出1M和5M的频率,输出信号clk_5mhz和clk_1mhz用以后年对信号的采集使用。在本模块中要注意的是:对于计数器的位宽设定这对于程序优化很有帮助,可以优化资源提高资源利用率。

测频模块:


等精度频率计



本模块是测频率模块,也是最重要的一个模块,这个模块需要分为两个部分进行数据采集,一个是小于1KHz另一个是大于1KHz信号,大于1KHz采集用的方法是等精度法采集,小于1KHz信号用测周法进行采集数据,这样能够很精确的测量数据,下面具体分析各种方法。等精度法进行大于1KHz信号采集,在测量过程中,有两个计数器分别对标准信号和被测信号计数,首先开启预置闸门(预置闸门上升沿),此时计数器不开始计数,而是等到被测信号上升沿到来时计数器才真正开始计数,然后等到预置闸门关闭信号(下降沿)到时,计数器并不停止计数而是等到被测信号上升沿到来时才结束计数,完成一次测量过程,这样实际闸门与预置闸门相差不到一个周期。产生结果进行缓存输出。闸门信号通过判断敏感信号触发形式来开启和关闭。在缓存输出中注意:数据清零、缓存和输出这之间的转换,本人在写程序中遇到了很纠结的是这之间关系混乱造成数据一直为0,原因是数据一直清零,最终确定的方法是通过设定和判断标志位和敏感触发信号的设定来进行缓存、输出、清零,使状态处于很有条理的装态,通过写频率计深感在写多个状态执行操作时要么用状态机要么用标志位,在复杂的状态中用状态机,本人状态机写得不是很好,这次没用状态机,但是状态机确实很重要!言归正传继续等精度方法,测出的实际信号个数cnt_c1和未知信号个数cnt_x1通过u以下运算公式进行运算

fre_f<=(5000000/cnt_c1)*cnt_x1

以上是大于1KHz,小于1KHz而言等精度则在测量误差上就很大了,则采用测周法进行,测周法时在待测信号的一个周期内记录标准信号的周期数或者脉冲数,通过公式:

fre_f<=1000000000/data2运算输出。需要注意小于1KHz要扩大1000倍。通过测周法概念可以看出测周法比等精度发简单,在之间只需要通过判断被测信号上升沿和下降沿然后再相应触发条件下进行计数就可以完成。

测周模块:





本模块还是通过等精度法进行测量,前面闸门设置,基准信号被测信号计数和数据缓存输出与测频的方法一样,但是在计算公式上分为两种一种为大于1KHz另一种当然小于1KHz,公式如下:

      cnt1_x1<1000

      fre_z<=(cnt1_c1/cnt1_x1)/50;//运算公式

      cnt1_x1>1000                           

fre_z<=(cnt1_c1/cnt1_x1)*20;//运算公式

      在测量数据中cnt1_x1<1000 单位要换成Hz,需要扩大1000倍所以两个公式除了相差1000倍其他原理一样。




侧占空比:



本模块通过判断被测信号上升沿和下降沿的触发信号来分别计高电平持续时间和低电平持续时间,还是通过技术器来计数通过缓存输出,对数据进行运算。在这之中要注意的是运算公式

fre_pwm<=(cnt3_xh*100000)/(cnt3_xh+cnt3_xl)  在公式中一定要根据自己设定的基准信号频率来扩大相应倍数,本人用的是50M的所以在基准信号中扩大1000000倍才能够显示数据。

显示模块:



本模块主要对数据进行数码管显示,通过数码管扫描显示数据。




功能转换模块:



本模块是把这三块功能和显示进行设定显示,还是通过标准位设定,用按键来转换三个功能并用数码管显示。最重要的是标志位设定和按键出来,按键要加上防抖程序是程序更加稳定。

这是完整版的,都总结在这里!希望大家多多支持,发帖不易...


  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:25
Smart Idiot 2016-07-29
可以采集正弦波嘛?Altera可以用NCO那个IP做频率计
0   回复
举报
发布
update 2016-07-28
谢谢楼主的分享
0   回复
举报
发布
肥肥飞飞 2016-07-12
可以下载不?
0   回复
举报
发布
风中飞 2015-08-29
下下来看看
0   回复
举报
发布
追梦的阿土哥 2015-08-29
这是今年瑞萨杯的F题吗?楼主你们真厉害~
0   回复
举报
发布
dadaxiu 2015-08-21
谢谢分享!!
0   回复
举报
发布
starysoul 2015-08-20
不错啊,谢谢分享!
0   回复
举报
发布
Anlish. 2015-08-18
厉害厉害
0   回复
举报
发布
视觉℡ 2015-08-18
看看        
0   回复
举报
发布
HelloWii 2015-04-08
感谢楼主分享。。学习一下。。。
0   回复
举报
发布
查看更多
x
收藏成功!点击 我的收藏 查看收藏的全部帖子