용어 정의
BOTTOM - 카운터가 0이 되었을 때를 의미.
MAX – 카운터가 0xFF(=255)에 도달했을 때를 의미
TOP
TOP값은 0xFF(MAX) 또는 OCR0 레지스터에 저장된 값으로 지정할 수 있다.
카운터가 TOP값과 똑같거나 더 커진 경우를 의미한다.
Fast PWM 모드
fast Pulse Width Modulation(fast PWM) 모드는 TCCR0 레지스터의 WGM01과 WGM00비트가 1로 설정된 경우이다.
카운터값(TCNT0)는 BOTTOM으로부터 MAX까지 값이 증가하고 MAX에 도달하면 다시 BOTTOM부터 증가를 시작한다.
non-inverting Compare Output 모드에서는 TCNT0와 OCR0가 일치하는 경우 output compare (OC0)가 0으로 클리어되고 TCNT0가 BOTTOM인 경우 1로 설정된다.
inverting Compare Output 모드에서는 TCNT0와 OCR0가 일치하는 경우 output compare (OC0)가 1로 설정되고 TCNT0가 BOTTOM인 경우 0으로 클리어 된다.
fast PWM 모드에서 카운터값(TCNT0)가 MAX값과 일치할 때까지 카운터는 증가한다. MAX값에 도달하면 TCNT0는 0으로 클리어된다.
TCNT0 대각선상의 작은 수평선은 OCR0와 TCNT0가 일치하는 경우를 의미한다.
카운터가 MAX에 도달할때마다 타이머/카운터 오버플로우 플래그(TOV0)는 1로 설정된다. 인터럽트가 활성화 되어있다면 오버플로우 인터럽트 핸들러 루틴을 OCR0값을 업데이트하는 용도로 사용할 수 있다.
TCCR0 레지스터의 COM01과 COM00을 설정하여 Invert mode인지 non-invert mode인지 결정한다.
포트 핀의 데이터 방향이 출력일 경우에만 OC0의 값이 실제로 출력된다.
inverting mode에서는 OCR0와 TCNT0 사이의 값이 일치하는 경우 OC0 레지스터는 1로 설정됨으로써 PWM 파형이 출력되고 TCNT값이 MAX에서 BOTTOM으로 변하는 경우에 OC0 레지스터는 0으로 클리어되어 파형 출력이 중단된다.
아래 처럼 회로를 구성하고
아래 코드를 동작시키면.. 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 56 57 58 59 60 61 | /* * 8bit_timer_example3.c * * Created: 2016-06-18 * 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); //FAST PWM 모드 TCCR0 |= (1<<WGM01); 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예제 - lm35 온도 센서값 시리얼로 출력하기 (0) | 2023.10.08 |
---|---|
Atmega128 기초 - 8비트 타이머/카운터 Phase Correct PWM 모드 (0) | 2016.06.21 |
Atmega128 기초 - 8비트 타이머/카운터 CTC 모드 (0) | 2016.06.18 |
Atmega128 기초 - 8비트 타이머/카운터 일반모드 (2) | 2016.06.17 |
Atmega128 기초 - 외부 인터럽트 (0) | 2016.06.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!