个人笔记。
最近在做一个编码器实验,发现采集到的编码器信号会出现一些毛刺来干扰数据。
现场发现可能是以下原因产生的
1、编码器本身产生的影响。
2、编码器与FPGA连接处产生的干扰。
3、现场其他设备产生的磁场对它的干扰。
对于毛刺的解决主要有两种方法,分为硬件上和软件上解决。
硬件上可以在编码器与FPGA连接处加上电容电阻来滤波。
软件上可以设计程序实现滤波去毛刺。
首先可以取多个信号点,然后判别大多数信号点是高电平还是低电平,最后将滤波完的信号置高还是置低。
integer i;
integer a_sum; //取和
reg a_buf[99:0]; //取信号点
reg r_a; //滤波完的信号
//a信号采集50个数
always @(posedge i_clk or negedge i_rst_n) begin
if(!i_rst_n)begin end
else
begin
a_buf[0]<=i_a;
for(i=1;i<64;i=i+1)
begin
a_buf[i]<=a_buf[i-1];
end
end
end
//对a信号50个数求和
always @(posedge i_clk or negedge i_rst_n) begin//x(1) * h(1)
if(!i_rst_n)begin a_sum <=0; end
else
begin
a_sum <= a_buf[0]+ a_buf[1]+ a_buf[2]+ a_buf[3]+ a_buf[4]+ a_buf[5]+ a_buf[6]+
a_buf[7]+ a_buf[8]+ a_buf[9]+ a_buf[10]+ a_buf[11]+ a_buf[12]+ a_buf[13]+ a_buf[14]+ a_buf[15]+ a_buf[16]+ a_buf[17]+a_buf[18]+ a_buf[19]+ a_buf[20]+ a_buf[21]+ a_buf[22]+ a_buf[23]+ a_buf[24]+ a_buf[25]+ a_buf[26]+ a_buf[27]+a_buf[28]+ a_buf[29]+ a_buf[30]+ a_buf[31]+ a_buf[32]+ a_buf[33]+ a_buf[34]+ a_buf[35]+ a_buf[36]+ a_buf[37]+a_buf[38]+ a_buf[39]+ a_buf[40]+ a_buf[41]+ a_buf[42]+ a_buf[43]+ a_buf[44]+ a_buf[45]+ a_buf[46]+ a_buf[47]+a_buf[48]+ a_buf[49];
end
end
always @(posedge i_clk or negedge i_rst_n) begin
if(!i_rst_n)begin r_a<=0; end
else
begin
if(a_sum>25) begin r_a <=1;end //和大于25取高电平
else begin r_a <=0;end //和小于25取低电平
end
end
网上找的计数器消抖去毛刺方法
//10ms计数器,用于消抖。
reg D_10ms;
reg [31:0]cnt;
always@(posedge clk,negedge rst_n)
begin
if(!rst_n)begin
cnt <= 0;
D_10ms <= 1'b0;
end
else begin
if(cnt < 32'd49_9999)begin//10ms消抖 // 根据主频情况此值设置可变49999
cnt <= cnt + 1'b1;
D_10ms <= 1'b0;
end
else begin
cnt <= 0;
D_10ms <= 1'b1;
end
end
end
//同步消抖 A、B
reg A_buf,A_buf0;
reg B_buf,B_buf0;
wire A_Debounce; //消完抖A
wire B_Debounce; //消完抖B
always@(posedge clk,negedge rst_n)begin
if(!rst_n)begin
A_buf <= 1'b1;
A_buf0 <= 1'b1;
B_buf <= 1'b1;
B_buf0 <= 1'b1;
end
else begin
if(D_10ms)begin
A_buf <= A;
A_buf0 <= A_buf;
B_buf <= B;
B_buf0 <= B_buf;
end
end
end
assign A_Debounce = A_buf0 && A_buf && A;
assign B_Debounce = B_buf0 && B_buf && B;