0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是开关抖动?防止电路开关弹跳的常用方法

玩转单片机与嵌入式 来源:玩转单片机与嵌入式 作者:济南行远智能科技 2022-10-17 10:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一:什么是开关抖动?

当我们按下按钮或拨动开关或微动开关时,两个金属部件会接触以短路电源。但它们不会立即连接,而是金属部件在实际稳定连接之前连接和断开几次。

释放按钮时也会发生同样的事情。这会导致误触发或多次触发,例如多次按下按钮。这就像一个弹跳的球从高处落下,它一直在表面弹跳,直到它静止。

9f8d9988-4cf2-11ed-a3b6-dac502259ad0.png

换句话说,我们可以说开关弹跳是任何开关的非理想行为,它会生成单个输入的多个转换。当我们处理电源电路时,开关弹跳不是主要问题,但当我们处理逻辑或数字电路时,它会引起问题。因此,为了消除电路中的抖动,使用了开关去抖动电路。

二:电路及波形

首先,我们将演示没有开关去抖动的电路

9fd9f256-4cf2-11ed-a3b6-dac502259ad0.png

通过示波器抓取信号的波形如下:

9fea642e-4cf2-11ed-a3b6-dac502259ad0.jpg

您还可以在按下按钮时在示波器中看到波形。它显示在按钮切换期间发生了多少弹跳。

三:硬件去抖动

防止电路开关弹跳的常用方法有3种。

硬件去抖

RC 去抖

开关去抖IC

01

硬件电路去抖

在硬件去抖动技术中,我们使用 S-R 触发器来防止电路发生开关抖动。这是所有方法中最好的去抖动方法。

a01d87be-4cf2-11ed-a3b6-dac502259ad0.png

a08f4db8-4cf2-11ed-a3b6-dac502259ad0.jpg


该电路由两个与非门(74HC00 IC)组成,形成一个 SR 触发器。正如您在电路图中看到的,只要拨动开关切换到 A 侧,输出逻辑就会变为“高”。在这里,我们使用示波器来检测弹跳。而且,正如您在下面给出的波形中看到的那样,逻辑正在以轻微的曲线移动而不是弹跳。电路中使用的电阻是上拉电阻。 每当开关在触点之间移动以产生反弹时,触发器都会保持输出,因为“0”是从与非门的输出反馈的。

02

R-C 去抖

R-C 仅由其名称定义,该电路使用 RC 网络来防止开关弹跳。电路中的电容器滤除开关信号的瞬间变化。当开关处于打开状态时,电容器两端的电压保持为零。最初,当开关打开时,电容器通过 R1 和 R2 电阻器充电。

a0adb6e0-4cf2-11ed-a3b6-dac502259ad0.png

当开关闭合时,电容器开始放电至零,因此反相施密特触发器输入端的电压为零,因此输出变为高电平。

在弹跳情况下,电容器停止 Vin 处的电压,直到它达到 Vcc 或接地。

为了提高 RC 去抖动的速度,我们可以连接一个二极管,如下图所示。因此,它减少了电容器的充电时间。

a0c3f0ae-4cf2-11ed-a3b6-dac502259ad0.png

03

开关去抖IC

市场上有用于开关去抖动的 IC。一些去抖 IC 是 MAX6816、MC14490 和 LS118。

下面是使用MAX6818进行开关去抖的电路图。

a0de37a2-4cf2-11ed-a3b6-dac502259ad0.png


所以在这里,我们学习了按钮如何产生开关反弹效应,以及如何通过使用硬件的方式来防止按键抖动。

四:软件消抖

我们都知道,并且也是我们使用最多的场合是通过软件实现按键消抖。

最简单的方式是增加延迟以消除软件去抖。添加延迟会强制控制器在特定时间段内停止,但在程序中添加延迟并不是一个好的选择,因为它会暂停程序并增加处理时间。最好的方法是在代码中使用中断来进行软件弹跳。

01

软件延时

sbit KEY = P1^3;
///按键读取函数
uint8_t GetKey(void)
{
    if(KEY == 1)
    {
        DelayMs(20);        //延时消抖
        if(KEY == 1)
        {
            return 1;
        }
        else 
        {
            return 0;
        }
    }
    else 
    {
        return 0;
    }
}
上面是最简单的软件延时方法,也可以通过多个按键组合增加相关软件滤波的方式进行按键判断,其实原理相似。

但是这种纯延时的实现方式太过暴力,在延时的时候一直占用cpu的资源,如果在延时的时候,有其他外部中断或者抢占事件,系统完全没有响应的。

所以我们CPU需要一个独立的定时装置,来完成这个计时工作,而且需要在计时时间到达时再检测一次按键的电平值。

02

中断消抖

首先初始化管脚,打开管脚的外部中断:

/*Configure GPIO pins : KEY_1_Pin KEY_2_Pin */
  GPIO_InitStruct.Pin = KEY_1_Pin|KEY_2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);  
  
  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
初始化TIM1,打开其update中断:

static void MX_TIM1_Init(void)
{
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 7200 - 1;                // 72000000 / 7200 = 10000 hz  0.01ms
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 200 - 1;                    // 200 * 0.01 = 20ms
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{ 
    if(htim_base->Instance==TIM1) 
    {
   /* Peripheral clock enable */                 
        __HAL_RCC_TIM1_CLK_ENABLE();    
  /* USER CODE BEGIN TIM1_MspInit 1 */
        HAL_NVIC_SetPriority(TIM1_UP_IRQn,1,3); 
        HAL_NVIC_EnableIRQ(TIM1_UP_IRQn); 
    }
}
stm32f1xx_hal_it.c中去注册中断回调函数(关键的步骤,需要在按键中断处理函数中打开定时器,开始计时):
void EXTI15_10_IRQHandler(void)            // 按键的中断处理函数
{
 
  HAL_TIM_Base_Start_IT(&htim1);    //  开启定时器1,开始计时
 
  printf("key down
");
 
  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_11);
  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_12);
}

定时器的中断处理函数:
void TIM1_UP_IRQHandler(void)
{
  
  HAL_TIM_IRQHandler(&htim1);   //这个是所有定时器处理回调的入口,在这个函数里对应定时器多种中断情况的中断回调,需要找到update的回调函数
  printf("TIM IRQ
");
 
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)        // 定时器update中断处理回调函数
{
   /* USER CODE BEGIN Callback 0 */
 
   /* USER CODE END Callback 0 */
   if (htim->Instance == TIM2) {
     HAL_IncTick();
   }
   
   if (htim->Instance == TIM1) {            // 在这里选择tim1 
 
     printf("TIM1 updata
");
 
    HAL_TIM_Base_Stop_IT(&htim1);       //    关闭tim1 及清除中断
 
     if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_11) )    //再次判断管脚的电平
     {
      printf("KEY1 be pressed!!!
");
     }
    
    if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) )//再次判断管脚的电平
    {
      printf("KEY2 be pressed!!!
");
    }
   }
   /* USER CODE BEGIN Callback 1 */
 
   /* USER CODE END Callback 1 */
}

总结一下,实现用定时器中断来完成按键延时去抖的关键步骤:

1. 初始化GPIO脚,初始化TIM ,算好时间,填入分频值。

2. 打开GPIO中断,在中断处理函数中打开定时器,让其计数。

3. 定时器溢出中断函数中,再次判断按键电平值。关闭定时器,清除pending。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 示波器
    +关注

    关注

    113

    文章

    6967

    浏览量

    194693
  • 定时器中断
    +关注

    关注

    0

    文章

    49

    浏览量

    11680
  • 按键消抖
    +关注

    关注

    2

    文章

    28

    浏览量

    10796

原文标题:按键消抖常用的软硬件方法

文章出处:【微信号:玩转单片机与嵌入式,微信公众号:玩转单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何实现软件与硬件的开关抖动设计

    开关、磁性开关和磁簧开关以及继电器等。所有开关都有一个共同点:就是有抖动。这就是它们的工作方式。 通常情况下,这种
    的头像 发表于 03-04 14:03 5009次阅读

    几种常用开关电源保护电路

    几种常用开关电源保护电路在电气技术指标满足正常使用要求的条件下,为使电源在恶劣环境及突发故障情况下安全可靠地工作,必须设计多种保护电路,比如防浪涌的软启动,防过压、欠压、过热、过流、
    发表于 12-01 17:28

    请问有滑动开关抖动电路的VHDL代码吗?

    嗨,大家好,我使用斯巴达3E入门套件来设计特定的作品,并且iam使用板上的滑动开关(SW0)来启用顺序电路(FSM),我遇到了开关弹跳问题,任何人都可以给我一个用于
    发表于 05-10 12:20

    常用到的去抖动方法有哪些?

    模拟电路中产生边沿抖动的机理是什么数字电路中产生边沿抖动的机理是什么经常用到的去抖动
    发表于 04-08 06:16

    常用电子设备开关电源检修方法

    常用电子设备开关电源检修方法是一本实操性比较强的技能培训书籍。全书分3个部分:基础知识——介绍常用电子设备开关电源的基本
    发表于 12-13 12:49 0次下载
    <b class='flag-5'>常用</b>电子设备<b class='flag-5'>开关</b>电源检修<b class='flag-5'>方法</b>

    模拟开关型防抖动电路

    模拟开关型防抖动电路
    发表于 09-11 14:14 10次下载
    模拟<b class='flag-5'>开关</b>型防<b class='flag-5'>抖动</b><b class='flag-5'>电路</b>

    按键弹跳消除模块的程序设计与应用

    按键开关是电子设备人机交互的主要器件之一。按键大多是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回
    的头像 发表于 01-07 08:45 3344次阅读
    按键<b class='flag-5'>弹跳</b>消除模块的程序设计与应用

    开关和继电器触点弹跳知识简介

    RC电路经常用于去抖开关。不幸的是,这往往做错了!如果慢速边沿被馈送到没有滞后的数字输入,则开关信号可能会在超过逻辑阈值时振荡。我也经常看到电容器直接放在开关触点上。很可能这样的
    的头像 发表于 08-12 10:30 7911次阅读

    开关电器常用的灭弧方法

    开关电器常用的灭弧方法有哪些?
    的头像 发表于 07-28 11:39 1.5w次阅读

    防止电路开关弹跳常用方法

    当我们按下按钮或拨动开关或微动开关时,两个金属部件会接触以短路电源。但它们不会立即连接,而是金属部件在实际稳定连接之前连接和断开几次。释放按钮时也会发生同样的事情。这会导致误触发或多次触发,例如多次按下按钮。这就像一个弹跳的球从
    发表于 07-13 16:18 6363次阅读
    <b class='flag-5'>防止</b><b class='flag-5'>电路</b><b class='flag-5'>开关</b><b class='flag-5'>弹跳</b>的<b class='flag-5'>常用</b><b class='flag-5'>方法</b>

    NIDEC(尼得科)拨动开关ET115A12-Z数据手册

    ET系列是标准尺寸高容量拨动开关.ET系列有多种型号可供选择额定电流值,开关功能和端子。外壳设计使用具有优异耐热性,耐电弧性和耐电痕性的自熄酚醛树脂,并通过接触结构防止电弧引起的绝缘劣化,尽可能减少
    发表于 09-21 11:39 0次下载

    NIDEC(尼得科)拨动开关ET125A12-Z数据手册

    ET系列是标准尺寸高容量拨动开关.ET系列有多种型号可供选择额定电流值,开关功能和端子。外壳设计使用具有优异耐热性,耐电弧性和耐电痕性的自熄酚醛树脂,并通过接触结构防止电弧引起的绝缘劣化,尽可能减少
    发表于 09-21 11:39 0次下载

    NIDEC(尼得科)拨动开关ET215N12-Z数据手册

    ET系列是标准尺寸高容量拨动开关.ET系列有多种型号可供选择额定电流值,开关功能和端子。外壳设计使用具有优异耐热性,耐电弧性和耐电痕性的自熄酚醛树脂,并通过接触结构防止电弧引起的绝缘劣化,尽可能减少
    发表于 09-21 11:39 1次下载

    NIDEC(尼得科)拨动开关ET225N12-Z数据手册

    ET系列是标准尺寸高容量拨动开关.ET系列有多种型号可供选择额定电流值,开关功能和端子。外壳设计使用具有优异耐热性,耐电弧性和耐电痕性的自熄酚醛树脂,并通过接触结构防止电弧引起的绝缘劣化,尽可能减少
    发表于 09-21 11:39 0次下载

    弹跳开关电路原理图讲解

    弹跳,从而导致潜在问题,例如误触发或多次触发。这种现象就像一个弹球从高处下降,不断弹跳,直到最终静止。传统的去抖电路,尤其是那些具有转换触点的电路,可能并不总是实用或具有成本效益。特
    的头像 发表于 12-03 17:22 1488次阅读
    无<b class='flag-5'>弹跳开关电路</b>原理图讲解