임베디드-08

기타튀김·2025년 5월 20일

임베디드

목록 보기
8/8
post-thumbnail

📘 Lecture 08 — Timer (타이머)


✅ 1. 타이머란 무엇인가?

● 정의

타이머는 **정해진 시간 간격에 따라 이벤트를 발생시키거나, 시간을 측정하는 주변 장치(peripheral)**이다. MCU 내부 또는 외부 클럭에 의해 작동하며, 주기적 작업을 자동화할 수 있다.

교수님 설명 요약:
“MCU가 정확한 시간 간격마다 어떤 일을 해야 한다면, 타이머가 그 역할을 맡는다. 사람이 반복 루프를 직접 짜는 것이 아니라 하드웨어가 알아서 시간을 측정해주는 장치다.”


✅ 2. 타이머의 필요성

활용 예설명
주기적 작업0.5초마다 LED 토글, 1초마다 데이터 로깅
디지털 시계1초 카운트로 시간 측정
PWM 생성일정 주기/듀티비를 갖는 신호 생성
캡처외부 이벤트의 시점 기록
인터럽트 발생주기적으로 ISR을 호출하여 태스크 수행

✅ 3. 타이머의 종류 (모드 기준)

모드설명
Basic Timer단순 카운터 또는 주기 인터럽트용
PWM TimerPWM 신호 생성
Input Capture외부 신호의 시간 기록
Output Compare특정 시간에 맞춰 출력 신호 제어
Encoder Timer회전량 측정용 (Quadrature decoder)

✅ 4. 타이머의 구성 요소

● 기본 구조

  1. Counter (CNT)
    현재까지 카운트된 값을 저장
  2. Prescaler (PSC)
    클럭 속도를 나누어 타이머 주기 조절
  3. Auto-Reload Register (ARR)
    CNT가 도달하면 초기화될 기준값 (주기 결정)
  4. Interrupt
    CNT = ARR 도달 시 인터럽트 발생
  5. Control Register (CR1, CR2 등)
    타이머 동작 모드, 방향 설정 등

✅ 5. 주기 계산 방법

● 타이머 주기 계산식

Tperiod=PSC+1fclk×(ARR+1)T_{\text{period}} = \frac{PSC + 1}{f_{\text{clk}}} \times (ARR + 1)
항목설명
PSC프리스케일러 (분주비 -1)
ARR자동 재로딩 값
f_clk타이머에 공급되는 클럭 주파수

예: 클럭 = 72MHz, PSC = 7199, ARR = 999
→ 주기 = (7200 / 72,000,000) × 1000 = 0.1초 (10Hz 주기)


✅ 6. Interrupt를 이용한 주기적 동작

  • 타이머는 특정 시간마다 자동으로 인터럽트를 발생시킬 수 있다.
  • 인터럽트 핸들러에서 필요한 동작을 수행하면, 주기적 처리가 가능하다.
Ticker timer;
void handler() {
    // 1초마다 실행될 코드
}
int main() {
    timer.attach(&handler, 1.0);  // 1초 간격으로 인터럽트 등록
    while (1) {
        // 다른 작업
    }
}

✅ 7. Capture Mode (입력 캡처)

● 개념

외부 이벤트(예: 펄스 입력)가 발생한 **정확한 시간(CNT값)**을 기록

구성 요소설명
CNT현재 타이머 카운터 값
ICx입력 캡처 채널 (핀과 연결됨)
CCRx캡처된 CNT 값 저장

예: 두 펄스 간 시간 측정 → 주기 계산 가능 → 속도 측정 응용


✅ 8. Compare Mode (출력 비교)

● 개념

CNT 값이 특정 Compare 값(CCR)과 같아질 때 출력 핀 상태를 바꾸는 방식

  • CNT == CCR이면 → 출력 신호를 High로 or 토글
  • PWM 신호 생성의 핵심 기반

✅ 9. PWM 모드

● PWM(Pulse Width Modulation)

  • 타이머를 활용해 **일정 주기(T), 특정 듀티비(D%)**의 신호 생성
  • LED 밝기 조절, 모터 속도 제어 등에 활용
파라미터설명
주기 (T)PWM 신호의 총 길이
듀티비 (D)ON 상태 시간 비율 (%)
ARRT에 해당
CCRD에 해당
Duty=CCRARR+1×100%\text{Duty} = \frac{\text{CCR}}{\text{ARR} + 1} \times 100\%

✅ 10. Mbed 기반 타이머 API

Ticker 클래스: 인터럽트 기반 주기 처리

Ticker ticker;
void tick_handler() {
    // 주기적으로 실행됨
}
int main() {
    ticker.attach(&tick_handler, 0.5); // 0.5초 간격
}

Timeout: 한번만 일정 시간 후 실행

Timeout timeout;
timeout.attach(&handler, 2.0);  // 2초 뒤 한 번 실행

Timer: 일반 시간 측정

Timer t;
t.start();
wait(1.0);
t.stop();
printf("Elapsed: %f\n", t.read());

✅ 11. Timer와 다른 기능 연계

기능연계 방식
GPIO 제어타이머 인터럽트 내에서 디지털 출력 변화
인터럽트 시스템주기적으로 ISR 호출하여 태스크 실행
ADC타이머에 의해 정기적으로 샘플링 수행 가능
PWMCCR, ARR 설정으로 PWM 생성
센서 입력펄스 입력 주기 측정 → 속도 계산
RTOS주기적 Task 실행 기반으로 활용 가능

🧾 정리 요약

항목설명
TimerMCU 내부에서 정해진 간격마다 카운터 증가하는 장치
PSC클럭 분주기. 낮을수록 빠른 주기
ARR자동 재로딩 값. CNT가 도달하면 초기화
CNT현재 카운터 값
CompareCNT == CCR → 핀 출력 변화 발생
Capture외부 이벤트 발생 시간 기록
PWM듀티비 조절 가능한 반복 신호 생성
Ticker/Timer APIMbed에서 인터럽트 기반 주기 처리
주기 공식(PSC+1)/fclk×(ARR+1)(PSC+1) / f_{clk} × (ARR+1)
활용LED 점멸, 사운드 발생, 센서 측정, RTOS Task Scheduler 등

profile
부산대 정보컴퓨터공학부

0개의 댓글