본문 바로가기
EmbeddedSystem/AVR

[AVR] Timer / Counter

by TSpoons 2024. 11. 5.

Timer / Counter

- 입력 클럭의 개수를 세기 위한 소자

timer vs counter

타이머(timer) : 입력 클럭이 일정한 주파수 펄스
- MCU 내부 counter 입력으로 선택 : 시간 측정 가능
카운터(counter) :입력 클럭의 주파수가 일정하지 않음
- 외부 입력 신호를 counter 입력으로 선택 : 외부 발생 event의 횟수 측정 가능

overflow flag

- 각 타이머는 자신의 overflow flag를 가짐
- timer나 counter에서 overflow가 발생하면 해당 bit가 set 된다. ->(timer overflow interrupt 발생하도록 설정 가능)
- overflow flag를 기준으로 사용하면 timer overflow interrupt를 사용하여 일정한 시간 간격마다 interrupt를 발생하도록 할 수 있음
 
 

Timer Applications

1. 정확한 시간 지연
2. 특정 event 사이 시간 측정
3. 특정한 작업을 주기적으로 수행
4. 원하는 주파수의 구형파 신호 생성
5. PWM 신호 생성
(1) 일정한 간격(clock 단위로 지연)
ex) 1MHz clock 주파수 입력을 받는 16-bit timer라 할 때,  10clock만큼 지연시간 얻는 함수

//슈도 코드(Pseudo code)

void delay(void){
    timer <- 0xfff6; // signed에서 -10으로 해석된다.  
    // timer <- (0xfff6*CLK_FREQ_MHZ);
    clear overflow_flag;
    start timer;
    while(!overflow_flag);
    stop timer;
}

Q1. 16MHz 주파수 입력을 받는 16-bit timer이면? 625ns 
 
(2) 사용자가 원하는 시간(ms 단위로 지연)
클럭 주파수가 16MHz이면, 이 주파수를 이용하여 10ms를 나타내려면
CLK : 1s 동안 16M번 진동
10ms -> CLK: 160,000 개

#define CLK_FREQ_KHz 16000 // 16MHz 

void delay_ms(uint16_t delay){
    timer <- -(delay*(CLK_FREQ_KHz); 
    clear overflow_flag;
    start timer;
    while(!overflow_flag);
    stop timer;
}

Q2. 위 함수에서 최대로 전달할 수 있는 가장 큰값은?
16bit는 (-32768~32767)만 표현 가능하다.
=> 32768 % 16000 = 2 
 

따라서 우리가 "1초" 를 표현하고자 할 때, delay_ms(1000)이 아닌 다음과 같이 해야 한다.

void delay_1sec(void) {
    // 2ms씩 500번 반복하면 1초
    for(int i = 0; i < 500; i++) {
        delay_ms(2);
    }
}

 

 

Timer Overflow Interrupt

ISR(...){
    timer <- 0xb000;
    ...
    toggle PC4;
}

MCU의 입력 클럭이 터무니 없이 높을 때 AVR에게 큰 클럭주파수는 더 낮은 주파수의 입력이 필요하다.
(16MHz와 같은 주파수는 16bit로 나타낼 수 없다.)

 

 

 

Time Prescaler

- MCU의 입력 클럭이 너무 크면, 원하는 시간 간격 설정을 못 할 수도 있다.

  • 용도에 맞도록 timer의 입력 주파수를 낮춰준다.

Prescaler of 16-bit TImers of ATmega1281
 

'EmbeddedSystem > AVR' 카테고리의 다른 글

[AVR] 타이머/카운터와 Prescaler(분주비)  (1) 2024.12.27
[AVR] Timer Mode : "normal" vs "CTC" vs "PWM"  (0) 2024.11.07
[AVR] Microchip studio Tutorial  (1) 2024.10.24
[AVR] External Interrupts 2  (1) 2024.10.15
[AVR] External Interrupt  (1) 2024.10.14