一文了解开关抖动及消除的方法

风与尘的誓约半导体器件原理 2023-04-25 16:35:05 783阅读 举报

对于电子爱好者来说,开关抖动并不陌生。当我们按下按钮或拨动开关或微动开关时,两个金属部件会接触以短路电源。但它们不会立即连接,而是金属部件在实际稳定连接之前连接和断开几次。释放按钮时也会发生同样的事情。这会导致误触发或多次触发,例如多次按下按钮。这就像一个弹跳的球从高处落下,它一直在表面弹跳,直到它静止。当按下和释放微动按键时,会由短时间的抖动现象才会到达想要的状态。如下图所示:
 
开关抖动
 
从上图可知。按键抖动时间大概为150us。
 
在一些对按键抖动敏感的情况下需要进行消抖设计,目前常见的消抖设计如下:
 
滤波电容
 
关于去抖硬件最简单的方式并联一颗100nF陶瓷电容,进行滤波处理。
 
开关抖动
 
RC滤波+施密特触发器
 
要想更严谨设计消抖电路,会增加施密特触发器,更大程度的保证后端不受按键抖动影响,电路如下:
 
开关抖动
 
分别来看按键闭合断开时电路状态:
 
开关抖动
 
开关打开时:
电容C1通过R1 D1回路充电,Vb电压=Vcc-0.7为高电平,后通过反向施密特触发器使Vout输出为低。
 
开关闭合时:
电容C1通过R2进行放电,最后Vb电压变为0,通过反向施密特触发器使Vout输出为高。
 
当按下按键出现快速抖动现象时,通过电容会使Vb点电压快速变成Vcc或GND。在抖动过程时对电容会有轻微的充电或放电,但后端的施密特触发器有迟滞效果不会导致Vout发现抖动现象。
 
此电路中D1的使用使为了限制R1 R2一起给C1供电,增加充电时间影响效果。如果减小R1的值会使电流增加,功耗较高。
 
专用消抖芯片
 
一些厂家会提供专用芯片,避免自搭电路的不稳定性, 如美信-Max6816:
 
开关抖动
 
软件滤波
 
软件消除抖动也是很常见的方式,一般形式是延时查询按键状态或者中断形式来消除抖动。
 
下面是Arduino的软件消抖代码:
 
/* SoftwareDebounce
 * 
 * At each transition from LOW to HIGH or from HIGH to LOW 
 * the input signal is debounced by sampling across
 * multiple reads over several milli seconds.  The input
 * is not considered HIGH or LOW until the input signal 
 * has been sampled for at least "debounce_count" (10)
 * milliseconds in the new state.
 *
 * Notes:
 *   Adjust debounce_count to reflect the timescale 
 *     over which the input signal may bounce before
 *     becoming steady state
 *
 * Based on:
 *   http://www.arduino.cc/en/Tutorial/Debounce
 *
 * Jon Schlueter
 * 30 December 2008
 *
 * http://playground.arduino.cc/Learning/SoftwareDebounce
 */
 
int inPin = 7;         // the number of the input pin
int outPin = 13;       // the number of the output pin
 
int counter = 0;       // how many times we have seen new value
int reading;           // the current value read from the input pin
int current_state = LOW;    // the debounced input value
 
// the following variable is a long because the time, measured in milliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was sampled
int debounce_count = 10; // number of millis/samples to consider before declaring a debounced input
 
void setup()
{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, current_state); // setup the Output LED for initial state
}
 
 
void loop()
{
  // If we have gone on to the next millisecond
  if(millis() != time)
  {
    reading = digitalRead(inPin);
 
    if(reading == current_state && counter > 0)
    {
      counter--;
    }
    if(reading != current_state)
    {
       counter++; 
    }
    // If the Input has shown the same value for long enough let's switch it
    if(counter >= debounce_count)
    {
      counter = 0;
      current_state = reading;
      digitalWrite(outPin, current_state);
    }
    time = millis();
  }
}
 

版权声明:
作者:风与尘的誓约
链接:https://www.cycxic.com/p/4749571a769d6.html
来源:半导体器件原理
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以点击 “举报”


登录 后发表评论
0条评论
还没有人评论过~
請告訴我二極體的型號說明。
问答 1 位搬砖人回复
二極體建議的焊盤圖案為何?
问答 1 位搬砖人回复
二極體的銲接條件為何?
问答 1 位搬砖人回复
二極體使用上要注意的地方為何?
问答 1 位搬砖人回复
何謂TVS二極體(ESD保護)?
问答 1 位搬砖人回复
何謂反向回復時間(trr)?
问答 1 位搬砖人回复
有關EDZS / EDZV的差異
问答 1 位搬砖人回复
有關UDZS / UDZV的差異
问答 1 位搬砖人回复
是否符合規範及ROHS指令?
问答 1 位搬砖人回复
二極體也可以使用手工焊接嗎?
问答 1 位搬砖人回复
是否可以將二極體進行迴焊?
问答 1 位搬砖人回复
熱電阻:Rth是什麼?
问答 1 位搬砖人回复