소개: 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, 워치독 타이머를 초기화합니다.DINT
와EINT
: 초기화 중 인터럽트를 비활성화하고, 완료 후 활성화합니다.
2. GPIO 설정
- GPIO0과 GPIO1: 각각 ePWM1A와 ePWM1B로 설정되어 하프-브릿지 회로의 상단 및 하단 MOSFET을 제어합니다.
EALLOW
와EDIS
: 보호된 레지스터 접근을 제어합니다.
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 드라이버 사양에 따라 조정 가능).
- 비트필드: 레지스터 설정을 명확히 하여 코드 가독성을 높임.
실제 구현 시 주의사항
- 하드웨어 확인: MOSFET 드라이버의 데이터시트를 확인하여 데드밴드 값(
DBRED
,DBFED
)을 최적화하세요. - Code Composer Studio(CCS): 이 코드는 TI의 CCS와 C2000Ware 환경에서 실행됩니다.
F28x_Project.h
가 프로젝트에 포함되어야 합니다. - 동적 제어: 듀티 사이클을 변경하려면
EPwm1Regs.CMPA.bit.CMPA
를 런타임에 수정하세요. - 인터럽트 추가: 실시간 제어가 필요한 경우,
ETSEL
과ETPS
레지스터를 설정하여 인터럽트를 활성화할 수 있습니다.
결론
이 문서는 TMS320F28377D를 사용한 하프-브릿지 PWM 설정을 위한 완전한 예제 코드를 제공하며, 상세한 주석과 함께 구현 방법을 설명합니다. 모터 제어, 인버터 설계, 또는 전력 전자 애플리케이션에 관심 있는 개발자라면 이 코드를 참고하여 효율적인 PWM 제어를 구현할 수 있습니다.
'MCU > C2000' 카테고리의 다른 글
[TMS320F28377D] SCI 사용법: Bitfield 구조 활용 예제 코드 (0) | 2025.08.06 |
---|---|
[TMS320F28377D] ADC 트리거 모드 사용: Bitfield 구조 활용 (0) | 2025.08.06 |
[TMS320F28377D] ADC 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.06 |
[TMS320F28377D] CPU 타이머 사용법 :Bitfield 구조 활용 예제 코드 (0) | 2025.08.06 |
[TMS320F28377D] CCS 프로젝트 설정 및 기본 프로그램 (0) | 2025.08.06 |
[TMS320F28377D] GPIO 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.06 |
TMS320F28377D PWM 출력 설정: Bitfield 구조 활용 예제 코드 (0) | 2025.08.05 |
[TMS320F28388D] ELF 파일 구조 심층 분석 및 CCS 확인 방법 (0) | 2025.08.02 |