查看: 674|回复: 0

[经验] 详解MCU独立按键消抖,原因、方法统统都有

[复制链接]
  • TA的每日心情
    开心
    2019-11-4 13:48
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-6-9 09:45:44 | 显示全部楼层 |阅读模式
    分享到:
    简单的说,进入了电子,不管是学纯模拟,还是学单片机,DSP、ARM等处理器,或者是我们的FPGA,一般没有不用到按键的地方。按键:人机交互控制,主要用于对系统的控制,信号的释放等。因此在这里,FPGA上应用的按键消抖动,也不得不讲!
    一、为什么要消抖动
    在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。
    对此一般产用消抖动的原理。一般可分为以下几种:
    (1)延时
    (2)N次低电平计数
    (3)低通滤波
    在数字电路中,一般产用(1)(2)种方法。后文中将详细介绍。
    二、各种消抖动
    1. 模拟电路按键消抖动
    对于模拟电路中,一般消抖动用的是电容消抖动或者施密特触发等电路,再次不做具体介绍。

    2. 单片机中按键消抖动
    对于单片机中的按键消抖动,本节Bingo根据自己当年写过的单片机其中的一个代码来讲解,代码如下所示:
    unsigned char key_sCAN(void)
    {
    if(key == 0) //检测到被按下
    {
    delay(5); //延时5ms,消抖
    if(key != 0)
    retrurn 0; //是抖动,返回退出
    while(!key1); // 确认被按下,等下释放
    delay(5); //延时5ms,消抖
    while(!key1); //确认被释放
    return 1; //返回按下信号
    }
    return 0; //没信号
    }
    针对以上代码,消抖动的顺序如下所示:
    (1)检测到信号
    (2)延时5ms,消抖动
    (3)继续检测信号,确认是否被按下
    a) 是,则开始等待释放
    b) 否,则返回0,退出
    (4)延时5ms,消抖动
    (5)确认,返回按下信号,退出
    当然在单片机中也可以循环计数来确认是否被按下。Bingo认为如此,太耗MCU资源,因此再次不做讲述。
    3. FPGA中的按键消抖动
    对于FPGA中的消抖动,很多教科书上都没有讲述。但Bingo觉得这个很有必要。对于信号稳定性以及准确性分析,按键信号必须有一个稳定的脉冲,不然对系统稳定性有很大的干扰。
    此处Bingo用两种方法对FPGA中按键消抖动分析。其中第一种是通过状态机的使用直接移植以上MCU的代码,这个思想在FPGA状态机中很重要。第二种,通过循环n次计数的方法来确认是否真的被按下,这种方法很实用在FPGA这种高速并行器件中。
    (1)利用状态机移植MCU按键消抖动
    此模块由Bingo无数次修改测试最后成型的代码,在功能上可适配n个按键,在思想上利用单片机采用了单片机消抖动的思想。具体代码实现过程请有需要的自行分析,本模块移植方便,Verilog代码如下所示:
    /*************************************************
    * Module Name : key_scan_jitter.v
    * Engineer : Crazy Bingo
    * Target DevICe : EP2C8Q208C8
    * Tool versions : QUARTus II 11.0
    * Create Date : 2011-6-26
    * Revision : v1.0
    * DescripTIon :
    **************************************************/
    module key_scan_jitter
    #(
    parameter KEY_WIDTH = 2
    )
    (
    input clk,
    input rst_n,
    input [KEY_WIDTH-1:0] key_data,
    output key_flag,
    output reg [KEY_WIDTH-1:0] key_value
    );
    reg [19:0] cnt; //delay_5ms(249999)
    reg [2:0] state;
    //-----------------------------------
    always @(posedge clk or negedge rst_n)


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 15:49 , Processed in 0.120265 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.