본문 바로가기
MCU/C2000

[TMS320F28335] LLC 공진 컨버터 설계 및 제어 코드 가이드

by linuxgo 2025. 8. 9.
반응형

소개 (Introduction)

LLC 공진 컨버터는 높은 효율, ZVS(영전압 스위칭), 넓은 부하 범위에서 안정적인 동작으로 전력 전자 분야에서 널리 사용됩니다. 이 가이드는 LLC 공진 컨버터 설계와 TMS320F28335 기반 제어 코드를 단계별로 설명하며, 소프트 스타트와 과열 보호 기능을 포함합니다. 시스템 사양: 150 MHz 클럭, 100 kHz 공진 주파수(\( L_r = 20 \mu H \), \( Cr = 126 nF \)), 12V 출력, 200 ns 데드타임.
(The LLC resonant converter is widely used in power electronics for its high efficiency, Zero Voltage Switching (ZVS), and stable operation across a wide load range. This guide explains the LLC converter design and TMS320F28335-based control code step-by-step, including soft start and overheat protection. System specs: 150 MHz clock, 100 kHz resonant frequency (\( L_r = 20 \mu H \), \( Cr = 126 nF \)), 12V output, 200 ns dead-time.)

LLC 공진 컨버터 설계 절차 (LLC Converter Design Steps)

설계 요구 사항 (Design Requirements)

  • 입력 전압: 300V ~ 400V DC (정류 후). (Input Voltage: 300V to 400V DC, post-rectification.)
  • 출력 전압: 12V, 240W (20A). (Output Voltage: 12V, 240W (20A).)
  • 스위칭 주파수: 공진 주파수 100 kHz, 범위 50 kHz ~ 150 kHz. (Switching Frequency: Resonant frequency 100 kHz, range 50 kHz to 150 kHz.)
  • 효율 목표: 95% 이상, ZVS 유지. (Efficiency Goal: >95% with ZVS.)
  • 보호 기능: 과전류, 과전압, 과열, 단락. (Protections: Overcurrent, overvoltage, overheat, short-circuit.)
  • 제어 목표: 전압 안정화 (±5%), 빠른 응답, 소프트 스타트. (Control: Voltage regulation (±5%), fast transient response, soft start.)

공진 탱크 설계 (Resonant Tank Design)

공진 탱크는 \( L_r \), \( Cr \), \( L_m \)으로 구성됩니다. 공진 주파수는 아래 수식으로 계산:
(The resonant tank consists of \( L_r \), \( Cr \), and \( L_m \). Resonant frequency is calculated as:)
\[ f_r = \frac{1}{2\pi \sqrt{L_r \cdot Cr}} \] \( L_r = 20 \mu H \), \( Cr = 126 nF \)일 때: \( f_r \approx 100 \, \text{kHz} \).
마그네틱 인덕턴스 \( L_m \)은 \( L_r \)의 5~10배 (예: \( L_m = 100 \mu H \)). 전압 이득:
(For \( L_r = 20 \mu H \), \( Cr = 126 nF \): \( f_r \approx 100 \, \text{kHz} \). Magnetizing inductance \( L_m \) is 5–10 times \( L_r \), e.g., \( L_m = 100 \mu H \). Voltage gain:)
\[ M = \frac{V_{out} \cdot N_s}{V_{in} \cdot N_p} \] 변압기 턴 비율: \( N_p:N_s = 20:1 \). MATLAB/Simulink로 검증.
(Transformer turns ratio: \( N_p:N_s = 20:1 \). Validate with MATLAB/Simulink.)

스위치 및 드라이버 선택 (Switch and Driver Selection)

600V MOSFET(예: Infineon IPW60R099C6)과 고전류 게이트 드라이버(예: TI UCC27714) 사용. 데드타임 200 ns로 ZVS 보장.
(Use 600V MOSFETs (e.g., Infineon IPW60R099C6) and high-current gate driver (e.g., TI UCC27714). Set 200 ns dead-time for ZVS.)

변압기 설계 (Transformer Design)

턴 비율 \( N_p:N_s = 20:1 \), 페라이트 코어(예: ETD39, PC40), 리츠 와이어 사용.
(Turns ratio \( N_p:N_s = 20:1 \), ferrite core (e.g., ETD39, PC40), Litz wire.)

출력 정류 및 필터링 (Output Rectification and Filtering)

동기 정류 MOSFET 또는 쇼트키 다이오드(예: Vishay V30100S), 출력 커패시터 \( C_{out} = 1000 \mu F \), 리플 전압 \( \Delta V_{out} < 1\% \).
(Synchronous rectification MOSFETs or Schottky diodes (e.g., Vishay V30100S), output capacitor \( C_{out} = 1000 \mu F \), ripple voltage \( \Delta V_{out} < 1\% \).)

제어 시스템 설계 (Control System Design)

TMS320F28335(150 MHz)로 ePWM, ADC, HRPWM을 활용한 가변 주파수 제어(50~150 kHz) 구현.
(Implement variable frequency control (50–150 kHz) using TMS320F28335 (150 MHz) with ePWM, ADC, HRPWM.)

제어 코드 구현 (Control Code Implementation)

아래 코드는 소프트 스타트, 과열 보호, 가변 주파수 제어를 포함한 LLC 제어 코드입니다. ePWM1, ADC, 트립 존 사용.
(The code below implements LLC control with soft start, overheat protection, and variable frequency control using ePWM1, ADC, and trip zones.)


#include "F28x_Project.h"

// 매크로 정의 (Macro Definitions)
#define LEVEL_5
#define ENABLE_SOFT_START        // 소프트 스타트 활성화 (Enable soft start)
#define ENABLE_OVERHEAT_PROTECTION // 과열 보호 활성화 (Enable overheat protection)

// 함수 프로토타입 (Function Prototypes)
void InitEPwm1(void); // LLC 제어용 ePWM1 초기화 (Initialize ePWM1 for LLC control)
void InitAdc(void);   // 피드백용 ADC 초기화 (Initialize ADC for feedback)
void InitTripZone(void); // 보호용 트립 존 초기화 (Initialize Trip Zone for protection)
interrupt void adc_isr(void); // PI 제어용 ADC 인터럽트 (ADC interrupt for PI control)
interrupt void epwm1_isr(void); // 소프트 스타트용 ePWM 인터럽트 (ePWM interrupt for soft start)

// 전역 변수 (Global Variables)
float Vref = 12.0;        // 목표 출력 전압, V (Target output voltage, V)
float Vout = 0.0;         // 측정 출력 전압 (Measured output voltage)
float Iout = 0.0;         // 측정 출력 전류 (Measured output current)
float Kp = 10.0;          // PI 비례 게인 (PI proportional gain)
float Ki = 0.1;           // PI 적분 게인 (PI integral gain)
float error = 0.0;        // 전압 오차 (Voltage error)
float integral = 0.0;     // PI 적분 항 (Integral term for PI control)
float freq = 50000.0;     // 초기 주파수 50 kHz (Initial frequency 50 kHz)
Uint16 TBPRD_min = 499;   // 150 kHz용 TBPRD (TBPRD for 150 kHz)
Uint16 TBPRD_max = 1499;  // 50 kHz용 TBPRD (TBPRD for 50 kHz)
Uint16 fault_flag = 0;    // 트립 존 오류 플래그 (Fault flag for trip zone)
Uint16 soft_start_complete = 0; // 소프트 스타트 완료 플래그 (Soft start completion flag)
float temp = 0.0;         // 측정 온도, °C (Measured temperature, °C)
float temp_max = 100.0;   // 최대 허용 온도 (Maximum allowable temperature)

// 메인 함수 (Main Function)
void main(void)
{
    InitSysCtrl(); // 시스템 초기화 (Initialize system)
    DINT; // 인터럽트 비활성화 (Disable interrupts)
    InitPieCtrl(); // PIE 제어 초기화 (Initialize PIE control)
    IER = 0x0000; IFR = 0x0000; // 인터럽트 플래그 초기화 (Clear interrupt flags)
    InitPieVectTable(); // PIE 벡터 테이블 초기화 (Initialize PIE vector table)

    EALLOW;
    PieVectTable.ADCINT1 = &adc_isr; // ADC 인터럽트 매핑 (Map ADC interrupt)
    PieVectTable.EPWM1_INT = &epwm1_isr; // ePWM 인터럽트 매핑 (Map ePWM interrupt)
    EDIS;

    InitEPwm1(); // ePWM 초기화 (Initialize ePWM)
    InitAdc(); // ADC 초기화 (Initialize ADC)
    InitTripZone(); // 트립 존 초기화 (Initialize Trip Zone)

    PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // ADCINT1 활성화 (Enable ADCINT1)
    IER |= M_INT1; // INT1 그룹 활성화 (Enable INT1 group)
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1; // EPWM1_INT 활성화 (Enable EPWM1_INT)
    IER |= M_INT3; // INT3 그룹 활성화 (Enable INT3 group)
    EINT; ERTM; // 글로벌 인터럽트 및 실시간 모드 활성화 (Enable global interrupts and real-time mode)

    while(1) {
        if (fault_flag) {
            EALLOW;
            EPwm1Regs.TZCLR.bit.OST = 1; // 트립 지우기 (Clear trip)
            fault_flag = 0;
            EDIS;
        }
    }
}

// ePWM1 초기화 (ePWM1 Initialization)
void InitEPwm1(void)
{
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // ePWM1A 설정 (Configure ePWM1A)
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // ePWM1B 설정 (Configure ePWM1B)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 대칭 PWM (Symmetrical PWM)
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 위상 비활성화 (Disable phase)
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 섀도우 모드 (Shadow mode)
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 카운터 0 동기화 (Sync at counter zero)
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 클럭 분주 1 (Clock divider 1)
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 클럭 분주 1 (Clock divider 1)
    EPwm1Regs.TBPRD = 1499; // 50 kHz 주기 (50 kHz period)
    EPwm1Regs.TBPHS.bit.TBPHS = 0; // 위상 0 (Phase 0)
    EPwm1Regs.TBCTR = 0; // 카운터 초기화 (Clear counter)
    EPwm1Regs.CMPA.bit.CMPA = 750; // 50% 듀티 (50% duty cycle)
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // 카운터 0에서 설정 (Set at counter zero)
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // CMPA 업에서 지우기 (Clear on CMPA up)
    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // CMPA 다운에서 지우기 (Clear on CMPA down)
    EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // 카운터 0에서 설정 (Set at counter zero)
    EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // CMPB 업에서 지우기 (Clear on CMPB up)
    EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; // CMPB 다운에서 지우기 (Clear on CMPB down)
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 데드밴드 활성화 (Enable dead-band)
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 상보 출력 (Complementary output)
    EPwm1Regs.DBRED.bit.DBRED = 30; // 상승 에지 지연 (Rising edge delay)
    EPwm1Regs.DBFED.bit.DBFED = 30; // 하강 에지 지연 (Falling edge delay)
    EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; // HRPWM 로드 (HRPWM load)
    EPwm1Regs.HRCNFG.bit.CTLMODE = HR_BEP; // 양쪽 에지 제어 (Both edges control)
    EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP; // 양쪽 에지 향상 (Both edges enhanced)
    EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; // 자동 변환 (Auto-conversion)
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; // SOCA 활성화 (Enable SOCA)
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // 카운터 0 트리거 (Trigger at counter zero)
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 매 주기 SOC (SOC every period)
    EPwm1Regs.ETSEL.bit.INTEN = 1; // 인터럽트 활성화 (Enable interrupt)
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 카운터 0 인터럽트 (Interrupt at counter zero)
    EPwm1Regs.ETPS.bit.INTPRD = 1500; // 10ms 인터럽트 (10ms interrupt)
    EDIS;
}

// ADC 초기화 (ADC Initialization)
void InitAdc(void)
{
    EALLOW;
    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // 변환 종료 인터럽트 (Interrupt at conversion end)
    AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // ADC 활성화 (Enable ADC)
    AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 밴드갭 전원 (Power band-gap)
    AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // ADC 전원 (Power ADC)
    AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // ADCINA0 선택 (Select ADCINA0)
    AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // 획득 창 7 사이클 (Acquisition window 7 cycles)
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // ePWM1 트리거 (ePWM1 trigger)
    AdcRegs.ADCSOC1CTL.bit.CHSEL = 1; // ADCINA1 선택 (Select ADCINA1)
    AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; // 획득 창 7 사이클 (Acquisition window 7 cycles)
    AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // ePWM1 트리거 (ePWM1 trigger)
    AdcRegs.ADCSOC2CTL.bit.CHSEL = 2; // ADCINA2 선택 (Select ADCINA2)
    AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; // 획득 창 7 사이클 (Acquisition window 7 cycles)
    AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5; // ePWM1 트리거 (ePWM1 trigger)
    AdcRegs.INTSEL1N2.bit.INT1SEL = 0; // SOC0 트리거 ADCINT1 (SOC0 triggers ADCINT1)
    AdcRegs.INTSEL1N2.bit.INT1E = 1; // ADCINT1 활성화 (Enable ADCINT1)
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0; // ADCINA0 (전압, voltage)
    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; // ADCINA1 (전류, current)
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0; // ADCINA2 (온도, temperature)
    EDIS;
    DELAY_US(1000); // ADC 전원 대기 (ADC power-up delay)
}

// 트립 존 초기화 (Trip Zone Initialization)
void InitTripZone(void)
{
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 3; // TZ1 설정 (Configure TZ1)
    EPwm1Regs.TZSEL.bit.OSHT1 = 1; // TZ1 트립 활성화 (Enable TZ1 trip)
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // ePWM1A 로우 (Force ePWM1A low)
    EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // ePWM1B 로우 (Force ePWM1B low)
    EPwm1Regs.TZEINT.bit.OST = 1; // 원샷 인터럽트 (Enable one-shot interrupt)
    EDIS;
}

// 소프트 스타트 인터럽트 (Soft Start Interrupt)
interrupt void epwm1_isr(void)
{
    if (freq < 100000.0 && !soft_start_complete) {
        freq += 1000.0; // 1000 Hz 증가 (Increment 1000 Hz)
        if (freq >= 100000.0) {
            freq = 100000.0;
            soft_start_complete = 1; // 소프트 스타트 완료 (Soft start complete)
        }
        Uint16 TBPRD_new = (Uint16)(150e6 / (2 * freq * 1 * 1)) - 1;
        if (TBPRD_new < TBPRD_min) TBPRD_new = TBPRD_min;
        if (TBPRD_new > TBPRD_max) TBPRD_new = TBPRD_max;
        EPwm1Regs.TBPRD = TBPRD_new; // 주기 업데이트 (Update period)
        EPwm1Regs.CMPA.bit.CMPA = TBPRD_new / 2; // 50% 듀티 (50% duty cycle)
    }
    EPwm1Regs.ETCLR.bit.INT = 1; // 인터럽트 플래그 지우기 (Clear interrupt flag)
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

// ADC 인터럽트 (ADC Interrupt)
interrupt void adc_isr(void)
{
    Vout = AdcResult.ADCRESULT0 * (3.3 / 4096) * (12.0 / 3.3); // 전압 (Voltage)
    Iout = AdcResult.ADCRESULT1 * (3.3 / 4096) * (10.0 / 3.3); // 전류 (Current)
    temp = AdcResult.ADCRESULT2 * (3.3 / 4096) * (150.0 / 3.3); // 온도 (Temperature)
    if (temp > temp_max) {
        EALLOW;
        EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 트립 트리거 (Trigger trip)
        fault_flag = 1;
        EDIS;
    }
    if (soft_start_complete) {
        error = Vref - Vout; // 오차 계산 (Calculate error)
        integral += error; // 적분 항 (Integral term)
        if (integral > 1000.0) integral = 1000.0; // 안티-와인드업 (Anti-windup)
        if (integral < -1000.0) integral = -1000.0;
        freq = freq + Kp * error + Ki * integral;
        if (freq < 50000.0) freq = 50000.0; // 50 kHz 제한 (Limit to 50 kHz)
        if (freq > 150000.0) freq = 150000.0; // 150 kHz 제한 (Limit to 150 kHz)
        Uint16 TBPRD_new = (Uint16)(150e6 / (2 * freq * 1 * 1)) - 1;
        if (TBPRD_new < TBPRD_min) TBPRD_new = TBPRD_min;
        if (TBPRD_new > TBPRD_max) TBPRD_new = TBPRD_max;
        EPwm1Regs.TBPRD = TBPRD_new; // 주기 업데이트 (Update period)
        EPwm1Regs.CMPA.bit.CMPA = TBPRD_new / 2; // 50% 듀티 (50% duty cycle)
    }
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 인터럽트 플래그 지우기 (Clear interrupt flag)
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
            

시뮬레이션 및 테스트 (Simulation and Testing)

MATLAB/Simulink 또는 LTspice로 공진 탱크 시뮬레이션, 오실로스코프로 PWM과 ZVS 확인, 전력 분석기로 효율(>95%) 측정.
(Simulate resonant tank with MATLAB/Simulink or LTspice, verify PWM and ZVS with oscilloscope, measure efficiency (>95%) with power analyzer.)

최적화 및 튜닝 (Optimization and Tuning)

PI 게인(\( K_p = 10.0 \), \( K_i = 0.1 \)) 튜닝, 데드타임(150~300 ns) 최적화.
(Tune PI gains (\( K_p = 10.0 \), \( K_i = 0.1 \)), optimize dead-time (150–300 ns).)

문서화 및 양산 (Documentation and Production)

설계 사양, 테스트 결과, 코드 설정 문서화, EMI/EMC 테스트 수행.
(Document design specs, test results, code settings, perform EMI/EMC testing.)

검증 절차 (Verification Steps)

검증 단계별 가이드 (Step-by-Step Verification)

  1. 레벨 1: ePWM 설정50 kHz, 50% 듀티, 200 ns 데드타임 확인. (Verify 50 kHz, 50% duty, 200 ns dead-time.)
    매크로: #define LEVEL_1
  2. 레벨 2: ADC 설정\( V_{out} \), \( I_{out} \), \( temp \) 모니터링. (Monitor \( V_{out} \), \( I_{out} \), \( temp \).)
    매크로: #define LEVEL_2
  3. 레벨 3: 가변 주파수소프트 스타트(50~100 kHz), ZVS 확인. (Verify soft start (50~100 kHz), ZVS.)
    매크로: #define LEVEL_3, #define ENABLE_SOFT_START
  4. 레벨 4: 트립 존PWM 차단 및 복구 확인. (Verify PWM shutdown and recovery.)
    매크로: #define LEVEL_4
  5. 레벨 5: 전체 통합12V 출력, 소프트 스타트, 과열 보호(\( temp > 100^\circ \text{C} \)) 확인. (Verify 12V output, soft start, overheat protection (\( temp > 100^\circ \text{C} \)).)
    매크로: #define LEVEL_5, #define ENABLE_SOFT_START, #define ENABLE_OVERHEAT_PROTECTION

실무 팁 (Practical Tips)

효율적인 설계 및 구현 팁 (Design and Implementation Tips)

  • 공진 탱크: 부하 조건에 따라 \( L_r \), \( Cr \), \( L_m \) 조정. (Adjust \( L_r \), \( Cr \), \( L_m \) based on load.)
  • 과부하 보호: Iout > 10A 체크 추가. (Add Iout > 10A check.)
  • 모니터링: UART로 실시간 데이터 출력. (Output real-time data via UART.)
  • 효율성: 동적 데드타임: DBRED = 20 + (Iout * 2);. (Dynamic dead-time: DBRED = 20 + (Iout * 2);.)

결론 (Conclusion)

이 가이드는 LLC 공진 컨버터 설계와 TMS320F28335 제어 코드를 단계별로 제공합니다. 소프트 스타트와 과열 보호를 포함한 코드는 실무 적용에 최적화되었습니다. 
(This guide provides a step-by-step LLC resonant converter design and TMS320F28335 control code, optimized for practical use with soft start and overheat protection. )

주의: 이 문서와 코드는 설계 참고용입니다. 실무 적용 시 하드웨어, 부하 조건, 안전 규정을 고려하여 철저히 검증하고 조정해야 합니다.
(Caution: This document and code are for reference only. For practical applications, validate and adjust thoroughly based on hardware, load conditions, and safety regulations.)

반응형