C 嵌入式系统设计模式 12:去抖动模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。

本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之五:去抖动模式。

去抖动模式 (Debouncing Pattern) 是一种简单且有用的设计模式,用于消除因金属表面间歇性接触而产生的多个错误事件

摘要

按键、机械开关和继电器是数字系统的输入设备,它们存在一个共同的问题——当金属弹片接触时,金属会发生变形或“反弹”,在开关打开或关闭期间产生间歇性连接。由于与嵌入式系统的响应速度(微秒级或更快)相比,这种情况发生得非常慢(毫秒级),因此这会导致向控制系统发送多个电子信号。该模式通过等待初始信号后的一段时间,然后检查状态,将多个信号减少为单个信号,从而解决了这个问题。

问题

许多嵌入式系统的输入设备使用金属与金属的接触来表示感兴趣的事件,例如按键按下、机械开关动作。当金属移动并接触时,会发生物理变形,导致间歇性的弹跳接触,直到振动减弱。
在这里插入图片描述

模式结构

模式结构图如下所示。
在这里插入图片描述
去抖动的核心思想是在检测到信号变化后,不是立即响应,而是等待一段时间(这段时间足够让弹跳现象消失),然后再采样信号状态。这样可以确保获取到的是稳定的、非弹跳引起的信号状态。

模式详情

应用客户端

应用客户端 (ApplicationClient) 是去抖事件的最终接收者。它的操作函数 deviceEventReceive() 仅在事件真实发生时激活。

弹跳设备

弹跳设备 (Bouncing) 表示设备硬件本身,比如按键、开关等。sendEvent() 操作只是激活嵌入式处理器中断向量表中的一个中断,而 getState 操作是通过读取内存位置或 IO 端口来实现的。DeviceState 通常是一个双值属性,即 ONOFF

去抖动器

去抖动器 (Debouncer) 是一个软件元素 (这与 弹跳设备 是一个硬件设备不同) 。它处理输入事件、进行去抖动并保存当前设备的实际更改状态。

eventReceive() 函数由 弹跳设备sendEvent() 服务激活。然后,它设置延迟计时器(如果需要,还会禁用来自设备的中断),然后检查设备状态。如果在去抖动时间之后,检测到当前状态改变,则表示事件 (比如按键按下事件) 真实发生,因此它将适当的消息发送到 应用客户端 。按钮的旧状态存储在其变量 oldState 中;每当检测到设备状态更改时,此变量都会更新。

去抖定时器

这个计时器通过其 delay() 服务提供了一个非阻塞等待。这通常是通过操作系统调用来完成的,但也可以使用特殊的计时器硬件来完成。

效果

在实际应用中,许多硬件设备并不具备内置的去抖动功能,或者其去抖动效果并不理想。因此,软件去抖动成为了一个常见的解决方案。通过软件去抖动,可以确保应用程序只处理那些由设备状态真实变化引起的事件,从而提高了系统的稳定性和可靠性。此外,软件去抖动还可以提供更多的灵活性和控制选项,例如调整去抖动时间、处理并发事件等。因此,在设计和实现嵌入式系统或类似的应用时,软件去抖动是一个非常重要的考虑因素。

实现策略

在嵌入式系统或低级系统编程中,中断是处理器响应外部事件(如硬件设备状态变化)的一种方式。当中断发生时,处理器会暂停当前执行的程序,转而执行与中断相关联的处理程序)。为了将中断与特定的处理程序关联起来,系统通常使用中断向量表(Interrupt Vector Table),该表存储了每个中断类型对应的处理程序地址。因此,当 弹跳设备 需要使用中断与 去抖动器 通信时,必须将去抖动器的处理程序地址注册到中断向量表中。此外,由于中断处理程序通常不能有参数,因此在设计时需要特别注意这一点。如果确实需要访问硬件对象的状态或数据,一种常见的方法是将处理程序设计为静态成员函数,并通过其他方式(如全局变量、单例模式等)来访问所需的数据。

如果不使用中断向量表,则可以根据需要将此模式与 观察者模式 混合使用,以将事件信号分发给多个观察者。

去抖动计时器可以使用特殊的计时器硬件,例如硬件定时器。如果使用RTOS(实时操作系统)计时器,则必须注意时间单位的分辨率。例如,Windows 的标准计时器分辨率在 10 到 25 毫秒之间。你只能获得作为基本计时器分辨率倍数的延迟时间,因此如果你想要45毫秒的延迟,你将不得不使用最接近且大于或等于你所需时间的计时器分辨率。对于去抖动应用,这通常是可以的,但你的需求可能会因你的特定硬件和应用程序而异。

如果你不介意在等待去抖动期间完全占用你的嵌入式处理器,那么这是一个简单的问题,只需使用阻塞延时即可。

实例

见原书。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2812869.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

(undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1:https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2(正定矩阵):https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…

【Datawhale组队学习:Sora原理与技术实战】Sora技术原理

Sora能力边界探索 最大支持60秒高清视频生成,以及基于已有短视频的前后扩展,同时保持人物/场景的高度一致性如奶茶般丝滑过渡的视频融合能力同一场景的多角度/镜头的生成能力具有动态摄像机运动的视频。随着摄像机的移动和旋转,人和其 他场景…

SpaceX 首次通过星链 从太空向社交平台 X 上发帖

2 月 26 日,伊隆马斯克旗下太空探索技术公司 SpaceX 宣布,该公司已成功地通过「星链」卫星网络,从太空向社交平台 X 上发布了第一个帖子。 这一次的发布,是通过手机卫星服务——「卫星直连蜂窝网络」(Direct to Cell&…

vscode不能远程连接ubuntu18.04.6

目录 问题解决Portable Mode 安装vscode 补充说明学习资料 问题 vscode远程ssh连接ubuntu18.04.6时,出现如下提示框,单击Learn More后,定位到问题。Can I run VS Code Server on older Linux distributions? 原始是:需要glibc …

递归和迭代【Py/Java/C++三种语言详解】LeetCode每日一题240218【树DFS】LeetCode 589、 N 叉树的前序遍历

有LeetCode算法/华为OD考试扣扣交流群可加 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目描述解题思路代码方法一:递归法PythonJavaC时空复杂度 方法二:迭代法PythonJavaC时空复杂度 …

北邮毕业论文Latex模板使用教程(Windows)

1latex模板下载 下载地址: https://github.com/rioxwang/BUPTGraduateThesis2安装编译环境 TEX Live 2014 或者CTEX 2.9.2.164,以及更高的版本. 下载其中一个即可 (1)TEX Live下载地址: https://tug.org/texlive/acq…

JAVA学习笔记12

1.键盘输入语句 1.1 介绍 ​ *在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。 1.2 步骤 ​ 1.导入该类的所在包,java.util.* ​ 2.创建该类对象(声明变量) ​ 3.调用里面的功能 import java.…

Aigtek前置微小信号放大器在传感器检测中的应用有哪些

传感器是将物理量转换为电信号的装置,其精度和灵敏度直接影响到检测系统的性能。而传感器的输出信号通常都非常微弱,需要进行放大处理才能得到可靠的测量结果。前置微小信号放大器,作为一种重要的传感器检测元件,在传感器检测中发…

游戏服务器租用价格大比拼,腾讯云阿里云京东云疯狂比价!

游戏服务器租用多少钱一年?1个月游戏服务器费用多少?阿里云游戏服务器26元1个月、腾讯云游戏服务器32元,华为云26元,游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选,游戏专业服务器公网带宽10M、12M、15M…

CentOS7 Hive2.3.8安装

CentOS7 Hive2.3.8 安装 建议从头用我的博客,如果用外教的文件到 一、9)步骤了,就用他的弄完,数据库不一样,在9步骤前还能继续看我的 一、 安装MySQL 0.0)查询mariadb,有就去0.1),没有就不管…

x-cmd pkg | g - 功能和交互更为丰富的 `ls` 替代方案

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 g 是一项用 Go 开发的、功能和交互更为丰富的 ls 替代方案。它拥有 100 多个功能选项,主要是通过各式图标、各种布局选项和 git status 集成来增强视觉效果,并且支持多种输出格式,如…

Administrative-divisions-of-China:中华人民共和国行政区划数据

Administrative-divisions-of-China是中华人民共和国行政区划:省级(省份)、 地级(城市)、 县级(区县)、 乡级(乡镇街道)、 村级(村委会居委会) &a…

c++史上最全算法详解,0基础可秒懂!(爆肝4万字)

本文极长,建议点赞收藏后看! 质量分95!! 文章目录 -1.C 标准0.语法基础1. C头文件2. C命名空间3. 主函数4. 变量类型5. ASCII码6. 注释 1.顺序结构一、代码示例二、例题1:求圆的面积三、例题2:求解一元二次…

常见集合框架底层原理

常见集合框架底层原理 常见的集合有哪些 Java集合类主要由两个接口Collection和Map派生出来的,Collection有三个子接口: List、 Set、Queue List代表了有序可重复集合,可直接根据元素的索引来访问Set代表了无序集合,只能根据元素本身来访问…

【Leetcode每日一题】二分查找 - 有效的完全平方数(难度⭐)(19)

1. 题目解析 Leetcode链接:367. 有效的完全平方数 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 核心在于判断给定的整数是否可以开方成两个整数相乘,可以就返回false,反之返回true。 2. 算法…

【c语言】基础数据类型

文章目录 1、什么数据类型2、常量3、变量4、整型数据5、浮点型数据6、字符型数据7、字符串数据 1、什么数据类型 ​ 在生活中,裁缝做衣服需要用到不同的化纤、棉花、丝绸等布料,炒不同的菜需要油、盐等不同的配方,而程序员在编写程序时也需要…

4核8G服务器多少钱?腾讯云和阿里云哪家便宜?

4核8G云服务器多少钱一年?阿里云ECS服务器u1价格955.58元一年,腾讯云轻量4核8G12M带宽价格是646元15个月,阿腾云atengyun.com整理4核8G云服务器价格表,包括一年费用和1个月收费明细: 云服务器4核8G配置收费价格 阿里…

Vue.js+SpringBoot开发快递管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

Vue源码系列讲解——生命周期篇【七】(模板编译阶段)

目录 1. 前言 2. 模板编译阶段分析 2.1 两种$mount方法对比 2.2 完整版的vm.$mount方法分析 3. 总结 1. 前言 前几篇文章中我们介绍了生命周期的初始化阶段,我们知道,在初始化阶段各项工作做完之后调用了vm.$mount方法,该方法的调用标志…

前后端分离PHP+vue+mysql城市轨道交通线路公交查询系统

医院、厕所、药店、派出所、学校、营业厅、快递、银行 开发语言:php 后端框架:Thinkphp 前端框架:vue.js 服务器:apache 数据库:mysql 运行环境:phpstudy/wamp/xammp等 A.美食 快餐、中餐、自助餐、火锅、烧烤、奶…