Input Capture. "언제 들어왔는가"를 CPU가 아니라 하드웨어가 기록하게 하는 방식이다.
폴링·인터럽트와 무엇이 다른가
폴링 while (pin == 0); → 그동안 CPU 가 묶인다. 반복문 주기가 곧 오차
인터럽트 에지에서 ISR 진입 후 타이머를 읽는다
→ 진입 지연(수십~수백 사이클)이 그대로 오차가 된다
입력 캡처 에지 순간 하드웨어가 카운터 값을 레지스터에 박는다
→ ISR 은 나중에 읽기만 한다. 지연이 오차에 들어가지 않는다
정확도가 필요한 시간 측정은 예외 없이 입력 캡처로 간다.
초음파 거리 측정에 쓰면
void FTM0_Ch6_IRQHandler(void) {
if (FTM0->CONTROLS[6].CnSC & FTM_CnSC_CHF_MASK) {
FTM0->CONTROLS[6].CnSC &= ~FTM_CnSC_CHF_MASK;
cap_prev = cap_curr;
cap_curr = (uint16_t)FTM0->CONTROLS[6].CnV; /* 하드웨어가 박아 둔 시각 */
}
}
uint16_t delta = cap_curr - cap_prev; /* unsigned 뺄셈이라 오버플로에도 맞는다 */
설계에서 정할 것 둘
- 분해능 — 타이머 틱이 곧 최소 단위다. 8MHz를 /8 하면 1µs 틱이 된다
- 측정 범위 — 16비트 카운터는 1µs 틱에서 65.5ms 만에 한 바퀴 돈다. 분해능을 올리면 범위가 줄어드는 트레이드오프다
함정
- 캡처 레지스터를 읽기 전에 다음 에지가 오면 값이 덮인다(오버캡처)
- 채터링이 있는 신호는 필터를 켜거나 소프트웨어로 걸러야 한다