아트메가/이론

아트메가128 타이머/카운터0 Fast PWM모드 알아보기

원원 2017. 9. 28. 15:53

안녕하세요. 오늘은 Fast PWM모드에 대해 알아보겠습니다

PWM(pulse width modulation)이란 펄스 폭 변조라는 뜻인데, HIGH와 LOW의 비율을 원하는 대로 출력시켜주는것 입니다.

예를들어 LED를 A포트에 연결하고 PORTA=0xff; 라고 한다면, LED는 HIGH만 출력 될 것입니다.

그러나 PWM을 사용해서 HIGH 50% LOW 50%로 하고 LED를 연결한다면 LED의 밝기는 PWM를 안쓴것에 비해 밝기가 50%가 될 것입니다.

이것을 듀티비라고 합니다. 아두이노에서는 analogWrite함수로 PWM을 사용합니다.


이러한 PWM을 가지고 DC모터의 세기를 제어하거나, LED를 밝기를 제어하거나, 서보모터등을 제어할 수 있습니다.



PWM의 종류는 2가지가있습니다.

Phase Correct PWM , Fast PWM그중에 이 글에서는 Fast PWM을 알아봅니다. 두 PWM의 차이점은 OC0의 파형의 차이입니다.





FAST PWM모드는 WGM01 WGM00이 1 1 이여야 하구요. TOP은 0xff까지 가고 OCR0업데이트는 BOTTOM일때 되네요.

OCR0업데이트가 BOTTOM일때 되므로 듀티비가 다르게 나오는 것입니다.







Fast PWM모드일때 OC0핀이 변하는 상태입니다. 1 0 이라면 compare match가 발생하면 OC0을 0으로 클리어하고 TOP에서는 출력을 1로 합니다.



COM01 : COM00 가 1 0 일때 위의 파형대로 나옵니다. compmare match때 LOW TOP때(overflow발생) HIGH인것을볼 수 있습니다.

주기가 두개이고 compmare match가 대략 중간지점에서 발생한다고 가정했을때 듀티비는 50%입니다.






데이터시트에 나와있는 파형입니다. 이 파형은 OC0이 계속 변해서 듀티비가 변하는것을 나타나고 있습니다.









예제1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#define F_CPU 16000000UL
 
 
int main(void)
{
   TCCR0= 0x6f;
   OCR0 = 127;
   SREG=0x80;
   DDRB=0xff;
 
    while(1)
    { 
  
    }
}

cs

주기가 50%인 PWM 파형입니다.



예제2)

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
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#define F_CPU 16000000UL
 
SIGNAL(SIG_OUTPUT_COMPARE0)  
{  
    OCR0 = OCR0+1;
    if(OCR0==255)
        OCR0=0;
}
  
 
 
int main(void)
{
   TCCR0= 0x6f;
   OCR0 = 0;
   SREG=0x80;
   TIMSK = 0x02;
   DDRB=0xff;
 
    while(1)
    { 
  
    }
}

cs

코드를 보면 OCR0이 0부터 1씩 증가합니다.
그리고 컴페어 메치까지 HIGH이고 컴페어 메치부터 LOW이므로
듀티비의 HIGH의 비율이 점점 커지다가 HIGH의 비율이 작아지는것을 예상할 수 있습니다.
이걸 LED에 연결하면 LED의 밝기가 점점 커지다가 다시 어두워지고 다시 밝아지고 할 것을 예상할 수 있습니다.


파형의 출력입니다.




다음에는 Phase Correct PWM MODE를 알아보겠습니다.