زمانی که کلیدی را فشار میدهید برای تغییر وضعیت آن نیاز به کمی زمان است؛ به زمانی که دست را روی کلید فشار میدهید تا سیگنال به کلید برسد پریود تایم میگویند. حالا در برخی پروژهها این زمان ممکن است دردسرساز شود. برای مثال، شما فرض کنید یک کی پد دارید و میخواهید زمانی که کلید # زده شده اتفاقی بیفتد ممکن در حین فشاردادن کلید درست زده نشود یا سیگنال به میکروکنترلر شما ارسال نشود و موجب مشکلاتی در پروژه شود، به بهینهسازی این کار دیبانسینگ هست.
شما دیباسینگ را هم به شکل نرمافزاری و هم به شکل سختافزاری میتوانید پیاده کنید. در ابتدا با استفاده از فیلتر بالاگذر نحوه پیادهسازی این مدار را تحلیل میکنیم. قبل از آن لازم است راجع به چند مورد صحبت کنیم.
مقاومت pullup
این مقاومت به کلید و 5 ولت میکرو متصل می شود. فرض کنید کلید شما در حالت پیش فرض یک است. با وجود این مقاومت این اتفاق می افتد و در صورتی که کلید فشار داده شود، خروجی صفر می شود. برای جلوگیری از اتصال کوتاه شدن در مدار از این مقاومت ها استفاده می کنند، معمولا این مقاومت بین 4 تا 10 کیلو انتخاب می شود.
مقاومت pulldown
این مقاومت بین کلید و زمین قرار میگیرد. این مقاومت هم بهصورت داخلی از میکروکنترلر قابلپیادهسازی است. هدف استفاده از این مقاومت پیشگیری از ولتاژ بالا
روشهای دیباسینگ سختافزاری
مدار با گیت NAND
در اینجا ما دو تا گیت NOT را با هم سری میکنیم. نیاز به یک مقاومت بین کلید و 5 ولت هم داریم که مقاومت پول آپ ما است اینجا شماتیک مدار را میتوانید ببینید.
حالا نمونه طراحی شده این مدار در بردبورد و شکل خروجی سیگنال آن در اسیلوسکوپ را میبینم.
اگر دقت کنید سیگنال خروجی یک پالس مربعی پیدا کرده و دیگر نویزهای ناشی از فشاردادن مکرر کلید را نمیبینم.
مدار فیلتر پایین گذر
میتوانیم از مدار RC برای کنترل این مدار استفاده کنیم؛ فقط نیاز داریم از یک گیت not بهعنوان خروجی استفاده کنیم. برای اینکه خروجی سیگنال کلید را اصلاح کند به شماتیک زیر دقت کنید.
در مدار بالا هر زمان کلید صفر شود گیت آن را یک میکند و برعکس این کار موجب میشود سیگنال خروجی ما دچار اعوجاج نشود.
استفاده از آی سی
برخی آیسیها که در بازار هستند این امکان میدهند بدون طراحی مدار خاصی بتوانیم سوئیچ خود را کنترل و از نویزهای احتمالی جلوگیری کنیم.
دیبانسینگ نرمافزاری
با استفاده از زبانهای برنامهنویسی و کمی تنظیمات شما میتوانید دیبانسینگ را پیادهسازی کنید. ما در اینجا از آردوینو یونو استفاده میکنیم و برای این کار از کتابخانه آن استفاده میکنیم. در ابتدا طبق شماتیک زیر پیش برید.
این نمونه کد بدون دیبانسینگ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | const int BUTTON_PIN = 7; // the number of the pushbutton pin // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if(lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; } |
در کد بالا اگر کلید را چند بار فشار دهیم ممکن است خروجی سریال تغییر کند و پیغام اشتباه به ما نمایش داده بشود. حالا برای اصلاح این مشکل از کد زیر استفاده میکنیم. در این کد از کتابخانه آن استفاده شده است.
نمونه کد با دیبانسینگ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | // This file is open source under the terms of the BSD 3-Clause license. // // Example basic usage for the debounce library. #include<Arduino.h> #include<debounce.h> // Connect a button to some GPIO pin; digital pin 6 in this example. static constexpr int PIN = 6; static void buttonHandler(uint8_t btnId, uint8_t btnState) { if (btnState == BTN_PRESSED) { Serial.println("Pushed button"); } else { // btnState == BTN_OPEN. Serial.println("Released button"); } } // Define your button with a unique id (0) and handler function. // (The ids are so one handler function can tell different buttons apart if necessary.) static Button myButton(0, buttonHandler); void setup() { Serial.begin(115200); pinMode(PIN, INPUT_PULLUP); } static void pollButtons() { // update() will call buttonHandler() if PIN transitions to a new state and stays there // for multiple reads over 25+ ms. myButton.update(digitalRead(PIN)); } void loop() { pollButtons(); // Poll your buttons every loop. delay(10); // Loop iterations should run fairly quickly, 10's of ms, not 100's. |
در کد بالا که میتوانید درexampleهای کتابخانه دیبانسینگ آن را ببینید. استفاده از متد update در تابع pullbottons موجب میشود که خروجی پین موردنظر ما درصورتیکه یک باشد صفر شود و برعکس در این حالت true برمیگرداند. این متد از بهوجودآمدن خطا در حین زدن کلید پیشگیری میکند. همچنین، inputpullup موجب میشود ما از واحد داخلی میکروکنترلر برای پول آپ استفاده کنیم.
لغت دیبانس یا debounce صحیح هست
Debounce?=دبایس؟
فیلتر پایین گذر یا بالاگذر؟