임베디드 용어 사전
GPIO·인터럽트

채터링

기계식 스위치가 접점에서 짧게 여러 번 붙었다 떨어지는 현상. 한 번 누른 것이 여러 번으로 읽힌다.

버튼은 금속 접점이라 붙는 순간 수 ms 동안 튄다.

이상          ─────┐________
실제          ──┐_┌┐_┌─┐____   1~20ms 동안 여러 번

인터럽트로 세면 한 번 눌렀는데 카운터가 5씩 오른다.

대응 셋

소프트웨어 시간 필터   변화를 감지한 뒤 일정 시간 무시하거나,
                    N번 연속 같은 값일 때만 확정한다
하드웨어 RC 필터      저항+커패시터로 파형을 눕힌다
슈미트 트리거 입력     임계값을 위아래로 다르게 둬 흔들림을 흡수한다

인터럽트로 처리할 때의 정석

ISR 에서 세지 말고 플래그만 세우고 타이머로 확정한다.

void EXTI_IRQHandler(void) { pending = 1; t0 = now_ms(); }   // ISR 은 짧게
/* 메인 루프 */
if (pending && now_ms() - t0 > 20) { confirm(read_pin()); pending = 0; }

디바운싱 시간은 보통 10~20ms 로 잡는다. 너무 길면 빠른 연타를 놓친다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — GPIO — 핀 하나에 담긴 전기