인터럽트를 이용한 디지털 스위치 바운싱(채터링) 해결 방법 – ATmega2560 디바운싱

2025년 12월 04일

디지털 스위치 입력의 접점단속 현상으로 발생하는 바운싱(bouncing)과 채터링(chattering)은 마이크로컨트롤러가 입력을 여러 번 잘못 인식하게 만드는 대표적인 문제이다. 본 글에서는 ATmega2560과 오실로스코프를 이용해 실제 바운싱 파형을 분석하고, 추가 회로 없이 인터럽트에 지연시간을 삽입하는 방식으로 바운싱을 해결하는 실용적인 디바운싱 기법을 소개합니다.

바운싱으로 인한 채터링

바운싱(Bouncing)과 채터링(Chattering)의 이해

디지털 회로에서 물리적인 스위치 입력을 사용할 때 항상 골치 아프게 하는 문제가 바로 바운싱(bouncing)이라고 불리는 접점단속(接點斷屬) 현상이다.

스위치의 역할은 떨어진 두 지점을 물리적으로 이어 전류가 흐를 수 있도록 해 주는 것이다. 그러나 사람이 스위치를 한 번 꾸~~욱 눌렀다고 느끼는 그 순간에도, 실제 접점은 기계적인 반동 때문에 여러 번 튀어 오르며(bounce) 붙었다 떨어지기를 반복한다. 공을 바닥에 떨어뜨리면 여러 번 튀어 오르는 것과 같은 현상인데, 이는 스위치 구조상 피할 수 없는 물리적 특성이다.

이러한 기계적 바운싱이 발생하면, 스위치 출력은 그에 따라 빠르게 HIGH/LOW를 오르내리며 변동한다. 이러한 전기적 신호의 불안정성을 채터링(chattering)이라고 부른다. 즉, 바운싱은 기계적 원인이고 채터링은 그 결과로 나타나는 전기적 노이즈이다.

(하지만 바운싱과 채터링은 두 표현은 현장에서 거의 동일한 의미로 혼용되어 사용한다. 본 글에서도 마찬가지로 혼용해 사용할 것이다.)

문제는 디지털 시스템이 이 불안정한 신호 변화를 모두 정상 입력으로 받아들인다는 점이다. 사용자는 버튼을 한 번 눌렀다고 생각하지만, 마이크로컨트롤러는 이 짧은 바운싱 구간 동안 발생한 변화를 수십 번의 입력 이벤트로 처리할 수 있을만큼 빠르게 동작한다.

실제 파형의 모습

아래 그림은 NKK Switch사의 YB26WSKW01-2CF02-JB 토글식 푸시스위치를 이용하여, 스위치 접점에서 실제로 어떤 일이 일어나는지 오실로스코프로 측정한 파형이다. 스위치는 ‘딱 한 번’ 눌렀다.

스위치 바운싱과 채터링으로 인해 ATmega2560 인터럽트가 여러 번 발생하는 오실로스코프 파형. 노란색은 스위치 출력, 하늘색은 인터럽트 실행 신호를 나타낸다.
  • 노란색 파형 : 스위치의 물리적 출력 전압
  • 하늘색 파형 : 해당 신호를 입력받은 ATmega2560 AVR의 인터럽트 루틴 실행 신호

스위치 출력은 여러 번 요동치고 있으며, 하늘색 파형은 ATMEGA2560 AVR에서 인터럽트 루틴이 그만큼 반복 실행된 것을 보여준다. 몇 번 실행됐는지 세기도 싫을 정도다…

바운싱을 막기 위한 하드웨어적 접근과 한계

이러한 현상을 완화하기 위해 사용되는 방법은 여럿 존재한다.

  • 고품질 스위치 사용: 물리적 구조가 정교한 스위치는 바운싱이 적게 발생한다.
  • 콘덴서(Capacitor) 병렬 연결: 콘덴서는 순간적인 전압 변동을 완화하여 채터링을 줄여 준다.
  • 래치(Latch) 회로 구성: SR 래치나 논리게이트를 이용해 바운싱 신호를 안정된 신호로 변환할 수 있다.

하지만 이들 방법은 부품 비용이 증가하거나 회로 구성이 복잡해진다는 단점이 있다. 무엇보다 기본적으로 바운싱이라는 물리적 현상을 완전히 없애는 것은 불가능하다는 사실은 변하지 않는다. 스위치를 바꾸고 콘덴서를 달아도, 결국 바운싱은 형태만 달라질 뿐 완전히 없어지지 않는다.

따라서 대부분의 디지털 시스템에서는 하드웨어 보완과 더불어, 소프트웨어적으로 바운싱을 처리하는 디바운싱(debouncing) 방법을 반드시 함께 사용한다. 그렇지 않으면 버튼을 한 번 눌렀는지, 열 번 눌렀는지 시스템이 랜덤하게 판단하는 혼란스러운 상황이 생길 수 있다. 결국 내가 만든 시스템이 어떻게 동작할 지 전혀 예상 할 수 없는 랜덤박스가 되어 버린다.

지연시간으로 바운싱 회피

지연 디바운싱의 원리

바운싱 현상은 물리적 스위치를 사용하는 이상 피할 수 없는 문제이며, 반드시 처리해야 한다. 이를 해결하기 위한 여러 방법이 존재하는데, 그중 가장 간단하고 추가 부품이 필요 없는(즉, 비용이 들지 않는) 방식이 바로 지연시간(delay)을 이용한 디바운싱이다.

원리는 매우 단순하다. 스위치가 눌리는 것을 감지하면 바운싱이 완전히 사라질 때까지 잠시 기다렸다가 입력을 확정하는 것이다. 즉, 스위치가 흔들리는 짧은 구간 동안의 입력 변화는 모두 무시하고, 안정된 상태가 되었을 때 한 번만 처리하도록 하는 방식이다. 별도의 하드웨어를 구성할 필요가 없기 때문에 임베디드 시스템에서 가장 흔하게 사용되는 디바운싱 기법이다.

인터럽트 기반 구현 예시

아래는 스위치의 변화를 감지하고 실행되는 인터럽트 루틴에 1ms의 지연시간을 추가한 코드이다. 인터럽트가 한 번 실행된 후 일정 시간 동안은 추가 입력을 무시하여 바운싱을 효과적으로 막는다.

ISR(PCINT0_vect)
{
	PCICR = PCICR & 0xFE;	// 하는동안 딴 짓 못하게 인터럽트 백터 막고
	PORTA=0xff;				// 불을 켜 보고
							// 할거 하고
	_delay_ms(1);			// 스위치를 입력을 1msec 동안 씹는다. 
	
	PCIFR = (1<<PCIF0);	// 기다릴만큼 기다렸으니, 인터럽트 플래그 해제
	PCICR = PCICR | 0x01;	// 인터럽트 다시 활성화
	PORTA=0x00;				// 불을 꺼 보자
}

실행 결과

1ms 지연 디바운싱 적용 후 스위치 바운싱 신호가 제거되어 ATmega2560 인터럽트가 한 번만 실행되는 오실로스코프 파형. 노란색은 스위치 전압, 하늘색은 인터럽트 처리 신호이다.

처음 인터럽트가 발생하고 약 1ms 동안(PORTA가 HIGH인 구간) 바운싱으로 인해 입력 신호가 여러 차례 변화했음에도 불구하고, 인터럽트 루틴은 단 한 번만 실행되었다. 지연시간 동안 발생한 모든 전기적 잡음(chattering)이 무시되었기 때문이다.

장점과 단점

이 방식의 가장 큰 장점은 회로 변경 없이 소프트웨어만으로 바운싱 문제를 해결할 수 있다는 점이다. 대부분의 사용자 입력에서는 수 ms 정도의 지연이 큰 문제가 되지 않기 때문에 매우 실용적이다.

하지만 단점도 있다. 지연시간을 추가하는 만큼 시스템의 반응 속도가 느려진다는 점이다. 매우 즉각적인 입력 반응이 필요한 시스템(예: 초고속 인코더 등)에서는 사용하기 어렵다. 그럼에도 일반적인 스위치 입력에서는 충분히 사용할 만하며, 추가 비용 없이 적용할 수 있는 간단한 해결 방법이라는 장점이 있다.

🔄 갱신 내역

  • 최초 게시
  • 주소 이전
  • 주소 이전 및 수정