按键消抖常用的软硬件方法


点击下方名片,关注公众号



一:什么是开关抖动?


当我们按下按钮或拨动开关或微动开关时,两个金属部件会接触以短路电源。但它们不会立即连接,而是金属部件在实际稳定连接之前连接和断开几次。释放按钮时也会发生同样的事情。这会导致误触发或多次触发,例如多次按下按钮。这就像一个弹跳的球从高处落下,它一直在表面弹跳,直到它静止。


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


二:电路及波形



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


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


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


三:硬件去抖动


防止电路开关弹跳的常用方法有3种。
  • 硬件去抖
  • RC 去抖
  • 开关去抖IC

01

硬件电路去抖


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



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

02

R-C 去抖


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




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

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

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


03

开关去抖IC


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

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


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

四:软件消抖


我们都知道,并且也是我们使用最多的场合是通过软件实现按键消抖。
最简单的方式是增加延迟以消除软件去抖。添加延迟会强制控制器在特定时间段内停止,但在程序中添加延迟并不是一个好的选择,因为它会暂停程序并增加处理时间。最好的方法是在代码中使用中断来进行软件弹跳。

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\r\n");   __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\r\n"); }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\r\n");     HAL_TIM_Base_Stop_IT(&htim1);       //    关闭tim1 及清除中断      if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_11) )    //再次判断管脚的电平     {      printf("KEY1 be pressed!!!\r\n");     }        if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) )//再次判断管脚的电平    {      printf("KEY2 be pressed!!!\r\n");    }   }   /* USER CODE BEGIN Callback 1 */    /* USER CODE END Callback 1 */}


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

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

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

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


End



欢迎关注我的公众号,回复【加群】限时免费进入技术交流群

(扫码进  技术开发交流群)





玩转单片机与嵌入式 专注单片机、嵌入式、学习资料、最新设计、案例等。以单片机为起点,带你玩转单片机、嵌入式。
评论
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 141浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 119浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 117浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 117浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 79浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 115浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 113浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 111浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 100浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 140浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦