TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 23 READS

버튼 한 번 눌렀는데 신호가 열 번 튄다면 — 슈미트 트리거와 히스테리시스 이야기

버튼 한 번 눌렀는데 신호가 열 번 튄다면 — 슈미트 트리거와 히스테리시스 이야기
SOURCE IMAGE · HACKER NEWS
버튼 한 번 눌렀는데 신호가 열 번 튄다면 — 슈미트 트리거와 히스테리시스 이야기

아두이노나 라즈베리파이로 뭔가 만들어본 적 있으신가요? 버튼 하나 연결하고 '눌리면 LED 켜기'를 구현했는데, 분명 한 번 눌렀는데 코드는 열 번 눌렸다고 인식하는 경험. 임베디드 입문자라면 거의 통과의례처럼 겪는 일이거든요. 소프트웨어 세계에서는 0은 0이고 1은 1이지만, 현실의 전기 신호는 그렇게 깔끔하지 않아요. 항상 노이즈가 섞여서 출렁거리죠. 오늘은 이 문제를 해결하는 고전적이면서도 우아한 회로, 슈미트 트리거(Schmitt Trigger) 이야기를 해볼게요. 하드웨어 안 하는 분들도 끝까지 읽어보세요. 이 개념, 사실 서버 운영이랑 백엔드 설계에도 그대로 등장하거든요.

먼저 비교기부터 알아볼게요

슈미트 트리거를 이해하려면 비교기(comparator)부터 알아야 하는데요. 비교기가 뭐냐면, 입력 전압을 기준 전압과 비교해서 더 높으면 HIGH(1), 낮으면 LOW(0)를 출력하는 회로예요. 연속적으로 변하는 아날로그 세계를 딱 떨어지는 디지털 세계로 번역해주는 관문인 셈이죠. 온도 센서 값이 기준을 넘으면 팬을 켜고, 조도 센서 값이 기준 아래로 내려가면 가로등을 켜는 식으로, 생각보다 정말 많은 곳에 숨어 있어요.

문제는 경계선 근처에서 터져요

그런데 이 단순한 구조에 치명적인 약점이 있어요. 입력이 기준값 근처에서 어슬렁거릴 때예요. 예를 들어 기준이 2.5V인데 입력 신호가 노이즈 때문에 2.49V와 2.51V 사이를 미세하게 오르내린다고 해볼게요. 그러면 출력은 0과 1 사이를 미친 듯이 왔다 갔다 해요. 이걸 채터링(chattering)이라고 부르는데요, 사람 눈에는 버튼을 한 번 누른 것뿐인데 회로 입장에서는 접점이 붙었다 떨어졌다를 수십 번 반복한 것으로 보이는 거예요. 이 출력이 인터럽트에 연결되어 있다면? 한 번의 클릭이 수십 번의 이벤트가 되어버리죠.

해법: 문턱을 두 개로 나누기

슈미트 트리거의 아이디어는 허무할 정도로 단순해요. 임계값을 하나가 아니라 두 개로 나누는 거예요. 올라갈 때는 상위 임계값(예: 2.7V)을 넘어야 HIGH가 되고, 일단 HIGH가 된 다음에는 하위 임계값(예: 2.3V) 아래로 확실히 내려가야만 LOW로 돌아가요. 두 문턱 사이의 간격, 여기서는 0.4V를 히스테리시스(hysteresis)라고 불러요. 이제 노이즈 폭이 0.4V보다 작으면 경계 근처에서 아무리 흔들려도 출력은 꿈쩍하지 않아요.

일상 비유로는 에어컨이 딱이에요. 26도로 설정했다고 26.0도를 기준으로 켰다 껐다를 반복하면 컴프레서가 남아나질 않겠죠. 그래서 실제로는 27도가 되면 켜고, 25도까지 내려가면 끄는 식으로 여유 구간을 둬요. 이 여유 구간이 바로 히스테리시스예요.

회로로는 출력의 일부를 입력 쪽으로 되돌리는 양의 피드백(positive feedback)으로 구현해요. 출력이 HIGH냐 LOW냐에 따라 실효 임계값이 위아래로 이동하게 만드는 거죠. 저항 두 개의 비율로 히스테리시스 폭을 원하는 만큼 설계할 수 있고, 74HC14처럼 아예 슈미트 트리거가 내장된 로직 칩도 흔해요. 회로도에서 게이트 기호 안에 조그맣게 그려진 히스테리시스 곡선 마크가 보이면 '아, 얘는 문턱이 두 개구나' 하고 읽으면 돼요. 버튼 디바운싱, 노이즈 낀 센서 신호를 깨끗한 사각파로 다듬기, 온도나 조도처럼 느리게 변하는 신호를 디지털 입력에 넣기 전 정리하기 같은 곳에 두루 쓰여요.

소프트웨어에도 똑같은 문제가 있어요

여기서부터가 하드웨어 안 하는 분들을 위한 이야기인데요. 오토스케일링을 생각해보세요. 'CPU 사용률 80% 초과 시 서버 증설'이라는 규칙 하나만 있으면, 사용률이 79%와 81% 사이에서 출렁일 때 서버가 생겼다 사라졌다를 반복해요. 이걸 플래핑(flapping)이라고 하는데, 채터링과 완전히 같은 문제예요. 그래서 실전에서는 증설 기준은 80%, 축소 기준은 60%로 벌려놓죠. 모니터링 알림도 마찬가지예요. 발생 임계값과 해제 임계값을 분리하지 않으면 경계 근처에서 알림이 울렸다 꺼졌다를 반복하면서 새벽에 온콜 담당자를 괴롭혀요. 로드밸런서 헬스체크가 '연속 3회 실패 시 제외, 연속 2회 성공 시 복귀'처럼 동작하는 것도 시간 축에서의 히스테리시스라고 볼 수 있어요.

정리하면

'경계값 근처에서 시스템이 떨리는' 문제는 전자회로든 클라우드 인프라든 어디에나 있고, 해법은 언제나 같아요. 문턱을 두 개로 나누고 그 사이에 완충 구간을 두는 것. 1930년대에 오토 슈미트가 오징어 신경의 신호 전달을 연구하다 고안한 회로의 원리가, 지금 여러분의 쿠버네티스 오토스케일러 설정에도 그대로 살아 있는 셈이죠. 여러분의 시스템에도 임계값 하나로만 동작하는 로직이 있다면, 경계 근처에서 떨고 있지 않은지 한번 점검해보세요. 플래핑이나 채터링 때문에 고생해본 경험, 댓글로 공유해주시면 재미있을 것 같아요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.wevolver.com/article/schmitt-trigger-robust-comp...
SHARE
처리 중...