按键消抖实验
按键消抖与时间按键
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 0;break;
}
}
}
定时器函数
void timer0 ()interrupt1
TR0=1;
if(T>100)
{
TR0=0;
T=0;
}
if(TR0=1&&T<100)
continue;//在定时器里面设置初值让定时器中断一次1ms并且T自加1,100次就100ms
switch(key)
{//返回键值
case 0xfe:return 1;break;
case 0xfd:return 2;break;
消抖分硬件和软件消抖,
硬件消抖有《模拟电子技术》上提到用三态门实现,当然还有周立功那个7920(管理数码管和按键的芯片),当然还有很多硬件电路以及一些按键有自带消抖电路,但是如果要做产品硬件消抖肯定会增加成本,一般都会考虑软件消抖
软件消抖我们先来看看书上消抖方法如下图
例程
Unsignedchar keyscan()//这里是用的P2口作为按键的输入口
第4个问题了,从物理上我们可以知道,既然是阻尼振动,必定到振动到某个时候肯定是和稳定的状态一致的,所以肯定不是必须10ms的延时的,比如按下去假设10ms振动后机械才稳定,但是电平上当触点挨得很近振动的时候就算触点不是挨着,还是显示低电平
第5个问题实际上前面已经说了,有硬件消抖肯定对CPU占用最少,软件消抖当然就是尽量不要用些没用的语句,分配好时序
2.如何消抖
3.是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖
按键消抖计数原理与测试说明
“按键消抖计数”程序测试与原理说明1程序运行效果说明按下KEY1,数码管上的示数加1。
按下KEY2,数码管上的示数减1。
2程序电路工作原理以及按键抖动原因按键电路示意图(三个按键分别是K1、K2、K3)当按键被按下的时候,电路导通接地,I/O口为低电平;当按键未被下时,电路断开,I/O口保持高电平的。
但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。
为了不产生这种现象而作的措施就是按键消抖。
3消抖的方法按键消抖分为硬件消抖和软件消抖。
3.1硬件消抖在键数较少时可用硬件方法消除键抖动。
下图所示的RS触发器为常用的硬件去抖。
硬件消抖电路图图中两个“与非”门构成一个RS触发器。
当按键未按下时,输出为0;当键按下时,输出为1。
此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。
也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。
这一点通过分析RS触发器的工作过程很容易得到验证。
3.1软件消抖方法1:使用延时如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
方法2:检测多次可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下。
消抖电路原理及实现
实 验 报 告实验日期: 学 号:姓 名:实验名称:消抖电路总 分:一、实验概述运用LPM 原件定制DFF 触发器,并调用LPM 定制的DFF 触发器,用VHDL 语言的元件例化实现消抖电路并了解其工作原理。
二、实验原理 1、触发器原理触发器是一种可存储1位二进制码的逻辑电路,是构成各种时序电路的最基本逻辑单元。
触发器有一对互补输出端,输出状态不仅与当前输入有关,还与前一输出状态有关。
触发器有两个稳定状态,在一定的外界信号作用下会发生状态翻转。
2、消抖电路原理脉冲按键与电平按键通常采用机械式开关结构,其核心部件为弹性金属簧片。
按键信号在开关拨片与触电接触后经多次弹跳才会稳定,而在按键过程中,可能出现了多个脉冲。
因此需要根据实际情况进行按键消抖处理以提取稳定脉冲,在按键过程中提取稳定的电平状态,通过对抖动脉冲多次检测信号按键电平值,并提取一前一后两个信号按键电平值来进行比较,以此来获取开关状态。
输出一个周期的脉冲时,要求前一次检测到的电平信号为低电平,后一次检测到的电平信号为高电平时。
3、结构图:三、实验设计时钟信号 元件记忆当前的按键信号电平 元件记忆上一次按键信号电平 两次按键的电平进行比较 脉冲信号1、LPM元件定制DFF触发器(1)设置lpm_ff元件选择Installed Plug-Ins→Storage→lpm_ff项。
(2)LPM元件定制步骤,设置输入data为1位,clock为时钟信号,类型为D 型。
(3)添加异步清零和异步置1。
(4)aclr异步清零且高电平有效,aset异步置1且高电平有效,二者无效时,q输出由clock上升沿触发更新为data。
(5)调出其vhd文件添加至消抖电路的工程中。
(6)仿真验证并下载。
功能仿真波形分析参数:end time 为2.0ns,grid size为100ns;信号:alcr 异步清零且高电平有效,二进制;aset异步置1且高电平有效,二进制;二者无效,q(二进制)输出由clock(二进制)上升沿触发更新为data(二进制)。
按键开关去抖动问题
目录
• 引言 • 按键开关抖动的常见解决方法 • 按键开关去抖动的原理 • 去抖动效果的评估和测试 • 实际应用中的按键开关去抖动案例
01
引言
按键开关去抖动的背景和重要性
按键开关在电子设备中广泛应用,但在实际使用中,由 于机械或电气噪声的影响,按键开关可能会出现抖动现 象,即开关状态在短时间内的快速切换。
结合硬件去抖和软件去抖的优点,先通过硬件电路对按键信号进行初步处理,再通过软件算法 进一步去除抖动。
互补滤波法
采用硬件滤波和软件滤波两种方法对按键信号进行互补处理,提高去抖效果。
04
去抖动效果的评估和测试
去抖动效果的评估方法
实际使用评估
在实际使用场景中,观察 按键开关去抖动的表现, 评估其稳定性和可靠性。
在智能家居领域,按键开关被广泛应用于各种智 能设备的控制面板上。由于用户操作频繁,按键 开关容易出现机械疲劳和抖动现象,影响设备的 正常使用。
通过采用去抖动技术,可以有效消除按键开关的 抖动现象,提高设备的响应速度和稳定性,提升 用户的使用体验。
汽车电子中的按键开关去抖动应用
在汽车电子领域,按键开关广泛应用于车载信息娱乐系统、空调控制、车窗升降 等系统中。由于汽车环境的复杂性和使用频率高,按键开关的抖动问题尤为突出 。
实验过程
在实验中模拟按键开关的 抖动情况,记录去抖动电 路的表现和性能数据。
数据处理
对实验数据进行处理和分 析,提取关键性能指标, 如抖动抑制时间、抑制率 等。
结果分析
根据实验结果,分析去抖 动电路的性能表现,评估 其优缺点和适用场景。
实际应用中的按键开关去抖
05
动案例
工业控制中的按键开关去抖动应用
单片机按键电容消抖电路
单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。
然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。
这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。
因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。
本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。
通过在按键电路中引入电容元件,可以达到消抖的效果。
电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。
文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。
接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。
在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。
最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。
通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。
这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。
文章结构部分的内容是对整篇文章的组织和布局进行描述。
它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。
在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。
在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。
正文部分主要包括单片机按键原理和按键消抖的必要性。
按键消抖
状态机实现去抖动原理:按键去抖动关键在弄提取键稳定的电平状态,滤除前沿、后沿抖动毛刺。
对于一个按键信号,可以用一个脉冲对它进行取样,如果连续三次取样为低电平,可以认为信号已经处于键稳定状态,这时输出一个低电平的按键信号。
继续取样的过程如果不能满足连续三次取样为低,则认为键稳定状态结束,这时输出变为高电平。
设计的状态转换图如图所示。
Reset信号有效时,电路进入复位状态s0,这时认为取样没有检测到低电平,在输入取样过程中,每次检测到一个低电平,发生依次向下的状态转移,直到连续检测到三个低电平时,进s3态,这时输出置低(按键信号稳定态),在中间状态s1,s2时,一旦检测到高电平,就进入s0状态,重新检测。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xiaod isport(clk : in std_logic ;reset : in std_logic ;din : in std_logic ;dout : out std_logic);end entity;architecture rtl of xiaod isTYPE state IS( s0,s1,s2,s3);SIGNAL pre_s, next_s: state;beginprocess( reset, clk )beginif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;end process;process( pre_s, next_s, din ) begincase pre_s iswhen s0 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;when s1 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s2;end if;when s2 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s3;end if;when s3 =>dout <= '0';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;end case;end process ;end rtl;程序中din为要去抖动的热键信号,dou为去抖后输出的稳定信号。
单片机按键实验实训报告
一、实验目的1. 理解单片机按键的工作原理和电路连接方法;2. 掌握按键消抖原理及其实现方法;3. 学会使用单片机编程控制按键功能,实现简单的输入控制;4. 提高单片机实验操作能力和编程能力。
二、实验仪器及设备1. 单片机开发板(如STC89C52);2. 按键;3. 万用表;4. 电脑;5. Keil C编译器。
三、实验原理1. 按键原理:按键是一种电子开关,按下时导通,松开时断开。
在单片机应用中,按键常用于输入控制信号。
2. 按键消抖原理:由于按键机械弹性,闭合和断开时会有一连串的抖动。
若直接读取按键状态,容易导致误操作。
因此,需要进行消抖处理。
3. 消抖方法:主要有软件消抖和硬件消抖两种方法。
本实验采用软件消抖方法,即在读取按键状态后,延时一段时间再读取,若两次读取结果一致,则认为按键状态稳定。
四、实验步骤1. 硬件连接:将按键一端接地,另一端与单片机的某个I/O口相连。
2. 编写程序:使用Keil C编译器编写程序,实现以下功能:(1)初始化I/O口,将按键连接的I/O口设置为输入模式;(2)读取按键状态,判断按键是否被按下;(3)进行消抖处理,若按键状态稳定,则执行相应的功能。
3. 编译程序:将编写好的程序编译成HEX文件。
4. 烧录程序:将编译好的HEX文件烧录到单片机中。
5. 实验验证:观察实验现象,验证按键功能是否实现。
五、实验结果与分析1. 硬件连接正确,程序编译无误。
2. 实验现象:当按下按键时,单片机执行相应的功能;松开按键后,按键功能停止。
3. 分析:通过软件消抖处理,有效避免了按键抖动导致的误操作。
六、实验总结1. 本实验成功实现了单片机按键控制功能,掌握了按键消抖原理及实现方法。
2. 通过实验,提高了单片机编程和实验操作能力。
3. 在后续的单片机应用中,可以灵活运用按键控制功能,实现各种输入控制需求。
4. 本次实验为单片机应用奠定了基础,为进一步学习单片机技术打下了良好基础。
关于消除按键机械抖动的研究
4结束语
以上给出了几种消除按键机械抖动的方法,它们各有优缺 点,适用于不同情况下的监控控制系统。经实验证明,以上各种 方法对不同要求的系统能较好的实现监控计算机与S7—200 系列PLC通信,对工程实践有较高的参考价值。
参考文献 【1】赖寿宏.微型计算机源自制技术【M】.北京:机械工业出版社,2003. 【2】严盈富.监控组态软件与PLc入门【M】.北京:人民邮电出版社,
【3】李建兴.可编程序控制器应用技术[M】.北京:机械工业出版社,
1999.
【4】徐爱钧.智能化测量控制仪表原理与设计【M】.北京:北京航空航天大 学出版社。2004.
万 方数据
105
30一35ms),若考虑器件的差异和老化等因素。采样的时间应该
在数控系统中,无论采用单片机、微机或PLC,人机交互都 是不可或缺的。在所有交互设备中,按键和按钮是最常用的,但 无论是按键还是按钮,因为都是机械开关结构,由于机械触点 的弹性及电压突跳等原因,在触点闭合和断开的瞬间会出现电 压抖动,抖动的时间长短取决于开关元件的机械特性,一般为 5—10ms。在触点抖动期间,检测按键的通、断状态,可能导致 判断出错,如:按键一次按下或释放被错误地认为是多次操作。
9 Q・
如图为采用移位指令设计法设计的顺序控制系统步进阶 梯程序,采用一个8位移位寄存器(由辅助继电器M10—M17 组成)作为控制元件,移位寄存器中的IN为移位数据输入端, CP为移位脉冲输入端,R为复位端。这三个输入端的输入信号 均为脉冲上升沿有效。对顺序控制系统来说,输入IN的信号必 须是一个单脉冲信号,即移位数据为“1”。起动步1时,IN和 CP同时输入按钮信号xo的脉冲上升沿后,在IN端生成的移 位数据“1'’便移入移位寄存器的M10位,此时该位有输出(即 输出M10的常开触点闭合信号),建立步l程序,并为步2提 该方法比较复杂,如果系统按键输入较多,则因附加电路
按键消抖的原理和基于verilog的消抖设计
按键消抖的原理和基于verilog的消抖设计按键开关是各种电子设备不可或缺的人机接口。
在实际应用中,很大一部分的按键是机械按键。
在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。
在系统设计中,有各种各样的消除按键抖动的设计方法,硬件电路和软件设计都很成熟。
不过我们这里要从另外一个角度来讨论按键的消抖,并给出一个用verilog给出一个具体的实现。
首先,看一个普通的机械按键的触点在闭合与断开时的波形(用示波器抓取)。
下面的四张图都是按键在闭合的时候抓到的波形。
可以看到两个明显的趋势:1. 按键在几个us之内就可以达到稳定状态,从高电平转换到底电平;2. 在高电平转换到低电平的过程中,触点有非常明显的抖动。
下面的两张图是按键在断开的时候抓到的波形。
也可以看到两个明显的趋势:1. 按键的变化趋势比较缓慢,从低电平变为高电平需要大概10~20ms的时间;2. 按键断开时没有闭合时那么大的抖动下面两张图是用手迅速闭合按键然后就断开时,按键的输出波形。
在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。
所以,对于按键消抖的处理,必须按最差的情况来考虑。
我们从上面的图上可以看到,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。
按键一次闭合最短的时间大概是120ms 左右。
如果我们把按键的输出做为一个时钟域(时钟频率未知,但信号的slow rate是已知的,既最大20ms左右)的信号,用另外一个时钟来采集这个按键的输出,则就可以把按键的消抖归结为一个最基本的CDC问题来处理。
而问题的核心是如何确定采集时钟的频率。
假设采集时钟的周期小于20ms,那么,采集时钟就有可能两次采到按键断开时的不。
机械开关抖动次数的测定及消抖方法
机械开关抖动次数的测定及消抖⽅法消除抖动可软件消除(写⼀端延时程序约5-10ms躲过抖动的时间);也可硬件消除(触发器,或单稳态电路)1 电路的设计 机械开关的触点从断开到闭合,或从闭合到断开,从表⾯上看只经过⼀次变化,实际上,开关的触点在此过程中将会发⽣抖动。
换句话说,从断开到稳定地闭合的过程中,开关要经过若⼲次的通和断;从闭合到完全断开过程中亦如此。
图1简单描绘了机械开关的动作,在电平发⽣变化时,其前后都有⽆数个⼩脉冲,都是因机械开关触点抖动⽽产⽣的。
这种变化很难⽤⾁眼和简单的仪表测出,但是可⽤计数器准确地测出机械开关的抖动次数,并以数字显⽰出来。
这⾥选⽤的计数器为4位同步⼗进制计数器74LS160,其逻辑功能参见表1。
计数器的输出接译码器74LS47,其输出可驱动七段数码管显⽰数字,数码管选⽤共阳型。
图1 机械开关的动作表1 74LS160计数器的逻辑功能表输 ⼊输 出CT P CT T CP D D D D Q3Q2Q1Q0X X X X X X X L L L LH H ↑X X X X计 数L X X X X X X保 持 由于1只⼗进制计数器只能表⽰出(0~9)10个数,⽽机械开关的实际抖动次数往往很⼤,因此我们根据计数器功能表,将4只⼗进制计数器级联应⽤,如图2所⽰。
这样它能表⽰1个4位的⼗进制数,计数范围0000~9999。
当第1只计数器(个位)计到9(1001)时,再来1个计数脉冲,计数器的状态由1001变为0000,第1只计数器⼜从0开始计数;与此同时,第1只计数器的进位输出端Oc输出1个进位脉冲,它加到第2只计数器(⼗位)的CP端,使10位的计数器加1。
依此类推,后⾯各级计数器亦如此。
也就是说,每当10n位的计数器计满10个数时,10(n+1)位计数器加1。
图2 计数器的级联及显⽰电路 第1只计数器CP端的脉冲来⾃机械开关,根据表1给出的计数器功能表可知,⼗进制计数器74LS160为上升沿触发;再由图1所⽰描绘的机械开关的动作可知,在每⼀个稳定的脉冲的上升沿之前和下降沿之后,都有⽆数个⼩脉冲即机械开关的抖动脉冲;⽽在这些抖动脉冲的上升沿处,图2所⽰的计数器组便加1。
键盘的消抖原理
键盘的消抖原理键盘消抖是指在通过键盘输入时,对于一个按键在被按下到最终确认的过程中,可能会出现多次触发的情况,这样会导致输入数据错误,给使用者带来很大的困扰。
消抖技术旨在解决这一问题,通过特定的电路设计或编程算法,将输入信号进行抑制或过滤,以保证输入数据的准确性。
一、消抖技术的原理1. 机械式按键的消抖机械式按键的消抖主要是通过按键的物理特性来实现的。
当按键被按下时,按键头与底座之间会产生一定的位移或压缩,导致弹簧被压缩或弯曲,使得电路闭合,从而产生按键信号。
为了避免按键震动在电路中产生的反复触发问题,通常会在按键电路中加入一个RC电路或短暂延时电路。
在按键按下后,通过加电、蓄电和放电等过程,使得输入信号稳定下来,从而消除了多余的触发信号。
触摸式按键的消抖主要是通过电容值的变化来识别按键信号的。
当手指接触到触摸板时,会引起电容量的变化,从而识别出按下的位置和时间。
在识别过程中,通常利用滤波器或计数器进行信号的稳定化处理,消除不稳定的噪声输入。
还可以利用防误触算法,对快速按下和抬起的操作进行识别和排除。
矩阵式按键是由多个按键交错排列而成的,通过多个行列连接交叉的方式来实现按键的输入。
在输入时,需要依次扫描每个按键的状态,并将状态从矩阵输出到处理器或控制器中。
为了防止按键的反复触发,通常可以采用“按下即认为有效,抬起则认为无效”的算法,以保证输入数据的准确性。
还可以利用短暂延时电路或状态寄存器等技术来消除抖动干扰,从而有效地提高按键输入的精度和可靠性。
1. 电子游戏电子游戏是一种需要快速响应、高精度的应用场景,玩家需要在短时间内完成复杂的操作,并保证输入的准确性和流畅度。
此时,键盘消抖技术就显得尤为重要,可以有效消除按键的抖动和误触干扰,提高玩家的游戏体验和胜率。
2. 工控设备工控设备是一种需要高可靠性、稳定性和安全性的系统。
在工控设备中,键盘消抖技术可以保证输入的精度和可靠性,减少系统的故障率和维护成本。
EDA实验五报告
实验五按键消抖和分频器电路设计一、实验目的学习和掌握使用Verilog语言设计按键去抖动电路和分频器的方法二、实验原理分频器就是简单的加法计数器,对于偶数分频和奇数分频应注意其占空比的问题。
当按一次按健时,由于按健有反应时间、有大量的毛刺产生(抖动),可能按一次机器感应到几次。
消抖就是让在按键正常反应时间内机器只感应一次按键效果,防止误操作。
消抖的原理是:当检测到有键按下时,并不认为有键按下,而是等待20ms后,再次判断是否有键按下,若有则认为确实有键按下;若没有则认为上次的按键是误操作。
三、实验内容1.分频器设计:使用实验箱左下角的时钟频率源,编写一段Verilog程序,使led发光管,每隔1S闪烁一次。
程序设计:module clk5M_1s(clk5M,clk1s);input clk5M;output clk1s;parameter i1=4999;parameter i2=999;reg [12:0]t1,t2;reg k;reg clk1s;always @(posedge clk5M)begin //进行5000分频if(t1<=i1) t1<=t1+1'b1; else t1<=1'b0;if(t1==i1) k<=k+1'b1;endalways @(posedge k)begin //进行1000分频if(t2<=i2) t2<=t2+1'b1; else t2<=1'b0;if(t2==i2) clk1s<=clk1s+1'b1;endendmodule分析:选用的时钟频率源为5M,如果产生频率为1Hz的脉冲使led发光管每隔1s亮一次,则共需分频5000000次,因此分频次数超过内部芯片1个计数器所能承受的范围,故需用两个计数器进行两次分频,即程序中所指出的第一次5000分频,第二次1000分频。
FPGA入门系列实验教程——按键消抖控制LED亮灭
FPGA入门系列实验教程——按键消抖控制LED亮灭1.实验任务实现按键控制LED亮灭。
通过这个实验,掌握采用Verilog HDL语言编程实现按键控制LED亮灭及按键消抖方法。
2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。
软件实验环境为Quartus II8.1开发软件。
3.实验原理当独立按键key1按下后,相应的LED被点亮;再次按下后,LED做翻转输出,即LED熄灭,从而实现按键控制LED亮灭。
本实验对按键进行了消抖处理。
作为机械开关的按键,操作时,机械触点的弹性及电压突跳等原因,在触点闭合或开启的瞬间会出现电压抖动,实际应用中如果不进行处理将会造成误触发。
按键去抖动的关键在于提取稳定的低电平状态,滤除前沿、后沿抖动毛刺。
按键消抖处理一般有硬件和软件两种方法。
软件消抖是检测到有触发后,延时一段时间后再检测触发状态,如果与之前检测到的状态相同,则认为有按键按下;如果没有则认为是误触发。
硬件就是加去抖电路。
4.实验程序module key_debounce(rst_n,clk,key,led);input rst_n;input clk;input key;output led;//通过降采样对key的输入做低通滤波,将其高频分量滤除,得到low_sw值reg[17:0]cnt;always@(posedge clk)if(!rst_n)cnt<=18'd0;elsecnt<=cnt+1'b1;wire sample_pulse=cnt==18'h3ffff;reg low_sw;always@(posedge clk)if(!rst_n)low_sw<=1'b1;else if(sample_pulse)low_sw<=key;//在整个low_sw(active_low)有效过程中取一个控制量作为led的控制信号//本实例中使用low_sw的下降沿reg low_sw_r;//将low_sw信号锁存一个时钟周期,延时不是真的“锁存”always@(posedge clk)low_sw_r<=low_sw;wire led_ctrl=low_sw_r&(!low_sw);reg led;always@(posedge clk or negedge rst_n)if(!rst_n)led<=1'b0;else if(led_ctrl)led<=~led;endmodule5.实验步骤(1)建立新工程项目:打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目key_debounce。
按键的硬件消抖电路原理
为什么要进行按键消抖按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很"漫长"的过程,因为单片机处理的速度在"微秒"级,而按键抖动的时间至少在“毫秒"级。
一次按键动作的电平波形如下图。
存在抖动现象,其前后沿抖动时间一般在5ms-10ms之间。
由于单片机运行速度非常快,经过A时刻的时候会检测到低电平判断按键被按下。
当到了B时刻的时候,单片机同样会检测到高电平,误以为松开按键,然后又到了C时刻检测到低电平,判断到按键被按下。
周而复始,在5-1Oms内可能会出现很多次按下的动作,每一次按键的动作判断的次数都不相同。
按键闭合或者释放稳定时再读取按键的状态。
硬件消抖电路硬件消抖一般有两种实现方式:ORS触发器O电谷滤波RS触发器利用RS触发器来吸收按键的抖动。
一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。
RS触发电路消抖电路图如下。
电容滤波将电容并联在按键的两端,利用电容的放电的延时特性。
将产生抖动的电平通过电容吸收掉。
从而达到消抖的作用,电容消抖电路图如下图所示。
3V3Keyl6Slsw-PBzzLcι'O.IuFGND总结实际上,在没有MCU的情况下,对按键进行消抖通常是通过硬件消抖电路来实现。
而在嵌入式开发中,大多数情况下都是通过程序来实现按键消抖。
简单说就是加合适的延迟,显然这实现成本要比硬件电路方式低得多。
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',计数器状态保持。
看老外如何实现按键消抖
看老外如何实现按键消抖(VHDL )作者:跑丢的孩… 文章来源:跑丢的孩子 点击数:422 更新时间:2012-11-2我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开。
抖动时间由按键的机械特性所决定,一般为5ms~10ms 。
所以我们在做按键检测时都要加一个消抖的过程。
按键消抖主要有两种方案:一是硬件消抖;二是软件消抖。
下面结合一个例程来看看老外是如何实现软件消抖的。
entity top isPort ( btn_0 : in STD_LOGIC;clk : in STD_LOGIC;led : out STD_LOGIC);end top;architecture Behavioral of top isconstant CNTR_MAX : std_logic_vector(15 downto 0) := (others => '1'); signal btn0_cntr : std_logic_vector(15 downto 0) := (others => '0'); signal led_r : std_logic := '0';signal btn0_reg : std_logic := '0';beginbtn0_debounce_process : process (CLK)beginif (rising_edge(CLK)) thenif (btn0_cntr = CNTR_MAX) thenbtn0_reg <= not(btn0_reg);end if;end if;end process;btn0_counter_process : process (CLK)beginif (rising_edge(CLK)) thenif ((btn0_reg = '1') xor (btn_0 = '1')) thenif (btn0_cntr = CNTR_MAX) thenbtn0_cntr <= (others => '0');elsebtn0_cntr <= btn0_cntr + 1;end if;elsebtn0_cntr <= (others => '0');end if;end if;end process;process(btn0_reg)beginif rising_edge(btn0_reg) thenled_r <= not (led_r);end if;end process;led <= led_r;end Behavioral;一般人的做法是:当第一次检测到按键被按下后,执行一个延时程序,产生一个5ms~10ms的延时程序,然后再一次检测按键的状态,如果仍保持按键闭合状态电平,则认为确实有按键按下。
按键消抖
end
else
cnt <= 0; end
always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_out <= 0;
else if(cnt == TIME_20MS - 1)
key_out <= key_in; endendmodule
方案3
// key down, bounce 19ms
repeat(951) @(negedge clk) key_in = ~key_in;
// last 60ms
repeat(3000) @(negedge clk);
cnt <= 0;
//
end always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_cnt
<= 0;
else if(key_cnt == 0 && key_in != key_out)
key_cnt <= 1;
else
if(cnt == TIME_20MS - 1)
// clock .key_out(key_out) );
initial begin
clk = 1;
forever #(T/2) clk
= ~clk; end
// reset initial begin
nrst = 1;
@(negedge clk) nrst = 0;
@(negedge clk) nrst
按键消抖
按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动 时间的长短和按键的机械特性有关,一般为5~10ms。通常我们手动按键然后释放,这个动作中稳定闭合的时间超过了 20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常 我们采用软件延时的方法就可以解决抖动问题。
按键功能实验报告总结(3篇)
第1篇一、实验背景按键作为电子设备中常见的输入装置,其功能丰富,应用广泛。
本实验旨在通过设计和实现一系列按键功能,加深对按键工作原理的理解,并提高电子设计实践能力。
二、实验目的1. 掌握按键的基本原理和电路设计方法。
2. 熟悉按键在不同应用场景下的功能实现。
3. 培养电子设计实践能力,提高问题解决能力。
三、实验内容1. 实验器材:51单片机最小核心电路、按键、LED灯、电阻、电容、面包板等。
2. 实验内容:(1)单按键控制LED灯闪烁(2)按键控制LED灯点亮与熄灭(3)按键控制LED灯亮度调节(4)按键实现数字时钟调整(5)按键实现多功能计数器(6)按键实现密码输入与验证四、实验步骤1. 根据实验要求,设计电路图,并选择合适的元器件。
2. 使用面包板搭建实验电路,包括单片机、按键、LED灯、电阻、电容等。
3. 编写程序,实现按键功能。
4. 对程序进行调试,确保按键功能正常。
5. 实验完成后,撰写实验报告。
五、实验结果与分析1. 单按键控制LED灯闪烁实验结果:按下按键,LED灯闪烁;松开按键,LED灯停止闪烁。
分析:本实验通过单片机定时器实现LED灯的闪烁。
当按键按下时,定时器开始计时;当定时器达到设定时间后,LED灯点亮;定时器继续计时,当达到设定时间后,LED灯熄灭。
如此循环,实现LED灯的闪烁。
2. 按键控制LED灯点亮与熄灭实验结果:按下按键,LED灯点亮;再次按下按键,LED灯熄灭。
分析:本实验通过单片机的I/O口控制LED灯的点亮与熄灭。
当按键按下时,单片机将I/O口置为高电平,LED灯点亮;当按键再次按下时,单片机将I/O口置为低电平,LED灯熄灭。
3. 按键控制LED灯亮度调节实验结果:按下按键,LED灯亮度逐渐增加;松开按键,LED灯亮度保持不变。
分析:本实验通过单片机的PWM(脉宽调制)功能实现LED灯亮度的调节。
当按键按下时,单片机调整PWM占空比,使LED灯亮度逐渐增加;松开按键后,PWM占空比保持不变,LED灯亮度保持不变。
【黑金原创教程】【FPGA那些事儿-驱动篇I】实验二:按键模块①-消抖
【⿊⾦原创教程】【FPGA那些事⼉-驱动篇I】实验⼆:按键模块①-消抖实验⼆:按键模块① - 消抖按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在《建模篇》出现过,⽽且还惹来⼀堆⿇烦。
事实上,笔者这是在刁难各位同学,好让对⽅的惯性思维短路⼀下,但是惨遭⼝⽔攻击 ... ⾯对它,笔者宛如被甩的男⼈,对它⼜爱⼜恨。
不管怎么样,如今 I’ll be back,笔者再也不会重复⼀样的悲剧。
按键消抖说傻不傻说难不难。
所谓傻,它因为原理不仅简单(就是延迟⼏下下⽽已),⽽且顺序语⾔(C语⾔)也有⽆数不尽的例⼦。
所谓难,那是因为⼈们很难从单⽚机的思维跳出来 ... 此外,按键消抖也有许多细节未曾被⼈重视,真是让⼈伤⼼。
按键消抖⼀般有3段操作:l 检测电平变化;l 过滤抖动(延迟);l 产⽣有效按键。
假设C语⾔与单⽚机的组合想要检测电平变化,它们⼀般是利⽤if查询或者外部中断。
事后,如果这对组合想要过滤抖动,那么可以借⽤for 延迟的⼒量,⼜或者依赖定时中断产⽣精明的延迟效果。
反观有效案件的产⽣,这对组合视乎⽽外钟情“按下有效”似的 ... 不管怎么样,C语⾔与单⽚机这对组合在处理按键的时候,它们往往会错过⼀些黄⾦。
“黄⾦?”,读者震撼道。
所谓黄⾦时间就是电平发⽣变化那⼀瞬间,还有消抖(延迟)以后那⼀瞬间。
按键按下期间,按键的输⼊电平故会发⽣变化,如果使⽤if查询去检测,结果很容易浪费单⽚机的处理资源,因为单⽚机必须⼀直等待 ... 换之,如果反⽤外部中断,中断寻址也会耽误诺⼲时间。
假设C语⾔与单⽚机这对组合挨过电平检测这起难关,余下的困难却是消抖动作。
如果利⽤for循环实现去消抖,例如 Delay_ms(10) 之类的函数。
For循环不仅计数不紧密,⽽且还会⽩⽩浪费单⽚机的处理资源。
定时中断虽然计数紧密,但是中断触发依然也会产⽣诺⼲的寻址延迟。
补上,所谓寻址延迟是处理器处理中断触发的时候,它要事先保护现场之余,也要寻址中断处理⼊⼝,然后执⾏中断函数,完后回复现场,最后再返回当前的⼯作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于verilog按键消抖设计Aaron malone关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了。
然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的。
这两篇博文都是ednchina的博客精华,并且在其blog 首页置顶多日,我想对大家会很有帮助的。
键盘的分类键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。
而靠软件编程来识别的称为非编码键盘。
在单片机组成的各种系统中,用的最多的是非编码键盘。
也有用到编码键盘的。
非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。
按键在闭合和断开时,触点会存在抖动现象:从上面的图形我们知道,在按键按下或者是释放的时候都会出现一个不稳定的抖动时间的,那么如果不处理好这个抖动时间,我们就无法处理好按键编码,所以如何才能有效的消除按键抖动呢?让下面的两篇博文日志给你答案吧。
经典的verilog键盘扫描程序从最基础的分频程序开始,但看到这个键盘扫描程序后,直呼经典,有相见恨晚的感觉,还想说一句:威百仕( VibesIC ),我很看好你!WHY?待我慢慢道来,这个程序的综合后是0error,0warning。
想想自己编码的时候那个warning是满天飞,现在才明白HDL设计有那么讲究了,代码所设计的不仅仅是简单的逻辑以及时序的关系,更重要的是你要在代码中不仅要表现出每一个寄存器,甚至每一个走线。
想想我写过的代码,只注意到了前者,从没有注意过后者,还洋洋自得以为自己也算是个高手了,现在想来,实在惭愧啊!学习学习在学习,这也重新激发了我对HDL设计的激情,威百仕给了我一个方向,那我可要开始努力喽!废话说了一大堆,看程序吧:(本代码经过ise7.1i综合并下载到SP306板上验证通过)//当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED 熄灭,按键控制LED亮灭经过一次20ms的采样后判定为键盘按下。
代码部分`timescale 1ns / 1ps//说明:当三个独立按键的某一个被按下后,相应的LED被点亮;// 再次按下后,LED熄灭,按键控制LED亮灭module sw_debounce(clk,rst_n,sw1_n,sw2_n,sw3_n,led_d1,led_d2,led_d3);input clk; //主时钟信号,50MHzinput rst_n; //复位信号,低有效input sw1_n,sw2_n,sw3_n; //三个独立按键,低表示按下output led_d1,led_d2,led_d3; //发光二极管,分别由按键控制//---------------------------------------------------------------------------reg[2:0] key_rst;always @(posedge clk or negedge rst_n)if (!rst_n) key_rst <= 3'b111;else key_rst <= {sw3_n,sw2_n,sw1_n};reg[2:0] key_rst_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always @ ( posedge clk or negedge rst_n )if (!rst_n) key_rst_r <= 3'b111;else key_rst_r <= key_rst;//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期wire[2:0] key_an = key_rst_r & (~key_rst);//---------------------------------------------------------------------------reg[19:0] cnt; //计数寄存器always @ (posedge clk or negedge rst_n)if (!rst_n) cnt <= 20'd0; //异步复位else if(key_an) cnt <=20'd0;else cnt <= 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中cnt == 20'hfffff low_sw <= {sw3_n,sw2_n,sw1_n};//---------------------------------------------------------------------------reg [2:0] low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always @ ( posedge clk or negedge rst_n )if (!rst_n) low_sw_r <= 3'b111;else low_sw_r <= low_sw;//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期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;endelse begin //某个按键值变化时,LED将做亮灭翻转if ( led_ctrl[0] ) d1 <= ~d1;if ( led_ctrl[1] ) d2 <= ~d2;if ( led_ctrl[2] ) d3 <= ~d3;endassign led_d3 = d1 ? 1'b1 : 1'b0; //LED翻转输出assign led_d2 = d2 ? 1'b1 : 1'b0;assign led_d1 = d3 ? 1'b1 : 1'b0;endmodule综合的电路经过两次20ms的采样后判定为键盘按下。
代码module ex3(clk,rst_n,sw1_n,sw2_n,sw3_n,led_d1,led_d2,led_d3);input clk; //主时钟信号,50MHzinput rst_n; //复位信号,低有效input sw1_n,sw2_n,sw3_n; //三个独立按键,低表示按下output led_d1,led_d2,led_d3; //发光二极管,分别由按键控制//---------------------------------------------------------------------------reg[2:0] key_rst;always @(posedge clk or negedge rst_n)if (!rst_n) key_rst <= 3'b111;else key_rst <= {sw3_n,sw2_n,sw1_n};reg[2:0] key_rst_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always @ ( posedge clk or negedge rst_n )if (!rst_n) key_rst_r <= 3'b111;else key_rst_r <= key_rst;//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期wire[2:0] key_an = key_rst_r & (~key_rst);//---------------------------------------------------------------------------reg[19:0] cnt; //计数寄存器always @ (posedge clk or negedge rst_n)if (!rst_n) cnt <= 20'd0; //异步复位else if(key_an) cnt <=20'd0;else cnt <= 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中cnt == 20'hfffff low_sw <= {sw3_n,sw2_n,sw1_n};//---------------------------------------------------------------------------reg [2:0] low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always @ ( posedge clk or negedge rst_n )if (!rst_n) low_sw_r <= 3'b111;else low_sw_r <= low_sw;//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期wire[2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);reg[19:0] cnt1; //计数寄存器always @ (posedge clk or negedge rst_n)if (!rst_n) cnt1<= 20'd0; //异步复位else if(led_ctrl) cnt1 <=20'd0;else cnt1 <= cnt1 + 1'b1;reg[2:0] low_sw1;always @(posedge clk or negedge rst_n)if (!rst_n) low_sw1 <= 3'b111;else if (cnt1 == 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw中cnt == 20'hfffff low_sw1 <= {sw3_n,sw2_n,sw1_n};reg [2:0] low_sw1_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always @ ( posedge clk or negedge rst_n )if (!rst_n) low_sw1_r <= 3'b111;else low_sw1_r <= low_sw1;wire[2:0] led_ctrl1 = low_sw1_r[2:0] & ( ~low_sw1[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;endelse begin //某个按键值变化时,LED将做亮灭翻转 if ( led_ctrl1[0] ) d1 <= ~d1;if ( led_ctrl1[1] ) d2 <= ~d2;if ( led_ctrl1[2] ) d3 <= ~d3;endassign led_d3 = d1 ? 1'b1 : 1'b0; //LED翻转输出assign led_d2 = d2 ? 1'b1 : 1'b0;assign led_d1 = d3 ? 1'b1 : 1'b0;endmodule综合后的电路。