硬件消抖和软件消抖的比较
Ofweek 2021-09-13

  在特权同学的博文中卖了个关子,现在就要来讲讲用硬件做消抖的方法,当然其实这个任务并没有太多新意,也没有太多“技术含量”可言,但是在某些应用场合,这个硬消抖却对系统性能的提升有着非常大的助益。

  我们先来了解一下一般的软件消抖(本文主要以按键的消抖为例)方式。有如下一段序:

  If(value == 0) //一旦检测到键值

  {

  Delay(); //延时20ms,有效滤除按键的抖动

  If(value == 0) //再次确定键值是否有效

  {

  …… //执行相应处理

  }

  }

  这段软消抖程序从机理上看不会有什么问题,通常在软件程序不太“繁忙”的情况下也能够很好的消抖并做相应处理。也许value值的产生也是系统的一个中断(如PIO边沿检测产生的中断),通常系统中也不会就此一个中断,那么在多个中断共存的情况下,该程序的消抖延时就很可能成为系统性能提升的一个瓶颈。为什么这么说呢?举个简单的实例。在这个实例中,系统中除了按键检测外,还有一个中断A以及相应的中断处理函数。在主函数中,我们通常会这么编写程序:

  Void main(void)

  {

  If(中断A标志位有效)

  {

  Clear_A; //清除A标志位

  Processing_A(); //中断A处理函数

  }

  If(value == 0) //一旦检测到键值

  {

  Delay(); //延时20ms,有效滤除按键的抖动

  If(value == 0) //再次确定键值是否有效

  {

  …… //执行相应处理

  }

  }

  }

  假设这个系统两次产生中断A的最小间隔时间是5ms,A中断处理函数需要1ms,按键中断处理需要1ms。那么,系统中断A有可能出现产生了中断却无法得到相应。在下面的状况中就可能出现如图1所示的问题。

  

  图1

  在这种情况下,中断A产生若干次后却只有最后一次能够得到响应处理,这是由于软件消抖延时影响了系统响应的实时性。当然了,如果非得用软件来解决这个问题,也许办法还是有的(不过特权同学没有深究,也不是很精于此道,欢迎软件高手们指点;当时遇到类似问题时朋友提过用状态机的思想来做消抖,不过特权同学潜意识里感觉状态机处理消抖可能会让整个软件编程思路混乱,所以也没有深入去思考过)。但是既然特权同学的系统是软硬协同架构,那么软硬都是可以互补的,也就是说有些工作的分工是可以重新调配的,因此就提出了用硬件来减轻软件工作量,从而提升软件的实时性。

  硬件分担软件的任务我们通常称之为“硬件加速”,这个实例中的硬消抖替代软消抖归根结底也是“硬件加速”。在按键信号输入到软件系统前用逻辑对其进行一下简单的处理即可实现所谓的“硬件消抖”,verilog代码如下:

  //----------------------------------------------------------------------

  //对输入信号inpio硬件滤波,每20ms采样一次当前值

  reg[18:0] cnt; //20ms计数器

  always @(posedge clk_25m or negedge rst_n)

  if(!rst_n) cnt <= 19‘d0;

  else if(cnt < 19’d500000) cnt <= cnt+1’b1;

  else cnt <= 19’d0;

  reg[1:0] inpior; //当前inpio信号锁存,每20ms锁存一拍

  always @(posedge clk_25m or negedge rst_n)

  if(!rst_n) inpior <= 2‘b11;

  else if(cnt == 19’h7ffff) inpior <= {inpior[0],inpior};

  wire inpio_swin =inpior[0] | inpior[1]; //前后20ms两次锁存值都为0时才为0

  原先直接给软件处理的信号是inpio,它的抖动必须用delay()来滤除。而用硬件逻辑处理后得到的inpio_swin信号则是消抖处理过的信号。软件程序就不再需要delay()来滤波了。软件程序简化可以如下:

  Void main(void)

  {

  If(中断A标志位有效)

  {

  Clear_A; //清除A标志位

  Processing_A(); //中断A处理函数

  }

  If(value == 0) //一旦检测到键值

  {

  If(value == 0) //再次确定键值是否有效

  {

  …… //执行相应处理

  }

  }

  }

  重新回到图1所示的状况,其实已经不再会出现中断A被“丢帧”的尴尬了。这就是“硬件加速”的效果,虽然这只是很简单的一个技巧,但也不禁让特权同学感慨:有逻辑(资源)真好! 

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
热门推荐
  • 相关技术文库
  • 硬件
  • 原理图
  • 信号完整性
  • EMI
  • 工程师需了解的芯片datasheet

    注 | 文末留言有神器 本文主要介绍芯片datasheet的查找、使用方法以及重要性,不管是设计硬件电路还是编程,datasheet都是重要的资料, 芯片的使用方法都在datasheet里,这也是最权威的资料! Datasheet(数据手册)的快速阅读能力是每个工程师都应该具备的基本

    05-11
  • 三级管的无刷电机滤波应用

    如图1是无刷电机霍尔信号的滤波电路,为了保证波形质量,简单的阻容滤波并不能完全解决实际复杂的工作环境所带来的波形异常,量产的无刷驱动模块也有该电路。 为了保证滤波质量,在RC滤波后面加一个NPN三极管,利用三极管自身的响应速度达到高质量滤波目的。

    05-11
  • 为什么烧毁的总是相同的电容?

    我曾在一家光通信公司担任设计工程师,该公司生产的1000台设备安装在世界各地。现场的模块很多,送回公司返修的也很多,我的工作便是搞清这些模块出了什么故障。其中一次故障查找经历给我上了精彩的一课,我至今记忆犹新。 客户寄回来一个模块,其故障原因很

    05-11
  • 理解PID,探究微分、积分电路的本质

    很多朋友觉得PID是遥不可及,很神秘,很高大上的一种控制,对其控制原理也很模糊,只知晓概念性的层面,知其然不知其所以然,那么本期从另类视角来探究微分、积分电路的本质,意在帮助理解PID的控制原理(PID:P表示比例控制;I表示积分控制;D表示微分控制)

    05-10
  • 555定时器电路图汇总

    3*3*3光立方 警报器 闪光器 鸣笛警报器 闪烁电路 闪烁电路 激光射线 闩 电子骰子 LED调光器 555放大器 光检测器 机器枪 金属探测器 电机脉宽调制 LED闪光电路 音乐盒 玩具器官 警灯 另一个警灯 驱动双色LED 模型铁路时间 雨水警报 反应计时器 继电器 继电器

    05-07
  • 电解电容的计算与选择

    输入侧的电解电容计算 我们一般按照在最低输入电压下,最大输出的情况下,要求电解电容上的纹波电压低于多少个百分点来计算。当然,如果有保持时间的要求,那么需要按照保持时间的要求重新计算,二者之中,取大的值。 假如在最低输入电压下,电源的输入功率为

    05-07
  • 一个按键开关机的硬件软件设计

    要设计一个产品,只有一个按键,长按开机,再长按就关机(关机电路上的电源需要断开)。那么硬件需要怎么设计呢,软件又可以怎么做呢? 硬件电路设计如下。 硬件PCB设计如下。 硬件的工作原理是这样的,长按按键SW1时,MOS管Q1导通,电源VBAT+给系统供电,单片

    05-06
  • 电子硬件英文缩写术语解析

    常用控制接口 EN:Enable,使能。使芯片能够工作。要用的时候,就打开EN脚,不用的时候就关闭。有些芯片是高使能,有些是低使能,要看规格书才知道。 CS:Chip Select,片选。芯片的选择。通常用于发数据的时候选择哪个芯片接收。例如一根SPI总线可以挂载多个

    05-06
  • 二极管限幅电路的具体分析细节

    二极管最基本的工作状态是导通和截止两种,利用这一特性可以构成限幅电路。所谓限幅电路,就是指限制电路中某一点的信号幅度大小,当信号幅度大到一定程度时,不让信号的幅度再增大;当信号的幅度没有达到限制的幅度时,限幅电路不工作。具有这种功能的电路称

    05-07
  • 60%的EMI问题可以用这个来解决

    随着信号上升沿时间的减小,信号频率的提高,电子产品的EMI问题,也来越受到电子工程师的重视。高速pcb设计的成功,对EMI的贡献越来越受到重视,几乎60%的EMI问题可以通过高速PCB来控制解决。 1 高速信号走线屏蔽规则 如上图所示:在高速的PCB设计中,时钟等

    04-30
  • 几种常用的传感器数据处理

    在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用的简单处理方法: 1.加权平滑:平滑和均衡传感器数据,减小偶然数据突变的影响; 2.抽取突变:去除静态和缓慢变化的数据背景,强调瞬间变化; 3.简单移动平均线

    04-30
  • 工程师硬件面试的几个问题

    今天给大家分享一些硬件常见面试题。 问1 晶体管基本放大电路有共射、共集、共基三种接法,请简述这三种基本放大电路的特点。 共射:共射放大电路具有放大电流和电压的作用,输入电阻大小居中,输出电阻较大,频带较窄,适用于一般放大。 共集:共集放大电路

    04-29
下载排行榜
更多
广告
X
广告