按键消抖的原理和基于fpga的消抖设计
按键消抖的原理和基于fpga的消抖设计
按键消抖1功能概述按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。
实际应用中,按键开关通常为机械式弹性开关。
当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。
为保证系统及时正确识别,必须对这种情况作出相应处理。
我们称之为按键消抖。
按键消抖可分为硬件消抖和软件消抖。
硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。
如果按键较多,则使用软件消抖。
软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。
需要注意的是,软件消抖需要占据一定的系统资源。
尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。
而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。
优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。
在本例中,我们的只需要用4个信号界定,并用很短的代码即可。
下面我们先来看看功能要求:在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。
在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。
2 设计思路一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。
1图1 按键抖动过程示意当系统检测出按键闭合后,执行一个延时程序,产生5ms~10ms的延时;前沿抖动消失后,再一次检测键的状态;如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
【豆丁-精品】-基于FPGA的按键消抖动设计
2009年11月吉林师范大学学报(自然科学版)№.4第4期Journal of Jilin Normal University (Natural Science Edition )Nov.2009收稿日期:2009209222 基金项目:吉林省信息产业厅专项发展基金项目(2007042)作者简介:许德成(19772),男,吉林省辽源市人,现为吉林师范大学信息技术学院讲师,硕士.研究方向:基础电子技术,单片机及可编程逻辑器件技术.基于FPG A 的按键消抖动设计许德成(吉林师范大学信息技术学院,吉林四平136000)摘 要:在研制测量仪表、电子仪器及电子设计的过程中,按键是常用器件,而按键的弹跳现象是数字系统设计中存在的客观问题.这就要求电路具有消抖措施,即对于由于机械弹跳产生的噪声信号经过消抖电路滤除,保证电路能够正确的响应.本文介绍了基于FPG A 的两种消除按键抖动的方法,并给出了相应的VH D L 代码以及仿真图形,从而解决了按键的机械抖动影响,保证电路稳定工作.关键词:机械抖动;仿真图形;电路中图分类号:T N912 文献标识码:A 文章编号:1674238732(2009)04201542030 引言我们通常所用的按键都为机械触点开关.由于机械触点存在弹性作用,当我们按下按键或松开按键时,都不可避免的要在触点闭合及断开的瞬间产生有一连串的键抖动.其按键信号的实际波形如图1所示.图1 按键信号的实际波形 由图1可见,在按键闭合和断开时产生了多个边沿.而在实际中每按一次键,我们只需要一组稳定的上升或下降边沿.所以对于电路中的按键信号,如果我们不滤除抖动的话,还是简单的读取信号的边沿,会引起一次按键被误读多次.这样就会引起电路的误动作.为了保证按一次键电路只有一次正确的响应,即在键闭合稳定时读取键的状态,就要求电路中必须采取滤除抖动的措施.消除案件抖动的方法一般有硬件和软件两种方式.对于硬件方式一般可用RS 触发器作为常用的消抖电路,从根本上解决按键抖动问题.但对于按键较多且从节省硬件资源和易于修改的角度考虑,我们常应用软件滤抖.1 基于计数器模式消抖电路的设计方法应用计数器实现,即采用延时的方法.先正确设定计数的时钟脉冲.当判断到按键按下时计数器开始计数,等计数器计满后再一次判断键的状态.如果仍为按下状态,则认为是按键稳定闭合.这时再针对具体按键信号做相应的处理,否则认为是抖动信号,电路不做任何处理.应用这种方法消除按键抖动,其计数器模值的确定和计数时钟的频率是按键抖动消除的关键问题,因为它们共同决定了延时的时间.如果延时时间过长,就会使正确的按键信号得不到处理;如果延时时间过短,则会将抖动误认为是输入信号,从而导致后电路做出错误处理.一般人按键的时间大于100ms ,抖动时间一般·451·为5ms ~10ms.按这种常规处理,我们一般认为接收到的按键信号持续时间如果小于40ms 则其为抖动信号,如果时间大于40ms 则为正确的按键信号.即让计数器的模值和计数时钟周期的乘积略大于40ms 即可.这样就可以把按下的时间小于40ms 的抖动信号滤掉.其VH D L 代码为:library ieee ;use ieee.std -logic -1164.all ;entity anjian is port (clk ,input :in std -logic ;output :out std -logic );end anjian ;architecture one of anjian is signal a :std -logic ;signal count :integer range 0to 9;beginprocess (clk )beginif input =′0′then count <=0;elsif clk ’event and clk =′1′thenif count =9then count <=count ;else count <=count +1;end if ;end if ;if count =8then a <=′1′;else a <=′0′;end if ;end process ;output <=a ;end one; 由上仿真图可以看出:当信号维持时间小于八个计数时钟周期的时候,认为这时的信号是短时间的抖动信号,所以电路输出不做任何反应.保持原电平不变,后续电路也无需处理.当信号维持时间超过八个计数时钟周期,认为这时定稳定的按键信号,即键稳定的闭合.所以输出一个按键脉冲,以供后续电路处理.2 基于RS 触发器模式的消抖动电路设计在设计中用时钟信号进行采样.对于按键输入信号,当两次采样信号相同时,这是判定已经稳定的按下或放开了按键.触发器相应的被置成0态或1态.如两次采样结果不相同.则触发器维持原输出信号不变.由于直接由触发器输出的信号时间宽度可能过长,所以在触发器后再接一级同步化电路,保证每次输出的信号只占有一个时钟周期的宽度.应用这种方法去滤除抖动,关键是确定采样时钟的频率.保证两次采样的时间间隔能够大于按键的抖动时间,且小于正常按键时的按键稳定闭合时间.其VH D L 代码和仿真如下:library ieee ;use ieee.std -logic -1164.all ;entity dou is port (din ,clk :in std -logic ;dout :out std -logic );end entity dou ;architecture one of dou issignal clr0,clr1,q0,q1,d1,d0:std -logic ;beginclr0<=din ;clr1<=q0;process (clk ,clr0,clr1)beginif clr0=′0′then q0<=′0′;elsif clk ′event and clk =′1′thenq0<=′1′;end if ;if clr1=′0′then q1<=′0′;elsif clk ′event and clk =′1′thenq1<=′1′;end if ;end process ;process (clk )beginif clk ′event and clk =′1′thend0<=q1;d1<=d0;end if ;end process ;dout <=d0and (not d1);end ;·551· 由上仿真图形可以看出:当两次的采样信号结果相同时,这时输出信号才可能发生变化,对应的按键的稳定闭合或断开,当两次的采样信号结果不同时,认为输入的信号定抖动信号.这时电路输出维持原状态不变,同时由于有同步化的处理,输出信号的高电平宽度只为采样时钟的一个周期.3 结束语通过以上的仿真图形可以看出,对于带有机械抖动的按键信号,当它经过消抖电路处理后其输出信号已经将抖动滤除,且输出信号只占有一个时钟信号的周期,从而能使后续电路能够正确的读取键值,做相应的响应,有效的避免了误动作.因此该设计有很大的实际应用意义.参 考 文 献[1]潘 松,黄继业.E DA 技术实用教程[M].北京:科学出版社,20051[2]谭会生,瞿遂春.E DA 技术综合应用实例与分析[M].西安:西安电子科技大学出版社,2004.[3]林明权等.VH D L 数字控制系统设计范例[M].北京:电子工业出版社,2003.[4]方 龙,肖献保,李 威.关于消除按键机械抖动的研究[J ].广西轻工业,2008,1:92.[5]潘永雄,泌河,刘向阳.电子线路CAD 实用教程[M].西安:西安电子科技大学出版社,2004.[6]杨 恒,李爱国,王辉,王新安.FPG A/CP LD 最新实用技术指南[M].北京:清华大学出版社,2005.[7][美]沃尔夫(W olr.w )基于FPG A 的系统设计(英语版)[M].北京:机械工业出版社,2005.[8]王强,曾繁泰,励娜.EPA 工程的理论与实践—S OC 系统蕊片设计[M].北京:电子工业出版社,2004.[9]李国洪,胡辉,沈阳山等.E DA 技术与实验[M].北京:电子工业出版社,2005.Shaking R elease Design on the K eys of FPGAXU De 2cheng(C ollege of In formation T echnology ,Jilin N ormal University ,S iping 136000,China )Abstract :K eys were the comm on elements during the research of measure instrument ,electronic apparatus ,and design of the electronic.The bounce phenomenon of keys was the objective problem in the digital system design.Therefore ,the shaking release measurement was necessary.That is to rem ove the noise signal at the engine bounce through the elimi 2nating the shaking circuit in order to ensure the right response of the circuit.The paper introduced tw o methods of elim 2inating shaking on FPG A and gave the relative VH D L code and the imitating picture.It res olved the in fluence of engine shaking on keys and ensurd the steady w orking of the circuit.K ey w ords :engine shaking ;imitating picture ;circuit·651·。
按键消抖的原理
按键消抖的原理一、引言在电子设备中,按键是常见的输入方式。
然而,由于按键的机械结构,当按下或松开按键时,会产生机械弹跳现象,导致信号出现多次跳变,这就是所谓的“按键抖动”现象。
为了避免这种现象对电路造成干扰,需要进行按键消抖处理。
二、什么是按键消抖?按键消抖是指在接收到按键信号后,在一定时间内只处理一次信号,并且保证该信号为有效信号。
其目的是消除因机械结构引起的多次跳变信号。
三、按键消抖的原理1. 机械弹跳原理在了解按键消抖原理之前,需要先了解机械弹跳原理。
当按下或松开一个开关时,由于接触面积有限和金属表面不完全平整等因素影响,开关触点会发生不稳定震荡,并在短时间内反复接通和断开。
这种现象称为“机械弹跳”。
2. 软件处理原理软件处理原理是通过程序来实现对按键状态进行检测和判断的方式。
具体实现方法包括:轮询法、中断法、计时法等。
(1)轮询法轮询法是指通过循环检测按键状态的方式来实现按键消抖。
具体实现方法为:在主程序中设置一个循环,不断检测按键状态,当检测到按键被按下时,进行一定的延时后再次检测按键状态,如果依然是按下状态,则判断为有效信号。
(2)中断法中断法是指通过外部中断来实现对按键状态进行检测和判断的方式。
具体实现方法为:将按键连接到微控制器的外部中断引脚上,在程序中设置好相应的中断服务程序,当检测到外部中断信号时,进入相应的中断服务程序进行处理。
(3)计时法计时法是指通过定时器来实现对按键状态进行检测和判断的方式。
具体实现方法为:当检测到按键被按下时,启动定时器并开始计数,在一定时间内只处理一次信号,并保证该信号为有效信号。
四、硬件处理原理硬件处理原理是通过使用电路元件来实现对按键消抖的方式。
具体包括RC滤波器、Schmitt触发器、反相器等。
1. RC滤波器RC滤波器是将电容和电阻组合在一起,利用电容的充放电特性实现对信号的滤波。
当按键被按下时,由于电容的充放电时间常数较长,可以使机械弹跳信号被滤除。
按键消抖的原理和基于verilog的消抖设计
按键消抖的原理和基于verilog的消抖设计按键开关是各种电子设备不可或缺的人机接口。
在实际应用中,很大一部分的按键是机械按键。
在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。
在系统设计中,有各种各样的消除按键抖动的设计方法,硬件电路和软件设计都很成熟。
不过我们这里要从另外一个角度来讨论按键的消抖,并给出一个用verilog给出一个具体的实现。
首先,看一个普通的机械按键的触点在闭合与断开时的波形(用示波器抓取)。
下面的四张图都是按键在闭合的时候抓到的波形。
可以看到两个明显的趋势:1. 按键在几个us之内就可以达到稳定状态,从高电平转换到底电平;2. 在高电平转换到低电平的过程中,触点有非常明显的抖动。
下面的两张图是按键在断开的时候抓到的波形。
也可以看到两个明显的趋势:1. 按键的变化趋势比较缓慢,从低电平变为高电平需要大概10~20ms的时间;2. 按键断开时没有闭合时那么大的抖动下面两张图是用手迅速闭合按键然后就断开时,按键的输出波形。
在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。
所以,对于按键消抖的处理,必须按最差的情况来考虑。
我们从上面的图上可以看到,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。
按键一次闭合最短的时间大概是120ms 左右。
如果我们把按键的输出做为一个时钟域(时钟频率未知,但信号的slow rate是已知的,既最大20ms左右)的信号,用另外一个时钟来采集这个按键的输出,则就可以把按键的消抖归结为一个最基本的CDC问题来处理。
而问题的核心是如何确定采集时钟的频率。
假设采集时钟的周期小于20ms,那么,采集时钟就有可能两次采到按键断开时的不。
按键去抖debounce FPGA设计
按键debounce何謂debounce,為何要debounce?當按下按鈕時,表面上只按了一下。
但是訊號的傳遞並不是很單純的由’1’直接跳到’0’。
實際上的訊號會如上圖所示,當我們按下按鈕後,訊號會在高低電位之間彈跳(bounce)。
則電路所收到的訊號可能會像111110110110000000,會和我們所預期的111111111000000000不同。
如此一來,雖然我們只按了一下按鈕,電路可能會解讀成按了好幾下按鈕。
debounce的目的就是為了要除去訊號在高低電位之間彈跳所造成的不正確輸入。
下面是之前开发板的一个按键程序:`timescale 1ns/1nsmodule sw_debounce(clk,rst_n,sw1,sw2,sw3,//outputled_d3,led_d4,led_d5);input clk;input rst_n;input sw1,sw2,sw3; //Active lowoutput led_d3;output led_d4;output led_d5;// ---------------------------------------------------------------------------// 通过降采样对sw1~sw3的输入做低通滤波,将其高频分量滤除,得到low_sw值// ---------------------------------------------------------------------------reg [19:0] cnt;always @ (posedge clk or negedge rst_n)if (!rst_n)cnt <= 20'd0;elsecnt <= cnt + 1'b1;reg [2:0] low_sw;always @(posedge clk or negedge rst_n)if (!rst_n)low_sw <= 3'b111;else if (cnt == 20'hfffff) //每隔20MS检测一次按键low_sw <= {sw3,sw2,sw1};// ---------------------------------------------------------------------------// ---------------------------------------------------------------------------reg [2:0] low_sw_r; //将low_sw信号锁存一个时钟周期,延时不是真的“锁存”always @ ( posedge clk or negedge rst_n )if (!rst_n)low_sw_r <= 3'b111;elselow_sw_r <= low_sw;wire [2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);//当检测到按键有下降沿变化时,代表该按键被按下,按键有效reg d1;reg d2;reg d3;always @ (posedge clk or negedge rst_n)if (!rst_n)begind1 <= 1'b0;d2 <= 1'b0;d3 <= 1'b0;endelsebeginif ( led_ctrl[0] ) d1 <= ~d1;if ( led_ctrl[1] ) d2 <= ~d2;if ( led_ctrl[2] ) d3 <= ~d3;endassign led_d5 = d1 ? 1'b1 : 1'b0;assign led_d3 = d2 ? 1'b1 : 1'b0;assign led_d4 = d3 ? 1'b1 : 1'b0;具体原理:通常,按键抖动会产生10--20MS的毛刺,因此要做的实际上就是在20MS中采样一次,当检测到按键下降沿的时候,就认定按下,其他状态忽略。
基于FPGA的抖动及消抖的方法
基于FPGA的抖动及消抖的方法抖动的产生通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
抖动时间抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次。
为确保FPGA对键的一次闭合仅作一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
FPGA内实现消抖的方法在FPGA内实现按键消抖的方法多种多样,但是最简单的是采用移位寄存器的方法进行消抖。
因为移位寄存器的方法不需要对时钟进行分频,也不需要进行延时等复杂操作,即可实现对按键边沿的检测。
假设未按下时键值=1.1、在无键按下时,移位寄存器samp[7:0]始终采集到高电平,即samp[7:0]=8b1111_1111;2、当键按下时,samp[7:0]将采集到低电平,数据的变化方式为samp[7:0]=8b1111_1110--8b1111_1100--8b1111_1000-- ........8b0000_0000;samp[7:0]=8b1111_ 1110即为按键下降沿。
3、当松开按键时,samp[7:0]将重新采集到高电平,数据变化方式为samp[7:0]=8b0000_0001--8b0000_0011-- ........--8b1111_1111;当samp[7:0]=8b0111_1111时,即为按键上升沿。
参考Verilog代码//模块名:EdgeDetect,边沿检测//button:按键,无键按下时为高电平//clk:10M时钟//rst:复位按钮,低电平有效//rise:检测到上升沿,高电平有效,宽度为1个clk//fall:检测到下降沿,高电平有效,宽度为1个clkmodule EdgeDetect(input clk,input rst,input button,output reg rise,output reg fall);。
按键消抖原理
按键消抖原理
按键消抖原理是指通过某种方法在按键被按下或松开时,消除或减少按键的抖动现象,使输入信号得到稳定的识别和处理。
在实际应用中,按键在被按下或松开时,由于机械结构的原因,往往会引起按键的不稳定状态,表现为按键在短时间内多次触发开关。
这种按键抖动不仅会导致输入信号的波动,还可能对系统造成误操作或不良影响。
为了解决按键抖动问题,常用的按键消抖原理主要有以下几种:
1. 软件延时消抖:通过在程序中设定一个适当的延时时间,当按键被按下或松开后,延时一段时间再读取按键状态,以判断按键是否稳定。
如果经过延时后按键状态仍然相同,则可以认为按键已经稳定按下或松开,从而减少抖动的影响。
2. 硬件滤波消抖:通过在按键电路上设计滤波器或添加电容元件,可以对按键信号进行滤波处理,去除短时间内的干扰信号,使输入信号更加稳定。
常用的滤波电路包括RC滤波电路、OTA滤波电路等。
3. 状态改变检测消抖:在按键电路中,通过检测按键的状态变化来判断按键是否按下或松开。
当按键在短时间内发生多次状态变化时,只会认为按键状态发生了一次改变,从而忽略了抖动现象。
这种方式适用于按键状态改变的速度较慢的情况。
通过以上的按键消抖原理,可以有效地减少按键抖动现象,提
高按键输入的可靠性和稳定性。
在实际应用中,可以根据具体情况选择适合的原理和方法来实现按键消抖,以满足不同的需求。
按键消抖动电路的原理
按键消抖动电路的原理
按键消抖电路的原理是通过添加一个延时电路来消除按键开关接通和断开时产生的抖动信号。
当按键按下时,开关接通,导致电流流过该开关。
但由于机械结构和接触电阻等原因,按键可能会在被按下或断开的瞬间反复接通和断开,产生多个开关状态变化的短暂信号。
这样的信号可能会对数字电路产生误操作或干扰。
为了解决这个问题,可以通过添加一个简单的延时电路来实现按键消抖。
延时电路可以使用稳压二极管和电容器等元件来构建。
当按键被按下时,电容器开始充电,此时可以认为开关已经稳定接通。
当按键被断开时,电容器开始放电,此时可以认为开关已经稳定断开。
通过延时电路,可以过滤掉按键状态变化的短暂信号,只保留稳定的按键状态信号。
简单的按键消抖电路可以是一个RC电路,其中R代表电阻,C代表电容。
如果按键被按下,电容器开始充电,充电时间取决于RC时间常数(τ)。
常见的RC 时间常数可以设置在10ms到50ms之间。
当充电时间超过设定的时间后,电容器被认为已经充电完成,此时可以确定开关已经接通,可以将稳定的开关状态传递到数字电路中。
同样,当按键被释放,电容器开始放电,放电时间也取决于RC时间常数。
当放电时间超过设定的时间后,电容器被认为已经放电完成,此时可以确定开关已经断开,可以将稳定的开关状态传递到数字电路中。
通过添加延时电路,按键消抖电路可以有效地稳定按键的开关状态,减少误操作和干扰对数字电路的影响。
fpga按键消抖原理
fpga按键消抖原理fpga按键消抖原理___________________FPGA按键消抖是一种用于处理按键输入信号的技术,它可以有效地降低噪声对按键信号的影响,从而确保按键输入的正确性。
## 一、什么是fpga按键消抖FPGA按键消抖是一种应用于处理外部输入的技术,它可以有效地减少按键输入的误差,同时防止因由噪声或触发时间过长等原因导致的误操作,从而保证操作系统的稳定性和正确性。
## 二、fpga按键消抖的原理FPGA按键消抖的原理是:当用户按下一个按钮时,FPGA会连续采集多个采样点,并判断采样点的平均值,如果采样值与平均值相差不大,则认为是有效的输入;如果采样点的平均值与采样值相差较大,则认为采样点受到了噪声干扰,此时不认为是有效的输入。
此外,FPGA还会根据按钮被按下的时间来决定是否应该将其作为有效输入:如果用户在一定的时间内多次重复按下一个按钮,FPGA会自动将其作为无效输入,从而避免重复操作。
## 三、fpga按键消抖的应用FPGA按键消抖在实际应用中最常用于处理用户输入,它可以有效地避免由于噪声或触发时间过长而导致的误差。
此外,FPGA也可以用于处理传感器输出,例如测量传感器的输出信号、光学传感器的输出信号等。
## 四、fpga按键消抖的注意事项在使用FPGA进行按键消抖时,应该注意以下几点:1. FPGA采样点的数量要适当:采样点的数量不宜过多或过少,要根据实际情况适当调整。
2. FPGA采样点的间隔要适当:采样点之间的间隔应该尽可能小,以便能够有效地减少噪声对信号的影响。
3. FPGA采样点的平均值要适当:采样点的平均值应该尽可能小,以便能够有效地减少噪声对信号的影响。
4. FPGA采样时间要适当:FPGA在采样信号时应该尽可能快,以便能够有效地减少噪声对信号的影响。
## 五、总结FPGA是一种常用的电子设备,它可以有效地处理外部输入信号,从而避免因由噪声或触发时间过长而导致的误差。
键盘的消抖原理
键盘的消抖原理键盘消抖是指在通过键盘输入时,对于一个按键在被按下到最终确认的过程中,可能会出现多次触发的情况,这样会导致输入数据错误,给使用者带来很大的困扰。
消抖技术旨在解决这一问题,通过特定的电路设计或编程算法,将输入信号进行抑制或过滤,以保证输入数据的准确性。
一、消抖技术的原理1. 机械式按键的消抖机械式按键的消抖主要是通过按键的物理特性来实现的。
当按键被按下时,按键头与底座之间会产生一定的位移或压缩,导致弹簧被压缩或弯曲,使得电路闭合,从而产生按键信号。
为了避免按键震动在电路中产生的反复触发问题,通常会在按键电路中加入一个RC电路或短暂延时电路。
在按键按下后,通过加电、蓄电和放电等过程,使得输入信号稳定下来,从而消除了多余的触发信号。
触摸式按键的消抖主要是通过电容值的变化来识别按键信号的。
当手指接触到触摸板时,会引起电容量的变化,从而识别出按下的位置和时间。
在识别过程中,通常利用滤波器或计数器进行信号的稳定化处理,消除不稳定的噪声输入。
还可以利用防误触算法,对快速按下和抬起的操作进行识别和排除。
矩阵式按键是由多个按键交错排列而成的,通过多个行列连接交叉的方式来实现按键的输入。
在输入时,需要依次扫描每个按键的状态,并将状态从矩阵输出到处理器或控制器中。
为了防止按键的反复触发,通常可以采用“按下即认为有效,抬起则认为无效”的算法,以保证输入数据的准确性。
还可以利用短暂延时电路或状态寄存器等技术来消除抖动干扰,从而有效地提高按键输入的精度和可靠性。
1. 电子游戏电子游戏是一种需要快速响应、高精度的应用场景,玩家需要在短时间内完成复杂的操作,并保证输入的准确性和流畅度。
此时,键盘消抖技术就显得尤为重要,可以有效消除按键的抖动和误触干扰,提高玩家的游戏体验和胜率。
2. 工控设备工控设备是一种需要高可靠性、稳定性和安全性的系统。
在工控设备中,键盘消抖技术可以保证输入的精度和可靠性,减少系统的故障率和维护成本。
按键消抖原理
按键消抖原理
按键消抖是指在按下按键后,由于机械原因或者信号干扰等因素导致按键在短时间内出现多次开关状态变化的现象,这种现象会给电子系统带来干扰和误判。
为了避免这种情况的发生,常常采用按键消抖技术。
按键消抖的原理是在按键输入电路中添加一个延时电路和滤波电路,可以在按键按下后延迟一段时间后再检测按键状态,同时通过滤波电路去除掉抖动信号,从而保证按键的稳定性和可靠性。
延时电路可以采用RC延时电路或者数字延时电路,其作用是在按键按下后,延迟一段时间再检测按键状态,这段时间一般为几毫秒至几十毫秒不等。
这样可以保证按键状态稳定后再进行后续处理,避免了抖动信号的影响。
滤波电路可以采用RC滤波电路或者数字滤波电路,其作用是去除掉按键抖动信号,只保留按键真实的状态信号。
这样可以保证按键状态的准确性和可靠性。
总之,按键消抖技术是保证电子系统稳定和可靠运行的重要技术手段。
- 1 -。
详解MCU独立按键消抖,原因、方法统统都有
简单的说,进入了电子,不管是学纯模拟,还是学单片机,DSP、ARM等处理器,或者是我们的FPGA,一般没有不用到按键的地方。
按键:人机交互控制,主要用于对系统的控制,信号的释放等。
因此在这里,FPGA上应用的按键消抖动,也不得不讲!一、为什么要消抖动在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。
因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。
对此一般产用消抖动的原理。
一般可分为以下几种:(1)延时(2)N次低电平计数(3)低通滤波在数字电路中,一般产用(1)(2)种方法。
后文中将详细介绍。
二、各种消抖动1. 模拟电路按键消抖动对于模拟电路中,一般消抖动用的是电容消抖动或者施密特触发等电路,再次不做具体介绍。
2. 单片机中按键消抖动对于单片机中的按键消抖动,本节Bingo根据自己当年写过的单片机其中的一个代码来讲解,代码如下所示:针对以上代码,消抖动的顺序如下所示:(1)检测到信号(2)延时5ms,消抖动(3)继续检测信号,确认是否被按下a) 是,则开始等待释放b) 否,则返回0,退出(4)延时5ms,消抖动(5)确认,返回按下信号,退出当然在单片机中也可以循环计数来确认是否被按下。
Bingo认为如此,太耗MCU 资源,因此再次不做讲述。
3. FPGA中的按键消抖动对于FPGA中的消抖动,很多教科书上都没有讲述。
但Bingo觉得这个很有必要。
对于信号稳定性以及准确性分析,按键信号必须有一个稳定的脉冲,不然对系统稳定性有很大的干扰。
10_基于FPGA进行按键消抖
10_基于FPGA进⾏按键消抖10_基于FPGA进⾏按键消抖实验原理计数器型消抖电路:计数器型消抖电路(⼀) 计数器型消抖电路(⼀)是设置⼀个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in='1',计数器加1,key_in='0'时,计数器清零。
当计数器值为2时,key_out输出才为1,其他值为0时。
计数器值为N时处于保持状态。
因此按键key_in持续时间⼤于N个clk时钟周期时,计数器输出⼀个单脉冲,否则没有脉冲输出。
如果按键开关抖动产⽣的⽑刺宽度⼩于N个时钟周期,因⽽⽑刺作⽤不可能使计数器有输出,防抖动⽬的得以实现。
clk的时钟周期与N的值可以根据按键抖动时间由设计者⾃⾏设定。
下图为N为3的波形仿真图,当按键持续时间⼤于3个时钟周期,计数器输出⼀个单脉冲,其宽度为1个时钟周期,⼩于3个时钟周期的窄脉冲⽤作模拟抖动⼲扰,从图1可以看出,抖动不能⼲扰正常的单脉冲输出。
该⽅法的特点是能很好消除按键抖动产⽣的窄脉冲,还可以滤去⼲扰、噪⾳等其他尖峰波,但遇到脉宽⼤于N个Tclk时钟周期的⼲扰、噪⾳等时会有输出从⽽产⽣误操作,⽽对于按键操作要求按键时间必须⼤于N个Tclk时钟周期,否则按键操作也没有输出。
计数器型消抖电路(⼆) 计数器型消抖电路(⼆)是控制计数器⼯作⼀个循环周期(N+1个状态),且仅在计数器为0时输出为"1"。
电路设计了连锁控制设施。
在计数器处于状态0时,此时若有按键操作,则计数器进⼊状态1,同时输出单脉冲(其宽度等于时钟周期)。
计数器处于其他状态,都没有单脉冲输出。
计数器处于状态N时,控制en='0',导致计数器退出状态N,进⼊状态0。
计数器能否保持状态0,取决于⼈⼯按键操作,若按键key_in='1',控制en='1'(计数器能正常⼯作),key_in='0',计数器状态保持。
按键的硬件消抖电路原理
为什么要进行按键消抖按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级。
一次按键动作的电平波形如下图。
存在抖动现象,其前后沿抖动时间一般在5ms~10ms之间。
由于单片机运行速度非常快,经过A时刻的时候会检测到低电平判断按键被按下。
当到了B时刻的时候,单片机同样会检测到高电平,误以为松开按键,然后又到了C时刻检测到低电平,判断到按键被按下。
周而复始,在5-10ms内可能会出现很多次按下的动作,每一次按键的动作判断的次数都不相同。
为确保单片机对按键的一次闭合仅作一次处理,必须处理按键抖动问题。
在按键闭合或者释放稳定时再读取按键的状态。
硬件消抖电路硬件消抖一般有两种实现方式:o RS触发器o电容滤波RS触发器利用RS触发器来吸收按键的抖动。
一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。
RS触发电路消抖电路图如下。
电容滤波将电容并联在按键的两端,利用电容的放电的延时特性。
将产生抖动的电平通过电容吸收掉。
从而达到消抖的作用,电容消抖电路图如下图所示。
总结实际上,在没有MCU的情况下,对按键进行消抖通常是通过硬件消抖电路来实现。
而在嵌入式开发中,大多数情况下都是通过程序来实现按键消抖。
简单说就是加合适的延迟,显然这实现成本要比硬件电路方式低得多。
按键消抖的原理
按键消抖的原理引言按键消抖是电子设备中常见的一种技术处理方式,用于解决按键在按下或松开时可能出现的多次触发的问题。
本文将介绍按键消抖的原理、常见的实现方法以及应用场景。
什么是按键消抖?当我们按下或松开一个物理按键时,由于按键弹性或机械性能的原因,按键可能会在短时间内多次切换状态。
这种多次切换状态的现象被称为按键抖动。
按键消抖的目的是通过软件或硬件的方式,保证在按下或松开一个按键时,系统只识别一次按键操作,而不是多次。
按键消抖的原理按键消抖的原理是通过延时和状态稳定来处理按键信号。
通常情况下,按键的信号变化是非常快速的,因此需要通过延时来等待按键信号稳定。
延时的时间设置要根据按键的特性及使用环境而定,一般情况下,10毫秒的延时已经足够。
具体的按键消抖原理如下: 1. 监测按键状态:通过采集按键的电压信号或连接处的电流变化,检测按键的状态。
2. 检测按键抖动:将检测到的按键状态与先前的状态进行比较,判断是否出现按键抖动。
3. 延时处理:当检测到按键状态发生变化时,延时一段时间,等待按键信号稳定。
这段时间的长短要根据按键的特性和使用环境来决定。
4. 状态稳定判断:在延时过后,再次检测按键的状态,如果按键状态仍然保持稳定,则判断为有效的按键操作。
常见的按键消抖实现方法为了实现按键消抖,有多种方法可供选择,下面介绍几种常见的实现方式:软件消抖软件消抖是通过编程的方式来实现按键消抖的。
具体步骤如下: 1. 监测按键状态:在软件中定时采集按键状态。
2. 判断按键状态变化:将采集到的按键状态与先前的状态进行比较,判断是否出现按键抖动。
3. 延时处理:在检测到按键状态变化后,延时一段时间,等待按键信号稳定。
这段时间的长短要根据按键的特性和使用环境来决定。
4. 状态稳定判断:在延时过后,再次检测按键的状态,如果按键状态仍然保持稳定,则判断为有效的按键操作。
硬件消抖硬件消抖是通过电路设计来实现按键消抖的。
阐述基于FPGA的按键抖动的消除方法
阐述基于FPGA的按键抖动的消除方法我们在进行数字电路的设计的过程中,经常会碰到信号抖动相关的问题。
抖动信号大致分为两类:一类是时间极短的干扰信号(比如毛刺);另一类是时间较长的干扰信号(如本文所研究的按键抖动问题)。
对于第一类干扰信号——毛刺,它的时间极短,通常只有几纳秒,不能满足触发器的建立时间与保持时间,因此我们可以用一个D触发器去读带毛刺的信号,由于D触发器具有对毛刺不敏感的特点,可以去除信号中的毛刺,达到消除抖动的效果(消除毛刺的方法很多,在这里不做讨论,本文重点说明按键抖动的消除及其代码设计)。
在数字电路设计中,按键通常为一个个具有弹性的机械触点开关,其开启或者闭合的瞬间都会产生按键抖动,实际波形如图1所示:由图1可知,在按键闭合和断开的瞬间,我们往往只需要一组稳定的上升边沿和下降边沿,但实际上却产生了若干个边沿。
所以,在实际电路中,我们仅仅按动按键,简单地读取信号的边沿,却不滤除抖动,会导致一次按键操作被误读多次,从而引起电路的误动作。
为了达到一次按键操作得到一次正确的响应的目的(在按键闭合或者断开),信号稳定的状态下读取此时按键的状态,就必须在电路中采取消除抖动的措施。
在纯数字电路设计中,下面介绍几种消除按键抖动的常用实现方法。
1 设计硬件消抖电路(硬件方法)设计一个具有延时作用的滤波电路或者经常用到的单稳态电路等硬件电路,来消除按键的抖动(避免抖动时间)。
图2所示的电路,即为典型的滤波延时消抖电路,S为按键,Di为CPU数据线。
当按键S未闭合时,与非门的输入电压Vi(即电容的端电压)为0,从而输出电压Vo为1。
我们按下按键S,电容C的端电压不会发生突变,充电延迟时间取决于R1、R2和C值的大小,当电容端电压在充电时间内未达到与非门的开启电压,将不会改变门的输出电压;当电容端电压大于门的开启电压时,与非门的输出Vo发生改变,即输出为0(我们在数字电路的设计过程中,为了避开按键抖动的影响,需要使充电延时大于或等于100ms)。
fpga按键消抖的原理和方法
FPGA(现场可编程门阵列)是一种可按照用户需求重新配置其硬件资源的可编程硅芯片。
在数字电路中,按键消抖 (Debounce) 是一个非常常见但重要的问题,因为机械按钮在按下和释放时会产生不稳定的信号。
为了解决这个问题,我们需要消除机械按键所产生的抖动信号。
消抖的原理是为输入信号添加处理和判断逻辑,将抖动视为一个单位的无效信号,从而过滤有问题的输入信号。
针对 FPGA,常用的按键消抖方法有以下两种:1. **计数器方法 (Counter Method)**这种方法检测按键输入是否持续一定时间内(假设我们使用n 个时钟周期)保持稳定。
如果输入持续稳定,则将其作为有效输入信号。
通过计数器实现的消抖具备可配置的消抖时间,从而适应各种不同类型的按键。
以下是计数器消抖方法的大致步骤:1. 初始化一个 n 位计数器。
2. 如果按键输入保持稳定(按下或释放),计数器增加,否则计数器清零。
3. 当计数器达到预定的阈值时,改变按键的状态(按下或释放)。
4. **移位寄存器方法 (Shift Register Method)**其实现原理是将多个连续的抖动信号视为一个有效输入,适用于按键抖动时间较短的场景。
以下是移位寄存器消抖方法的大致步骤:1. 初始化一个 n 位移位寄存器。
2. 每个时钟周期将输入信号添加到移位寄存器的低位(或高位),同时向右(或左)移动一位。
3. 当移位寄存器中所有位的值都相同(全为 0 或全为 1)时,认为信号稳定,将其视为有效输入信号。
在消抖方法的选择上,实际应用要考虑系统性能、消抖精度、按键抖动时间等因素。
简单的消抖算法可能只跟踪按键的状态改变,而更高级的算法可以检测按键被按下并保持的持续时间,从而在功能上更灵活。
verilog按键消抖原理
verilog按键消抖原理
摘要:
1.按键消抖的原理
2.按键消抖的方法
3.基于Verilog 的按键消抖设计
4.结论
正文:
一、按键消抖的原理
按键消抖是指在按键输入过程中,由于按键机械特性和电路特性的影响,导致按键在按下或松开时,信号电平会在一段时间内发生抖动。
为了消除这种抖动,需要采用一定的方法来确认按键输入的稳定性,这就是按键消抖。
二、按键消抖的方法
常见的按键消抖方法有以下几种:
1.硬件消抖:通过硬件电路实现消抖,如使用滤波器、RC 电路等。
2.软件消抖:通过软件算法实现消抖,如使用计数器、计时器等。
3.结合硬件和软件消抖:既使用硬件电路,也使用软件算法来实现消抖。
三、基于Verilog 的按键消抖设计
基于Verilog 的按键消抖设计可以分为以下几个步骤:
1.输入信号处理:对输入的按键信号进行采样,并转化为数字信号。
2.计数器:使用计数器来统计按键信号的持续时间,以判断按键是否稳定。
3.状态判断:根据计数器的计数值来判断按键是按下还是松开。
4.输出信号处理:将判断结果输出,以控制其他电路或设备。
四、结论
按键消抖是电子设备中常见的一种技术,它可以有效地消除按键输入过程中的抖动,提高系统的稳定性和可靠性。
单片机按键去抖动程序设计思路
单片机按键去抖动程序设计思路
1.去抖动原理:按键在按下和松开的瞬间会产生震动,导致按键信号在短时间内出现多次转换,给程序带来困扰。
为了解决这个问题,需要对按键信号进行去抖动处理,即在按键按下和松开时,只记录一次按键状态变化。
2.软件去抖动方法:软件去抖动方法主要通过软件延时来判断按键信号是否稳定。
具体来说,可以通过以下步骤实现软件去抖动:-初始化按键引脚为输入模式,并使能内部上拉电阻;
-设定一个延时时间阈值t,用于判断按键是否稳定;
-读取按键引脚的电平,如果为低电平,说明按键按下;
-进入一个循环,每次循环读取一次按键引脚的电平,并与前一次读取的电平进行比较;
-如果连续读取到的电平与前一次相同,说明按键信号稳定;
-如果连续读取到的电平与前一次不同,则说明按键信号还在抖动,继续读取直到连续读取到的电平与前一次相同;
-当稳定的电平持续时间超过延时时间阈值t时,认为按键信号已稳定,可以进行相应的处理。
3. 硬件去抖动方法:硬件去抖动方法主要通过电路设计来实现。
常见的硬件去抖动电路包括RC滤波电路和Schmitt触发器电路。
其中,RC 滤波电路利用电容和电阻的特性,对按键信号进行平滑处理;Schmitt触发器电路则通过正反馈的方式,将不稳定的信号转换为稳定的信号。
这两种方法可以根据实际需求选择。
总结:
按键去抖动程序设计可以通过软件去抖动和硬件去抖动两种方式实现。
软件去抖动主要通过软件延时判断按键信号是否稳定,而硬件去抖动则通
过电路设计实现。
根据具体的应用场景和需求,可以选择适合的方法来设
计按键去抖动程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按键消抖
1功能概述
按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。
实际应用中,按键开关通常为机械式弹性开关。
当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。
为保证系统及时正确识别,必须对这种情况作出相应处理。
我们称之为按键消抖。
按键消抖可分为硬件消抖和软件消抖。
硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。
如果按键较多,则使用软件消抖。
软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。
需要注意的是,软件消抖需要占据一定的系统资源。
尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。
而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。
优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。
在本例中,我们的只需要用4个信号界定,并用很短的代码即可。
下面我们先来看看功能要求:
在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。
在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。
2 设计思路
一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。
1
图1 按键抖动过程示意
当系统检测出按键闭合后,执行一个延时程序,产生5ms~10ms的延时;前沿抖动消失后,再一次检测键的状态;如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
本案例我们设置经过20 ms后的高电平才是真正的按键功能。
信号列表如下:
3 程序设计
模块代码
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18 module key_module(
clk ,
rst_n ,
key_in ,
key_vld
);
parameter DATA_W = 20 ;
parameter KEY_W = 4 ;
parameter TIME_20MS= 1_000_000 ;
input clk ;
input rst_n ;
input [KEY_W-1 :0] key_in ;
output [KEY_W-1 :0] key_vld ;
reg [KEY_W-1 :0] key_vld ;
reg [DATA_W-1:0] cnt ;
wire add_cnt ;
wire end_cnt ;
2
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
reg flag ;
reg [KEY_W-1 :0] key_in_ff1 ;
reg [KEY_W-1 :0] key_in_ff0 ;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
cnt <= 20'b0;
end
else if(add_cnt)begin
if(end_cnt)
cnt <= 20'b0;
else
cnt <= cnt + 1'b1;
end
else begin
cnt <= 0;
end
end
assign add_cnt = flag==1'b0 && (key_in_ff1!=0);
assign end_cnt = add_cnt && cnt == TIME_20MS - 1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag <= 1'b0;
end
else if(end_cnt)begin
flag <= 1'b1;
end
else if(key_in_ff1==0)begin
flag <= 1'b0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_in_ff0 <= 0;
key_in_ff1 <= 0;
end
else begin
key_in_ff0 <= key_in ;
key_in_ff1 <= key_in_ff0;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
key_vld <= 0;
end
else if(end_cnt)begin
key_vld <= key_in_ff1;
end
else begin
key_vld <= 0;
end
end
endmodule
3。