본문 바로가기
MCU/C2000

[TMS320F28377D] 하프-브릿지 PWM 설정: 비트필드 예제

by linuxgo 2025. 8. 5.
반응형

소개: TMS320F28377D와 하프-브릿지 PWM의 중요성

Texas Instruments의 TMS320F28377D는 고성능 C2000 시리즈 마이크로컨트롤러로, 모터 제어, 전력 변환, 인버터와 같은 애플리케이션에서 널리 사용됩니다. 하프-브릿지 PWM(Pulse Width Modulation)은 전력 전자 회로에서 효율적인 스위칭을 위해 필수적이며, 슈트-스루(shoot-through)를 방지하기 위해 데드밴드(dead-band) 설정이 중요합니다. 이 글에서는 비트필드 구조체를 사용한 하프-브릿지 PWM 설정 예제 코드를 제공하고, 상세한 주석과 함께 설정 방법을 설명합니다.

왜 하프-브릿지 PWM이 필요성

하프-브릿지 회로는 상단과 하단 MOSFET을 교대로 스위칭하여 전력을 제어합니다. PWM 신호는 듀티 사이클을 조정하여 출력 전압을 제어하며, 데드밴드는 두 MOSFET이 동시에 켜지는 것을 방지하여 회로 손상을 예방합니다. TMS320F28377D의 ePWM 모듈은 이러한 작업을 고속으로 처리할 수 있는 강력한 기능을 제공합니다. 이 글에서는 20kHz PWM 주파수와 50% 듀티 사이클을 기준으로 설정 방법을 설명합니다.

TMS320F28377D 하프-브릿지 PWM 설정 코드

아래는 TMS320F28377D에서 ePWM1 모듈을 사용하여 하프-브릿지 PWM을 설정하는 C 언어 예제 코드입니다. 이 코드는 F28x_Project.h 헤더 파일을 사용하며, 비트필드를 활용하여 레지스터를 명확히 설정합니다. 각 설정은 상세한 주석으로 설명되어 코드 이해를 돕습니다.

#include "F28x_Project.h" // TMS320F28377D의 레지스터 정의와 초기화 함수를 포함하는 표준 헤더 파일

// 함수 원형 선언
void InitEPwm1(void); // ePWM1 모듈을 초기화하는 함수
void GpioSelect(void); // GPIO 핀을 PWM 출력으로 설정하는 함수

// 메인 함수: 시스템 초기화 및 PWM 설정 후 무한 루프 실행
void main(void)
{
    // 시스템 클럭, PLL, 워치독 타이머 등을 초기화
    // 이 함수는 F28x_Project.h에 정의되어 있으며, 150MHz 시스템 클럭 설정을 포함
    InitSysCtrl();

    // 전역 인터럽트를 비활성화하여 초기화 중 예기치 않은 인터럽트 방지
    DINT;

    // GPIO 핀 설정 (ePWM1A 및 ePWM1B 출력용)
    GpioSelect();

    // ePWM1 모듈을 하프-브릿지 PWM으로 설정
    InitEPwm1();

    // 전역 인터럽트 활성화
    EINT;

    // 실시간 모드 인터럽트 활성화 (디버깅 및 실시간 동작 지원)
    ERTM;

    // 무한 루프: 실제 애플리케이션에서는 제어 로직(예: 듀티 사이클 조정)을 추가 가능
    while(1)
    {
        // 여기에 추가적인 런타임 제어 코드 삽입 가능
    }
}

// GPIO 설정 함수: ePWM1A 및 ePWM1B 출력용 GPIO 핀 설정
void GpioSelect(void)
{
    // 보호된 레지스터 접근을 허용 (GPIO 및 주변장치 레지스터 수정 가능)
    EALLOW;

    // GPIO0을 ePWM1A로 설정 (하프-브릿지의 상단 MOSFET 제어)
    // GPAMUX1.bit.GPIO0 = 1: GPIO0을 ePWM1A 기능으로 멀티플렉싱
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;

    // GPIO1을 ePWM1B로 설정 (하프-브릿지의 하단 MOSFET 제어, 보완 출력)
    // GPAMUX1.bit.GPIO1 = 1: GPIO1을 ePWM1B 기능으로 멀티플렉싱
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;

    // 보호된 레지스터 접근 비활성화
    EDIS;
}

// ePWM1 초기화 함수: 하프-브릿지 PWM 신호 생성 및 데드밴드 설정
void InitEPwm1(void)
{
    // 보호된 레지스터 접근을 허용 (ePWM 레지스터 수정 가능)
    EALLOW;

    // ePWM1 모듈 클럭 활성화
    // PCLKCR2.bit.EPWM1 = 1: ePWM1 모듈에 시스템 클럭 공급
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;

    // 시간 기준 설정 (Time-Base): PWM 주기 및 타이밍 제어
    // TBCTL.bit.CTRMODE = TB_COUNT_UP_DOWN: 업-다운 카운트 모드 설정
    // 업-다운 모드는 대칭 PWM 신호를 생성하여 하프-브릿지에 적합
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP_DOWN;

    // TBCTL.bit.PHSEN = TB_DISABLE: 위상 동기화 비활성화
    // 하프-브릿지에서는 단일 모듈 사용 시 동기화 불필요
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;

    // TBCTL.bit.HSPCLKDIV = TB_DIV1: 고속 클럭 분주비 1 (분주 없음)
    // 시스템 클럭(150MHz)을 그대로 사용
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;

    // TBCTL.bit.CLKDIV = TB_DIV1: 클럭 분주비 1 (분주 없음)
    // 최종 시간 기준 클럭 = 150MHz
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    // TBPRD = 3750: PWM 주기 설정
    // 주기 = (TBPRD * 2) / 150MHz = 50us → 주파수 = 20kHz
    EPwm1Regs.TBPRD = 3750;

    // 비교 레지스터 설정: 듀티 사이클 제어
    // CMPA.bit.CMPA = 1875: ePWM1A의 듀티 사이클 50% 설정
    // CMPA = TBPRD / 2 → 50% 듀티 사이클 (상향/하향 카운트에서 대칭)
    EPwm1Regs.CMPA.bit.CMPA = 1875;

    // CMPB.bit.CMPB = 1875: ePWM1B의 듀티 사이클 50% 설정
    // ePWM1B는 ePWM1A의 보완 출력으로 사용
    EPwm1Regs.CMPB.bit.CMPB = 1875;

    // 액션-퀄리파이어 설정 (Action-Qualifier): PWM 신호의 출력 동작 정의
    // ePWM1A 설정
    // AQCTLA.bit.ZRO = AQ_SET: 카운터가 0일 때 ePWM1A를 고전위로 설정
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;

    // AQCTLA.bit.CAU = AQ_CLEAR: CMPA에서 상향 카운트 시 ePWM1A를 저전위로 설정
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

    // ePWM1B 설정 (보완 출력)
    // AQCTLB.bit.ZRO = AQ_CLEAR: 카운터가 0일 때 ePWM1B를 저전위로 설정
    EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR;

    // AQCTLB.bit.CBD = AQ_SET: CMPB에서 하향 카운트 시 ePWM1B를 고전위로 설정
    EPwm1Regs.AQCTLB.bit.CBD = AQ_SET;

    // 데드밴드 설정 (Dead-Band): 상단/하단 MOSFET의 동시 도통 방지
    // DBCTL.bit.OUT_MODE = DB_FULL_ENABLE: 데드밴드 모듈 완전 활성화
    // ePWM1A와 ePWM1B 모두에 데드밴드 적용
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;

    // DBCTL.bit.POLSEL = DB_ACTV_HIC: ePWM1A는 활성 고전위, ePWM1B는 보완 출력
    // ePWM1B는 ePWM1A의 반전된 신호로 동작
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;

    // DBRED = 150: 상승 에지 지연 설정
    // 150 클럭 * (1/150MHz) = 1us 데드밴드 (상단 MOSFET 턴-오프 지연)
    EPwm1Regs.DBRED = 150;

    // DBFED = 150: 하강 에지 지연 설정
    // 150 클럭 * (1/150MHz) = 1us 데드밴드 (하단 MOSFET 턴-오프 지연)
    EPwm1Regs.DBFED = 150;

    // DBCTL.bit.IN_MODE = DBA_ALL: 데드밴드 입력 소스로 ePWM1A 선택
    // ePWM1A를 기준으로 ePWM1B의 보완 출력 생성
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;

    // 동기화 출력 설정
    // TBCTL.bit.SYNCOSEL = TB_CTR_ZERO: 카운터가 0일 때 동기화 신호 출력
    // 다른 ePWM 모듈과 동기화가 필요한 경우 사용
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    // 보호된 레지스터 접근 비활성화
    EDIS;
}

코드 설명: 주요 구성 요소

1. 시스템 초기화

  • InitSysCtrl(): 시스템 클럭(150MHz), PLL, 워치독 타이머를 초기화합니다.
  • DINTEINT: 초기화 중 인터럽트를 비활성화하고, 완료 후 활성화합니다.

2. GPIO 설정

  • GPIO0과 GPIO1: 각각 ePWM1AePWM1B로 설정되어 하프-브릿지 회로의 상단 및 하단 MOSFET을 제어합니다.
  • EALLOWEDIS: 보호된 레지스터 접근을 제어합니다.

3. ePWM 모듈 설정

  • 시간 기준(Time-Base): 업-다운 카운트 모드로 설정하여 대칭 PWM 신호를 생성합니다. TBPRD = 3750은 20kHz 주파수를 설정합니다.
  • 비교 레지스터(CMPA, CMPB): 50% 듀티 사이클을 위해 CMPA = CMPB = 1875로 설정합니다.
  • 액션-퀄리파이어(AQ): ePWM1A와 ePWM1B를 보완 출력으로 설정하여 하프-브릿지 동작을 구현합니다.
  • 데드밴드(DB): 1us 지연(DBRED = DBFED = 150)을 추가하여 슈트-스루를 방지합니다.

설정의 주요 특징

  • 주파수: 20kHz (모터 제어 및 전력 변환에 적합).
  • 듀티 사이클: 50% (런타임에 CMPA 값을 변경하여 조정 가능).
  • 데드밴드: 1us (MOSFET 드라이버 사양에 따라 조정 가능).
  • 비트필드: 레지스터 설정을 명확히 하여 코드 가독성을 높임.

실제 구현 시 주의사항

  1. 하드웨어 확인: MOSFET 드라이버의 데이터시트를 확인하여 데드밴드 값(DBRED, DBFED)을 최적화하세요.
  2. Code Composer Studio(CCS): 이 코드는 TI의 CCS와 C2000Ware 환경에서 실행됩니다. F28x_Project.h가 프로젝트에 포함되어야 합니다.
  3. 동적 제어: 듀티 사이클을 변경하려면 EPwm1Regs.CMPA.bit.CMPA를 런타임에 수정하세요.
  4. 인터럽트 추가: 실시간 제어가 필요한 경우, ETSELETPS 레지스터를 설정하여 인터럽트를 활성화할 수 있습니다.

결론

이 문서는 TMS320F28377D를 사용한 하프-브릿지 PWM 설정을 위한 완전한 예제 코드를 제공하며, 상세한 주석과 함께 구현 방법을 설명합니다. 모터 제어, 인버터 설계, 또는 전력 전자 애플리케이션에 관심 있는 개발자라면 이 코드를 참고하여 효율적인 PWM 제어를 구현할 수 있습니다.

반응형