找回密码
 注册
关于网站域名变更的通知
查看: 176|回复: 1
打印 上一主题 下一主题

优秀滤波算法应用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-9 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
优秀滤波算法应用

( \- J  b8 Z( G! b8 g& E1 ]; d
, V$ |  ]2 e# R: U  a; d
       我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开。抖动时间由按键的机械特性所决定,一般为5ms~10ms。所以我们在做按键检测时都要加一个消抖的过程。按键消抖主要有两种方案:一是硬件消抖;二是软件消抖。下面结合一个例程来看看老外是如何实现软件消抖的。
entity top is
/ m1 @2 q) C2 g! n* B  y    Port ( btn_0 : in  STD_LOGIC;) Q6 J* j7 h: Z" x8 @
           clk : in  STD_LOGIC;$ r1 E& K' X/ r# X% i. n% C0 u, c
           led : out  STD_LOGIC);
6 i/ _# o2 K+ F- F8 `: n3 ?) send top;
architecture Behavioral of top is) M4 F# g0 E9 A- y; X
constant CNTR_MAX : std_logic_vector(15 downto 0) := (others => '1');. i: I& z7 V, O: f- Y0 h6 Q0 {
signal btn0_cntr : std_logic_vector(15 downto 0) := (others => '0');
5 F: I! a5 C; Lsignal led_r : std_logic := '0';
; `- Z8 O5 }& ]signal btn0_reg : std_logic := '0';4 ^; _5 k' e+ }- _* h
begin
( C" b; G! R1 B6 Q" Nbtn0_debounce_process : process (CLK)
7 T" d' V9 A; W% w: N. v' P9 ebegin
9 Q  G% b! Y- G if (rising_edge(CLK)) then
  U( K5 j% z" \3 J+ _' \$ O  if (btn0_cntr = CNTR_MAX) then
1 I% D3 I  L0 h+ C' d% h5 x" k   btn0_reg <= not(btn0_reg);
7 d- X. h+ L$ O2 u( y( {  f  end if;
, _3 k+ D8 g( P& G- s end if;
7 Q0 Z4 c" [* x% c0 B6 C' cend process;
- ~+ J2 F$ D1 \" Dbtn0_counter_process : process (CLK)
8 ~1 k/ Q3 v2 z9 _% B% h; qbegin. K6 }" `' h2 \
if (rising_edge(CLK)) then: L3 N4 h& y/ Q: s  e" [
  if ((btn0_reg = '1') xor (btn_0 = '1')) then2 Y  l, B" X& D4 ^; T/ ^
   if (btn0_cntr = CNTR_MAX) then
. N5 o3 A9 c9 Q# r- A- N    btn0_cntr <= (others => '0');
, v1 K: c7 y  L4 e$ R. {+ B   else) L. B! n4 ^8 Y9 o
    btn0_cntr <= btn0_cntr + 1;
; j) \% q- ~& z5 y0 S# Y# d   end if;; v3 y% E: s! T- ~( m# o* D: G
  else3 ^  v) g) l1 Z) g0 A
   btn0_cntr <= (others => '0');/ l# e8 [4 m+ ?6 f
  end if;
1 W6 e6 p2 g7 J! U end if;* x1 a0 `' B4 T2 m/ }* W4 [
end process;
$ T- {* G' f, X4 m3 Z( @process(btn0_reg)
/ H2 |- \0 T- U  u& Gbegin+ G$ s! x; t( Y( N! F5 {: K
if rising_edge(btn0_reg) then8 \8 j# r9 ]7 {5 J; T) x
  led_r <= not (led_r);" w2 F5 M. ~7 ]6 i# B
end if;# g- z7 t( U) M# u& ^+ v9 m
end process;! n4 E0 L" ^& F
led <= led_r;
- ~' R. J. E% w/ _3 b) v& y" X' Qend Behavioral;% V4 a& ]0 K  U, |6 Z% d5 M# s' ?
       一般人的做法是:当第一次检测到按键被按下后,执行一个延时程序,产生一个5ms~10ms的延时程序,然后再一次检测按键的状态,如果仍保持按键闭合状态电平,则认为确实有按键按下。这种办法不失为一种不错的解决方案,但是不同按键的机械特性不同,就算是同一型号按键机械特性或多或少也会有所不同,这样一来,延时时间不好确定。而上面的这段代码很好的解决了这一问题,下面我们来具体分析一下。当有按键按下
$ p" S  I- H5 ^% Dbtn_0 = '1',计数器启动开始计数,并且不断检测按键的状态。如果是抖动,计数器会被清零;如果按键闭合状态时的电平保持一段时间不发生变化,我们就认为当前有按键按下。同理,按键释放时也会执行类似的过程。按上述分析,我们会得到如下结论:btn0_reg出现上升沿代表有按键按下。上述例程的实验现象是:随着按键的按下LED交替点亮熄灭。
' i4 ^9 R7 H$ H3 ^- Q. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-3 09:15 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表