안녕하세요. 오늘은 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 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) { } } |
주기가 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 |
파형의 출력입니다.
다음에는 Phase Correct PWM MODE를 알아보겠습니다.
'아트메가 > 이론' 카테고리의 다른 글
아트메가128 타이머/카운터0 주파수 알아보기 (2) | 2017.10.01 |
---|---|
아트메가128 타이머/카운터0 Phase Correct PWM모드 알아보기 (0) | 2017.09.30 |
아트메가128 타이머/카운터0 CTC 모드 알아보기 (0) | 2017.09.27 |
아트메가128 타이머/카운터0 compare match interrupt사용하기 (0) | 2017.09.26 |
아트메가128 타이머/카운터0 overflow interrupt사용하기 (4) | 2017.09.21 |