거북이처럼 천천히

Timer / Counter - 기초 (2) 본문

Embedded Programming/Atmega 128A (실습)

Timer / Counter - 기초 (2)

유로 청년 2024. 6. 1. 17:23

서론

 

 Timer / Counter - 기초 (1) 에서는 Timer와 Counter에 대한 기본과 PWM, Duty ratio 등에 대해서 살펴보았으며, 이번 글에서는 ATmeaga 128에 대한 Timer / Counter에 대해서 글을 쓰도록 하겠다.

 

ATmega 128는 2개의 8Bit Timer/Counter와 2개의 16Bit Timer/Counter를 갖고 있다. 이에 대한 특징과 클럭신호를 나누어 카운터의 동작 속도를 늦추는 역활을 수행하는 Prescaler(분주비)에 대해서 자세히 살펴보도록 보자.

 

 

 

본론

 

 ATmega 128은 4개의 Timer/Counter를 갖고 있기 때문에 이를 Timer/Counter 0 ~ 3 까지 인덱스를 붙을 수 있다.

 

 

1) 8Bit Timer/Counter 

 

Timer/Counter 0, 2 :

8Bit Timer/Counter 이며, counter는 0 ~ 255까지 256를 카운트할 수 있다.
10bit Prescaler가 내장되어 있다.
Overflow, Compare match interrupt source를 제공한다.

 

 

Q) Prescaler(분주비)는 무엇인가?

 

ATmega 128은 16MHz에서 동작하기 때문에 ATmeaga 128의 주파수와 주기는 다음과 같다.

  • ATmega 128의 주파수 (frequency)는 16MHz이다.
    즉, 1초에 16,000,000번 진동함을 의미한다.
  • ATmega 128의 클럭 주기 (cycle)은 1/16MHz = 62.5ns이다.

 

만약, 분주비를 설정하지 않고, 8bit counter을 이용한다면 8bit counter는 0 ~ 255까지 총 256번밖에 카운트를 못하기 때문에 8bit counter을 통해 측정할 수 있는 62.5ns * 256 = 16μs 밖에 측정할 수 없다. 이는 많은 어플리케이션에서 충분하지 않을 수 있다.

 

 따라서 Prescaler(분주비)를 통해 주기를 갖는 클럭 신호에서 여러 주기를 묶어서 하나의 주기로 생각하여 Counter의 카운트 속도를 늦출 수 있으며, 이를 통해 8bit timer/counter를 통해 16μs보다 더 긴 시간을 측정할 수 있다.

 

 예를 들어 16MHz 주파수를 갖는 클럭 신호를 64분주 시킬 경우, 1초에 16,000,000번 진동하던 신호가 64개의 주기를 하나로 묶음으로서 1초에 16,000,000/64 = 250000번 진동하게 되며, 이를 주파수로 표현하면 250kHz로 진동하게 된다.

 

 

따라서 16MHz 주파수를 갖는 클럭 신호를 64분주 시키게 되면 250kHz 주파수를 갖는 클럭 신호로 변환이 되며, 8bit timer / counter를 통해 측정할 수 있는 시간은 위와 같이 1.024ms를 측정할 수 있다.

 

 

 

Q) Timer/Counter 0과 Timer/Counter 2의 차이점은 무엇인가?

A) Timer/Counter 0과 Timer/Counter 2의 차이점은 설정 가능한 분주비에 차이가 있다.

 

    Timer/Counter 0의 경우는 분주비의 값으로 1, 8, 32, 64, 128, 256, 1024 이 설정 가능하다.

    Timer/Counter 2의 경우는 분주비의 값으로 1, 8, 64, 256, 1024 이 설정 가능하다.

 

 

 

 

2) 16Bit Timer/Counter

 

Timer/Counter 1, 3:

Interrupt 기능이 있다.
Overflow Interrupt : Counter의 값이 Max을 넘었어 Overflow가 되는 경우 발생
Output compare Interrupt : Counter의 값이 Output Compare Register의 값과 같게 되는 순간 발생
Input capture Interrput : 외부로부터 트리거 신호에 의해서 카운터의 초기값을 입력 갭쳐

16Bit Timer/Counter는 65,536를 카운트 할 수 있다.
PWM (Pulse Width Modulation) 출력 가능하다.

 

 

결론

 

 ATmega 128에 내장된 8Bit Timer/Counter와 16Bit Timer/Counter와 Prescaler에 대해서 살펴보았다. 특히 Prescaler는 클럭 신호을 분주비로 나누어 새로운 클럭 신호로 생성하기 때문에 (= 클럭신호에서 여러 주기를 하나로 묶어 하나의 주기로 생각하기 때문에) Timer/Counter의 컨트롤에 중요한 역활을 수행하기 때문에 확실히 이해하고 넘어가자.