본문 바로가기
MCU/C2000

[TMS320F28377D] DC-DC 변환 토포롤로지별 ePWM 생성 방법: Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 18.
반응형

개요

TI의 TMS320F28377D는 C2000 Delfino 시리즈의 고성능 32비트 마이크로컨트롤러로, DC-DC 변환기와 같은 전력 변환 애플리케이션에서 ePWM(Enhanced Pulse Width Modulation) 모듈을 활용해 정밀한 PWM 신호를 생성할 수 있습니다. 이 문서에서는 주요 DC-DC 변환 토포롤로지(벅, 부스트, 벅-부스트, 푸시-풀, 풀-브릿지)별로 ePWM 설정 방법을 설명하고, Bitfield 구조를 사용한 실용적인 예제 코드를 제공합니다. 각 예제는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능하며, 초보자와 숙련된 개발자 모두 활용할 수 있도록 구성했습니다.

1. DC-DC 변환 토포롤로지와 PWM 요구사항

DC-DC 변환기는 입력 전압을 원하는 출력 전압으로 변환하는 전력 전자 회로입니다. 각 토포롤로지별 PWM 신호 요구사항은 다음과 같습니다:

  • 벅 변환기 (Buck Converter):
    • 단일 PWM 신호, 고정 주파수, 가변 듀티 사이클.
    • 스위치(고측 MOSFET)를 제어하며, 듀티 사이클(D)에 따라 출력 전압(Vout = D × Vin) 조절.
    • 동기 정류 사용 시 보완 PWM 신호 필요.
  • 부스트 변환기 (Boost Converter):
    • 단일 PWM 신호, 고정 주파수, 가변 듀티 사이클.
    • 저측 스위치 제어, 듀티 사이클에 따라 출력 전압(Vout = Vin / (1-D)) 조절.
  • 벅-부스트 변환기 (Buck-Boost Converter):
    • 단일 PWM 신호 또는 동기 정류를 위한 두 개의 PWM 신호.
    • 출력 전압은 듀티 사이클에 따라 Vin보다 높거나 낮음(Vout = -D × Vin / (1-D)).
  • 푸시-풀 변환기 (Push-Pull Converter):
    • 두 개의 상보 PWM 신호, 50% 이하 듀티 사이클, 데드밴드 필수.
    • 트랜스포머 기반, 두 스위치 번갈아 동작.
  • 풀-브릿지 변환기 (Full-Bridge Converter):
    • 네 개의 PWM 신호(두 쌍의 상보 신호), 데드밴드 포함.
    • 고전력 애플리케이션에 적합, 트랜스포머를 통해 출력 전압 제어.

2. ePWM 설정 개요

TMS320F28377D의 ePWM 모듈은 DC-DC 변환기에 필요한 고정밀 PWM 신호를 생성합니다. 주요 설정 요소는 다음과 같습니다:

  • 타임 베이스 (TB): 주기(TBPRD)와 클럭 설정(TBCTL.bit.CLKDIV, HSPCLKDIV).
  • 카운터 비교 (CC): 듀티 사이클 설정(CMPA, CMPB).
  • 액션 퀄리파이어 (AQ): PWM 출력 동작(AQCTLA, AQCTLB).
  • 데드밴드 (DB): 동기 정류 또는 다중 스위치 토포롤로지에서 스위치 간 지연 설정.
  • 트립 존 (TZ): 과전류 보호를 위한 CMPASS 연동(옵션).

3. ePWM 설정 절차

  1. 시스템 초기화:
    •    InitSysCtrl()로 시스템 클럭(예: 200MHz) 및 PLL 초기화.
    •    인터럽트 비활성화 및 PIE 초기화.
  2. ePWM 클럭 활성화:
    •    CpuSysRegs.PCLKCR2.bit.EPWMx로 ePWM 모듈 클럭 활성화.
  3. 타임 베이스 설정:
    •    TBCTL.bit.CTRMODE: 카운트 모드(예: 업 카운트).
    •    TBPRD: PWM 주기 설정.
    •    TBCTL.bit.CLKDIV, TBCTL.bit.HSPCLKDIV: 클럭 분주 설정.
  4. 듀티 사이클 설정:
    •    CMPA.bit.CMPA: 듀티 사이클 설정.
  5. 출력 동작 설정:
    •    AQCTLA, AQCTLB: PWM 출력 High/Low 동작 설정.
  6. 데드밴드 설정(필요 시):
    •    DBCTL: 데드밴드 활성화 및 지연 시간 설정.
  7. 인터럽트 설정(선택 사항):
    •    ETSEL, ETPS로 PWM 이벤트 인터럽트 설정.
  8. CMPASS 연동(선택 사항):
    •    과전류 보호를 위해 CMPASS와 트립 존 설정.

4. DC-DC 변환기별 ePWM 예제 코드

아래는 TMS320F28377D에서 각 DC-DC 변환 토포롤로지에 적합한 ePWM 설정 예제 코드입니다. 모든 코드는 100kHz PWM 주파수, 200MHz 시스템 클럭 기준으로 작성되었습니다.

4.1 예제 1: 벅 변환기 (단일 PWM)

// File: epwm_buck_converter.c
// Description: TMS320F28377D ePWM 기반 벅 변환기 PWM 생성 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void)
{
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0 출력 설정
    EDIS;

    // ePWM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
    EDIS;

    // ePWM1 설정 (Bitfield 사용)
    EALLOW;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티 (Vout = 0.5*Vin)
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
    EDIS;

    EINT; // 글로벌 인터럽트 활성화

    for(;;); // 무한 루프
}

설명:

  • 기능: ePWM1A를 통해 100kHz, 50% 듀티 사이클의 PWM 신호를 생성하여 벅 변환기의 고측 MOSFET 제어.
  • 설정:
    • ePWM1: 업 카운트 모드, 100kHz 주기(TBPRD=2000), 50% 듀티(CMPA=1000).
    • 출력: GPIO0(ePWM1A)에서 PWM 신호 출력.
  • 출력: GPIO0에서 100kHz PWM 신호, 듀티 사이클 50%로 출력.
  • 적용: 기본 벅 변환기 스위칭, 출력 전압은 입력 전압의 50%.

4.2 예제 2: 부스트 변환기 (단일 PWM)

// File: epwm_boost_converter.c
// Description: TMS320F28377D ePWM 기반 부스트 변환기 PWM 생성 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void)
{
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0 출력 설정
    EDIS;

    // ePWM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
    EDIS;

    // ePWM1 설정 (Bitfield 사용)
    EALLOW;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1600; // 80% 듀티 (Vout = Vin/(1-0.8) = 5*Vin)
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
    EDIS;

    EINT; // 글로벌 인터럽트 활성화

    for(;;); // 무한 루프
}

설명:

  • 기능: ePWM1A를 통해 100kHz, 80% 듀티 사이클의 PWM 신호를 생성하여 부스트 변환기의 저측 MOSFET 제어.
  • 설정:
    • ePWM1: 업 카운트 모드, 100kHz 주기(TBPRD=2000), 80% 듀티(CMPA=1600).
    • 출력: GPIO0(ePWM1A)에서 PWM 신호 출력.
  • 출력: GPIO0에서 100kHz PWM 신호, 듀티 사이클 80%로 출력.
  • 적용: 부스트 변환기에서 출력 전압은 입력 전압의 약 5배(Vout = Vin/(1-0.8)).

4.3 예제 3: 벅-부스트 변환기 (동기 정류, 데드밴드 포함)

// File: epwm_buck_boost_converter.c
// Description: TMS320F28377D ePWM 기반 벅-부스트 변환기 PWM 생성 예제 (Bitfield 구조, 동기 정류)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void)
{
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // GPIO1을 ePWM1B로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0 출력 설정
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // GPIO1 출력 설정
    EDIS;

    // ePWM1 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
    EDIS;

    // ePWM1 설정 (Bitfield 사용)
    EALLOW;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 ePWM1A High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 ePWM1A Low
    EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR; // TBCTR=0일 때 ePWM1B Low
    EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // TBCTR=CMPA일 때 ePWM1B High

    // 데드밴드 설정
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 데드밴드 완전 활성화
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // ePWM1B는 ePWM1A의 보완 신호
    EPwm1Regs.DBRED.bit.DBRED = 20; // 상승 지연 100ns (20 TBCLK = 20/200MHz)
    EPwm1Regs.DBFED.bit.DBFED = 20; // 하강 지연 100ns
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
    EDIS;

    EINT; // 글로벌 인터럽트 활성화

    for(;;); // 무한 루프
}

설명:

  • 기능: ePWM1A와 ePWM1B를 사용하여 100kHz, 50% 듀티 사이클의 상보적인 PWM 신호를 생성하며, 데드밴드(100ns)를 적용해 동기 정류 벅-부스트 변환기 제어.
  • 설정:
    • ePWM1: 업 카운트 모드, 100kHz 주기(TBPRD=2000), 50% 듀티(CMPA=1000).
    • 데드밴드: ePWM1A와 ePWM1B 간 100ns 지연 적용.
    • 출력: GPIO0(ePWM1A), GPIO1(ePWM1B)에서 상보 PWM 신호 출력.
  • 출력: GPIO0과 GPIO1에서 100kHz PWM 신호, 50% 듀티, 100ns 데드밴드 포함.
  • 적용: 동기 정류 벅-부스트 변환기에서 고측/저측 MOSFET 제어.

4.4 예제 4: 푸시-풀 변환기 (상보 PWM, 데드밴드 포함)

// File: epwm_push_pull_converter.c
// Description: TMS320F28377D ePWM 기반 푸시-풀 변환기 PWM 생성 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void)
{
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // GPIO2을 ePWM2A로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0 출력 설정
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // GPIO2 출력 설정
    EDIS;

    // ePWM1, ePWM2 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
    CpuSysRegs.PCLKCR2.bit.EPWM2 = 1; // ePWM2 모듈 클럭 활성화
    EDIS;

    // ePWM1 설정 (Bitfield 사용)
    EALLOW;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 800; // 40% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 데드밴드 완전 활성화
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // ePWM1B는 ePWM1A의 보완 신호
    EPwm1Regs.DBRED.bit.DBRED = 20; // 상승 지연 100ns
    EPwm1Regs.DBFED.bit.DBFED = 20; // 하강 지연 100ns
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

    // ePWM2 설정 (ePWM1과 위상 반대)
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm2Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm2Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm2Regs.CMPA.bit.CMPA = 800; // 40% 듀티
    EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 데드밴드 완전 활성화
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // ePWM2B는 ePWM2A의 보완 신호
    EPwm2Regs.DBRED.bit.DBRED = 20; // 상승 지연 100ns
    EPwm2Regs.DBFED.bit.DBFED = 20; // 하강 지연 100ns
    EPwm2Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
    EPwm2Regs.TBPHS.bit.TBPHS = 1000; // 180도 위상 이동 (TBPRD/2)
    EDIS;

    EINT; // 글로벌 인터럽트 활성화

    for(;;); // 무한 루프
}

설명:

  • 기능: ePWM1A와 ePWM2A를 사용하여 100kHz, 40% 듀티 사이클의 상보 PWM 신호를 생성하며, 180도 위상 차와 100ns 데드밴드를 적용해 푸시-풀 변환기 제어.
  • 설정:
    • ePWM1, ePWM2: 업 카운트 모드, 100kHz 주기(TBPRD=2000), 40% 듀티(CMPA=800).
    • 위상: ePWM2는 ePWM1 대비 180도 위상 이동(TBPHS=1000).
    • 데드밴드: 각 모듈에 100ns 지연 적용.
    • 출력: GPIO0(ePWM1A), GPIO2(ePWM2A)에서 PWM 신호 출력.
  • 출력: GPIO0과 GPIO2에서 100kHz PWM 신호, 40% 듀티, 180도 위상 차, 100ns 데드밴드 포함.
  • 적용: 푸시-풀 변환기에서 두 스위치 번갈아 제어.

4.5 예제 5: 풀-브릿지 변환기 (네 개의 PWM 신호)

// File: epwm_full_bridge_converter.c
// Description: TMS320F28377D ePWM 기반 풀-브릿지 변환기 PWM 생성 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void)
{
    // 시스템 초기화
    InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 초기화
    IER = 0x0000; // CPU 인터럽트 비활성화
    IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
    InitPieVectTable(); // PIE 벡터 테이블 초기화

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // GPIO1을 ePWM1B로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // GPIO2을 ePWM2A로 설정
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // GPIO3을 ePWM2B로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0 출력 설정
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // GPIO1 출력 설정
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // GPIO2 출력 설정
    GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; // GPIO3 출력 설정
    EDIS;

    // ePWM1, ePWM2 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; // ePWM1 모듈 클럭 활성화
    CpuSysRegs.PCLKCR2.bit.EPWM2 = 1; // ePWM2 모듈 클럭 활성화
    EDIS;

    // ePWM1 설정 (첫 번째 브릿지 쌍)
    EALLOW;
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm1Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 ePWM1A High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 ePWM1A Low
    EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR; // TBCTR=0일 때 ePWM1B Low
    EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // TBCTR=CMPA일 때 ePWM1B High
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 데드밴드 완전 활성화
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // ePWM1B는 ePWM1A의 보완 신호
    EPwm1Regs.DBRED.bit.DBRED = 20; // 상승 지연 100ns
    EPwm1Regs.DBFED.bit.DBFED = 20; // 하강 지연 100ns
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

    // ePWM2 설정 (두 번째 브릿지 쌍, 180도 위상 이동)
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 업 카운트 모드
    EPwm2Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm2Regs.TBPRD = 2000; // 주기 = 2000 TBCLK (100kHz = 200MHz/2000)
    EPwm2Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 ePWM2A High
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 ePWM2A Low
    EPwm2Regs.AQCTLB.bit.ZRO = AQ_CLEAR; // TBCTR=0일 때 ePWM2B Low
    EPwm2Regs.AQCTLB.bit.CAU = AQ_SET; // TBCTR=CMPA일 때 ePWM2B High
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 데드밴드 완전 활성화
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // ePWM2B는 ePWM2A의 보완 신호
    EPwm2Regs.DBRED.bit.DBRED = 20; // 상승 지연 100ns
    EPwm2Regs.DBFED.bit.DBFED = 20; // 하강 지연 100ns
    EPwm2Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
    EPwm2Regs.TBPHS.bit.TBPHS = 1000; // 180도 위상 이동 (TBPRD/2)
    EDIS;

    EINT; // 글로벌 인터럽트 활성화

    for(;;); // 무한 루프
}

설명:

  • 기능: ePWM1A/B, ePWM2A/B를 사용하여 100kHz, 50% 듀티 사이클의 두 쌍의 상보 PWM 신호를 생성하며, 180도 위상 차와 100ns 데드밴드를 적용해 풀-브릿지 변환기 제어.
  • 설정:
    • ePWM1, ePWM2: 업 카운트 모드, 100kHz 주기(TBPRD=2000), 50% 듀티(CMPA=1000).
    • 위상: ePWM2는 ePWM1 대비 180도 위상 이동(TBPHS=1000).
    • 데드밴드: 각 쌍에 100ns 지연 적용.
    • 출력: GPIO0(ePWM1A), GPIO1(ePWM1B), GPIO2(ePWM2A), GPIO3(ePWM2B)에서 PWM 신호 출력.
  • 출력: GPIO0~3에서 100kHz PWM 신호, 50% 듀티, 180도 위상 차, 100ns 데드밴드 포함.
  • 적용: 풀-브릿지 변환기에서 네 스위치 제어, 고전력 트랜스포머 기반 애플리케이션.

5. 설정 고려사항

  • PWM 주파수: 100kHz는 일반적인 DC-DC 변환기 주파수. TBPRD 조정으로 변경 가능.
  • 듀티 사이클: CMPA 값을 조정하여 출력 전압 제어(예: 벅 0100%, 부스트 090%, 푸시-풀/풀-브릿지 0~50%).
  • 데드밴드: 동기 정류 또는 다중 스위치 토포롤로지에서 DBRED/DBFED 설정으로 단락 방지.
  • 위상 이동: 푸시-풀 및 풀-브릿지에서 TBPHS로 위상 제어.
  • 과전류 보호: CMPASS와 트립 존 연동(참고: 이전 문서의 CMPASS 예제).
  • 효율성: 데드밴드 최적화 및 스위칭 주파수 조정으로 전력 손실 최소화.

6. 사용 방법

6.1 환경 설정

  • C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx에서 라이브러리 다운로드.
  • CCS 프로젝트: TMS320F28377D 타겟으로 프로젝트 생성, F28x_Project.h 포함.
  • 링커 파일: device_support\f2837xd 폴더에서 링커 파일 추가.

6.2 코드 실행

  • 각 예제를 별도의 .c 파일로 저장하거나 main.c에 복사.
  • 다른 예제와 충돌 방지를 위해 불필요한 코드 주석 처리.

6.3 하드웨어 준비

  • PWM 출력: GPIO0~3(ePWM1A/B, ePWM2A/B)에 오실로스코프 연결.
  • 테스트:
    •    예제 1: GPIO0에서 100kHz, 50% 듀티 PWM 확인.
    •    예제 2: GPIO0에서 100kHz, 80% 듀티 PWM 확인.
    •    예제 3: GPIO0과 GPIO1에서 상보 PWM 및 100ns 데드밴드 확인.
    •    예제 4: GPIO0과 GPIO2에서 100kHz, 40% 듀티, 180도 위상 차 확인.
    •    예제 5: GPIO0~3에서 100kHz, 50% 듀티, 180도 위상 차, 100ns 데드밴드 확인.
  • 부하 연결: 실제 DC-DC 변환기 회로(MOSFET, 인덕터, 트랜스포머, 커패시터 등) 연결.

6.4 디버깅

  • CCS Expressions 창: EPwm1Regs.TBCTR, EPwm1Regs.CMPA, EPwm2Regs.TBPHS, DBRED 확인.
  • PWM 출력: 오실로스코프로 주기, 듀티, 위상, 데드밴드 점검.
  • 문제 해결:
    •    PWM 출력 없음: TBCTL, AQCTLA, GpioCtrlRegs 설정 확인.
    •    위상/데드밴드 문제: TBPHS, DBCTL, DBRED, DBFED 설정 확인.

7. 추가 팁

  • 듀티 사이클 동적 조정: ADC 또는 외부 입력을 통해 CMPA 값을 실시간 업데이트.
  • CMPASS 연동: 과전류/과전압 보호를 위해 이전 문서의 CMPASS 예제 참조.
  • C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\epwm.
  • TI 리소스: TI E2E 포럼, C2000Ware ePWM 예제 활용.

8. 결론

이 문서는 TMS320F28377D의 ePWM 모듈을 활용하여 벅, 부스트, 벅-부스트, 푸시-풀, 풀-브릿지 변환기용 PWM 신호를 생성하는 방법을 Bitfield 구조 기반 예제 코드로 설명했습니다. 각 코드는 DC-DC 변환기의 스위칭 제어에 최적화되어 있으며, 모터 드라이브, 배터리 관리 시스템, 재생 에너지 시스템 등 다양한 전력 변환 애플리케이션에 활용 가능합니다.

키워드: TMS320F28377D, ePWM, DC-DC 변환기, 벅 변환기, 부스트 변환기, 벅-부스트 변환기, 푸시-풀 변환기, 풀-브릿지 변환기, PWM, Bitfield, Code Composer Studio, 동기 정류, 데드밴드, 위상 이동

반응형