본문 바로가기
MCU/C2000

TI C2000 DSP ePWM Module 설정 가이드

by linuxgo 2025. 9. 14.

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_SHADOWCC_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_MODEDBA_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);
}