[求助] 用FPGA做频率为50hz的电压采集

yuechenping   2014-4-16 11:46 楼主

用FPGA做频率为50hz的电压采集,刚开始能显示采集到电压值和采集的电压频率为50hz,上电一段时间(几个小时)后,电压值正常,但是频率采集不到了,变为了0,请问大侠们这是什么原因啊?急用!!!

回复评论 (12)

频率的处理算法是否有问题啊
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2014-4-16 12:51
说说你的频率是怎样采集的?
training
点赞  2014-4-16 12:55
这个显然是设计问题,但具体是哪里的问题就无法从楼主的描述中获知了。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2014-4-16 16:26
引用: chunyang 发表于 2014-4-16 16:26
这个显然是设计问题,但具体是哪里的问题就无法从楼主的描述中获知了。

硬件问题,还是软件啊?我的采集频率是10Mhz,下面是我的频率计算方法:
module freq(
    input f_in,
    input f_start,
//    output reg f_end,
    output reg [15:0] freq_datah16,
         output reg [7:0] freq_datal8,
         output reg  freq2_rate_state,   //added 101015
    input clk_f   //100623: clock : 10Mhz
    );


   //-----------------freq_measure fsm------------------------------
   reg [23:0] freqcount = 0;

        parameter st0 = 0;
   parameter st1 = 1;
   parameter st2 = 2;
   parameter st3 = 3;
   parameter st4 = 4;
        parameter st5 = 5;
   parameter st6 = 6;
        parameter st7 = 7;
   parameter st8 = 8;


   reg [3:0] state = st0;
        //added 101019
        reg [23:0] f_mea_cnt;

       
   always@( posedge clk_f )
    begin
        case (state)
            st0 : begin                                      //idle
                                      if(f_start)
                                                state <= st1;
                                                else
                                                state <= st0;
                                               
                  freqcount <= 0;
                            freq_datah16 <= 0;
                                                freq_datal8 <= 0;
                                                freq2_rate_state <= 0;
                  end
             st1 : begin                                         
                                      if(!f_in)
                                                state <= st2;
                                                else if (f_mea_cnt >= 300000)
                                                state <= st6;
                                                else
                                                state <= st1;
                               
                                           freqcount <= 0;
                                           f_mea_cnt <= f_mea_cnt + 1;
                  end
                                st2 : begin                    
                                           if( f_in )
                  state <= st3;
                                                else if (f_mea_cnt >= 300000)
                                                state <= st6;
                                                else
                                      state <= st2;
                                                 
                                                freqcount <= freqcount +1;
                  f_mea_cnt <= f_mea_cnt + 1;
                                               
                                                end
                                st3 : begin     
                  if(!f_in)                               
                                      state <= st4;
                                                else if (f_mea_cnt >= 300000)
                                                state <= st6;
                                                else
                                                state <= st3;
                                               
                                                freqcount <= freqcount + 1;
                  f_mea_cnt <= f_mea_cnt + 1;
                                                end                               
                                st4 : begin
                                                state <= st1;
                                               
                                                if(freq2_rate_state == 1)
                                                freq2_rate_state <= 0;
                                                else
                                                freq2_rate_state <= 1;
                                               
                                                freq_datah16 <= freqcount[23:8];
                                                freq_datal8 <= freqcount[7:0];
                                 f_mea_cnt <= 0;
                                                end

                          st5 : begin     
                                
                  state <= st1;
                                               
                                                freqcount <= 0;
                  end
                          st6 : begin     
                                
                  state <= st1;
                                               
                                                freqcount <= 0;
                                                freq_datah16 <= 0;
                                                freq_datal8 <= 0;
                                                f_mea_cnt <= 0;
                                                freq2_rate_state <= 1;
                  end
                          
       default: begin  // Fault Recovery
               state <= st0;
                                       
                 freqcount <= 0;
                           freq_datah16 <= 0;
                                          freq_datal8 <= 0;                               
        end
         endcase

   end
          
          
          

endmodule

点赞  2014-4-17 09:15
引用: chenzhufly 发表于 2014-4-16 12:51
频率的处理算法是否有问题啊

频率算法是:
module freq(
    input f_in,
    input f_start,
//    output reg f_end,
    output reg [15:0] freq_datah16,
         output reg [7:0] freq_datal8,
         output reg  freq2_rate_state,   //added 101015
    input clk_f   //100623: clock : 10Mhz
    );


   //-----------------freq_measure fsm------------------------------
   reg [23:0] freqcount = 0;

        parameter st0 = 0;
   parameter st1 = 1;
   parameter st2 = 2;
   parameter st3 = 3;
   parameter st4 = 4;
        parameter st5 = 5;
   parameter st6 = 6;
        parameter st7 = 7;
   parameter st8 = 8;


   reg [3:0] state = st0;
        //added 101019
        reg [23:0] f_mea_cnt;

       
   always@( posedge clk_f )
    begin
        case (state)
            st0 : begin                                      //idle
                                      if(f_start)
                                                state <= st1;
                                                else
                                                state <= st0;
                                               
                  freqcount <= 0;
                            freq_datah16 <= 0;
                                                freq_datal8 <= 0;
                                                freq2_rate_state <= 0;
                  end
             st1 : begin                                         
                                      if(!f_in)
                                                state <= st2;
                                                else if (f_mea_cnt >= 300000)
                                                state <= st6;
                                                else
                                                state <= st1;
                               
                                           freqcount <= 0;
                                           f_mea_cnt <= f_mea_cnt + 1;
                  end
                                st2 : begin                    
                                           if( f_in )
                  state <= st3;
                                                else if (f_mea_cnt >= 300000)
                                                state <= st6;
                                                else
                                      state <= st2;
                                                 
                                                freqcount <= freqcount +1;
                  f_mea_cnt <= f_mea_cnt + 1;
                                               
                                                end
                                st3 : begin     
                  if(!f_in)                               
                                      state <= st4;
                                                else if (f_mea_cnt >= 300000)
                                                state <= st6;
                                                else
                                                state <= st3;
                                               
                                                freqcount <= freqcount + 1;
                  f_mea_cnt <= f_mea_cnt + 1;
                                                end                               
                                st4 : begin
                                                state <= st1;
                                               
                                                if(freq2_rate_state == 1)
                                                freq2_rate_state <= 0;
                                                else
                                                freq2_rate_state <= 1;
                                               
                                                freq_datah16 <= freqcount[23:8];
                                                freq_datal8 <= freqcount[7:0];
                                 f_mea_cnt <= 0;
                                                end

                          st5 : begin     
                                
                  state <= st1;
                                               
                                                freqcount <= 0;
                  end
                          st6 : begin     
                                
                  state <= st1;
                                               
                                                freqcount <= 0;
                                                freq_datah16 <= 0;
                                                freq_datal8 <= 0;
                                                f_mea_cnt <= 0;
                                                freq2_rate_state <= 1;
                  end
                          
       default: begin  // Fault Recovery
               state <= st0;
                                       
                 freqcount <= 0;
                           freq_datah16 <= 0;
                                          freq_datal8 <= 0;                               
        end
         endcase

   end
          
          
          

endmodule

点赞  2014-4-17 09:15
引用: yuechenping 发表于 2014-4-17 09:15
频率算法是:
module freq(
    input f_in,

采集进来的电压信号已经转换成方波信号了!
点赞  2014-4-17 10:01
关键是 零点检测

你描述一下你的 零点检测 怎么做的
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2014-4-17 11:41
引用: chenzhufly 发表于 2014-4-17 11:41
关键是 零点检测

你描述一下你的 零点检测 怎么做的

这个硬件和FPGA程序都是前人所做的,我现在接手修改,很多方面都不是很懂!你说的零点检测是指电压的零点检测还是程序里面啊?
点赞  2014-4-17 11:50
指电压的零点检测

你如何转成方波的
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2014-4-17 11:51
引用: chenzhufly 发表于 2014-4-17 11:51
指电压的零点检测

你如何转成方波的

这个就是电压转换的电路,转换成方波的电路
  • 11.png
点赞  2014-4-17 11:56
测过这个方波标准不?
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2014-4-17 13:28
引用: chenzhufly 发表于 2014-4-17 13:28
测过这个方波标准不?

这个板子以前用过,能测出来的,所以是方波没问题的
点赞  2014-4-17 14:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复