📘 Lecture 08 — Timer (타이머)
✅ 1. 타이머란 무엇인가?
● 정의
타이머는 **정해진 시간 간격에 따라 이벤트를 발생시키거나, 시간을 측정하는 주변 장치(peripheral)**이다. MCU 내부 또는 외부 클럭에 의해 작동하며, 주기적 작업을 자동화할 수 있다.
교수님 설명 요약:
“MCU가 정확한 시간 간격마다 어떤 일을 해야 한다면, 타이머가 그 역할을 맡는다. 사람이 반복 루프를 직접 짜는 것이 아니라 하드웨어가 알아서 시간을 측정해주는 장치다.”
✅ 2. 타이머의 필요성
| 활용 예 | 설명 |
|---|
| 주기적 작업 | 0.5초마다 LED 토글, 1초마다 데이터 로깅 |
| 디지털 시계 | 1초 카운트로 시간 측정 |
| PWM 생성 | 일정 주기/듀티비를 갖는 신호 생성 |
| 캡처 | 외부 이벤트의 시점 기록 |
| 인터럽트 발생 | 주기적으로 ISR을 호출하여 태스크 수행 |
✅ 3. 타이머의 종류 (모드 기준)
| 모드 | 설명 |
|---|
| Basic Timer | 단순 카운터 또는 주기 인터럽트용 |
| PWM Timer | PWM 신호 생성 |
| Input Capture | 외부 신호의 시간 기록 |
| Output Compare | 특정 시간에 맞춰 출력 신호 제어 |
| Encoder Timer | 회전량 측정용 (Quadrature decoder) |
✅ 4. 타이머의 구성 요소
● 기본 구조
- Counter (CNT)
현재까지 카운트된 값을 저장
- Prescaler (PSC)
클럭 속도를 나누어 타이머 주기 조절
- Auto-Reload Register (ARR)
CNT가 도달하면 초기화될 기준값 (주기 결정)
- Interrupt
CNT = ARR 도달 시 인터럽트 발생
- Control Register (CR1, CR2 등)
타이머 동작 모드, 방향 설정 등
✅ 5. 주기 계산 방법
● 타이머 주기 계산식
Tperiod=fclkPSC+1×(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() {
}
int main() {
timer.attach(&handler, 1.0);
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 상태 시간 비율 (%) |
| ARR | T에 해당 |
| CCR | D에 해당 |
Duty=ARR+1CCR×100%
✅ 10. Mbed 기반 타이머 API
● Ticker 클래스: 인터럽트 기반 주기 처리
Ticker ticker;
void tick_handler() {
}
int main() {
ticker.attach(&tick_handler, 0.5);
}
● Timeout: 한번만 일정 시간 후 실행
Timeout timeout;
timeout.attach(&handler, 2.0);
● Timer: 일반 시간 측정
Timer t;
t.start();
wait(1.0);
t.stop();
printf("Elapsed: %f\n", t.read());
✅ 11. Timer와 다른 기능 연계
| 기능 | 연계 방식 |
|---|
| GPIO 제어 | 타이머 인터럽트 내에서 디지털 출력 변화 |
| 인터럽트 시스템 | 주기적으로 ISR 호출하여 태스크 실행 |
| ADC | 타이머에 의해 정기적으로 샘플링 수행 가능 |
| PWM | CCR, ARR 설정으로 PWM 생성 |
| 센서 입력 | 펄스 입력 주기 측정 → 속도 계산 |
| RTOS | 주기적 Task 실행 기반으로 활용 가능 |
🧾 정리 요약
| 항목 | 설명 |
|---|
| Timer | MCU 내부에서 정해진 간격마다 카운터 증가하는 장치 |
| PSC | 클럭 분주기. 낮을수록 빠른 주기 |
| ARR | 자동 재로딩 값. CNT가 도달하면 초기화 |
| CNT | 현재 카운터 값 |
| Compare | CNT == CCR → 핀 출력 변화 발생 |
| Capture | 외부 이벤트 발생 시간 기록 |
| PWM | 듀티비 조절 가능한 반복 신호 생성 |
| Ticker/Timer API | Mbed에서 인터럽트 기반 주기 처리 |
| 주기 공식 | (PSC+1)/fclk×(ARR+1) |
| 활용 | LED 점멸, 사운드 발생, 센서 측정, RTOS Task Scheduler 등 |