본문 바로가기
EmbeddedSystem/AVR

[AVR] 타이머/카운터와 Prescaler(분주비)

by TSpoons 2024. 12. 27.

AVR 마이크로컨트롤러의 타이머/카운터 설정에서 가장 헷갈리는 부분인 분주비(Prescaler) 선택에 대해 알아보겠습니다. 특히 16MHz에서 주로 사용되는 타이머 설정을 자세히 살펴보면

Prescaler가 뭔가요?

Prescaler는 시스템 클럭을 나누는 분주기입니다. 쉽게 말해서, 16MHz라는 엄청 빠른 클럭 신호를 우리가 원하는 속도로 낮춰주는 역할을 해요. 마치 자동차의 기어박스처럼요!

시스템 클럭과 분주비 이해하기

우리가 주로 사용하는 ATmega2560의 시스템 클럭은 16MHz입니다. 이걸 그대로 사용하면:

  • 1클럭 = 0.0625μs (아주아주 짧은 시간!)
  • 16비트 타이머 최대값 = 65,535

이렇게 빠른 클럭은 LED 깜빡임같은 일반적인 용도에는 너무 빨라요. 그래서 분주비를 사용합니다!

🎨 분주비별 특징과 용도

1️⃣ 1분주 (No Prescaling)

  • 타이머 주파수: 16MHz
  • 용도: 초고속 PWM, 매우 정밀한 타이밍
  • 주의: 최대 4.096ms까지만 측정 가능

2️⃣ 64분주

  • 타이머 주파수: 250kHz
  • 한 카운트 = 4μs
  • 용도: 서보모터 제어, 중간 속도 이벤트
  • 단점: 0.5초 이상 긴 시간은 타이머 오버플로우 발생

3️⃣ 256분주 (가장 많이 사용!)

  • 타이머 주파수: 62.5kHz
  • 한 카운트 = 16μs
  • 용도: LED 제어, 일반 타이밍
  • 장점: 0.5초~2초 주기를 정확하게 만들 수 있음

4️⃣ 1024분주

  • 타이머 주파수: 15.625kHz
  • 용도: 매우 긴 시간 측정
  • 장점: 최대 4초 이상의 주기 생성 가능

실전 응용: 0.5초와 2초 주기 만들기

256분주를 사용한 타이머 설정 예제:

void timer_init(void) { 
// TIMER 5: CTC mode(4), TOP = OCRnA, prescaler = 256 
	TCCR5B |= _BV(WGM52) | _BV(CS52); // CTC 모드, 256분주 
    TCCR5A |= _BV(COM5A0); // 비교일치 설정 
    
    OCR5A = F_CPU/(256*2) - 1; // 0.5초 주기 설정 
    TIMSK5 |= _BV(OCIE5A); // 인터럽트 활성화 
}

꿀팁과 주의사항

  1. 정밀도 vs 주기
    • 짧은 주기 → 작은 분주비
    • 긴 주기 → 큰 분주비
  2. 주의할 점
    • 분주비가 작을수록 오버플로우 위험 증가
    • 인터럽트 처리 시간 고려 필요
    • 디버깅은 항상 오실로스코프로!

마무리

분주비 선택은 타이머/카운터 설정에서 가장 중요한 부분입니다. 원하는 주기와 정밀도에 따라 적절한 분주비를 선택하면 됩니다. 특히 256분주는 0.5초~2초 사이의 주기를 만들 때 최적이라는 걸 기억하세요!

 

 

#임베디드 #AVR #마이크로컨트롤러 #타이머카운터 #분주비 #전자공학

 

 

 

 

 


 

(참고)

Basic Timing Calculations

  • Timer Resolution: 16-bit (0-65,535 counts)
  • System Clock: 16MHz (0.0625μs base period)

Prescaler Analysis Table

PrescalerTimer FrequencyTime per CountMin PeriodMax PeriodPractical Use Case

1 16MHz 0.0625μs 0.0625μs 4.096ms High-speed events, narrow pulse generation
8 2MHz 0.5μs 0.5μs 32.768ms Fast PWM, high-frequency timing
64 250kHz 4μs 4μs 262.14ms Medium-speed events, servo control
256 62.5kHz 16μs 16μs 1.049s Standard timing, LED blinking, UI responses
1024 15.625kHz 64μs 64μs 4.194s Long interval timing, slow events

Detailed Period Calculation

For each prescaler:

  • Min Period = 1 count × (prescaler ÷ 16MHz)
  • Max Period = 65,535 counts × (prescaler ÷ 16MHz)

Common Target Periods and Required Counts

Target PeriodPrescaler=64Prescaler=256Prescaler=1024

1ms 250 counts 62.5 counts 15.625 counts
10ms 2,500 counts 625 counts 156.25 counts
100ms 25,000 counts 6,250 counts 1,562.5 counts
500ms 125,000 counts* 31,250 counts 7,812.5 counts
1s 250,000 counts* 62,500 counts 15,625 counts
2s 500,000 counts* 125,000 counts* 31,250 counts

*Exceeds 16-bit timer limit (>65,535)

Selection Guidelines

  1. High Precision Timing (< 1ms)
    • Use prescaler 1 or 8
    • Best for: PWM, motor control, sensor sampling
  2. Medium Duration Events (1ms - 100ms)
    • Use prescaler 64
    • Best for: UI debouncing, short delays
  3. Standard Timing (100ms - 1s)
    • Use prescaler 256
    • Best for: LED blinking, display updates
  4. Long Duration Events (> 1s)
    • Use prescaler 1024
    • Best for: timeouts, long interval timing

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

[AVR] Timer Mode : "normal" vs "CTC" vs "PWM"  (0) 2024.11.07
[AVR] Timer / Counter  (0) 2024.11.05
[AVR] Microchip studio Tutorial  (1) 2024.10.24
[AVR] External Interrupts 2  (1) 2024.10.15
[AVR] External Interrupt  (1) 2024.10.14