STM32ソフトウェアキーデバウンス

入門

  機械的スイッチは、典型的に使用されるエラストマーボタンスイッチであり、機械的接点が開いているときに、安定した閉じたときに、キースイッチが即座にオンされていない、機械的接触のばね作用するので、閉じられ、また開口時れます図に示すように、それが突然、完全にオフが、閉鎖及びジッタ系列に沿った瞬間であろう。

    

分析

  閉じるボタンの安定化は、100ミリ秒よりも通常より多く、時間の長さはオペレータによって決定され、それはすぐに、意図的に低くすることは困難で約40〜50ミリ秒、到達押すことができます。ジッタは、一度だけ切断に応答してプログラムキーまたは閉鎖を確保するためには、キーデバウンスを処理する必要があり、通常は10ミリ秒未満で、キーの機械的特性によって決定される時間です。

この方法の一つ

  ほとんどの場合、我々は、揺れの除去を達成するために使用されるソフトウェアプログラムを使用します。最も簡単なデバウンス原則、つまり、時に検出されたキーの状態変化、ちょうど同じで検出された状態ならば、我々はボタンを確認することができ、再度、キー状態検出の消失を振るように、およそ10ミリ秒の遅延時間を待ちますこれは、安定した動作を持っています。実用的なアプリケーションでは、このアプローチに大きな(貧しいリアルタイム)の制限。

方法二

  それならば8つの連続スキャンは、キーの状態で8回連続して見てた後、キーの状態をスキャンし、保存され、割り込みに2ms毎に割り込みタイマーを有効にすることと同じです。8キー時刻は、キーが一貫している場合、図2に示すように、むしろジッタ位相よりも、安定した段階でキーを決定することが可能である。この状態内で約16msの、16msのです。

    

コードの一部

// 外部中断触发(下降沿)
のボイド EXTI15_10_IRQHandler(無効
{ 
    場合(!RESET = EXTI_GetFlagStatus(EXTI_Line5))
    { 
        静的 U32 lasttime = 0 ; 

        もし((g_tickCount - lasttime)> 100 
        { 
            T_1min_cnt = TIM2OpenTime。
            TIM_ITConfig(TIM2、TIM_IT_Update、ENABLE)。
            lasttime = g_tickCount。
        } 
        EXTI_ClearITPendingBit(EXTI_Line5)。
    } 
}

 

/ * TIM2部分中断服务函数* / 
無効 TIM2_IRQHandler(無効// 250us 
{   
     場合(TIM_GetITStatus(TIM2、TIM_IT_Update)=!RESET)
    { 
        T_250us_cnt ++ ;
        もし(T2_250us_cnt> = 8// 2msのIRQ 
        { 
            T2_250us_cnt = 0 静的 U8 Keybuf1 = 0xffで、WG_AKeyBuf = 0xFFで; 

            Keybuf1 =((Keybuf1 << 1)| GPIO_ReadInputDataBit(GPIOG、GPIO_Pin_5))。// バッファのいずれかを左に、最下位ビットの現在値がシフト

            IF$ 00 == Keybuf1)// 。8回の連続走査が0、即ち、16ミリ秒押された状態、即ち内で検出されており、そのキーを押し
            { 
                Key1Sta = 0 ; 
            } 
            そう IF0xFFで == Keybuf1)// キーバウンス
            { 
                Key1Sta = 1 ; 
            } 
            そう// それ以外の場合は、キーの状態はまだ、値が変数KeyStaに更新されていない安定化されていないことを示す
                 // Key1Sta = 1; / / デフォルト値    
        } 
        TIM_ClearITPendingBit(TIM2、TIM_FLAG_Update); 
    }
}

 

おすすめ

転載: www.cnblogs.com/jiangzhaowei/p/11237331.html