본문 바로가기
  • Masacorgi 's Dev Bloggg
TIL/Embedded

[임베디드] 타이머와 인터럽트

by masacorgi 2025. 6. 15.

 

오늘의 주제는 MCU의 타이머와 인터럽트를 활용해 센서 데이터를 정해진 주기마다 자동으로 수집하는 구조에 대해서이다.
이건 실시간 모니터링, 로깅 시스템, 저전력 제어 등에서 매우 핵심적인 기술이라고 한다.

 

1. 왜 타이머/인터럽트가 필요한가?

1.1 기존 구조의 문제점

loop() {
  readSensor();
  delay(1000);  // 1초마다 반복
}
  • delay()는 MCU를 강제로 대기시켜서 다른 작업 불가능
  • 동시에 여러 작업을 하거나 정확한 타이밍 유지 어려움

1.2 해결 방법 → 타이머 + 인터럽트

  • 백그라운드에서 주기적인 알람을 발생
  • 특정 시간이 되면 자동으로 함수 호출 (인터럽트 발생)

 

 

2. 핵심 개념 정리

2.1 타이머 (Timer)

  • MCU 내부의 카운터 회로
  • 초 단위가 아닌 마이크로초/밀리초 단위 시간 측정 가능

2.2 인터럽트 (Interrupt)

  • 정해진 이벤트 발생 시, MCU가 즉시 특정 함수(인터럽트 핸들러) 실행
  • 메인 루프와 별도로 동작 → 비동기 처리 가능

 

 

3. 아두이노 타이머/인터럽트 실습 (Timer1 사용)

3.1 라이브러리 설치

#include <TimerOne.h>  // 별도 설치 필요

3.2 예제 코드 – 1초마다 센서 읽기

volatile bool flag = false;

void setup() {
  Serial.begin(9600);

  Timer1.initialize(1000000);  // 1초 = 1,000,000μs
  Timer1.attachInterrupt(timerCallback);  // 인터럽트 등록
}

void loop() {
  if (flag) {
    flag = false;
    
    int sensorValue = analogRead(A0);
    float voltage = sensorValue * (5.0 / 1023.0);
    float temp = voltage * 100.0;

    Serial.print("Temp: "); Serial.println(temp);
  }
}

void timerCallback() {
  flag = true;
}

*  핵심: loop()는 가볍게 유지하고, 센서 측정 타이밍은 타이머에 맡김

 

4. 구조도

[타이머1 설정: 1초 간격][타이머 인터럽트 발생][콜백 함수에서 flag = true]loop()에서 flag 감지 후 센서 읽기

 

 

5. 요약

타이머와 인터럽트를 적절히 사용하면 Main loop에만 의존해 delay()로 기다리는 구조가 아닌
MCU 스스로 “시간이 됐음을 감지”하고 처리하는 능동적 구조를 사용할 수 있다.
이 방식은 여러 작업을 병행하거나, 저전력 모드에서 깨어날 때, 주기적 데이터 수집 및 송신 시 자주 쓰이는 방식이다.

 

 

 

6. 참고자료