今天把(二)的方法介绍下,和大家分享,若有错误,欢迎指正。
传感器的数据采集和数据滤波处理是在FPGA上实现的,滤波采用了简单的滑动滤波,先把代码贴出来:
reg [17:0] adder_sum; //累加和
//求滑动滤波
always @ (posedge adc_clk) begin
adder_sum <= {data_buf1[15],data_buf1} + {data_buf2[15],data_buf2} +
{data_buf3[15],data_buf3} + {data_buf4[15],data_buf4};
end
always @ (posedge adc_clk or negedge adc_rst) begin
if (!adc_rst)
filter_val <= 16'h0;
else
filter_val <= adder_sum[17:2];
end
下面分析为啥用 /4的方法。
1、现场条件:现场传感器在静态时测量的数据为:
分析传感器的数据波动的周期在60Hz左右,基本上和工频电源的频率一致;传感器的重复测量频率在600Hz左右。
2、软件设计:FPGA芯片的时钟为25MHz,AD芯片的SPS采用300KHz,16位AD,采用24位移动方法,采样后再通过FIFO实现串并转换,其FPGA代码为:
//ADC 获取数据
reg [15:0] load_data_r;
always @ (posedge sclk_clk or negedge adc_rst) begin
if (!adc_rst)
load_data_r <= 16'h0;
else if (!load_data1 && !load_data2 && !load_data3 && clk_cnt_r == 4)
load_data_r[0] <= sda_ch;
。。。
else
load_data_r <= load_data_r;
end
//ADC 数据同步控制
wire [15:0] loadl_data;
wire adc_fifo_empty;
adc_fifo_bb adc_fifo_bb_inst(
.aclr (~adc_rst),
.data (load_data_r), //采样数据串行输入
.rdclk (adc_clk), //采样时钟
.rdreq (!adc_fifo_empty),//读请求
.wrclk (sclk_clk),
.wrreq (clk_cnt_r == 25),//写请求
.q (loadl_data), //数据并行输出
.rdempty (adc_fifo_empty), //数据有效
.wrfull ()
);
3、截止频率:设计采样截止频率为2KHz,所以滑动滤波截止频率计算方法为:
fco = (0.443 x fs)/N 其中,N为平均的点数,fs为采样频率,fco为截止频率,当N=4时,截止频率为:
fco = (0.443 x 20000)/4 = 2215hz,满足设计要求。
即,实际的截止频率=2.2KHz。
总结:实际测量数据还行,数据的曲线见上篇文章。
联系方式:masmin@163.com