Chống rung phím

Chống rung phím

Rung phím là hiện tượng tín hiệu bị nhiễu (không dứt khoát) khi nhấn phím. Hiện tượng này xảy ra do tiếp điểm vật lý trong nút nhấn tiếp xúc không tốt, dẫn đến có thể trong 1 lần nhấn phím nhưng gây ra nhiều xung tín hiệu như trong hình trên.

Có nhiều giải pháp để khắc phục hiện tượng này.

Chống rung phím bằng phần mềm

Chúng ta sẽ thêm vào những đoạn mã giúp MCU bỏ qua những tín hiệu không mong muốn bằng cách thêm vào những khoảng thời gian Delay sau khi nhấn phím, hệ thống sẽ chờ đến khi tín hiệu ổn định rồi mới lấy và xử lý tín hiệu.

Có một vài cách thêm vào như sau:

if(Button_pressed?)
{
  Delay(TimeDebounce); //This value about (ms)
  Pressed_State;
}
else Not_Pressed;

Giải thích: Sau khi kiểm tra có tín hiệu nhấn phím, chúng ta để cho hệ thống Delay 1 khoảng thời gian (Tạm dừng chưa lấy tín hiệu). Khoảng thời gian này khá lớn (Cỡ vài chục ms).

Đặc điểm: Khi bạn nhấn phím lâu hơn thời gian Delay thì hệ thống sẽ lại thực thi 1 hoặc nhiều lần nữa. Khiến cho hàm trong mệnh đề IF sẽ được thực hiện hơn 1 lần.

Chúng ta có thể ứng dụng việc này vào việc tăng hoặc giảm giá trị nào đó chẳng hạn….

if(Button_pressed?)
{
  While(Button_pressed?) Delay(TimeDebounce); //This value about (ns)
  Pressed;
}
else Not_Pressed;

Giải thích: Sau khi hệ thống kiểm tra có tín hiệu nhấn phím hay không, nếu có thì hệ thống sẽ nhảy vào trong mệnh đề IF, tại đây hệ thống sẽ kiểm tra tiếp xem phím có đang được nhấn hay không tại mệnh đề WHILE, nếu có thì sẽ Delay 1 khoảng thời gian. (Giá trị Delay này bạn có thể đặt cỡ vài chục ns - Ít hơn nhiều so với cách phía trên)

Đặc điểm: phương pháp này sẽ Delay liên tục cho đến khi phím được nhả ra thì mới thực thi chương trình xử lý. Tiết kiệm thời gian hơn so với phương pháp trước.

VD trên MSP430:

#include <msp430.h>       //Include library

//Define action
#define set |=            //SET bit
#define clr &=~           //CLEAR bit
#define tgl ^=            //TOGGLE bit

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

  //Output init
  P1DIR set (BIT0 + BIT6);                  //Set direction: OUT
  P1OUT set BIT0;                           //Make HIGH state (Voltage level) at P1.0 (BIT0 of P1)
  P1OUT clr BIT6;                           //Make LOW state (Voltage level) at P1.6 (BIT6 of P1)

  //Button init
  P1DIR clr BIT3;                           //Set direction: IN
  P1OUT set BIT3;                           //Pull button to HIGH Voltage
  P1REN set BIT3;                           //Pull-up internal resistor

  while (1)
  {
    if ((P1IN & BIT3) != BIT3)              //Button pressed?
      {
        P1OUT tgl (BIT0 + BIT6);            //Do anything...
        _delay_cycles(300000);

        //while((P1IN & BIT3) != BIT3) _delay_cycles(300);
      }

  }
}

Chống rung phím bằng phần cứng

Dạng sóng tín hiệu từ nút nhấn khi chưa có chống rung

Phương pháp này sẽ thêm vào mạch của bạn 1 vài linh kiện như Tụ điện, Điện trở, Cổng Logic… nhằm ổn định tín hiệu từ nút nhấn.

Một số mạch chống rung có thể tham khảo:

Thêm tụ để chống rung

Active High or Low

Ví dụ chống rung phím bằng tụ và điện trở

Tín hiệu sau khi lắp thêm tụ vào như sau:

Debounced Edge

Giải pháp: Ngoài trở treo, chúng ta cần thêm 1 tụ cỡ nhỏ nữa để có thể san những gợn tín hiệu không mong muốn.

Nhược điểm: Tín hiệu đầu ra không thực sự tốt, do có thời gian nạp cho tụ điện nên tín hiệu sẽ có dạng đường cong.

Sử dụng cổng NAND để chống rung

Chống rung với chuyển mạch Trigger NOT 74HC14

Sử dụng 4093, 40106 lấy ra 2 trạng thái

Giải pháp: Thêm linh kiện NAND 4093 hoặc 74HC14 vào để đưa ra tín hiệu xung vuông hoàn chỉnh.

Sử dụng 2 cổng NAND IC74LS00 để chống rung

Giải pháp: Cũng đưa ra tín hiệu xung vuông hoàn chỉnh, và có thể lấy ra tín hiệu đảo tại chân Q

Chống rung với IC MAX812

Chống rung với IC MAX6818

Có thể sử dụng các IC chuyên dùng để giải quyết vấn đề chống rung phím một cách nhanh chóng, mạch điện đỡ phức tạp.

Tùy vào mục đích, yêu cầu bài toán đặt ra mà bạn sử dụng các phương pháp Cứng - Mềm kết hợp lẫn nhau.

Enjoy!