용어 정의
BOTTOM - 카운터가 0이 되었을 때를 의미.
MAX – 카운터가 0xFF(=255)에 도달했을 때를 의미
TOP
TOP값은 0xFF(MAX) 또는 OCR0 레지스터에 저장된 값으로 지정할 수 있다.
카운터가 TOP값과 똑같거나 더 커진 경우를 의미한다.
Phase Correct PWM 모드
Phase Correct Pulse Width Modulation(Phase Correct PWM) 모드는 TCCR0 레지스터의 WGM01비트는 0으로, WGM00비트는 1로 설정된 경우이다.
카운터값(TCNT0)는 BOTTOM에서 MAX로 증가하다가 다시 MAX에서 BOTTOM으로 감소하는 것을 반복한다. PWM 해상도는 8비트로 고정된다.
noninverting Compare Output 모드에서는 TCNT0가 증가하다가 OCR0가 일치하면 output compare(OC0)는 0으로 클리어된다. 그리고 감소하다가 일치하면 1로 설정된다.
inverting Output Compare 모드는 반대로 동작한다.
Phase Correct PWM 모드는 dual-slope operation이라서 single slope operation인 Fast PWM보다 최대 Operation 주파수가 작다. 하지만 대칭적인 특징이 있어서 모터 제어 응용에서 많이 사용된다.
카운터(TCNT0)가 BOTOOM에 도달할때마다 Timer/Counter Overflow Flag (TOV0)는 1로 설정된다. 인터럽트를 활성화시켜 놓으면 이 시점마다 인터럽트를 발생시킬 수 있다.
TCCR0 레지스터의 COM01과 COM00을 설정하여 Invert mode인지 non-invert mode인지 결정한다.
포트핀의 데이터 방향을 출력으로 설정해 놓았을 때에만 OC0에서 실제 파형이 출력된다.
non-inverted 모드에서는 카운터가 증가할 때 OCR0와 TCNT0가 일치하면 OC0레지스터가 0으로 클리어 되어 파형이 출력되며, 카운터가 감소할 때 OCR0와 TCNT0가 일치하면 OC0 레지스터가 1로 설정되면서 파형이 출력된다. inverted 모드에서는 반대로 동작한다.
아래처럼 회로를 구성하고
아래 코드를 업로드하면 LED가 천천히 켜졌다가 천천히 꺼지는 걸 볼 수 있다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | /* * 8bit_timer_example4.c * * Created: 2016-06-21 * Author : webnautes */ #include <avr/io.h> #define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main(void) { DDRB |= (1<<DDB4); //LED용 //프리스케일러로 64를 선택 TCCR0 |= (1<<CS02); // Phase Correct PWM 모드 TCCR0 |= (1<<WGM00); //non-inverted mode TCCR0 |= (1<<COM01); //카운터 초기화 TCNT0 = 0; /* Replace with your application code */ while (1) { int i; for( i=0; i<255; i++) { OCR0 = i; _delay_ms(10); } for( i=255; i>=0; i--) { OCR0 = i; _delay_ms(10); } } } | cs |
'AVR > Atmega128 강좌' 카테고리의 다른 글
Atmega128 기초 – ADC(Analog to Digital) 변환 (0) | 2023.10.13 |
---|---|
Atmega128 ADC예제 - lm35 온도 센서값 시리얼로 출력하기 (0) | 2023.10.08 |
Atmega128 기초 - 8비트 타이머/카운터 Fast PWM 모드 (7) | 2016.06.21 |
Atmega128 기초 - 8비트 타이머/카운터 CTC 모드 (0) | 2016.06.18 |
Atmega128 기초 - 8비트 타이머/카운터 일반모드 (2) | 2016.06.17 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!