저번 글에서는 8비트 Timer/Counter 관련해서 공부를 했습니다. 이제는 16비트 Timer/Counter와 지난 글에서 제대로 다루지 못한 파형생성(PWM)관련한 실습과 이론을 정리해보겠습니다.
TCCR
레지스터 역시 3개가 존재한다. 이외에도 ICP(input Capture Pin, n = 1,3)핀을 통해 특정 사건이 발생하는 경우 TCNTn
레지스터의 값을 저장하기 위한 ICRn
레지스터가 존재한다.Timer/Counter의 펄스는
TCNTn(n=1,3)
레지스터에 기록됩니다. 16비트 Timer/Counter를 사용하므로TCNTn(n=1,3)
레지스터 역시 16비트여야 하지만, ATmega128은 8비트 cpu를 제공하므로 2개의 8비트 레지스터를 묶어서TCNTn(n=1,3)
레지스터 라는 이름으로 사용합니다.TCNTn(n=1,3)
는 상위 바이트TCNTnH
와 하위 바이트TCNTnL
레지스터로 구성됩니다. 아래는TCNTn(n=1,3)
레지스터의 구조입니다.
- 16비트 Timer/Counter의 동작을 제어하기위한
TCCR 레지스터
3가지의 역할입니다.
※ 사용할 모드와 분주비는 데이터시트를 확인하여 내가 사용할 모드의 비트 세팅을 해야합니다!
main.c
결과
fast PWM 모드를 사용하기위해 main.c
에서 TCCR1A
,TCCR1B
에 비트 세팅을 해주었습니다.(아래 사진참조)!
그리고 COM1A1 비트 설정은 비교 결과에 따른 출력 핀(OC1A)의 동작을 결정합니다. 여기서는 COM1A1을 설정함으로써 비교 일치 시 OC1A 핀이 클리어되고, 타이머가 BOTTOM에 도달했을 때 세트되는(non-inverting mode) 동작을 선택하고 있습니다.
ICR1 = 2499;
이를 통해 Timer/Counter의 TOP값을 정해주고 타이머가 0에서 2499까지 카운트하도록 합니다.
OCR1A = 625;
비교 일치 값을 설정하여 타이머가 625에 도달할 때 특정 동작(예: 핀 상태 변경)을 수행하도록 합니다
PWM 주파수는 다음과 같습니다. clock주파수 = 16Mhz, 분주비 = 64, TOP = 2499로 설정하여 100Hz의 주파수가 출력되게 설정을했고, 비교 일치 값을 625로 설정하여 듀티 사이클 값을 25%(625/2500)설정하여 결과와 같이 듀티사이클이 25%도달(Bottom에 도달하면)하면 OC1A 상태를 set시키고 TOP에 도달하면 clear시키는 과정을 반복하는 실습을 진행했습니다.
8비트 타이머/카운터와 16비트 타이머/카운터의 차이점은 여러 가지가 있지만, 주요 차이점 중 하나는 타이머의 TOP 값을 설정할 수 있는지 여부입니다.
- 8비트 타이머/카운터:
1. 8비트 타이머/카운터는 기본적으로 0에서 255(0xFF)까지 카운트할 수 있습니다.
2. 일부 모드에서는 TOP 값을 변경할 수 있지만, 주로 고정된 값(예: 255)입니다.
3. 비교 일치 레지스터(OCR)를 사용하여 비교 일치 값을 설정합니다.- 16비트 타이머/카운터:
1. 16비트 타이머/카운터는 0에서 65535(0xFFFF)까지 카운트할 수 있습니다.
2. ICR 레지스터를 사용하여 TOP 값을 유연하게 설정할 수 있습니다. 이를 통해 PWM 주기와 같은 타이밍을 더 정밀하게 제어할 수 있습니다.
3. 비교 일치 레지스터(OCR)를 사용하여 비교 일치 값을 설정합니다.
따라서, 타이머의 TOP 값을 설정할 수 있는지 여부는 8비트와 16비트 타이머/카운터의 주요 차이점 중 하나입니다. 16비트 타이머는 더 높은 해상도와 더 많은 기능을 제공하여 복잡한 타이밍 작업에 유용합니다