色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是開關抖動?防止電路開關彈跳的常用方法

玩轉單片機與嵌入式 ? 來源:玩轉單片機與嵌入式 ? 作者:濟南行遠智能科技 ? 2022-10-17 10:55 ? 次閱讀

一:什么是開關抖動?

當我們按下按鈕或撥動開關或微動開關時,兩個金屬部件會接觸以短路電源。但它們不會立即連接,而是金屬部件在實際穩定連接之前連接和斷開幾次。

釋放按鈕時也會發生同樣的事情。這會導致誤觸發或多次觸發,例如多次按下按鈕。這就像一個彈跳的球從高處落下,它一直在表面彈跳,直到它靜止。

9f8d9988-4cf2-11ed-a3b6-dac502259ad0.png

換句話說,我們可以說開關彈跳是任何開關的非理想行為,它會生成單個輸入的多個轉換。當我們處理電源電路時,開關彈跳不是主要問題,但當我們處理邏輯或數字電路時,它會引起問題。因此,為了消除電路中的抖動,使用了開關去抖動電路。

二:電路及波形

首先,我們將演示沒有開關去抖動的電路

9fd9f256-4cf2-11ed-a3b6-dac502259ad0.png

通過示波器抓取信號的波形如下:

9fea642e-4cf2-11ed-a3b6-dac502259ad0.jpg

您還可以在按下按鈕時在示波器中看到波形。它顯示在按鈕切換期間發生了多少彈跳。

三:硬件去抖動

防止電路開關彈跳的常用方法有3種。

硬件去抖

RC 去抖

開關去抖IC

01

硬件電路去抖

在硬件去抖動技術中,我們使用 S-R 觸發器來防止電路發生開關抖動。這是所有方法中最好的去抖動方法。

a01d87be-4cf2-11ed-a3b6-dac502259ad0.png

a08f4db8-4cf2-11ed-a3b6-dac502259ad0.jpg


該電路由兩個與非門(74HC00 IC)組成,形成一個 SR 觸發器。正如您在電路圖中看到的,只要撥動開關切換到 A 側,輸出邏輯就會變為“高”。在這里,我們使用示波器來檢測彈跳。而且,正如您在下面給出的波形中看到的那樣,邏輯正在以輕微的曲線移動而不是彈跳。電路中使用的電阻是上拉電阻。 每當開關在觸點之間移動以產生反彈時,觸發器都會保持輸出,因為“0”是從與非門的輸出反饋的。

02

R-C 去抖

R-C 僅由其名稱定義,該電路使用 RC 網絡來防止開關彈跳。電路中的電容器濾除開關信號的瞬間變化。當開關處于打開狀態時,電容器兩端的電壓保持為零。最初,當開關打開時,電容器通過 R1 和 R2 電阻器充電。

a0adb6e0-4cf2-11ed-a3b6-dac502259ad0.png

當開關閉合時,電容器開始放電至零,因此反相施密特觸發器輸入端的電壓為零,因此輸出變為高電平。

在彈跳情況下,電容器停止 Vin 處的電壓,直到它達到 Vcc 或接地。

為了提高 RC 去抖動的速度,我們可以連接一個二極管,如下圖所示。因此,它減少了電容器的充電時間。

a0c3f0ae-4cf2-11ed-a3b6-dac502259ad0.png

03

開關去抖IC

市場上有用于開關去抖動的 IC。一些去抖 IC 是 MAX6816、MC14490 和 LS118。

下面是使用MAX6818進行開關去抖的電路圖。

a0de37a2-4cf2-11ed-a3b6-dac502259ad0.png


所以在這里,我們學習了按鈕如何產生開關反彈效應,以及如何通過使用硬件的方式來防止按鍵抖動。

四:軟件消抖

我們都知道,并且也是我們使用最多的場合是通過軟件實現按鍵消抖。

最簡單的方式是增加延遲以消除軟件去抖。添加延遲會強制控制器在特定時間段內停止,但在程序中添加延遲并不是一個好的選擇,因為它會暫停程序并增加處理時間。最好的方法是在代碼中使用中斷來進行軟件彈跳。

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
");
 
  __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
");
 
}
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
");
 
    HAL_TIM_Base_Stop_IT(&htim1);       //    關閉tim1 及清除中斷
 
     if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_11) )    //再次判斷管腳的電平
     {
      printf("KEY1 be pressed!!!
");
     }
    
    if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) )//再次判斷管腳的電平
    {
      printf("KEY2 be pressed!!!
");
    }
   }
   /* USER CODE BEGIN Callback 1 */
 
   /* USER CODE END Callback 1 */
}

總結一下,實現用定時器中斷來完成按鍵延時去抖的關鍵步驟:

1. 初始化GPIO腳,初始化TIM ,算好時間,填入分頻值。

2. 打開GPIO中斷,在中斷處理函數中打開定時器,讓其計數。

3. 定時器溢出中斷函數中,再次判斷按鍵電平值。關閉定時器,清除pending。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 示波器
    +關注

    關注

    113

    文章

    6240

    瀏覽量

    184804
  • 定時器中斷
    +關注

    關注

    0

    文章

    49

    瀏覽量

    11167
  • 按鍵消抖
    +關注

    關注

    2

    文章

    27

    瀏覽量

    10448

原文標題:按鍵消抖常用的軟硬件方法

文章出處:【微信號:玩轉單片機與嵌入式,微信公眾號:玩轉單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何實現軟件與硬件的開關抖動設計

    開關、磁性開關和磁簧開關以及繼電器等。所有開關都有一個共同點:就是有抖動。這就是它們的工作方式。 通常情況下,這種
    的頭像 發表于 03-04 14:03 ?4352次閱讀

    幾種常用開關電源保護電路

    幾種常用開關電源保護電路在電氣技術指標滿足正常使用要求的條件下,為使電源在惡劣環境及突發故障情況下安全可靠地工作,必須設計多種保護電路,比如防浪涌的軟啟動,防過壓、欠壓、過熱、過流、
    發表于 12-01 17:28

    請問有滑動開關抖動電路的VHDL代碼嗎?

    嗨,大家好,我使用斯巴達3E入門套件來設計特定的作品,并且iam使用板上的滑動開關(SW0)來啟用順序電路(FSM),我遇到了開關彈跳問題,任何人都可以給我一個用于
    發表于 05-10 12:20

    常用到的去抖動方法有哪些?

    模擬電路中產生邊沿抖動的機理是什么數字電路中產生邊沿抖動的機理是什么經常用到的去抖動
    發表于 04-08 06:16

    常用電子設備開關電源檢修方法

    常用電子設備開關電源檢修方法是一本實操性比較強的技能培訓書籍。全書分3個部分:基礎知識——介紹常用電子設備開關電源的基本
    發表于 12-13 12:49 ?0次下載
    <b class='flag-5'>常用</b>電子設備<b class='flag-5'>開關</b>電源檢修<b class='flag-5'>方法</b>

    模擬開關型防抖動電路

    模擬開關型防抖動電路
    發表于 09-11 14:14 ?10次下載
    模擬<b class='flag-5'>開關</b>型防<b class='flag-5'>抖動</b><b class='flag-5'>電路</b>

    按鍵彈跳消除模塊的程序設計與應用

    按鍵開關是電子設備人機交互的主要器件之一。按鍵大多是機械式開關結構,由于機械式開關的核心部件為彈性金屬簧片,因而在開關切換的瞬間會在接觸點出現來回
    的頭像 發表于 01-07 08:45 ?2745次閱讀
    按鍵<b class='flag-5'>彈跳</b>消除模塊的程序設計與應用

    開關和繼電器觸點彈跳知識簡介

    RC電路經常用于去抖開關。不幸的是,這往往做錯了!如果慢速邊沿被饋送到沒有滯后的數字輸入,則開關信號可能會在超過邏輯閾值時振蕩。我也經常看到電容器直接放在開關觸點上。很可能這樣的
    的頭像 發表于 08-12 10:30 ?6878次閱讀

    開關電器常用的滅弧方法

    開關電器常用的滅弧方法有哪些?
    的頭像 發表于 07-28 11:39 ?1.3w次閱讀

    防止電路開關彈跳常用方法

    當我們按下按鈕或撥動開關或微動開關時,兩個金屬部件會接觸以短路電源。但它們不會立即連接,而是金屬部件在實際穩定連接之前連接和斷開幾次。釋放按鈕時也會發生同樣的事情。這會導致誤觸發或多次觸發,例如多次按下按鈕。這就像一個彈跳的球從
    發表于 07-13 16:18 ?5104次閱讀
    <b class='flag-5'>防止</b><b class='flag-5'>電路</b><b class='flag-5'>開關</b><b class='flag-5'>彈跳</b>的<b class='flag-5'>常用</b><b class='flag-5'>方法</b>

    NIDEC(尼得科)撥動開關ET115A12-Z數據手冊

    ET系列是標準尺寸高容量撥動開關.ET系列有多種型號可供選擇額定電流值,開關功能和端子。外殼設計使用具有優異耐熱性,耐電弧性和耐電痕性的自熄酚醛樹脂,并通過接觸結構防止電弧引起的絕緣劣化,盡可能減少
    發表于 09-21 11:39 ?0次下載

    NIDEC(尼得科)撥動開關ET125A12-Z數據手冊

    ET系列是標準尺寸高容量撥動開關.ET系列有多種型號可供選擇額定電流值,開關功能和端子。外殼設計使用具有優異耐熱性,耐電弧性和耐電痕性的自熄酚醛樹脂,并通過接觸結構防止電弧引起的絕緣劣化,盡可能減少
    發表于 09-21 11:39 ?0次下載

    NIDEC(尼得科)撥動開關ET215N12-Z數據手冊

    ET系列是標準尺寸高容量撥動開關.ET系列有多種型號可供選擇額定電流值,開關功能和端子。外殼設計使用具有優異耐熱性,耐電弧性和耐電痕性的自熄酚醛樹脂,并通過接觸結構防止電弧引起的絕緣劣化,盡可能減少
    發表于 09-21 11:39 ?1次下載

    NIDEC(尼得科)撥動開關ET225N12-Z數據手冊

    ET系列是標準尺寸高容量撥動開關.ET系列有多種型號可供選擇額定電流值,開關功能和端子。外殼設計使用具有優異耐熱性,耐電弧性和耐電痕性的自熄酚醛樹脂,并通過接觸結構防止電弧引起的絕緣劣化,盡可能減少
    發表于 09-21 11:39 ?0次下載

    彈跳開關電路原理圖講解

    彈跳,從而導致潛在問題,例如誤觸發或多次觸發。這種現象就像一個彈球從高處下降,不斷彈跳,直到最終靜止。傳統的去抖電路,尤其是那些具有轉換觸點的電路,可能并不總是實用或具有成本效益。特
    的頭像 發表于 12-03 17:22 ?890次閱讀
    無<b class='flag-5'>彈跳開關電路</b>原理圖講解
    主站蜘蛛池模板: 九色PORNY蝌蚪视频首页| 51久久夜色精品国产| 九九热在线视频观看这里只有精品| 亚洲无人区码二码三码区别图| 久久大香萑太香蕉av| 777久久人妻少妇嫩草AV| 欧美一级黄色影院| 国产69精品久久久久妇女| 性色爽爱性色爽爱网站| 精品无码久久久久久久动漫| 中文无码字慕在线观看| 欧美日韩第一区| 国产高清-国产av| 亚洲精品午睡沙发系列| 考试考90就可以晚上和老师C| 99香蕉视频| 王晶三级作品| 精品亚洲午夜久久久久| 99精品国产电影| 失禁 调教 刺激 哭喊男男| 狠狠躁天天躁小说| 97草碰在线视频免费| 日日噜噜噜噜夜夜爽亚洲精品| 国产乱码一区二区三区| 在线A亚洲老鸭窝天堂AV高清| 欧美亚洲国产激情一区二区| 国产精品xxxav免费视频| 亚洲视频精品在线观看| 内射老妇BBX| 国产精品视频国产永久视频| 一区二区三区毛AAAA片特级 | 久久精品国产96精品亚洲| 9久久99久久久精品齐齐综合色圆| 色小说在线| 久久国产精品福利影集| xxx日本hd| 亚洲精品久久无码AV片WWW| 噜噜噜狠狠夜夜躁精品| 达达兔午夜一级毛片| 伊人久久大香线蕉影院95| 日本不卡一二三|