티스토리 뷰

입문

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

Just4Fun 2016. 4. 12. 19:59

이번에는 타이머/카운터의 PWM중에서 Fast PWM 모드에 대한 설명을 하도록 하겠다.

위의 그림이 Fast PWM의 동작 원리를 설명하는 것이다.

TCNT의 값은 BOTTOM에서 TOP까지 일정하게 증가된다.  TCNT값이 증가되는 도중에 OCR값과 같아지면 OC가 0이 된다. TCNT의 값이 계속 증가하다가 TOP값이 되면 OC는 1이 되는 것이다.  결국 BOTTOM에서 TOP까지의 시간이 한 클럭이 되는 것이다.  다음에 설명할 Phase Correct PWM 모드는 Fast PWM 모드에 비해서 클럭 주기가 2배가 된다.

Fast PWM 모드에는 어떤식으로 동작되는지 역시 실험을 통해서 알아보도록 하겠다.

18,19 라인에서 OCR_A/B에 대한 설정이 있다.  이번에는 같은 값을 사용하였다.

23번 라인에 Fast PWM 모드로 설정하는 코드가 보인다.

26번 라인은 OC의 출력모드를 설정해 주는 부분이다.  OC_A는 Non-Invert모드로 설정하였고, OC_B는 invert 모드로 설정하였다.  즉, 서로 반대로 동작되도록 하였다.  위의 Timing diagram을 보면 OC의 모드에 따라 어떻게 출력되는지 보여준다.


31번 라인에서 T0 신호를 카운터의 입력으로 설정하였다.

50번 라인에서 입력 클럭 주파수를 10Hz로 설정하였다.

위의 코드를 이용하여 실제 보드에서는 어떻게 동작되는지 확인해 보자.

TCNT의 값이 100이 되면 PB5에 연결된 LED는 켜지고, PB6 LED는 꺼진다.  TCNT의 값이 TOP에서 BOTTOM이 되는 순간에 두 LED의 상태는 반전이 되는것을 볼 수 있을 것이다.

문서에 OC의 출력 클럭 주파수 구하는 공식이 다음과 같이 나와 있다.

N의 값은 1,8,64,256,1024이다.  그러므로 카운터로 들어오는 입력 클럭이 고정되어 있다면 OC의 출력 주파수는 5개 값밖에 가질 수 없다.  AVR의 경우 입력 클럭은 고정된 값이라고 봐도 무방하다.  이런 조건에서 OC의 출력 클럭 주파수를 세밀하게 조절하거나 수시로 변경하려면 어떻게 해야 할까?  이러한 요구조건을 수용하기 위하여 TCCR_B 레지스터에 WGM2 비트를 사용하면 된다.  이 비트값을 set하면 TOP 값이 0xFF에서 OCR_A의 값으로 바뀌게 된다.  어쩔수 없이 OC_A는 CTC모드와 같은 동작을 할 수 밖에 없고, 대신 OC_B는 OCR_A에 의하여 소프트웨어에 의한 클럭 주파수에 맞추어 동작될 수 있다.

WGM2 비트를 이용하여 OC클럭 주파수를 변경하는 코드를 만들어 보기로 하겠다.

14번 라인에 OC_A는 토글 모드로 동작되도록 하였고, OC_B는 Non-invert모드로 동작되도록 하였다.

20번 라인에서 WGM2 비트를 set 하였다.

6번 라인에 OCR_A를 100으로 설정하였으므로 TOP값은 100이 된다.

7번 라인에 OCR_B는 70으로 설정되었으므로 TCNT의 값이 70이 되면 LED가 꺼지고, TOP에서 BOTTOM으로 갈때 LED가 켜지게 된다.

코드를 위와 같이 수정하여 보드에서 결과를 확인해 보자.  TCNT의 최대값은 100까지 되고, OC_A는 CTC모드로 동작되는 것을 볼 수 있을것이다.

이제, 카운터 입력 클럭을 내부 prescaler로 변경하고, loop() 함수에서는 1초마다 OCR 값을 변경하여 LED의 밝기가 어떻게 변하는지 확인해 보기로 하자.

PB0에 연결된 LED의 상태가 바뀔때마다, PD5,PD6에 연결된 LED가 하나는 차츰 밝아져 가고, 다른 하나는 차츰 어두워져 가는것을 볼수 있을것이다.



main.c


입문 과정 목차

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함