null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
Embedded C Intermediate — 인터럽트·주변장치·펌웨어 설계 패턴
Structure
interrupt-system
•
인터럽트 개념 — 벡터 테이블과 ISR 등록 원리
•
인터럽트 라우팅 — SRC 레지스터로 코어에 연결하기
•
ISR 작성 규칙 — 재진입 금지, 실행 시간 최소화
•
ISR 공유 데이터 — volatile, 임계구역, 원자 접근
timers
•
타이머 개념 — 카운터, 오버플로, 프리스케일러
•
PWM 생성 — 원리, 듀티사이클, GTM TOM
•
입력 캡처 — 주파수·펄스폭 측정, GTM TIM
serial-communication
•
UART 심화 — FIFO, 오류 핸들링, 인터럽트 기반 송수신
•
SPI 프로토콜 — Master/Slave, CPOL/CPHA, QSPI
•
I2C 프로토콜 — 주소 지정, ACK/NACK, 멀티마스터
adc
•
ADC 기초 — 분해능, 샘플링 레이트, EVADC
•
ADC 변환 모드 — 단일, 연속, 스캔 모드
•
ADC 인터럽트 & DMA — 변환 완료 처리, 자동 수집 패턴
firmware-patterns
•
상태 머신 — FSM 설계, enum + 함수 포인터 테이블
•
링버퍼 — 원형 버퍼 구현, 인터럽트 안전 설계
•
협력형 스케줄러 — 타임 슬롯 기반 직접 구현
Flow Structure
타이머 개념 — 카운터, 오버플로, 프리스케일러
6 / 16
입력 캡처 — 주파수·펄스폭 측정, GTM TIM
☆ Star
↗ Full
PWM 생성 — 원리, 듀티사이클, GTM TOM
#pwm
#duty-cycle
#gtm
#tom
#tc37x
@devpc
|
2026-04-02 06:39:39
|
GET /api/v1/flows/11/nodes/214?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
3
Calls
# PWM 생성 — 원리, 듀티사이클, GTM TOM ## PWM이란? PWM(Pulse Width Modulation, 펄스 폭 변조)은 디지털 핀을 고속으로 켜고 끄면서 아날로그 출력을 흉내 내는 기술입니다. ``` 100% 듀티사이클: ────────────────────────────── (항상 HIGH) 50% 듀티사이클: ─── ─── ─── ─── ─── ─── ─── ─── 25% 듀티사이클: ── ── ── ────────── ────────── 0% 듀티사이클: ________________________________ (항상 LOW) ``` --- ## 핵심 파라미터 ``` ┌──────┐ ┌──────┐ │ │ │ │ ────┘ └──────────┘ └──── ├──────┤ ON시간 (Ton) ├──────────────────┤ 주기 (T) 듀티사이클(%) = Ton / T × 100 주파수(Hz) = 1 / T ``` ### 주파수와 듀티사이클의 독립성 PWM의 강점은 **주파수는 고정하고 듀티사이클만 변경**할 수 있다는 점입니다. - LED 밝기 조절: 주파수 1 kHz 고정, 듀티사이클 0~100% - DC 모터 속도 제어: 주파수 20 kHz 고정, 듀티사이클로 전압 비율 조절 - 서보모터: 주파수 50 Hz 고정, 듀티사이클 5~10%로 각도 제어 --- ## 타이머 기반 PWM 동작 원리 ``` 카운터 값 ▲ │ ARR(주기값) ARR│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ╱│ ╱│ CCR│─ ─ ─ ─╱ │─ ─ ─ ─╱ │ ← CCR(비교값, 듀티사이클 결정) │ ╱ │ ╱ │ │ ╱ │ ╱ │ │ ╱ │ ╱ │ │ ╱ │ ╱ │ └──────────────────────────▶ 시간 출력 핀: ──────┐ ┌──────┐ ┌── └───┘ └───┘ HIGH 구간 LOW 구간 (카운터 < CCR) (카운터 ≥ CCR) ``` - **ARR(Auto-Reload Register)**: 카운터 최댓값 → 주파수 결정 - **CCR(Capture/Compare Register)**: 비교값 → 듀티사이클 결정 --- ## TC37x — GTM 모듈 TC37x의 PWM은 **GTM(Generic Timer Module)** 내의 **TOM(Timer Output Module)** 채널로 생성합니다. ### GTM 구조 개요 ``` +─────────────────────────────────────────+ │ GTM │ │ +──────────────────────────────────+ │ │ │ TIM (입력 캡처) │ │ │ +──────────────────────────────────+ │ │ +──────────────────────────────────+ │ │ │ TOM (타이머 출력, PWM 생성) │ │ │ │ TOM0: 채널 0~15 │ │ │ │ TOM1: 채널 0~15 │ │ │ +──────────────────────────────────+ │ │ +──────────────────────────────────+ │ │ │ ATOM (고해상도 출력) │ │ │ +──────────────────────────────────+ │ +─────────────────────────────────────────+ ``` TOM 채널 하나 = PWM 채널 하나입니다. ### iLLD — IfxGtm_Tom_Pwm 사용법 ```c #include "IfxGtm_Tom_Pwm.h" IfxGtm_Tom_Pwm_Handle g_tomPwm; void initPwm(void) { // GTM 클럭 활성화 IfxGtm_enable(&MODULE_GTM); IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK); IfxGtm_Tom_Pwm_Config pwmConfig; IfxGtm_Tom_Pwm_initConfig(&pwmConfig, &MODULE_GTM); // TOM 채널 및 출력 핀 설정 pwmConfig.tom = IfxGtm_Tom_0; pwmConfig.tomChannel = IfxGtm_Tom_Ch_0; pwmConfig.pin.outputPin = &IfxGtm_TOM0_0_TOUT0_P02_0_OUT; // 핀 매핑 // 주파수 및 듀티사이클 설정 pwmConfig.frequency = 20000; // 20 kHz pwmConfig.dutyCycle = 0.5f; // 50% pwmConfig.synchronousUpdateEnabled = TRUE; IfxGtm_Tom_Pwm_init(&g_tomPwm, &pwmConfig); IfxGtm_Tom_Pwm_start(&g_tomPwm, TRUE); } // 런타임 듀티사이클 변경 void setPwmDuty(float duty) // duty: 0.0 ~ 1.0 { IfxGtm_Tom_Pwm_setParams(&g_tomPwm, 20000, duty); } ``` --- ## 듀티사이클 계산 예시 ``` 목표: 20 kHz PWM, 듀티사이클 30% GTM 클럭: 100 MHz (예시) ARR = 클럭 / 주파수 = 100,000,000 / 20,000 = 5,000 틱 CCR = ARR × 듀티사이클 = 5,000 × 0.30 = 1,500 틱 출력: ┌──────┐ ┌──────┐ │1500틱│ 3500틱 │1500틱│ ──┘ └───────────────┘ └─ ``` --- ## 응용: LED 밝기 제어 ```c // 1 kHz PWM으로 LED 밝기 제어 // duty 0.0 = 꺼짐, 1.0 = 최대 밝기 void setLedBrightness(float brightness) { if (brightness < 0.0f) brightness = 0.0f; if (brightness > 1.0f) brightness = 1.0f; IfxGtm_Tom_Pwm_setParams(&g_ledPwm, 1000, brightness); } ``` ## 응용: DC 모터 속도 제어 ```c // 20 kHz PWM + H-Bridge 드라이버 // 인간 가청 주파수(20 kHz) 이상으로 설정하여 소음 제거 void setMotorSpeed(float speed) // -1.0 ~ +1.0 { if (speed >= 0.0f) { setDirection(FORWARD); IfxGtm_Tom_Pwm_setParams(&g_motorPwm, 20000, speed); } else { setDirection(REVERSE); IfxGtm_Tom_Pwm_setParams(&g_motorPwm, 20000, -speed); } } ``` --- ## 다른 MCU와의 비교 STM32의 PWM은 TIMx 채널에서 직접 출력됩니다. TC37x의 GTM TOM은 더 복잡한 구조이지만, 독립적인 GTM 서브클럭을 사용하므로 CPU 부하 없이 다수의 PWM 채널을 동시에 정밀하게 제어할 수 있습니다. 차량용 모터 제어(BLDC, PMSM) 같은 고성능 응용에 유리합니다. --- ## 정리 | 항목 | 설명 | |------|------| | 듀티사이클 | ON 시간 / 주기 × 100, 출력 전압 비율 | | ARR | 카운터 최댓값, 주파수 결정 | | CCR | 비교값, 듀티사이클 결정 | | GTM TOM | TC37x PWM 출력 모듈 | | IfxGtm_Tom_Pwm | TOM 채널 PWM 생성 iLLD 드라이버 |
타이머 개념 — 카운터, 오버플로, 프리스케일러
입력 캡처 — 주파수·펄스폭 측정, GTM TIM
// COMMENTS
Newest First
ON THIS PAGE
No content selected.