创建可重复使用的反跳算法的7个步骤

谷歌的快速搜索显示,有超过212,000个网站正在研究如何反跳按钮。在检查了其中许多之后,很明显,这些实现并不意味着可以重用。实施和策略通常缺乏可伸缩性,容易使多个按钮反跳的能力以及可移植性。它们与设计运行的硬件紧密耦合。不必是这种情况。遵循七个简单步骤即可创建可在几乎所有嵌入式系统中使用的可重用去抖动算法。要遵循这些步骤或利用它们的输出,请下载以下示例源代码:

步骤#1 –定义软件架构

定义软件体系结构应该是软件开发人员“要做的事情”列表上的第一项。该软件体系结构充当蓝图,可以告诉开发人员确切的开发内容。跳过建筑阶段就像决定立即建造摩天大楼,而无需考虑建筑物的高度或楼层数。对于按钮去抖动算法,可以使用非常简单的分层体系结构,类似于下图所示。

该图显示该算法将由四个相互影响的部分组成,这些部分应该模块化且分开。

技巧2 –概述API

应用程序编程接口(API)是开始开发可重用软件的好方法。 API定义功能,对象并提供用于开发应用程序的构造块。该API允许抽象出较低级别的细节,实现。对于开关防抖动算法,开发人员会感兴趣的三个主要接口是:接口将由初始化例程,防抖动功能以及状态机组成。开发人员可能还对具有第四个功能来检索反跳状态的按钮感兴趣。下图显示了一个示例按钮API:

提示#3 –确定按钮状态

Every application will have different requirements 上 what states a button may be in. Very simple applications will have NOT_PRESSED and PRESSED.  A complex application may have far more states such detecting when a button is released or how many times it has been 压 within a defined window of time.  A properly defined API doesn’t care about these different states but can easily handle the different possible states in the implementation or through the configuration layer.  An example enumeration of the possible button states for a typical application can be seen in the image below:

提示4 –选择实现类型

定义API是一种抽象按钮反跳算法的实现细节的好方法,但是有时开发人员需要确定这些细节。有很多不同的方法可以消除软件中按钮的抖动。例如,最简单的方法是读取引脚状态,延迟去抖动周期,然后再次读取引脚。使用延迟方法并不是特别有效,也不总是正确的。按键去抖动的常见实现方式将定期对引脚进行采样,并且只有在连续采样x次后,该引脚才会被视为去抖动。实施可以取决于初始需求和目标应用。

提示5 –流程图设计

处理实现细节的最简单方法是在编写一行代码之前先对实现进行流程图处理。流程图使开发人员可以将精力集中在即将编写的代码上。总是存在绕过流程图的诱惑,而是直接跳到编写代码。首先编写代码总是导致必须一遍又一遍地重写代码。下图显示了一些常见的按钮反跳算法的示例流程图:

提示#6 –编写代码

仅在开发API和流程图之后才能编写嵌入式软件。有了流程图,编写嵌入式软件变得像将流程图翻译成开发人员选择的语言一样容易。本着开发可重复使用的按钮去抖动算法的精神,可以下载与这些步骤相关的示例代码 这里。下面是Button_Debounce函数的一个示例:

提示#7 –测试并验证

Finally after working so hard 上 the previous six steps, it is now time to test and validate that the selected implementation and design actually work.  One way to test the debounce algorithm is to pick a low cost development kit, such as an STM32 Nucleo board, and write some application code that will debounce the 上 board button and turn an LED 上 .  For a test keep it simple and turn the LED 上 if the button is debounced as 压 and turn the LED off otherwise.

结论

编写可重复使用的代码不需要花很多时间或花费更多的钱来编写一次性代码。预先花一些时间来思考API,选择实现和流程图,该设计将在后端节省比前期投资更多的时间。这些步骤演示了如何开发可重复使用的按钮算法,但是这些相同的步骤和策略几乎可以应用于开发人员将为嵌入式系统使用或开发的任何组件。

6 thoughts 上 “创建可重复使用的反跳算法的7个步骤”

    1. 可能是由于时间的细微变化。

      我怀疑我可能流程图,编写了代码,调试了代码,只是没有’t更新流程图。它’并不是要出于生产目的,而是提供一些入门示例。

      完美是创新的生命!

      感谢您的评论并指出这一点。我很感激!

    1. 这些很好…。但我更喜欢我的代码。更加灵活,可重复使用和记录(并且更易于阅读!)

  1. 同意,方法1是“quick and dirty”去抖动算法可能会用于说说建立电路和测试概念证明…不太好,但在某些地方可能合适。方法2朝着正确的方向前进,但是如果我’我没看错似乎有缺陷…开关释放根本没有消除抖动。可以肯定的是,我的观点是,去噪例程在嘈杂的数字输入上的使用与在实际物理交换机上的使用相同…假设在两种逻辑状态以及转换期间信号上可能都存在一些噪声。可以通过设置单独的按下和释放防反跳计数器来修改流程图。另外,一种改进是将只有一个向上/向下的反跳计数器,并具有单独的阈值。“pressed” and “not-pressed”引入迟滞。

    1. 我看到“Release”在代码中也会被删除。但是,采样时间与“Press”。正如雅各布在第一个评论中指出的那样,这仅仅是一个开始。你可以加“else if…”并根据您定义的架构和流程进行创新。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.