AVR(Atmega128)-Timer/Counter_2(PWM)

공이지·2024년 6월 5일
0

저번 글에서는 8비트 Timer/Counter 관련해서 공부를 했습니다. 이제는 16비트 Timer/Counter와 지난 글에서 제대로 다루지 못한 파형생성(PWM)관련한 실습과 이론을 정리해보겠습니다.

16bit Timer/Counter

  • 기본적인 동작은 8bit Timer/Counter와 비슷하지만 비트 수가 많아졌으니 8비트 보다는 복잡할 것이다. 또한 8bit Timer/Counter에서는 Overflow interrupt, Output Compare Match Interrupt(비교일치 인터럽트)를 사용할 수 있고, 8bit Timer/Counter와 달리 3개의 Output Compare Match Interrupt(비교일치 인터럽트)를 사용할 수 있다. 따라서 Timer/Counter의 동작을 제어하는 TCCR레지스터 역시 3개가 존재한다. 이외에도 ICP(input Capture Pin, n = 1,3)핀을 통해 특정 사건이 발생하는 경우 TCNTn레지스터의 값을 저장하기 위한 ICRn레지스터가 존재한다.
  • Overflow interrupt를 16bit Timer/Counter의 경우 16Mhz 클록을 사용하면 4.096ms의 시간 간격을 가질 수 있습니다. 16bit Timer/Counter에서 분주비를 256으로 설정한다면 1초에 한 번 overflow interrupt가 발생하도록 할 수 있다.

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가지의 역할입니다.




    ※ 사용할 모드와 분주비는 데이터시트를 확인하여 내가 사용할 모드의 비트 세팅을 해야합니다!

8bit-PWM(실습)

  • main.c
  • 결과
  • TCCR0(Timer/Counter Control Register 0) 레지스터를 설정하여 타이머/카운터 0의 작동 모드를 설정합니다. 여기서는 WGM01과 WGM00을 설정하여 fast PWM 모드로 설정하고, COM01을 설정하여 비교 일치 시 OC0 핀의 레벨을 반전시키며, CS02를 설정하여 클록 소스로 분주비 64를 선택합니다.
  • 이때, fast PWM으로 설정한 모드는 TOP값은 0xff, OCR0는 Bottom값일때 update됩니다. , 타이머가 비교 일치(compare match) 시점에 도달하면, OC0 핀의 상태를 클리어(0으로 설정)하고, 타이머가 'BOTTOM' (0) 값을 가질 때, OC0 핀의 상태를 셋(1로 설정)합니다.
  • 그 결과 Fast PWM 모드에서는 타이머가 0에서 255까지 증가하며, TOP 값은 255입니다. 그러면 비교일치 시점에 도달하여 OC0핀을 클리어하게되면 다시 Bottom값을 가져 OC0핀의 상태를 set시키면서 결과와 듀티 사이클만큼 반복하는 결과를 확인할 수 있습니다.

16bit-PWM

  • 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비트 타이머는 더 높은 해상도와 더 많은 기능을 제공하여 복잡한 타이밍 작업에 유용합니다

profile
화이팅..!

0개의 댓글