전자회로 실무 / 입력·신호

버튼(button)용 RC(Resistor-Capacitor) 필터(filter)는 슈미트 트리거(Schmitt trigger)의 전환 전압과 버튼 반응 시간을 함께 고려합니다

버튼(button)을 한 번 눌렀는데 여러 번 입력됐다면 접점이 순간적으로 붙었다 떨어지는 현상일 수 있습니다. RC(Resistor-Capacitor) 회로와 슈미트 입력으로 짧은 변화를 걸러내되, 정상적인 버튼 반응까지 느려지지 않도록 조정합니다.

먼저 알아둘 용어

바운스(bounce)·디바운스(debounce) — 기계 접점이 한 번 움직일 때 짧게 여러 번 붙었다 떨어지는 현상이 바운스입니다. 이를 하나의 의도한 입력으로 처리하는 것이 디바운스입니다.

RC(Resistor-Capacitor)·시정수 — 저항 R과 커패시터(capacitor) C로 구성한 필터(filter)입니다. 시정수 τ=RC는 전압 변화의 시간 규모이며 R의 단위 Ω, C의 단위 F를 쓰면 τ는 초(s)입니다.

슈미트 트리거(Schmitt trigger)·히스테리시스(hysteresis) — 슈미트 입력은 전압이 올라갈 때와 내려갈 때의 전환 임계값이 다릅니다. 이 임계값 차이가 히스테리시스로, 전압이 임계값 근처에서 조금 오르내릴 때 출력이 반복해서 바뀌는 현상을 줄입니다.

시간이 흐르면서 파형이 진행되는 모습을 보여 줍니다. 흐린 선은 전체 파형이며 진한 선은 현재까지의 구간입니다. 재생 속도와 움직임의 크기는 설명을 위한 것입니다.
정지 그림 확대
시간이 흐르면서 파형이 진행되는 모습을 보여 줍니다. 흐린 선은 전체 파형이며 진한 선은 현재까지의 구간입니다. 재생 속도와 움직임의 크기는 설명을 위한 것입니다. · 그림을 클릭하면 확대됩니다.

작동 원리

RC는 짧은 변화의 영향을 줄이지만 출력이 임계 부근을 천천히 지나게 합니다. 잡음이 겹치면 일반 입력이 여러 번 전환하거나 허용 입력 전이 조건을 벗어날 수 있습니다. 슈미트 입력은 올라갈 때와 내려갈 때의 임계값이 달라 작은 되돌림에 덜 민감합니다. 다만 히스테리시스만 있고 바운스가 두 임계값을 모두 넘으면 여전히 여러 번 전환합니다. 필터 시간과 임계값을 함께 정해야 합니다.

적용 순서

  1. 눌림과 해제 파형을 각각 확인합니다. 실제 접점의 반복 전환 시간과 폭을 보고 부품·운용 조건의 범위를 조사합니다. 특정 예시의 5 ms를 모든 스위치(switch)의 최대 바운스로 사용하지 않습니다.
  1. 사용 입력이 실제로 슈미트 입력인지 확인합니다. 상·하 임계값, 히스테리시스, 누설, 공급 전압별 보장값과 입력 전이 제한을 찾습니다. 일반 GPIO(General-Purpose Input/Output)라고 해서 필요한 히스테리시스가 있다고 가정하지 말고, 해당 핀(pin)의 입력 특성을 확인합니다.
  1. RC의 눌림·해제 경로를 따로 계산합니다. 충전과 방전이 서로 다른 저항을 통과한다면 시간도 다릅니다. 커패시터 방전 전류가 스위치·입력 구조를 과도하게 흐르지 않게 경로를 정합니다. 허용 응답 지연과 가장 빠른 의도된 연속 입력을 함께 고려합니다.
  1. RC 노드(node)와 슈미트 출력을 동시에 관찰하며 천천히 누르기, 빠른 반복, 해제, 전원 투입을 시험합니다. 바운스 중 출력이 한 번만 전환하고, 필요한 정상 입력은 빠뜨리지 않는지 확인합니다.

계산과 판단 예시

설명용으로 초기 0 V에서 3.3 V로 충전하는 이상적 RC와 상승 쪽 임계값 2.0 V, 시정수 10 ms를 가정하겠습니다. 충전식 V(t)=3.3×(1−exp(−t/RC))를 임계값에서 풀면 도달 시간은 −RC×ln(1−2.0/3.3)≈9.32 ms입니다. ln은 자연로그입니다. 시정수가 10 ms라고 곧바로 10 ms 디바운스가 되는 것은 아니며 초기 전압·임계값·부품 공차를 반영해야 합니다.

충전과 방전이 지나는 저항이 다르면 임계값 도달 시간도 달라집니다

3.3 V에서 10 kΩ 풀업 저항을 거쳐 버튼 노드에 연결하고, 버튼 노드에서 다시 10 kΩ 직렬 저항을 거쳐 100 nF 커패시터와 슈미트 입력에 연결했다고 가정하겠습니다. 버튼과 커패시터의 나머지 단자는 각각 접지에 연결합니다. 여기서 kΩ은 1,000 Ω, nF는 10⁻⁹ F입니다.

R1은 풀업 저항, R2는 버튼 노드와 커패시터 사이의 직렬 저항입니다. 누를 때와 놓을 때 전류가 지나는 저항이 달라집니다.
R1은 풀업 저항, R2는 버튼 노드와 커패시터 사이의 직렬 저항입니다. 누를 때와 놓을 때 전류가 지나는 저항이 달라집니다. · 클릭하면 확대됩니다.

버튼을 누르면 커패시터는 직렬 10 kΩ을 통해 방전하므로 시정수는 1 ms입니다. 버튼을 놓으면 풀업 10 kΩ과 직렬 10 kΩ을 모두 거쳐 충전하므로 시정수는 2 ms입니다. 부품값이 하나의 회로에 적혀 있어도 누를 때와 놓을 때의 응답은 같지 않습니다.

하강 쪽 임계값을 1.0 V, 상승 쪽 임계값을 2.0 V로 가정하면, 충분히 충전된 3.3 V에서 1.0 V까지 내려가는 시간은 1 ms×ln(3.3/1.0)≈1.19 ms입니다. 충분히 방전된 0 V에서 2.0 V까지 올라가는 시간은 −2 ms×ln(1−2.0/3.3)≈1.86 ms입니다. 설명용 임계값과 이상 부품을 사용한 계산입니다. 접점이 다시 바뀔 때 커패시터에 전압이 남아 있다면 그 전압부터 계산해야 하므로, 이 시간만으로 바운스 제거를 보장하지 않습니다.

풀업(pull-up) 저항값은 버튼을 누른 동안의 전류도 결정합니다

풀업은 저항으로 입력을 전원에 연결해, 버튼을 놓았을 때도 입력이 높은 논리 전압인 HIGH로 읽히게 하는 방법입니다. 앞 그림에서 버튼을 놓고 커패시터의 충전이 끝나면, 입력의 누설 등을 제외하고는 R1을 거쳐 접지로 흐르는 지속 전류가 거의 없습니다. 버튼을 누르면 상황이 달라집니다. 전원 → R1 → 버튼 → 접지로 길이 생겨, 충분히 시간이 지난 뒤에는 대략 I=VDD/R1이 흐릅니다. 여기서 VDD는 전원 전압, I는 R1을 지나는 전류입니다. 누르는 순간에는 커패시터에 남아 있던 전하가 R2와 버튼을 거쳐 빠지는 별도의 짧은 전류도 있으므로 두 경로를 구분해야 합니다.

버튼을 놓으면 접지로 이어지는 직류 경로가 끊기고, 계속 누르면 전원에서 풀업 저항 R1과 버튼을 거쳐 접지로 전류가 흐릅니다. 커패시터의 순간 전류는 이 그림에서 생략했습니다.
버튼을 놓으면 접지로 이어지는 직류 경로가 끊기고, 계속 누르면 전원에서 풀업 저항 R1과 버튼을 거쳐 접지로 전류가 흐릅니다. 커패시터의 순간 전류는 이 그림에서 생략했습니다. · 클릭하면 확대됩니다.

아래 표에서 mA는 1/1,000 A, µA는 1/1,000,000 A입니다. 소비 전력에 쓰는 mW는 1/1,000 W입니다.

풀업 저항 R13.3 V에서 버튼을 계속 누를 때5 V에서 버튼을 계속 누를 때
4.7 kΩ약 0.70 mA약 1.06 mA
10 kΩ0.33 mA0.50 mA
100 kΩ33 µA50 µA

표는 버튼·배선 저항과 내부 풀업을 제외한 설명용 계산입니다. 3.3 V와 10 kΩ에서는 눌린 동안 R1에서 약 3.3²/10,000=1.09 mW가 소비됩니다. 버튼을 누르지 않은 시간까지 이 전류가 계속 흐른다고 계산하면 배터리 수명을 잘못 추정합니다. 반대로 절전 중에도 버튼이 눌린 채 유지될 수 있다면 그 상태의 전류를 빠뜨리면 안 됩니다. 마이크로컨트롤러(MCU, Microcontroller Unit)의 내부 풀업과 외부 R1이 같은 전원에 연결되고 동시에 켜져 있으면 병렬 저항으로 계산하고, 리셋·절전 상태에서 내부 풀업이 실제로 유지되는지도 대상 부품의 자료로 확인합니다.

저항을 크게 만들면 눌림 전류는 줄지만, 놓인 입력을 HIGH로 지키는 힘도 약해집니다. 입력 누설 전류(input leakage current)는 입력 핀이 신호선에서 받아들이거나 신호선으로 내보내는 작은 전류입니다. HIGH 상태에서 입력·연결 부품이 저항을 통해 공급되는 전류를 접지 쪽으로 빼앗는 최악의 경우, 입력 전압은 대략 VDD−I누설×R1까지 내려갈 수 있습니다. 여기서 I누설은 접지 쪽으로 빠지는 누설 전류의 크기입니다. 예를 들어 누설을 1 µA로 가정하면 100 kΩ에서 전압 강하는 0.1 V입니다. 이는 설명용 수치이며 실제 누설의 최대값과 방향은 부품·온도·전원 상태에 따라 확인해야 합니다. 입력 HIGH 임계값(VIH, Input High Voltage)은 HIGH로 인정되는 최소 전압, 입력 LOW 임계값(VIL, Input Low Voltage)은 낮은 논리 전압인 LOW로 인정되는 최대 전압입니다. 가장 낮은 전원과 가장 불리한 누설에서도 입력 전압이 VIH보다 충분히 높은지 확인합니다. 저항으로 입력을 접지에 연결해 기본값을 LOW로 잡는 풀다운(pull-down) 방식은 버튼을 전원 쪽에 연결합니다. 이때는 누설이 만든 LOW 전압이 VIL 아래에 남아야 합니다.

R1을 크게 하면 배선과 입력의 정전용량(capacitance)을 충전하는 시간도 길어집니다. 그러나 버튼의 응답은 접점 바운스와 이 글의 RC 필터·소프트웨어 확인 시간에도 좌우됩니다. 따라서 ‘빠른 신호에는 항상 4.7 kΩ’, ‘버튼에는 항상 100 kΩ’처럼 값만 외워 적용하지 않습니다. 실제 입력 핀의 VIH·VIL, 최대 누설, 내부 저항, 배선 길이, 전원 범위와 절전 상태를 먼저 적고 저항 후보를 고릅니다. 그다음 버튼을 놓음·계속 누름·절전 중 누름의 세 상태에서 입력 전압과 보드 전류를 재고, 실제 수신 핀에서 상승·하강 파형을 확인합니다. 주변 잡음이나 긴 배선 때문에 오동작하면 저항만 낮추기 전에 배선·필터·입력 임계값도 함께 조사합니다.

소프트웨어(software)에서는 입력을 다시 확인한 뒤 한 번만 처리합니다

하드웨어 필터를 사용하더라도 프로그램이 버튼을 누른 횟수와 전압이 바뀐 횟수를 혼동하면 동작이 중복될 수 있습니다. 에지(edge)는 디지털 입력이 LOW에서 HIGH로, 또는 HIGH에서 LOW로 바뀌는 순간입니다. 인터럽트(interrupt)는 이런 변화가 생겼을 때 중앙처리장치(CPU, Central Processing Unit)가 처리 함수를 실행하도록 알리는 기능입니다. 접점이 흔들리는 동안에는 한 번 누른 동작에서 여러 에지가 생기므로, 인터럽트가 발생할 때마다 곧바로 눌림 횟수를 더하지 않습니다.

예를 들어 LOW로 내려가는 에지가 세 번, HIGH로 올라가는 에지가 두 번이면 양쪽 에지를 감지하는 설정에서는 요청이 다섯 번 생길 수 있습니다. 하강 에지만 감지하면 같은 파형에서 세 번입니다. 요청 수는 인터럽트 설정에 따라 달라지며 어느 쪽도 곧바로 버튼을 누른 횟수가 되지는 않습니다.

여기서는 저항으로 입력을 높은 전압에 연결하는 풀업(pull-up) 방식이며, 버튼을 놓으면 HIGH, 누르면 LOW가 된다고 가정하겠습니다. 타이머(timer)는 정한 시간이 지났는지 확인하는 데 사용합니다. 다음 순서는 접점이 안정될 시간을 확보한 뒤 입력을 다시 읽는 방법입니다.

  1. 입력이 처음 바뀌면 나중에 확인할 시점을 예약합니다. 인터럽트 처리 함수인 ISR(Interrupt Service Routine)에서는 확인이 필요하다는 표시나 타이머 설정만 남기고 빠르게 돌아옵니다. ISR 안에서 수 밀리초 동안 기다리면 다른 처리가 지연될 수 있고, 실행 환경에 따라 시간 지연 함수 자체가 동작하지 않을 수도 있습니다.
  1. 기다리는 동안 추가 에지를 별도의 눌림으로 세지 않습니다. 정한 시간이 지나면 일반 실행 흐름이나 타이머 처리에서 핀을 다시 읽습니다. 예를 들어 10 ms 뒤에 확인할 수 있지만, 이 값은 설명용입니다. 실제 스위치의 바운스 시간과 허용 응답 지연에 맞춰 정해야 합니다.
  1. 읽은 값과 이전에 확정한 버튼 상태를 비교합니다. 이전 상태가 HIGH이고 이번에 LOW를 받아들였다면 눌림을 한 번 처리합니다. 이미 LOW로 확정한 상태에서 다시 LOW를 읽었다면 버튼을 계속 누르고 있는 것이므로 횟수를 더하지 않습니다.
  1. 버튼을 놓을 때도 같은 확인 과정을 거쳐 HIGH 상태를 받아들입니다. 해제가 확인된 뒤에 들어오는 다음 LOW를 새로운 눌림으로 처리합니다. 부팅 때는 처음 읽은 상태를 기준으로 삼을지, 처음부터 눌린 버튼도 입력으로 처리할지 정해 두어야 뜻하지 않은 동작을 피할 수 있습니다.
첫 입력 변화로 재확인을 예약하고, 시간이 지난 뒤 확인한 상태가 이전 확정 상태와 다를 때만 처리합니다. 10 ms는 설명용이며 실제 바운스 시간에 맞춰 정합니다.
첫 입력 변화로 재확인을 예약하고, 시간이 지난 뒤 확인한 상태가 이전 확정 상태와 다를 때만 처리합니다. 10 ms는 설명용이며 실제 바운스 시간에 맞춰 정합니다. · 클릭하면 확대됩니다.

이 방법으로 한 번 다시 읽으면 그 순간의 값을 확인할 뿐, 기다리는 내내 입력이 안정되어 있었는지는 알 수 없습니다. 정한 시간이 지난 뒤에도 접점이 흔들리거나 잡음이 계속 들어온다면, 입력 변화가 관측될 때마다 확인 시점을 뒤로 미루고 일정 시간 같은 값이 유지될 때 받아들이는 방식이 필요합니다. 이때도 입력을 읽는 주기보다 짧은 잡음은 놓칠 수 있으므로, 소프트웨어 확인만으로 모든 잡음을 제거했다고 판단하지 않습니다.

마지막으로 한 번 누르기, 계속 누르기, 놓기, 빠르게 다시 누르기를 각각 시험합니다. 눌림 한 번에 동작이 한 번만 실행되고, 계속 누른 동안에는 반복되지 않으며, 정상적인 다음 눌림은 놓치지 않아야 합니다. RC 필터와 소프트웨어 확인을 함께 쓸 때는 두 과정 때문에 생기는 전체 반응 지연도 확인합니다.

적용 조건과 한계

노이즈·긴 케이블(cable)·ESD(Electrostatic Discharge)·전원 순서 문제를 디바운스 하나로 해결하지 않습니다. 느린 입력에 대한 허용이 없는 게이트(gate)를 RC 뒤에 쓰지 않습니다. 소프트웨어 디바운스와 함께 쓴다면 두 지연을 더해 사용자가 기대하는 반응을 확인합니다.

확인과 기록

버튼을 한 번 누르거나 놓을 때 각각 한 번의 입력으로 인식되는지 확인합니다. 짧은 간격으로 다시 눌렀을 때도 제대로 인식하고, 부팅할 때 버튼을 누르지 않았는데 입력이 발생하지는 않는지 기록합니다. 파형이 매끈한지와 실제 기능이 정확한지를 모두 확인합니다.

작업 순서를 다시 확인합니다

버튼용 RC 필터는 슈미트 트리거의 전환 전압과 버튼 반응 시간을 함께 고려합니다 — 설명용 도해
버튼용 RC 필터는 슈미트 트리거의 전환 전압과 버튼 반응 시간을 함께 고려합니다 — 설명용 도해 · 클릭하면 확대됩니다.