STM32F446RE에서 타이머 입력 캡처(Input Capture) 기능은 외부 핀으로 들어오는 신호의 변화(Edge) 시점의 타이머 카운터 값(CNT)을 캡처 레지스터(CCR)에 저장하여 현재 CCR 값 - 이전 CCR 값을 계산하여 신호의 주파수나 펄스 폭(듀티비l), 주기을 측정하는 기능
즉,. "외부 에지가 들어온 순간의 타이머 카운터 CNT값을 자동으로 CCRx에 저장한다"
콜백 함수의 인터럽트 처리는
신호가 입력되어 캡처가 일어날 때마다 HAL_TIM_IC_CaptureCallback 함수가 자동으로 실행
되며, 이 함수를 선언하여 변수를 저장하고 주파수를 계산한다.
1. STM32CubeMX 기본 설정
- 타이머 및 채널 선택: 설정을 원하는 타이머(예: TIM3)를 선택합니다.
- 모드 설정: Combined Channels 또는 개별 채널에서 Input Capture direct mode를 선택합니다.
- Parameter Settings 구성: - Prescaler (PSC): 타이머 클럭을 분주하여 해상도를 결정합니다 (예: 83인 경우 84MHz / (83+1) = 1MHz, 즉 1 초에 1,000,000번 카운트). - Counter Period (ARR): 타이머가 가질 수 있는 최대값이며, 일반적으로 16비트 타이머 기준 최대값인 65535로 설정합니다. - TAM2, TIM5 32Bit Timer일 경우는 ARR = 0xFFFFFFFF; == 32Bit 최대값 - Polarity: 어떤 Edge에서 캡처할지 선택합니다 (Rising Edge, Falling Edge, 또는 Both Edges). - IC Selection: Direct로 설정하여 물리적 핀과 채널을 바로 연결합니다.
- 인터럽트 활성화: NVIC Settings 탭에서 해당 타이머의 글로벌 인터럽트(예: TIM3 global interrupt)를 Enable 체크합니다.
타이머는 가급적 타이머2, 타이머5를 사용하기를 권장 = 32Bit 타이머로 고급기능이 잇으며 무엇보다도 32비트이므로 최대 카운터 값을 많이 가질수 있으며 매우 긴 시간 측정이 가능하다.
채널 또한 4개나 있음,
32비트 타이머라서 저주파 측정에도 유리(카운터 오버플로우 값이 크므로)
타이머의 최종 내부 클럭 속도를 반드시 확인하고 계산식에 대입해야 정확한 주파수가 나옵니다.
입력 필터(Filter) 설정: 신호에 노이즈가 섞여서 오작동할 경우 CubeMX의 Parameter Settings 내부 Input Filter 값을 0에서 15 사이의 값으로 올려주면 디지털 노이즈 필터링 효과를 얻을 수 있습니다.
타이머의 입력 캡처(Input Capture) 기능으로 구현할 수 있는 5가지 기능
1. 외부 신호의 주파수(Frequency) 및 주기 측정
원리: 신호의 상승 엣지(Rising Edge)가 연속으로 두 번 일어난 시간 간격을 측정합니다.
활용 예시:
- 아날로그 센서가 출력하는 주파수 신호 계측
- 발전기나 인버터의 출력 교류(AC) 신호 주파수 모니터링
2. 모터의 회전 속도(RPM) 측정
원리: 모터축에 연결된 홀 센서(Hall Sensor)나 광학 엔코더(Encoder) 신호를 입력받아, 모터가
한 바퀴 돌 때 걸리는 시간을 측정합니다.
활용 예시:
- BLDC 모터, DC 모터의 현재 속도 정밀 제어
- 자동차 바퀴 속도 측정 (속도계 구현)
3. PWM 신호의 듀티비(Duty Cycle) 측정
원리: 타이머의 PWM Input 모드를 쓰면, 채널 2개를 조합해 신호의 전체 주기와 High 레벨 유지
시간을 동시에 캡처합니다.
활용 예시:
- 다른 MCU나 센서가 보내온 PWM 제어 신호 해석
- RC 카(무선 조종) 수신기에서 나오는 서보 모터 제어 신호(PPM/PWM) 디코딩
4. 원거리 센서 거리 측정 (초음파 센서)
원리: HC-SR04 같은 초음파 센서에 트리거 신호를 보낸 후, 센서의 Echo 핀이
High를 유지하는 시간(펄스 폭)을 캡처로 측정하여 거리로 환산합니다.
활용 예시:
- 로봇의 장애물 회피 시스템
- 차량 후방 감지 센서
5. 리모컨 적외선(IR) 신호 디코딩
원리: 적외선 수신 모듈을 통해 들어오는 데이터 펄스의 High/Low 유지 시간을 측정하여,
제조사 규격(예: NEC 프로토콜)의 데이터(0과 1)로 변환합니다.
활용 예시:
- 가전제품 리모컨 신호 수신 및 해석
주로 많이 사용하는 패턴
1. 주파수 측정 : Rising Edge -> Rising Edge
2. 펄스폭 측정 : Rising Edge -> Falling Edge
3. PWM 측정 : PWM Input Mode
4. 고속 펄스 카운트 : TIM2 External Clock Mode
목적 계산
| 주파수 측정 | Rising → Rising |
| 주기 측정 | Rising → Rising |
| 펄스폭 측정 | Rising → Falling |
| 듀티 측정 | PulseWidth / Period |
| 이벤트 시간 기록 | CCR 값만 읽기 |
Input Capture에서 가장 많이 사용하는 기능
1. 주파수 측정
period = capture_now - capture_prev;
frequency = timer_clock / period;
2. PWM 폭 측정
pulse_width = falling_capture - rising_capture;
최종 타이머 카운터 클럭은 1MZ(1u Sec)가 되도록 설정한다.
기본 1u sec를 기준으로 카운터 한다.
Input Capture 하드웨어는 에지가 발생하면 자동으로 CCRx에 CNT 값을 저장하고 CCxIF 플래그를 세웁니다. 이 플래그를 폴링(polling) 으로 감시해도 되나 가급적이면 인터럽트나 DMA사용을 권장한다.
1. 일반적인 Input Capture: 시퀀스 = CPU 부하발생
에지 발생
↓
인터럽트 발생
↓
ISR 진입
↓
CCR1 저장
↓
CPU가 CCR1 읽음
↓
ISR 종료
2. DMA 사용 시퀀스 = CPU가 개입하지 않음
= CPU 부하없음 특히 고속 카운터인경우는 DMA 가 유리 == 권장
에지 발생
↓
CCR1 저장
↓
DMA 요청
↓
메모리 버퍼(RAM)에 자동 저장
인터럽트 사용 예
- 주파수 측정
- PWM 듀티 측정
- HC-SR04 거리 측정
- 수 kHz 이하 신호
DMA 사용 예
- 고속 펄스 분석
- 엔코더 신호 기록
- IR 수신 파형 분석
- PPM/PWM 다채널 측정
- 로직 애널라이저 비슷한 기능 구현
TIM2는 32비트 카운터라서 DMA와 조합하면 매우 강력하다.
예를 들어 1 MHz 카운터 기준으로 캡처값들을 DMA 버퍼에 계속 저장해 두면, 나중에
각 캡처값의 차이를 계산하여 신호의 주기 변화(지터), 듀티비, 펄스 간격 등을 매우
정밀하게 분석할 수 있습니다.
이런 용도로는 인터럽트보다 DMA가 더 적합하다. == DMA 권장