거북이처럼 천천히

다양한 파형 생성 실험 (8bit Timer/Counter) 본문

Embedded Programming/Atmega 128A (실습)

다양한 파형 생성 실험 (8bit Timer/Counter)

유로 청년 2024. 6. 9. 16:21

서론 

 

해당 게시물은 CTC Mode와 Normal Mode, Fast PWM Mode를 공부하면 궁금해 했던 점에 대해서 실험(?)하는 게시물이다. 따라서 CTC Mode와 Normal Mode, Fast PWM Mode에 대해서 궁금하다면 각 게시글을 참고하기 바란다.

 

 

본론 (CTC Mode)

1. 8bit Timer/Counter 2, 256분주, OCRn (=Output Compare Register n) = 224  → OC2 = 138.8888889Hz

 

CTC Mode에서 클럭 신호와 Ouput Compare 신호의 관계식
prescaler = 256, Output Compare Register n = 224 일 때, Output Compare의 주파수 계산

 

 

1) Output Compare Match Interrupt가 발생하면 OC2 signal을 Toggle 한다.

 

2) 초기 전압은 0V이지만, Output Compare Match Interrupt가 발생하면 5V로 Set된다.

 

3) 초기 전압은 5V이지만, Output Compare Match Interrupt가 발생하면 0V로 Clear된다

 

 

본론 (Normal Mode)

1. 8bit Timer/Counter 2, 64분주, TCNT2 = 256-50 = 206 → OC2 = 2500Hz

 

1) Output Compare Match Interrupt가 발생하면 OC2 signal을 Toggle 한다.

 

2) 초기 전압은 0V이지만, Output Compare Match Interrupt가 발생하면 5V로 Set된다.

 

3) 초기 전압은 5V이지만, Output Compare Match Interrupt가 발생하면 0V로 Clear된다.

 

 

 

본론 (Fast PWM Mode)

1. 8bit Timer/Counter 2, 256분주, Duty ration = 25%     OC2 = 244.140625Hz

 

2. Inverting Mode, TCNT Register값이 OCR2 값과 match하면 Output Compare Match Interrupt가 발생하며, 이때 OC2 Signal이 0V에서 5V로 변하며, TCNT Register값이 Max 값과 match하면 Overflow Interrupt가 발생하며, 이때는 반대로 OC2 Signal이 5V에서 0V로 변한다.

 

주의) Inverting Mode에서는 Output compare match interrupt가 발생하면 set되기 때문에 duty ratio를 25% 맞추기 위해서는 OCR2 = 256 - (256/4) 으로 설정해야 한다.

 

 

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

#define SIGNAL_DDR		DDRB
#define SIGNAL_PORT		PORTB

int main(void)
{
    // PB7을 출력으로 설정.
	SIGNAL_DDR |= (1<<DDB7);
	
	// PB7의 출력 값을 0V으로 초기설정
	SIGNAL_PORT &= ~(1<<PORTB7); 
	
	// TCCR2 (=Timer/Counter Control Register 2)
	TCCR2 |= (1<<WGM21 | 1<<WGM20 | 1<<COM21 | 1<<COM20 | 1<<CS22);
	
	// OCR2 값 초기 설정.
	OCR2 = 256 - 64;
	
    while (1) 
    {
    }
}

 

 

 

3. Non-inverting Mode, TCNT Register 값이 OCR2 값과 만나면 Output compare match interrupt가 발생하며, 이때 OC2 Signal이 5V에서 0V로 변하며, TCNT Register 값이 Max 값과 만나 Overflow interrupt가 발생하면 이때는 반대로 OC2 Signal이 0V에서 5V로 변한다.

 

 

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

#define SIGNAL_DDR		DDRB
#define SIGNAL_PORT		PORTB

int main(void)
{
    // PB7을 출력으로 설정.
	SIGNAL_DDR |= (1<<DDB7);
	
	// PB7의 출력 값을 0V으로 초기설정
	SIGNAL_PORT &= ~(1<<PORTB7); 
	
	// TCCR2 (=Timer/Counter Control Register 2)
	TCCR2 |= (1<<WGM21 | 1<<WGM20 | 1<<COM21 | 1<<CS22);
	
	// OCR2 값 초기 설정.
	OCR2 = 64;
	
    while (1) 
    {
    }
}

 

 

 

결론

 

이번 실험을 통해 CTC, Normal, Fast PWM Mode에 대해서 재확인하였고, 이론을 통해 배운 다양한 TCCR(Timer/Counter Control Register) 을 통한 출력 신호 제어 및 8bit Timer/Counter 2에 대해서 실험을 통해 직접 확인할 수 있었다.