Timer (General Purpose - Input Capture)

유명현·2021년 7월 1일
0
post-custom-banner

안녕하세요?

오늘은 Timer 기능 중 Input Capture기능에 대해 다뤄보겠습니다.

< Input Capture 개념 >

위의 그림을 보시면 Input Caputure를 쉽게 이해하실 수 있습니다.

외부에서 들어오는 신호를 받을 떄 Timer를 통해 주기 및 주파수를 파악할 수 있는 기능입니다.

Input Caputre 기능으로 Rising Edge, Falling Edge, both를 선택하여 각 Edge가 감지합니다.

갑지 시 TIMER CNT의 값을 CCR에 저장하게 됩니다.

CCR을 통해 언제 신호가 들어왔는지 확인이 가능합니다.

< STM32CubeMX를 통한 PWM 설정 >

Input Caputre의 기능을 확인하기 위해서 입력신호가 필요합니다.

PWM신호를 입력신호를 사용하기 위해 STM32CubeMX로 PWM을 설정합니다.

저는 1s주기와 50% Duty비를 갖도록 위처럼 설정을 했습니다.

(PWM의 자세한 내용은 Timer(General Purpose - PWM을 확인해주기 바랍니다.)

< STM32CubeMX를 통한 Input Capture 설정 >

한 핀에서 Rising Edge, Falling Edge를 감지하기 위해 CH1, CH2에 Input Capture 기능을 설정했습니다.

< Input Capture Coding >

신호를 감지 시 인터럽트 발생을 통하여 Callback함수를 호출합니다.

Rising Edge 감지 시 ic1Value에 CCR값을 저장시키고 CNT를 초기화 해줍니다.(초기화 시켜주는 이유는 주파수와 Duty비를 편하게 측정하기 위해서 입니다.)

Falling Edge 감지 시 ic2Value에 CCR값을 저장시키고 ic1Value와 ic2Value를 이용하여 입력된 신호의 Duty비와 주파수를 구합니다.

< 결과 확인 >

printf를 통하여 구한 Duty비와 주파수를 출력합니다.

저는 IAR를 이용하여 Terminal로 확인을 하였습니다.

직접 확인해 보시면 입력된 Duty비와 주파수는 살짝 오차가 생기는 것을 볼 수 있습니다.

이는 제가 HSI를 이용하여 Clk을 생성했기 때문입니다.(HSI는 클럭 발생 시 정밀하지 못하고 오차가 생깁니다. 정밀한 측정을 위해서 HSE를 사용해주시면 됩니다.)

감사합니다.

profile
기억보다 기록을
post-custom-banner

0개의 댓글