본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 7: 타이머와 카운터 사용법

by cogito21_cpp 2024. 8. 1.
반응형

타이머와 카운터의 개요

임베디드 시스템에서 타이머와 카운터는 시간과 이벤트를 정확하게 측정하고 제어하는 데 사용됩니다. 타이머는 일정한 시간 간격을 생성하고, 카운터는 이벤트의 발생 횟수를 측정합니다. 오늘은 타이머와 카운터를 사용하는 방법을 학습하겠습니다.

1. 타이머와 카운터의 기본 개념

  • 타이머(Timer): 설정된 시간 간격마다 인터럽트를 발생시키는 기능을 제공합니다. 주로 일정 시간 간격으로 작업을 수행할 때 사용됩니다.
  • 카운터(Counter): 외부 이벤트를 카운트하는 기능을 제공합니다. 주로 펄스 신호를 카운트하거나 이벤트 발생 횟수를 측정할 때 사용됩니다.

2. 타이머 설정 및 사용

타이머는 다양한 마이크로컨트롤러에서 제공되며, 설정 방법은 다를 수 있습니다. 여기서는 Arduino를 예로 들어 타이머를 설정하고 사용하는 방법을 설명하겠습니다.

 

예제: 타이머를 사용하여 주기적인 작업 수행

다음 예제는 1초마다 LED를 깜빡이게 하는 타이머를 설정하는 방법을 보여줍니다.

#include <TimerOne.h> // TimerOne 라이브러리 포함

const int ledPin = 13; // LED 핀

// 타이머 인터럽트 서비스 루틴
void timerIsr() {
    static bool ledState = false;
    ledState = !ledState; // LED 상태 토글
    digitalWrite(ledPin, ledState ? HIGH : LOW); // LED 상태 변경
}

void setup() {
    pinMode(ledPin, OUTPUT);
    Timer1.initialize(1000000); // 타이머를 1초 (1000000 마이크로초)로 설정
    Timer1.attachInterrupt(timerIsr); // 타이머 인터럽트 설정
}

void loop() {
    // 메인 루프는 비워둠
}

 

위 예제에서는 TimerOne 라이브러리를 사용하여 타이머를 설정합니다. Timer1.initialize 함수로 타이머 주기를 1초로 설정하고, Timer1.attachInterrupt 함수로 인터럽트 서비스 루틴을 설정합니다.

 

3. 카운터 설정 및 사용

카운터는 외부 이벤트를 카운트하는 데 사용됩니다. Arduino에서는 소프트웨어적으로 카운터를 구현할 수 있습니다.

 

예제: 외부 이벤트 카운트

다음 예제는 버튼을 눌렀을 때 발생하는 이벤트를 카운트하는 방법을 보여줍니다.

const int buttonPin = 2; // 버튼 핀
volatile int counter = 0; // 이벤트 카운트 변수

// 인터럽트 서비스 루틴
void countEvent() {
    counter++; // 카운트 증가
}

void setup() {
    pinMode(buttonPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(buttonPin), countEvent, FALLING); // 인터럽트 설정
    Serial.begin(9600);
}

void loop() {
    // 현재 카운트 값을 출력
    Serial.println(counter);
    delay(1000); // 1초 대기
}

 

위 예제에서는 버튼이 눌릴 때마다 인터럽트가 발생하여 counter 변수를 증가시킵니다. 메인 루프에서는 1초마다 현재 카운트 값을 출력합니다.

 

4. 고급 타이머 사용

고급 타이머 기능을 사용하면 더 정교한 시간 제어가 가능합니다. 예를 들어, PWM(펄스 폭 변조) 신호 생성, 타이머 캡처 등을 사용할 수 있습니다.

 

예제: PWM 신호 생성

다음 예제는 PWM 신호를 생성하여 LED 밝기를 조절하는 방법을 보여줍니다.

const int pwmPin = 9; // PWM 핀

void setup() {
    pinMode(pwmPin, OUTPUT);
}

void loop() {
    for (int brightness = 0; brightness <= 255; brightness++) {
        analogWrite(pwmPin, brightness); // PWM 신호 생성
        delay(10); // 지연 시간
    }

    for (int brightness = 255; brightness >= 0; brightness--) {
        analogWrite(pwmPin, brightness); // PWM 신호 생성
        delay(10); // 지연 시간
    }
}

 

위 예제에서는 analogWrite 함수를 사용하여 PWM 신호를 생성하고, LED의 밝기를 조절합니다. brightness 값을 0에서 255까지 변경하여 LED의 밝기를 점점 밝게 하거나 어둡게 합니다.

 

마무리

오늘은 타이머와 카운터의 기본 개념과 사용 방법을 학습했습니다. 타이머를 사용하여 주기적인 작업을 수행하고, 카운터를 사용하여 외부 이벤트를 카운트하는 방법을 익혔습니다. 다음 날에는 아날로그-디지털 변환(ADC)에 대해 알아보겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 8 예고

다음 날은 "아날로그-디지털 변환 (ADC)"에 대해 다룰 것입니다. ADC를 사용하여 아날로그 신호를 디지털 신호로 변환하는 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형