본문 바로가기
독서에서 한걸음

debounce

by oncerun 2023. 1. 21.
반응형

장치에 버튼이나 스위치가 들어가는 경우 버튼에 연결된 금속 조각이 접점에 닿으면 금속 조각이 아주 잠깐 bounce를 가지면서 접정에서 떨어진다. 접촉면이 안정될 때까지 이런 돼 튕김이 여러 번 발생할 수 있다.

 

버튼을 프로세서의 인터럽트 발생 핀에 연결하는 경우 푸쉬 버튼을 한 번 눌러도 인터럽트가 여러 번 발생할 수 있다.

 

버튼을 디바운스(debounce)되는 현상을 제거할 필요가 있다.

 

대부분의 시스템에는 주기적인 인터럽트를 만들어내는 일종의 타이머가 있다. 이 인터럽트를 이용해 버튼 디바운싱을 해결할 수 있다.

 

이를 해결하기 위해서는 일정 시간동안 버튼의 상태를 지속적으로 관찰해야 합니다. 이를 FIR을 사용하면 해결할 수 있다.

 

타이머를 이용해 주기적으로 인터럽트를 만들어내면서, 버튼 상태를 지속적으로 관찰할 수 있습니다. 

 

이때 큐를 사용해 버튼의 상태를 저장하고, 큐의 원소들을 OR 연산을 통해 하나의 상태를 생성할 수 있기 때문입니다.

또한 이전 상태와 현재 상태를 XOR 연산을 통해 비교할 수 있어, 버튼이 언제 눌렸는지 판단할 수 있습니다. 

 

이를 통해 실제 버튼이 눌렸을 때만 이벤트를 처리할 수 있어, 버튼 디바운싱 문제를 해결할 수 있다.

 

 

예를 들어 FIR를 구현하려면 우선 Queue가 하나 필요하다. 이 큐의 길이는 정해져 있어야 하며 이벤트를 저장할 수 있는 크기를 가져야 한다.

I/O 포트 상태는 INB라는 8비트 변수를 통해 읽을 수 있기 때문에 큐의 길이는 8개의 비트를 저장할 수 있는 크기를 가진다. 

 

타이머를 설정해야 하는데, 시스템이 가지고 있는 인터럽트를 주기적으로 발생시키는 타이머를 이용한다고 한다.

타이머 틱이 발생할 때 큐의 가장 오래된 값을 버리고 새 값을 삽입하면서 기존 값들을 하나씩 시프트 한다.

그리고 배열 원소들을 OR 하여 상태를 만들어내고, 원소가 2개 ( current와 previous) 있는 큐의 current 입력으로 넣는다. 

넣기 직전 current 값을 previous로 옮긴다. 

이제 current와 previous의 상태를 XOR 하면 버튼의 상태가 변경되었는지 알 수 있다.

 

FIR 필터는 입력 신호에 대한 고정된 가중치를 적용하여 출력 신호를 만드는 필터이다. 이러한 가중치는 원소 개수라고 할 수 있고 이 개수는 버튼의 바운싱 정도가 얼마나 큰지와 인터럽트가 얼마나 자주 걸리는지에 따라 정해야 합니다.

 

위 그림은 filter 배열을 사용하여 가중치를 저장하고 있습니다.

루프를 통해 필터 배열을 이동하면서, 각 필터 값을 current 변수에 OR 연산을 통해 합산하고, 현재 필터 값을 이전 필터 값으로 이동시켜 이전 필터 값을 덮어쓴다. 

그리고 필터의 첫 번째 인덱스에 INB값을 할당하고, current에 filter [0] 값을 OR 연산하여 합산합니다.

 

이렇게 필터 된 값을 previous와 current로 XOR 연산하여 변경된 버튼을 알 수 있습니다.

 

 

1. I/O 포트의 상태는 INB라는 8비트 unsigned char 변수를 통해 읽을 수 있다.

 

즉 I/O 포트에 연결된 버튼의 상태를  0과 255 사이의 값으로 표현할 수 있는 8비트만큼의 메모리를 사용하여 확인할 수 있다. 따라서 INB 변수를 읽으면 포트에 연결된 여러 개의 버튼의 상태를 한 번에 확인할 수 있다는 것이다.

 

2. 유한 임펄스 응답

 

Inite Impulse Response로 시간 응답이 유한하고 선형인 임펄스 응답 필터를 의미한다. 

입력 신호에 대해 선형 시스템의 응답을 제공하는데, 일반적으로 이런 필터는 일정한 가중치를 갖는 지수 이동 평균 필터로 구성된다. 

FIR(유한 임펄스 응답) 필터는 주로 신호 처리, 음성 처리, 오디오 처리, 이미지 처리 등 다양한 분야에서 사용된다.

 

 

 

 

 

반응형

'독서에서 한걸음' 카테고리의 다른 글

아싸  (0) 2023.02.20
읽고 싶은 책이 늘었다.  (0) 2023.02.06
도메인 모델과 경계  (0) 2023.01.03
도메인 주도 개발 Value Type  (0) 2023.01.01
Comments  (0) 2022.12.28

댓글