본문 바로가기
MCU/C2000

[TMS320F28377D] ePWM 사용법 : Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 17.
반응형

TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 모터 제어, 전력 변환, LED 조명과 같은 고속 PWM(펄스 폭 변조) 애플리케이션에 최적화되어 있습니다. ePWM(Enhanced Pulse Width Modulation) 모듈은 고해상도 PWM 신호 생성, 타이밍 제어, 트리거 생성 등 다양한 기능을 제공합니다. 이 글에서는 TMS320F28377D ePWM 모듈의 상세한 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 돕겠습니다.

1. TMS320F28377D ePWM 모듈 개요

TMS320F28377D는 최대 16개의 독립적인 ePWM 모듈(ePWM1~ePWM16)을 포함하며, 각 모듈은 고정밀 PWM 신호 생성을 지원합니다. 아래는 주요 사양입니다:

  • 클럭 소스: 시스템 클럭(SYSCLK, 최대 200MHz)
  • 해상도: 150ps (고해상도 PWM 모드, HRPWM)
  • 타이머: 16비트 타임-베이스(TB) 카운터
  • 카운터 모드:
    • 업 카운트(Up-Count)
    • 다운 카운트(Down-Count)
    • 업-다운 카운트(Up-Down-Count)
  • 출력: 각 모듈당 2개 출력(PWMA, PWMB)
  • 주요 기능:
    • PWM 듀티 및 주기 제어
    • 데드밴드(Deadband) 생성
    • 이벤트 트리거(SOCA, SOCB)로 ADC 트리거
    • 트립 존(Trip Zone)으로 보호 기능
    • 고해상도 PWM(HRPWM) 지원
  • 인터럽트: TBCTR(타이머 카운터) 이벤트, 트립 존, ADC 트리거 등
  • 동기화: 다중 ePWM 모듈 간 동기화 지원

2. ePWM Bitfield 설정 상세

TMS320F28377D의 ePWM 레지스터는 Bitfield 구조로 정의되어 있어, F2837xD_epwm.h 헤더 파일을 통해 접근합니다. Bitfield는 레지스터의 개별 비트를 명확히 설정하여 코드 가독성과 유지보수성을 높입니다. 주요 레지스터와 Bitfield는 다음과 같습니다:

2.1 TBCTL (타임-베이스 제어 레지스터)

  • bit.CTRMODE: 카운터 모드 (0: 업, 1: 다운, 2: 업-다운, 3: 정지)
  • bit.PHSEN: 위상 동기화 활성화 (1: 활성화)
  • bit.PRDLD: 주기 레지스터 로드 타이밍 (0: 즉시, 1: 제로 또는 동기화 시)
  • bit.SYNCOSEL: 동기화 출력 선택 (0: EPWMxSYNC, 1: TBCTR=0 등)
  • bit.CLKDIV: 클럭 분주비 (07, 1/11/128)

2.2 CMPCTL (비교 제어 레지스터)

  • bit.LOADAMODE: CMPA 로드 타이밍 (0: TBCTR=0, 1: TBCTR=PRD)
  • bit.LOADBMODE: CMPB 로드 타이밍
  • bit.SHDWAMODE: CMPA 섀도우 모드 (0: 섀도우, 1: 즉시)
  • bit.SHDWBMODE: CMPB 섀도우 모드

2.3 AQCTLx (액션 퀄리파이어 제어 레지스터, x=A/B)

  • bit.ZRO: TBCTR=0일 때 동작 (0: 무시, 1: Low, 2: High, 3: 토글)
  • bit.PRD: TBCTR=PRD일 때 동작
  • bit.CAU: TBCTR=CMPA(증가)일 때 동작
  • bit.CAD: TBCTR=CMPA(감소)일 때 동작

2.4 DBCTL (데드밴드 제어 레지스터)

  • bit.OUT_MODE: 출력 모드 (0: 비활성화, 3: 완전 활성화)
  • bit.POLSEL: 극성 선택 (0: Active High, 2: Active Low Complementary)
  • bit.IN_MODE: 입력 소스 (0: PWMA, 1: PWMB)

2.5 ETSEL (이벤트 트리거 선택 레지스터)

  • bit.SOCAEN: SOCA 활성화 (1: 활성화)
  • bit.SOCASEL: SOCA 트리거 조건 (0: TBCTR=0, 1: TBCTR=PRD 등)
  • bit.INTEN: 인터럽트 활성화 (1: 활성화)
  • bit.INTSEL: 인터럽트 조건

2.6 HRCTL (고해상도 PWM 제어 레지스터)

  • bit.HRPE: HRPWM 활성화 (1: 활성화)
  • bit.TBPHSHR: 위상 고해상도 조정
  • bit.CMPAHR: 비교 값 고해상도 조정

Bitfield 사용 이점:

  • 명확한 비트 단위 설정으로 실수 감소
  • 코드 가독성 및 유지보수성 향상
  • F2837xD_epwm.h에서 제공하는 구조체로 직관적 접근

3. ePWM 설정 절차

ePWM 모듈을 효과적으로 설정하려면 다음 단계를 따라야 합니다:

  1. 시스템 초기화:
    • InitSysCtrl()를 호출하여 시스템 클럭과 PLL을 초기화합니다.
    • 인터럽트를 비활성화하고 PIE(Peripheral Interrupt Expansion)를 초기화합니다 (DINT, InitPieCtrl, InitPieVectTable).
  2. ePWM 클럭 활성화:
    • CpuSysRegs.PCLKCR2.bit.EPWMx = 1을 설정하여 원하는 ePWM 모듈(x=1~16)의 클럭을 활성화합니다.
    • HRPWM 사용 시 CpuSysRegs.PCLKCR0.bit.HRPWM = 1을 추가로 설정합니다.
    • 보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용.
  3. 타임-베이스(TB) 설정:
    • TBCTL.bit.CTRMODE로 카운터 모드(업, 다운, 업-다운) 선택.
    • TBCTL.bit.CLKDIV와 TBCTL.bit.HSPCLKDIV로 클럭 분주비 설정.
    • TBPRD로 PWM 주기 설정 (TBPRD = SYSCLK/(PWM 주파수 * CLKDIV * HSPCLKDIV)).
  4. 비교(CMP) 설정:
    • CMPA.bit.CMPA 또는 CMPB.bit.CMPB로 듀티 사이클 설정.
    • CMPCTL.bit.LOADAMODE와 CMPCTL.bit.SHDWAMODE로 로드 타이밍과 섀도우 모드 설정.
  5. 액션 퀄리파이어(AQ) 설정:
    • AQCTLA 또는 AQCTLB에서 ZRO, PRD, CAU, CAD를 설정하여 PWM 출력 동작 정의.
    • 예: AQCTLA.bit.ZRO = AQ_SET, AQCTLA.bit.CAU = AQ_CLEAR로 High/Low 동작 설정.
  6. 데드밴드(DB) 설정 (필요 시):
    • DBCTL.bit.OUT_MODE로 데드밴드 활성화.
    • DBRED와 DBFED로 상승/하강 에지 지연 시간 설정.
    • DBCTL.bit.POLSEL로 출력 극성 설정.
  7. 이벤트 트리거(ET) 설정 (필요 시):
    • ETSEL.bit.SOCAEN과 ETSEL.bit.SOCASEL로 ADC 트리거(SOCA) 설정.
    • ETPS.bit.SOCAPRD로 트리거 주기 설정.
    • 인터럽트 사용 시 ETSEL.bit.INTEN과 ETSEL.bit.INTSEL 설정.
  8. HRPWM 설정 (필요 시):
    • HRCNFG.bit.HRLOAD와 HRCNFG.bit.EDGMODE로 HRPWM 동작 설정.
    • CMPA.bit.CMPAHR로 고해상도 듀티 조정.
  9. 모듈 실행:
    • TBCTL.bit.FREE_SOFT = 2로 Free Run 모드 활성화하여 PWM 출력 시작.

4. ePWM 설정 고려사항

  • 클럭 설정: SYSCLK(200MHz)에서 TBCLK 분주 설정 (예: CLKDIV=0, HSPCLKDIV=1 → TBCLK=100MHz)
  • 주기 및 듀티: TBPRD 및 CMPA/B 값으로 주기와 듀티 설정 (TBPRD = SYSCLK/(PWM 주파수 * CLKDIV))
  • 데드밴드: 모터 제어 시 스위칭 노이즈 방지 (예: 1us 데드타임)
  • 동기화: 다중 ePWM 모듈 간 위상 조정을 위해 SYNCO 사용
  • HRPWM: 150ps 해상도 활용 시 HRCTL 설정 필요
  • 트립 존: 과전류/과전압 보호를 위해 TZSEL 설정

5. 실용적인 ePWM 예제 코드 (Bitfield 구조)

아래는 TMS320F28377D ePWM 모듈을 Bitfield 구조로 설정한 7개의 실용적인 예제 코드입니다. 각 예제는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.

5.1 예제 1: 기본 PWM 생성 (업 카운트)

// File: epwm_basic_upcount.c
// Description: TMS320F28377D ePWM 기본 PWM(100kHz, 50% 듀티) 생성 예제 (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.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

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

    // ePWM1 설정 (Bitfield 사용)
    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% 듀티 (CMPA = TBPRD/2)
    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 모드

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

설명:

  • 기능: ePWM1의 PWM_A 출력으로 100kHz, 50% 듀티 사이클 PWM 신호 생성.
  • 설정: Up 카운터, 주기 2000(100kHz @ 200MHz), CMPA=1000(50% 듀티).
  • GPIO: GPIO0(ePWM1A), GPIO31(LED).
  • 출력: GPIO0(ePWM1A)에 PWM 신호 출력, 정상 동작 시 LED ON.

5.2 예제 2: 데드밴드 PWM (모터 제어용)

// File: epwm_deadband.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.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

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

    // ePWM1 설정 (Bitfield 사용)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP_DOWN; // 업-다운 카운트 모드
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 클럭 분주비 1/1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 고속 클럭 분주비 1/1 (TBCLK = 200MHz)
    EPwm1Regs.TBPRD = 1000; // 주기 = 2000 TBCLK (100kHz = 200MHz/(2*1000))
    EPwm1Regs.CMPA.bit.CMPA = 500; // 50% 듀티
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // TBCTR=CMPA(증가)일 때 High
    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // TBCTR=CMPA(감소)일 때 Low

    // 데드밴드 설정
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 데드밴드 완전 활성화
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active High Complementary
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // PWMA가 입력 소스
    EPwm1Regs.DBRED.bit.DBRED = 200; // 상승 에지 지연 (1us = 200 TBCLK)
    EPwm1Regs.DBFED.bit.DBFED = 200; // 하강 에지 지연 (1us = 200 TBCLK)

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

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

설명:

  • 기능: ePWM1의 PWM_A, PWM_B 출력으로 100kHz, 50% 듀티 사이클 상보 PWM 신호 생성, 1us 데드밴드 포함.
  • 설정: Up-Down 카운터, 주기 1000(100kHz @ 200MHz), CMPA=500(50% 듀티), 데드밴드 200 TBCLK.
  • GPIO: GPIO0(ePWM1A), GPIO1(ePWM1B), GPIO31(LED).
  • 출력: GPIO0, GPIO1에 상보 PWM 신호 출력, 정상 동작 시 LED ON.

5.3 예제 3: ADC 트리거를 위한 SOCA 생성

// File: epwm_adc_trigger.c
// Description: TMS320F28377D ePWM ADC 트리거(SOCA) 예제 (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.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

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

    // ePWM1 설정 (Bitfield 사용)
    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일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low

    // SOCA 설정 (ADC 트리거)
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; // SOCA 활성화
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // TBCTR=0일 때 SOCA 발생
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 첫 번째 이벤트에서 SOCA 발생

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

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

설명:

  • 기능: ePWM1의 PWM_A 출력으로 100kHz, 50% 듀티 사이클 PWM 신호 생성 및 SOCA 트리거로 ADC 동기화.
  • 설정: Up 카운터, 주기 2000(100kHz @ 200MHz), CMPA=1000(50% 듀티), SOCA 트리거 활성화.
  • GPIO: GPIO0(ePWM1A), GPIO31(LED).
  • 출력: GPIO0(ePWM1A)에 PWM 신호 출력, SOCA 트리거 발생, 정상 동작 시 LED ON.

5.4 예제 4: HRPWM (고해상도 PWM)

// File: epwm_hrpwm.c
// Description: TMS320F28377D ePWM HRPWM 예제 (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.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

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

    // ePWM1 설정 (Bitfield 사용)
    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일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low

    // HRPWM 설정
    EPwm1Regs.HRCNFG.bit.HRLOAD = 0; // CMPAHR 로드 타이밍 (TBCTR=0)
    EPwm1Regs.HRCNFG.bit.CTLMODE = 0; // CMPAHR 제어 모드
    EPwm1Regs.HRCNFG.bit.EDGMODE = 2; // 상승/하강 에지 모두 HRPWM
    EPwm1Regs.CMPA.bit.CMPAHR = 0x0100; // 고해상도 조정 (8비트, 약 1.5ns)

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

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

설명:

  • 기능: ePWM1의 PWM_A 출력으로 100kHz, 50% 듀티 사이클 PWM 신호 생성, HRPWM으로 고해상도 조정.
  • 설정: Up 카운터, 주기 2000(100kHz @ 200MHz), CMPA=1000(50% 듀티), CMPAHR=0x0100(1.5ns 조정).
  • GPIO: GPIO0(ePWM1A), GPIO31(LED).
  • 출력: GPIO0(ePWM1A)에 고해상도 PWM 신호 출력, 정상 동작 시 LED ON.

5.5 예제 5: 트립 존(Trip Zone) 보호 기능

// File: epwm_trip_zone.c
// Description: TMS320F28377D ePWM 트립 존 보호 예제 (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.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO2를 입력(Trip Zone 입력)으로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 0; // GPIO2 입력 설정
    EDIS;

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

    // ePWM1 설정 (Bitfield 사용)
    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일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low

    // 트립 존 설정
    EPwm1Regs.TZSEL.bit.CBC1 = 1; // TZ1 (GPIO2)에서 Cycle-by-Cycle 트립 활성화
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // TZ 이벤트 발생 시 PWM_A를 Low로 강제
    EPwm1Regs.TZEINT.bit.CBC = 1; // Cycle-by-Cycle 인터럽트 활성화

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

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

설명:

  • 기능: ePWM1의 PWM_A 출력으로 100kHz, 50% 듀티 사이클 PWM 신호 생성, GPIO2(TZ1)에서 트립 존 이벤트 발생 시 출력 차단.
  • 설정: Up 카운터, 주기 2000(100kHz @ 200MHz), CMPA=1000(50% 듀티), TZ1 Cycle-by-Cycle 트립 활성화.
  • GPIO: GPIO0(ePWM1A), GPIO2(TZ1 입력), GPIO31(LED).
  • 출력: GPIO0(ePWM1A)에 PWM 신호 출력, 트립 이벤트 발생 시 출력 Low, 정상 동작 시 LED ON.

5.6 예제 6: 다중 ePWM 동기화

// File: epwm_synchronization.c
// Description: TMS320F28377D ePWM 다중 모듈 동기화 예제 (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.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

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

    // ePWM1 설정 (Master, Bitfield 사용)
    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일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_OUT; // 동기화 신호 출력

    // ePWM2 설정 (Slave, Bitfield 사용)
    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)
    EPwm2Regs.CMPA.bit.CMPA = 1000; // 50% 듀티
    EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 위상 동기화 활성화
    EPwm2Regs.TBPHS.bit.TBPHS = 500; // 위상 지연 (25% 위상 차이)

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드
    EPwm2Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

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

설명:

  • 기능: ePWM1, ePWM2의 PWM_A 출력으로 100kHz, 50% 듀티 사이클 PWM 신호 생성, ePWM2는 ePWM1에 동기화 및 25% 위상 차이.
  • 설정: Up 카운터, 주기 2000(100kHz @ 200MHz), CMPA=1000(50% 듀티), ePWM2 위상 지연 500.
  • GPIO: GPIO0(ePWM1A), GPIO2(ePWM2A), GPIO31(LED).
  • 출력: GPIO0, GPIO2에 동기화된 PWM 신호 출력, 정상 동작 시 LED ON.

5.7 예제 7: PWM 인터럽트 기반 듀티 제어

// File: epwm_interrupt_duty.c
// Description: TMS320F28377D ePWM 인터럽트 기반 듀티 제어 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

volatile Uint16 duty = 1000; // 초기 듀티 50%

__interrupt void epwm1_isr(void)
{
    // 듀티 사이클 변경 (예: 25% ~ 75% 사이클)
    duty = (duty == 1000) ? 500 : 1500; // 25% 또는 75% 듀티
    EPwm1Regs.CMPA.bit.CMPA = duty;

    // 인터럽트 플래그 클리어
    EPwm1Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

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

    // 인터럽트 벡터 설정
    EALLOW;
    PieVectTable.EPWM1_INT = &epwm1_isr; // ePWM1 인터럽트 벡터 설정
    EDIS;

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0을 ePWM1A로 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

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

    // ePWM1 설정 (Bitfield 사용)
    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 = duty; // 초기 50% 듀티
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR=0일 때 High
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // TBCTR=CMPA일 때 Low

    // 인터럽트 설정
    EPwm1Regs.ETSEL.bit.INTEN = 1; // 인터럽트 활성화
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // TBCTR=0일 때 인터럽트 발생
    EPwm1Regs.ETPS.bit.INTPRD = 1; // 첫 번째 이벤트에서 인터럽트 발생
    EPwm1Regs.ETCLR.bit.INT = 1; // 인터럽트 플래그 클리어
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1; // PIE 그룹 3, ePWM1 인터럽트 활성화
    IER |= M_INT3; // CPU 인터럽트 3 활성화

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

    EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; // Free run 모드

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

설명:

  • 기능: ePWM1의 PWM_A 출력으로 100kHz PWM 신호 생성, 인터럽트를 통해 듀티 사이클 25%와 75% 간 전환.
  • 설정: Up 카운터, 주기 2000(100kHz @ 200MHz), CMPA=500/1500(25%/75% 듀티), 인터럽트 활성화.
  • GPIO: GPIO0(ePWM1A), GPIO31(LED).
  • 출력: GPIO0(ePWM1A)에 PWM 신호 출력, 듀티 사이클 동적 변경, 정상 동작 시 LED ON.

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 출력: ePWM1A, ePWM1B 핀에 오실로스코프 또는 부하 연결
  • 데드밴드: H-브리지 회로 사용 시 적절한 데드타임 확인
  • HRPWM: 고해상도 측정을 위해 고정밀 오실로스코프 사용
  • LED: GPIO31에 LED 연결 (정상 동작 확인용)
  • 트립 존: GPIO2에 트립 신호 입력 연결 (예: 과전류 센서)

6.4 디버깅

  • CCS의 Expressions 창에서 EPwm1Regs.TBCTR, EPwm1Regs.CMPA 확인
  • EPwm1Regs.ETFLG로 이벤트 트리거 상태 점검
  • 레지스터(EPwm1Regs.TBCTL, EPwm1Regs.AQCTLA) 모니터링
  • 트립 존 동작 확인 시 EPwm1Regs.TZFLG 점검

7. 추가 팁

  • 캘리브레이션: HRPWM 사용 시 Device_cal() 호출로 클럭 보정
  • 노이즈 감소: PWM 출력에 저역통과 필터 사용
  • C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\epwm
  • 문제 해결:
    • PWM 출력 없음: TBCTL.bit.CTRMODE, AQCTLA 설정 확인
    • ADC 트리거 실패: ETSEL.bit.SOCAEN, ETPS.bit.SOCAPRD 확인
    • 트립 존 실패: TZSEL, TZCTL 설정 확인
  • TI 리소스: TI E2E 포럼, C2000Ware 예제

8. 결론

이 문서는 TMS320F28377D ePWM 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여, 초보자부터 숙련된 개발자까지 쉽게 활용할 수 있도록 구성했습니다. 기본 PWM, 데드밴드, ADC 트리거, HRPWM, 트립 존, 다중 모듈 동기화, 인터럽트 기반 듀티 제어 예제를 통해 다양한 애플리케이션에 적용 가능합니다.

 

키워드: TMS320F28377D, ePWM, C2000, PWM, 마이크로컨트롤러, Code Composer Studio, ADC 트리거, 데드밴드, 상보 PWM, HRPWM, 트립 존, 동기화, 페이즈 시프트, Up-Down 카운터

반응형