EPWM(Enhanced Pulse Width Modulation) 모듈은 Texas Instruments(TI)의 C2000 마이크로컨트롤러(F2837xD 및 F28P65x 시리즈)에서 디지털 제어 시스템(예: 모터 제어, 전력 변환기, 인버터)의 핵심 역할을 수행합니다. 이 문서는 EPWM 모듈의 모든 하위 모듈(Time-Base, Counter-Compare, Action-Qualifier, Dead-Band, Chopper, Trip-Zone, Digital-Compare, Event-Trigger)과 Type-5 EPWM의 고급 기능(XCMP Mode, Diode Emulation, Minimum Dead-Band, Illegal Combination Logic, HRPWM)을 상세히 설명하며, 계산 공식, 설정 예시 코드를 포함합니다.
1. PWM 및 EPWM 개요
1.1 PWM의 기본 개념
PWM(펄스 폭 변조)은 아날로그 신호를 디지털 신호로 근사하는 기법으로, 고정 주파수와 진폭의 펄스 폭을 조절하여 에너지를 전달합니다. 모터 제어에서 로터의 관성으로 인해 펄스 에너지가 부드러운 사인파로 변환됩니다.
- 특징:
- 고정 캐리어 주파수.
- 펄스 폭은 신호 진폭에 비례.
- 디지털-아날로그 변환기(DAC) 역할.
- 전력 스위칭 장치에서의 활용:
- 트랜지스터(MOSFET, IGBT)를 포화/차단 영역에서 제어.
- 효율적이고 CPU 부담 최소화.
- 전력 변환기, 모터 드라이브, 인버터에 사용.
1.2 EPWM 모듈 특징
- 출력: 각 모듈은 두 채널(EPWMxA, EPWMxB)을 GPIO로 제공.
- 연결성: ADC SOC(Start of Conversion), 인터럽트, EPWM X-BAR와 상호작용.
- 동기화: SYNC-IN으로 여러 모듈 동기화, 위상 제어.
- Type-5 기능: XCMP Mode, Diode Emulation, Minimum Dead-Band, Illegal Combination Logic (F28P65x 전용).
- 고해상도 PWM(HRPWM): 150ps 단위 정밀 제어.
- 응용: DC-DC 컨버터, 3상 인버터, 모터 제어, 태양광 시스템.
2. EPWM 하위 모듈
EPWM은 8개의 하위 모듈로 구성되며, 각 모듈은 PWM 생성의 특정 기능을 담당합니다. 아래는 각 하위 모듈의 역할, 설정 방법, 코드 예시입니다.
- Time-Base
- Counter_Compare
- Dead-Band Generator
- PWM Chopper
- Trip-Zone
- Digital-Compare
- Event-Trigger
2.1 Time-Base Submodule
Time-Base는 PWM 주기와 주파수를 정의하는 16비트 카운터(TBCTR)를 기반으로 동작합니다.
- 클럭 계산: \[ TBCLK = \frac{EPWMCLK}{HSPCLKDIV \times CLKDIV} \]
- EPWMCLK: 시스템 클럭(예: 100MHz).
- HSPCLKDIV: 고속 클럭 분주(1, 2, 4, 6, 8, 10, 12, 14).
- CLKDIV: 클럭 분주(1, 2, 4, 8, 16, 32, 64, 128).
- 카운트 모드:
- 상향(Up-Count): 0 → TBPRD, 비대칭 파형.
- 하향(Down-Count): TBPRD → 0, 비대칭 파형.
- 상하향(Up-Down-Count): 0 → TBPRD → 0, 대칭 파형, 모터 제어에 적합.
- 쉐도우 레지스터: TBPRD, TBPHS로 비동기 업데이트 방지.
- 동기화: SYNC-IN(SYNCI)으로 위상 조정, SYNC-OUT으로 다른 모듈 동기화.
- 설정 예:
#include "driverlib.h" void configureTimeBase(uint32_t epwmBase) { EPWM_setTimeBasePeriod(epwmBase, 500); // TBPRD = 500 EPWM_setTimeBaseCounterMode(epwmBase, EPWM_COUNTER_MODE_UP_DOWN); EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_4, EPWM_HSCLOCK_DIVIDER_2); EPWM_setSyncInPulseSource(epwmBase, EPWM_SYNC_IN_PULSE_SRC_DISABLE); }
- 참고: TBPRD는 주기를 정의하며,
EPWM_setTimeBasePeriod
로 설정. 동기화는EPWM_setSyncInPulseSource
로 제어.
2.2 Counter-Compare Submodule
Counter-Compare는 TBCTR과 CMPA/B/C/D 레지스터를 비교하여 이벤트를 생성합니다.
- 비교 이벤트: TBCTR == CMPx.
- 상향/하향: 주기당 1회(CMPA, CMPB).
- 상하향: 주기당 2회(CMPAU, CMPAD, CMPBU, CMPBD).
- 쉐도우 레지스터: CMPCTL로 로드 타이밍 설정(CTR=0, CTR=PRD, SYNC).
- CMPCTL 설정: A와 B 모두
CC_SHADOW
와CC_CTR_ZERO
로 설정 권장(TI 예제 기준). - 설정 예:
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 375); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
- 참고: CMPA/B는 듀티 사이클 조절, CMPC/D는 추가 이벤트 생성에 사용.
2.3 Action-Qualifier Submodule
Action-Qualifier는 비교 이벤트로 PWM 파형을 형성합니다.
- Set PWM output high
- Clear PWM output low
- Toggle PWM output (if high, toggle low; if low, toggle high)
- Do nothing to PWM output
- 동작: Set High, Clear Low, Toggle, Do Nothing.
- 이벤트 소스: CTR=0, CTR=PRD, CMPA/B/C/D, T1/T2(DCAEVT1/2, DCBEVT1/2 TZ1~TZ3), EPWMxSYNCIN
- 설정 예:
아래 그림들은 액션-퀄리파이어 모듈이 비교 매치 이벤트와 함께 사용되어 EPWM 파형을 생성하는 방법을 보여줍니다. 채널 A와 채널 B의 출력은 완전히 독립적이라는 점에 주목하세요.
- EPWM 상향 카운트 비대칭 파형 1
#include "driverlib.h"
void configureAsymmetricWaveform1(uint32_t epwmBase) {
// Time-Base 설정: 상향 카운트, TBPRD=1000
EPWM_setTimeBasePeriod(epwmBase, 1000);
EPWM_setCounterMode(epwmBase, EPWM_COUNTER_MODE_UP);
EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
// Counter-Compare 설정
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, 500); // CMPA
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_B, 750); // CMPB
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
// Action-Qualifier 설정 (EPWMA)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
// Action-Qualifier 설정 (EPWMB)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
}
위 그림에서, EPWMA 출력은 타임-베이스 카운터가 0일 때(제로 매치) High로 설정되고, 비교 A 매치(CMPA)에서 Low로 클리어됩니다. EPWMB 출력은 제로 매치에서 High로 설정되고, 비교 B 매치(CMPB)에서 Low로 클리어됩니다.
- EPWM 상향 카운트 비대칭 파형 2
#include "driverlib.h"
void configureAsymmetricWaveform2(uint32_t epwmBase) {
// Time-Base 설정: 상향 카운트, TBPRD=1000
EPWM_setTimeBasePeriod(epwmBase, 1000);
EPWM_setCounterMode(epwmBase, EPWM_COUNTER_MODE_UP);
EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
// Counter-Compare 설정
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, 500); // CMPA
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_B, 750); // CMPB
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
// Action-Qualifier 설정 (EPWMA)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
// Action-Qualifier 설정 (EPWMB)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_TOGGLE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
}
위 그림에서, EPWMA 출력은 비교 A 매치(CMPA)에서 High로 설정되고, 비교 B 매치(CMPB)에서 Low로 클리어됩니다. 반면, EPWMB 출력은 제로 매치에서 토글됩니다.
- EPWM 상하향 카운트 대칭 파형 1
#include "driverlib.h"
void configureSymmetricWaveform1(uint32_t epwmBase) {
// Time-Base 설정: 상하향 카운트, TBPRD=1000
EPWM_setTimeBasePeriod(epwmBase, 1000);
EPWM_setCounterMode(epwmBase, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
// Counter-Compare 설정
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, 500); // CMPA
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_B, 750); // CMPB
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
// Action-Qualifier 설정 (EPWMA)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// Action-Qualifier 설정 (EPWMB)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
}
위 그림에서, 단일 카운터-비교 레지스터를 사용하여 상향 카운트와 하향 카운트에서 서로 다른 출력 동작이 적용됩니다. EPWMA와 EPWMB 출력은 비교 A 및 B 상향 카운트 매치(CMPAU, CMPBU)에서 High로 설정되고, 비교 A 및 B 하향 카운트 매치(CMPAD, CMPBD)에서 Low로 클리어됩니다.
- EPWM 상하향 카운트 대칭 파형 2
#include "driverlib.h"
void configureSymmetricWaveform2(uint32_t epwmBase) {
// Time-Base 설정: 상하향 카운트, TBPRD=1000
EPWM_setTimeBasePeriod(epwmBase, 1000);
EPWM_setCounterMode(epwmBase, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
// Counter-Compare 설정
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, 500); // CMPA
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_B, 750); // CMPB
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
// Action-Qualifier 설정 (EPWMA)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
// Action-Qualifier 설정 (EPWMB)
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
}
마지막 그림에서, 상향 카운트와 하향 카운트에서 다시 서로 다른 출력 동작이 사용됩니다. EPWMA 출력은 비교 A 상향 카운트 매치(CMPAU)에서 High로 설정되고, 비교 B 하향 카운트 매치(CMPBD)에서 Low로 클리어됩니다. EPWMB 출력은 제로 매치에서 Low로 클리어되고, 타임-베이스 주기 매치에서 High로 설정됩니다.
- 참고: T1/T2는 Digital-Compare 또는 Trip-Zone 이벤트로 트리거 가능.
2.4 Dead-Band Submodule
Dead-Band는 PWM 전환에 지연을 추가하여 단락(Shoot-Through)을 방지합니다.
- 지연:
- DBRED: 상승 에지 지연(Rising Edge Delay).
- DBFED: 하강 에지 지연(Falling Edge Delay).
- 모드:
- AHC(Active High Complementary): EPWMxA=입력, EPWMxB=반전+지연.
- ALC(Active Low Complementary): EPWMxA=입력, EPWMxB=반전+지연.
- 폴리티:
EPWM_DB_POLARITY_ACTIVE_HIGH
또는EPWM_DB_POLARITY_ACTIVE_LOW
. - 설정 예:
EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true); EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true); EPWM_setRisingEdgeDelayCount(EPWM1_BASE, 100); // 1us 지연 (TBCLK=100MHz 기준) EPWM_setFallingEdgeDelayCount(EPWM1_BASE, 100); EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_POLARITY_ACTIVE_HIGH);
- 참고: TI 예제는
DBCTL.IN_MODE
를DBA_ALL
로 설정하며,POLSEL
은 Active Low 권장.
2.5 Chopper Submodule
Chopper는 펄스 변압기 기반 게이트 드라이브를 위해 고주파 캐리어(CHPFREQ)를 PWM 신호에 AND 연산합니다.
- 기능: 초핑된 출력, 원샷 펄스(OSHT) 지원.
- CHPFREQ: 시스템 클럭에 따라 주파수 매핑(0~7).
- 수정 사항:
EPWM_setChopperFreq
는 열거형 없음, 정수(0~7)로 설정. - 설정 예:
EPWM_enableChopper(EPWM1_BASE); EPWM_setChopperFreq(EPWM1_BASE, 0); // 정수 값(0~7), 장치별 주파수 매핑 확인 EPWM_setChopperDutyCycle(EPWM1_BASE, EPWM_CHOPPER_DUTY_50);
- 참고: CHPFREQ는 TRM에서 주파수 매핑 확인 필요.
2.6 Trip-Zone Submodule
Trip-Zone은 과전압, 과전류, 과열 보호를 위한 빠른 하드웨어 메커니즘을 제공합니다.
- 트립 유형:
- OSHT(One-Shot): 주요 단락/과전류 보호.
- CBC(Cycle-by-Cycle): 주기별 전류 제한.
- 신호 소스: TZ1~TZ3(GPIO), TZ4(eQEP 오류), TZ5(클럭 실패), TZ6(에뮬레이션 정지).
- 동작: High-Z, High, Low, Disable.
설정 예:
EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT1);
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_HIGH_Z);
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_HIGH_Z);
EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_OST);
추가적으로, 디지털-비교 서브시스템에서 다양한 트립-존 소스 신호를 생성할 수 있습니다.
전력 드라이브 보호는 전력 변환기 및 모터 드라이브와 같은 시스템의 안전한 작동을 보장하기 위한 안전 기능입니다. 이 기능은 모터 드라이브 이상(예: 과전압, 과전류, 과도한 온도 상승)을 모니터링 프로그램에 알리는 데 사용됩니다. 전력 드라이브 보호 인터럽트가 마스크 해제된 경우, 핀이 Low 상태로 전환된 직후 PWM 출력 핀은 즉시 안전 상태로 전환됩니다. 또한 인터럽트가 발생합니다.
디지털-비교 서브모듈은 INPUT X-BAR 및 EPWM XBAR 모듈로부터 트립 신호를 수신합니다.
EPWM X-BAR
EPWM X-BAR는 다양한 내부 및 외부 신호를 ePWM 모듈로 라우팅하는 데 사용됩니다. EPWM X-BAR로부터 8개의 트립 신호가 모든 ePWM 모듈로 라우팅됩니다.
아래에 표시된 EPWM X-BAR 아키텍처 블록 다이어그램은 8번 반복됩니다. EPWM XBAR는 단일 신호를 선택하거나 최대 32개의 신호를 논리 OR로 결합할 수 있습니다. 그림 내의 표는 트립-존 및 디지털 비교 서브모듈에 다중화될 수 있는 다양한 트립 소스를 정의합니다.
2.7 Digital-Compare Submodule
Digital-Compare는 외부 신호(CMPSS, INPUT X-BAR)를 비교하여 이벤트를 생성합니다.
- 기능: 트립, PWM 동기화, ADC SOC, 인터럽트.
- Blanking: 노이즈 필터링을 위해 Blanking Window 설정.
- 설정 예:
EPWM_setTripZoneDigitalCompareEventCondition(EPWM1_BASE, EPWM_TZ_DC_OUTPUT_A1, EPWM_TZ_EVENT_DCXH_HIGH); EPWM_enableDigitalCompareBlankingWindow(EPWM1_BASE); EPWM_setDigitalCompareBlankingEvent(EPWM1_BASE, EPWM_DC_WINDOW_START_TBCTR_ZERO);
- 참고: CMPSS와 연계하여 아날로그 신호 비교 가능.
2.8 Event-Trigger Submodule
Event-Trigger는 Time-Base, Counter-Compare, Digital-Compare 이벤트를 활용하여 CPU 인터럽트 또는 ADC SOC를 생성합니다.
- 이벤트 소스:
- Time-Base: CTR=0, CTR=PRD, CTR=0 or PRD.
- Counter-Compare: CMPAU, CMPAD, CMPBU, CMPBD, CMPCU, CMPCD, CMPDU, CMPDD.
- Digital-Compare: DCAEVT1/2, DCBEVT1/2.
- 프리스케일링: 최대 15번째 이벤트마다 트리거(ETPS 레지스터).
- 설정 예:
#include "driverlib.h" void configureEventTrigger(uint32_t epwmBase) { EPWM_setADCTriggerSource(epwmBase, EPWM_SOC_A, EPWM_SOC_TBCTR_ZERO); EPWM_enableADCTrigger(epwmBase, EPWM_SOC_A); EPWM_setInterruptSource(epwmBase, EPWM_INT_TBCTR_ZERO); EPWM_setInterruptEventCount(epwmBase, 3); EPWM_enableInterrupt(epwmBase); }
- 참고: ADC SOC는 실시간 제어에서 피드백 루프 동기화에 유용.
3. Type-5 EPWM 고급 기능
Type-5 EPWM은 Type-4에 비해 고급 기능을 제공하며, 복잡한 PWM 파형 생성과 보호 메커니즘을 지원합니다. 아래 기능은 F28P65x 전용이며, epwm.h
에 정의되지 않음. 정확한 열거형은 장치별 헤더 파일(driverlib/epwm.h
)에서 확인해야 합니다.
3.1 XCMP Mode (Extended Counter Compare Mode)
XCMP Mode는 복잡한 PWM 파형 생성을 위해 추가 레지스터와 쉐도우 로드를 제공합니다.
- 특징:
- 단일 주기 내 최대 4개 펄스 생성(XCMP1~8).
- CMPA/B에 XCMP1~8 레지스터 할당.
- 상향 카운트 모드만 지원.
- 쉐도우 로드:
- Load Once, Load Multiple(Active, Set 1, Set 1+2, Set 1+2+3).
- 설정 예 (열거형은 F28P65x 헤더 확인 필요):
EPWM_enableXCMPMode(EPWM1_BASE); EPWM_setXCMPAllocation(EPWM1_BASE, EPWM_XCMP_ALLOC_CMPA_XCMP1_4); // 확인: F28P65x 열거형 EPWM_setXCMPLoadMode(EPWM1_BASE, EPWM_XCMP_LOAD_MULTIPLE_1_2); // 확인: F28P65x 열거형 EPWM_setXCMPValue(EPWM1_BASE, EPWM_XCMP_1, 200);
- 참고: 복잡한 파형(예: 다중 펄스)은 인버터 설계에 유용.
3.2 Diode Emulation Mode
Diode Emulation은 CMPSS와 연계하여 트립 신호(TRIPH/L)에 따라 PWM 출력을 제어합니다.
- 기능: DEMONTRIP, 출력 제어(예: TRIPL로 출력 Low).
- 설정 예 (열거형은 F28P65x 헤더 확인 필요):
EPWM_enableDiodeEmulation(EPWM1_BASE); EPWM_setDiodeEmulationOutput(EPWM1_BASE, EPWM_DE_OUTPUT_A, EPWM_DE_FOLLOW_TRIPL); // 확인: F28P65x 열거형
- 참고: 전력 변환기에서 역방향 전류 방지에 사용.
3.3 Minimum Dead-Band (MINDB) 및 Illegal Combination Logic (ICL)
MINDB는 상보적 PWM 간 최소 지연을 보장하고, ICL은 원치 않는 입력 조합을 감지합니다.
- MINDB: 하드웨어로 최소 데드타임 보장.
- ICL: 비허용 입력 조합에 대해 출력 제어.
- 설정 예 (열거형은 F28P65x 헤더 확인 필요):
EPWM_setMinDeadBandDelay(EPWM1_BASE, 50); // 50 TBCLK 사이클 EPWM_setIllegalComboLogic(EPWM1_BASE, EPWM_ICL_OUT_LOW, EPWM_ICL_INPUT_A_HIGH | EPWM_ICL_INPUT_B_LOW); // 확인: F28P65x 열거형
- 참고: MINDB는 스위칭 손실 감소, ICL은 보호 강화.
3.4 High-Resolution PWM (HRPWM)
EPWM 모듈은 카운터-비교 레지스터(CMPxHR), 타임-베이스 주기 레지스터(TBPRDHR), 및 타임-베이스 위상 레지스터(TBPHSHR)에 8비트 확장을 추가하여 에지 위치 제어를 위한 더 세밀한 시간 단위를 제공합니다. 이를 고해상도 PWM(HRPWM)이라고 하며, 이는 마이크로 에지 포지셔너(MEP) 기술을 기반으로 합니다.
MEP 로직은 기존 PWM 생성기의 하나의 거친 시스템 클럭을 세분화하여 약 150피코초(picoseconds) 수준의 시간 단계 정확도로 에지를 매우 정밀하게 배치할 수 있습니다(장치 문서에서 사양을 확인하세요). 자기 점검 소프트웨어 진단(SFO 라이브러리)을 사용하여 MEP 로직이 최적으로 작동하는지 확인하며, 온도, 전압, 공정에 따른 변화를 보상하기 위해 모든 작동 조건에서 MEP 로직을 캘리브레이션할 수 있습니다. HRPWM은 일반적으로 PWM 해상도가 약 9~10비트 이하로 떨어질 때 사용됩니다.
HRPWM 요약
- 기존 디지털 PWM의 해상도를 크게 향상시킵니다.
- 카운터-비교 레지스터(CMPxHR), 타임-베이스 주기 레지스터(TBPRDHR), 타임-베이스 위상 레지스터(TBPHSHR)에 8비트 확장을 추가하여 마이크로 에지 포지셔닝(MEP) 제어를 제공합니다.
- 일반적으로 PWM 해상도가 약 9~10비트 이하일 때 사용됩니다.
주의사항
모든 EPWM 출력이 HRPWM 기능을 지원하는 것은 아닙니다. 자세한 내용은 장치 데이터시트를 참조하세요.
- 기능: CMPxHR, TBPRDHR, TBPHSHR로 8비트 확장.
- SFO 라이브러리: MEP(Micro-Edge Positioning) 스케일 팩터 보정.
- 설정 예:
#include "sfo_v8.h" int MEP_ScaleFactor; void configureHRPWM(uint32_t epwmBase) { SFO_CalibrateMEP(&MEP_ScaleFactor); HRPWM_setCounterCompareValue(epwmBase, HRPWM_COUNTER_COMPARE_A, 0x80); }
- 참고: DC-DC 컨버터에서 정밀 전압 제어에 적합.
4. EPWM 파형 생성
4.1 스위칭 주파수
PWM 주파수는 TBCLK와 TBPRD로 결정됩니다.
- 비대칭 PWM (상향 또는 하향): \[ TBPRD = \frac{F_{TBCLK}}{F_{PWM}} - 1 \]
- 대칭 PWM (상하향): \[ TBPRD = \frac{F_{TBCLK}}{2 \times F_{PWM}} \]
- 참고: CLKDIV와 HSPCLKDIV는 명시적 계산 필요(예: 1UL*1UL).
4.2 듀티 사이클
듀티 사이클은 CMPx 값으로 조절됩니다.
- 비대칭 PWM: \[ \text{CMPx} = (1 - \text{Duty Cycle}) \times (TBPRD + 1) \]
- 대칭 PWM: \[ \text{CMPx} = (1 - \text{Duty Cycle}) \times TBPRD \]
4.3 해상도
PWM 해상도는 TBPRD에 따라 결정됩니다.
- 비대칭: \( \log_2(TBPRD + 1) \).
- 대칭: \( \log_2(TBPRD) \).
- HRPWM: 150ps 단위로 해상도 향상.
4.4 계산 예시
조건: TBCLK = 100MHz, \( F_{PWM} = 100 \, \text{kHz} \), 듀티 사이클 = 25%.
- 대칭 PWM: \[ TBPRD = \frac{100 \, \text{MHz}}{2 \times 100 \, \text{kHz}} = 500 \] \[ \text{CMPA} = 0.75 \times 500 = 375 \]
- 비대칭 PWM: \[ TBPRD = \frac{100 \, \text{MHz}}{100 \, \text{kHz}} - 1 = 999 \] \[ \text{CMPA} = 0.75 \times (999 + 1) = 750 \]
4.5 코드 예시
20kHz PWM, 1µs 데드타임, 0.5초마다 듀티 10~90% 변경 예시:
#include "driverlib.h"
void configureSymmetricPWM(uint32_t epwmBase)
{
EPWM_setTimeBasePeriod(epwmBase, 2500); // TBPRD = 100MHz / (2 * 20kHz) = 2500
EPWM_setCounterMode(epwmBase, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, 2250); // 초기 10% 듀티
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setDeadBandDelayMode(epwmBase, EPWM_DB_RED, true);
EPWM_setDeadBandDelayMode(epwmBase, EPWM_DB_FED, true);
EPWM_setRisingEdgeDelayCount(epwmBase, 100); // 1us (100MHz)
EPWM_setFallingEdgeDelayCount(epwmBase, 100);
EPWM_setDeadBandDelayPolarity(epwmBase, EPWM_DB_POLARITY_ACTIVE_LOW); // TI 예제 권장
}
void updateDutyCycle(uint32_t epwmBase)
{
static uint16_t duty = 10; // 10% 시작
static bool increasing = true;
if (increasing) {
duty += 10;
if (duty >= 90) increasing = false;
} else {
duty -= 10;
if (duty <= 10) increasing = true;
}
uint16_t cmpa = (100 - duty) * 2500 / 100; // 듀티 사이클 계산
EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, cmpa);
}
'MCU > C2000' 카테고리의 다른 글
TI C2000 DSP TMS320F28377D, TMS320F28379D, TMS320F28388D 비교 (2) | 2025.08.18 |
---|---|
C2000 DSP CMD 파일: 상세 설명, 구조, 작성 방법 및 예제 (2) | 2025.08.18 |
TMS320F28377D DSP SDFM 사용법 : Bitfield 구조 활용 예제 코드(수정) (1) | 2025.08.18 |
TMS320F28377D DSP ePWM CMPASS 사용법: Bitfield 구조 활용 예제 코드(수정) (0) | 2025.08.18 |
TMS320F28377D DSP SPI 사용법 : Bitfield 구조 활용 예제 코드(수정) (2) | 2025.08.18 |
TMS320F28377D DSP DMA 사용법 : Bitfield 구조 활용 예제 코드(수정) (0) | 2025.08.18 |
TMS320F28377D DSP CAN 사용법 : Bitfield 구조 활용 예제 코드(수정) (0) | 2025.08.18 |
TMS320F28377D DSP EMIF 사용법 : Bitfield 구조 활용 예제 코드(수정) (1) | 2025.08.17 |