CS/마이크로프로세서

[마이크로프로세서] 타이머/카운터 (2)

nowkoes 2023. 11. 27. 04:48

본문

기본 개념

 

 이번 시간에는 타이머/카운터의 모드에 대해 알아보는 시간을 가져보자. 위의 그림은 타이머/카운터의 블록 다이어그램을 간소하게 표현한 것이다. 해당 회로도를 보고, 간략하게 ATmega 128이 어떻게 타이머/카운터를 제어하는지 이해하면 좋을 것 같다.

 

타이머/카운터0는 외부 클럭에 프리스케일러가 달려 있지만, 타이머/카운터2는 그렇지 않음

 

 외부 클럭을 입력으로 받는 타이머/카운터 0과 내부 클럭을 입력으로 받는 타이머/카운터 2는 몇 가지 차이점이 있다. 타이머/카운터 0에는 T/C Oscillator라는 자체 발진 회로가 있어, 외부 클럭이 불안정하거나 사용할 수 없을 경우에도 독립적으로 타이밍을 생성할 수 있다. 이는 타이머/카운터 0이 외부 클럭 소스에 완전히 의존하지 않도록 해준다. 또한, 외부 클럭에 프리스케일러가 달려 있어 타이밍을 조절할 수 있는 유연성을 제공한다.

 그리고, 타이머/카운터 0의 비동기 회로부는 시스템 클럭과 독립적으로 작동할 수 있다는 특징이 있다. 이러한 특성은 실시간 클록(RTC) 기능을 가능하게 한다. 예를 들어 32.768kHz(2^15Hz) 크리스털을 연결하면, 초당 32768번의 진동이 발생한다. 발진기에서 발생하는 진동은 전자 회로를 통해 전기 신호로 변환되고, 이 신호가 타이머/카운터에 입력된다. 이를 이용해 타이머/카운터는 2^15번의 펄스를 세어 1초를 측정한다. 이를 이용해 정확한 1초 타이밍을 생성할 수 있어, 현재 시간을 유지하고 추적하는 기능을 구현할 수 있다.

 

  내부 클럭(16MHz, 분주비 1024) 발진기(분주비 128)
한 클럭 주기 1/16MHz * 1024 = 64us 1/32.768kHz * 128 = 3.90625ms
인터럽트 주기 64us * 256 = 16.384ms 3.90625ms * 256 = 1s
1초 계산 16.384ms * 61 = 999.424ms
인터럽트 61번
인터럽트 주기가 1초와 같게 설정하였으므로 추가적인 계산이 필요하지 않음

 

 

 8비트 타이머/카운터는 타이머를 카운트하는 과정에서 일반적으로 TOP, BOTTOM, MAX 세 가지 지점을 갖는다.

 

1. TOP:  타이머/카운터의 최대 카운팅 값을 나타내며, 이는 작동 모드에 따라 달라진다(후술 할 출력 비교를 200으로 설정하면, 200이 TOP이 됨). 

 

2. MAX: 타이머/카운터가 카운트할 수 있는 최대 값을 나타내며, 8비트일 경우 이 값은 255(0xFF)다. 만약 이 값에 도달하면, 일반적으로 오버플로우가 발생하며, 이를 MAX에 도달했다고 한다.

 

3. BOTTOM: 타이머/카운터가 카운트할 수 있는 최소 값을 나타내며, 8비트일 경우 이 값은 0이다. 만약 타이머/카운터가 0으로 리셋될 때, 이를 BOTTOM에 도달했다고 한다.


동작 모드

출처: www.microchip.com

 

 8비트 타이머/카운터는 크게 4가지 모드가 존재한다. 위의 표를 보면 알 수 있듯이, 일반 모드, CTC 모드, Fast PWM모드, Phase Correct PWM 모드가 있다.

 

 여기서 OCR0와 TOV0라는 새로운 용어가 등장하는데, OCR0출력 비교 레지스터로서 타이머/카운터의 값이 OCR0에 저장된 값과 일치하게 되면, 특정 이벤트가 발생한다. 그리고 TOV0타이머/카운터가 오버플로우될 때 자동으로 설정되는 플래그다. 추후에 레지스터를 설명하는 단계에서 자세히 설명할 예정이니, 간략하게 체크만 해두자.

 

일반 모드

출처: www.microchip.com

 

 Microchip에서 제공하는 공식 문서에 따르면, 일반 모드는 가장 기본적인 타이머/카운터 운용 모드라고 한다. 일반적으로 16MHz의 내부 클럭을 계수하며 255(0xFF)에서 0(0x00)으로 바뀔 때, 오버플로우가 발생하며 관련 플래그가 설정되고, 인터럽트가 발생한다. 여기서 임의의 시간으로 조정하려면 인터럽트가 발생할 때, 서비스 루틴에서 초기값을 설정해야 한다. 

 

 

1. TOP: 노말 모드의 경우 기본적으로 0부터 시작하여 255(8비트)까지 카운트한다고 하였다. 이로 인해 255가 타이머/카운터가 도달할 수 있는 최댓값이 TOP(0XFF)이다. 

 

2. Update of OCR: 출력 비교 레지스터 OCR0의 값이 변경되면, 타이머/카운터는 다음 사이클부터 이 새로운 값을 즉시 사용한다. 이는 노말 모드가 비교 매치 이벤트에 따른 타이머의 리셋이나 특별한 버퍼링 메커니즘을 사용하지 않기 때문이다. OCR0의 값은 프로그래밍에 의해 언제든지 변경될 수 있으며, 변경 즉시 타이머/카운터의 동작에 영향을 준다. 물론 일반 모드는 PWM 생성에 목적을 두고 있지 않으므로, 이 기능을 사용할 일은 잘 없다.

 

3. TOV0 Flag Set: TOV0 플래그는 타이머/카운터가 오버플로우될 때 설정된다고 하였다. 이는 타이머/카운터가 전체 범위를 완전히 카운트했음을 의미하며, MAX값은 프로그래머가 어떻게 설정하느냐에 따라 다르기 때문에 0xFF가 아닌 MAX다.

 

CTC(Clear Timer on Comapre Match) 모드

출처: www.microchip.com

 

 CTC 모드에서는 타이머/카운터가 0부터 시작하여 OCRn에 설정된 값까지 카운트한다. 타이머/카운터 값이 OCRn과 일치할 때, 타이머는 자동으로 0으로 리셋되는데, 이를 비교 일치라고 한다. 

 

 

1. TOP: CTC 모드의 정의에 따라 OCR0까지 카운트하므로 TOP은 OCRn값이 된다. 

 

2. Update of OCR: OCRn 레지스터 값이 변경되면, 그 변경은 다음 타이머/카운터 클럭 주기에 즉시 반영된다. 이는 현재 값과 OCRn의 값을 비교하는 것이 카운트되는 각 클럭 사이클에서 이루어지기 때문이다. 만약 타이머/카운터가 OCRn의 값과 일치하면, 비교 매치가 발생하고 타이머/카운터는 즉시 0으로 리셋된다. 이로 인해, OCRn 레지스터 값을 변경하는 것은 리셋된 후 다음 클럭 사이클부터 효과가 있다.

 

3. TOV0 Flag Set: CTC 모드에서 MAX 값은 OCRn의 값에 따라 설정된다. 따라서 MAX일 때 TOV0 플래그가 설정된다.

 

 

 CTC 모드에서는 OCRn의 값을 변경함으로써 출력 파형의 주기를 변경할 수 있다. 위의 그래프에서 OCRn의 값을 249로 설정했다고 가정해 보자. 그러면 TCNTn이 249가 되는 순간 오버플로우가 발생하고 다시 0부터 계수하기 시작한다. 이 타이밍에 비교 매치 이벤트가 발생하였으므로 OCn의 핀의 상태가 반전된다. 

 

 여기서 분주비와 내부 클럭 주기를 알고 있으면 OCn의 출력 파형 주기, 주파수를 계산할 수 있다. 만약 분주비가 1024고 내부 클럭 주파수가 16MHz면, OCn의 출력 파형 주기는 다음과 같다.

 

 

 

 이를 이용하여 원하는 진동수를 얻을 수 있다. 만약 분주비가 1024일 때 62Hz의 출력 파형을 만들고 싶으면 다음과 같은 수식을 이용하면 된다.

 

 

 여기서 분주비가 작을수록 정확한 주파수를 설정할 수 있지만, 분주비가 너무 작을 경우 출력이 불가능하므로 적절하게 설정할 수 있어야 한다. 이는 분주비가 작으면 타이머/카운터의 카운팅 속도가 빨라져서, 인터럽트를 처리하고 동작하기 위한 시간이 부족하다는 점에서 기인한다.

 

분주비가 64일 경우 오차가 거의 없지만, 계수를 255까지만 할 수 있어서 계산이 번거로워 진다. 모드를 계속 바꾸거나 OCRn 값을 계속 바꿔야 한다.
분주비 별 최소/최대 출력 주파수. 원하는 파형을 출력 가능한 가장 작은 분주비를 선택해야 한다.

반응형