산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino 내부 타이머 마스터하기: 정확한 타이밍을 위한 CTC 모드 활용법

부품 및 소모품

부품 수량
Arduino UNO (ATmega328P) 1
LED (일반) 1
220Ω 저항 1

프로젝트 소개

개요

정확한 시간 측정이 필요할 때 delay() 함수는 CPU를 점유하여 다른 작업을 못 하게 만듭니다. 내부 타이머와 인터럽트를 사용하면 백그라운드에서 시간을 세면서 메인 루프는 다른 작업을 수행할 수 있습니다.

작동 원리: Timer0 CTC 모드

ATmega328P 데이터시트의 타이머 블록 다이어그램을 보면:

  1. 클럭(16MHz) → 프리스케일러 → 제어 로직 → TCNT0 레지스터 증가
  2. TCNT0 값이 OCR0A 레지스터와 일치하면(Compare Match) 인터럽트 발생
  3. 이것이 CTC 모드 (Clear Timer on Compare)입니다.

프리스케일러 설정 (TCCR0B 레지스터)

CS02CS01CS00분주비타이머 클럭
001116 MHz
01082 MHz
01164250 kHz
10025662.5 kHz
101102415.625 kHz

OCR0A 값 계산 (1ms 인터벌 예시)

타이머 클럭 = 16MHz / 64 = 250,000 Hz (주기 4µs)

1ms = 1000µs → 1000 / 4 = 250 카운트 필요

CTC 모드에서는 0부터 세므로 OCR0A = 249 (0xF9)

실전 예제: 1초마다 LED 토글


int timer = 0;
bool state = false;

void setup() {
  pinMode(13, OUTPUT);
  
  // Timer0 CTC 모드 설정
  TCCR0A = (1 << WGM01);        // CTC 모드
  OCR0A = 0xF9;                 // 249 → 1ms 인터벌
  TIMSK0 = (1 << OCIE0A);       // 비교 매치 인터럽트 활성화
  sei();                        // 전역 인터럽트 허용
  TCCR0B = (1 << CS01) | (1 << CS00);  // 프리스케일러 64 (마지막에 설정!)
}

void loop() {
  if (timer >= 1000) {  // 1000ms = 1초
    state = !state;
    timer = 0;
  }
  digitalWrite(13, state);
}

ISR(TIMER0_COMPA_vect) {
  timer++;  // 1ms마다 증가
}

중요 포인트

회로도

LED 양극 → 220Ω 저항 → 핀 13, 음극 → GND. 기본 내장 LED(핀 13) 사용 시 저항 생략 가능.

제조공정

  1. 블루투스 제어 아두이노 스파이봇(Spybot) 만들기
  2. 플릭모트(FlickMote): 스마트 홈을 위한 제스처 제어 IR 리모컨
  3. DIY 아두이노 TV B-Gone: 모든 TV를 끄는 만능 리모컨
  4. 아두이노로 만드는 대형 LED 마스터 시계 (알람 기능 포함, 12m 거리에서도 식별 가능)
  5. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  6. 아두이노 프로젝트를 위한 최적화된 전원 솔루션
  7. 아두이노 틱택토 게임 - MAX7219 LED 매트릭스와 골판지 케이스
  8. 스마트 아두이노 4족 보행 로봇 제작: 단계별 완벽 가이드
  9. 게이밍용 커스텀 아두이노 조이스틱 스티어링 휠 만들기
  10. 아두이노 나노 R3로 완전한 기능의 CNC 머신 만들기