티스토리 뷰

입문

타이머/카운터 - PWM(CTC Mode)

Just4Fun 2016. 4. 10. 22:08

이번 글에서는 타이머/카운터의 PWM 모드 중에서 CTC(Clear Timer on Compare Match)모드에 대해서 설명하도록 하겠다.

위의 그림이 CTC 모드의 동작을 설명한 것이다.  카운터로 클럭이 들어올때마다 TCNT값이 1씩 증가한다.  TCNT값이 OCR_A와 값이 같아지게 되면 TCNT값이 BOTTOM값으로 초기화된다. 즉 0이 된다는 뜻이다.  그리고 다시 OCR_A와 값이 같아질때까지 1씩 증가되는 동작을 반복한다.

TCNT값이 OCR_A값과 같아 질때마다 OC핀의 출력이 토글된다.  그러므로 OCR_A 값을 조절하면 OC핀의 주기를 변경할 수 있게 된다.  위의 그림에서 세번째 구간의 주기가 다른 구간에 비해서 짧아진것을 볼 수 있다.  이때 OCR_A값을 보면 다른 구간에 비해서 작은 값을 가지는 것을 알 수 있다.  결론은 CTC 모드에서 OCR_A의 값을 작게 설정할수록 OC핀의 주기가 빨라진다.

실험을 통하여 CTC모드가 어떻게 동작 되는지 확인해 보도록 한다.

11번 라인에서 PWM모드를 CTC모드로 설정한 것을 볼 수 있다.

19번 라인은 T0시그널을 카운터의 입력으로 선택하는 것이다.  PB0의 출력을 T0입력으로 받아들이는 것이다.  앞의 글을 참고하면 이해할 수 있을것이다.

loop()함수는 위와 같이 작성하였다.  50msec마다 PB0에 있는 LED가 토글될 것이고 카운터로는 10Hz의 클럭으로 입력되는 것이다.

위의 코드를 이용하여 보드에서 어떤 동작을 하는지 확인해 보자.

TCNT값이 계속 증가하다가 OCR_A에 설정된 값인 100이 된 이후에 다시 0으로 값이 바뀌는 것을 볼 수 있을 것이다.  TCNT값이 0이 될때마다 PD6에 연결된 LED가 토글 되는것도 볼수 있다.   그러나 PD5에 연결된 LED는 계속 불이 꺼져 있을 것이다.  OCR_B에 설정된 값이 200이므로 결코 TCNT값이 200이 될 수 없으므로 PD5에 연결된 LED에는 불이 들어 오지 않게 되는 것이다.

timer_init() 코드에서 OCR_B의 값을 50으로 변경한 후 다시 보드에서 PD5에 연결된 LED의 동작을 확인해 보기 바란다.  TCNT 값이 50이 될때 PD5의 LED가 토글 되는것을 볼 수 있을 것이다.

이번에도 역시 카운터로 들어오는 입력 클럭을 prescaler 1024를 바꾸어서 동작시켜 보자.  그리고 5Hz로 출력이 될 수 있도록 100msec 주기로 토글시키는 OCR_A값을 구해보자.

OCR값에 따른 출력 주파수를 구하는 공식이 문서에 나와있다.

위의 공식을 이용하면 반대로 출력주파수를 구하기 위한 OCR값도 구할수 있다.  그 공식은 다음과 같이 나온다.

OCRnx = clkI/O / 2NOCnx - 1

이 공식을 이용하면 OCR = 1000000/(2*1024*5) - 1 = 96.65 가 된다. 소수점을 반올림 하면 97로 설정해 주면 5Hz의 출력 주파수가 나올것이다.

실제로 보드에 적용해 보고 결과를 확인해 보도록 하자.  PB0에 연결된 LED가 10Hz로 동작되고 있으므로 PB0 LED가 두번 깜빡일때 PD6에 연결된 LED는 한번 깜빡일 것이다.



main.c


입문 과정 목차

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함