This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/LAUNCHXL-F28069M: Unwanted phase-shift operation on a variable frequency and constant duty cycle resonant converter

Part Number: LAUNCHXL-F28069M

Tool/software: Code Composer Studio

Hi,

I’m implementing a full-bridge resonant converter controlled via variable frequency and constant duty cycle. ePWM4 and ePWM5 operate in complementary mode. ePWM4A and ePWM5A control the high switches. The frequency can vary from 50 kHz to 100kHz.

The controller algorithm runs inside ePWM4 interrupt. There’s also HMI code which is dealt with inside timer1 interrupt every 1ms.

I realized that, depending on how long the code within the timer1 interrupt takes to execute, e.g. 3 us, phase shift start to happen between ePWM4A and ePWM5A, which is not desired.

Could you help me finding out what causes this problem and how could it be avoid?

I'm sending a simplified version of the code showing the ePWMs configurations.

Regards,

Schneider

simp_code.txt
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
asm(" EALLOW");
// PCLKCR1.bit.EPWMxENCLK = 1: The ePWMx module is clocked by the system clock
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
asm(" EDIS");
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetric
EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled
EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW; // TBPRD register is loaded when TBCTR = 0
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // Disable PWM output synchronization signal
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA register is not loaded until LOADAMODE event occurs
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB register is not loaded until LOADBMODE event occurs
EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero
EPwm4Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWMxA is the source for both falling-edge and rising-edge delay
EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // Dead-band is fully enabled for both rising-edge delay on output EPWMxA and falling-edge delay on output EPWMxB
EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active high complementary (AHC). EPWMxB is inverted
EPwm4Regs.DBFED = EPwm4Regs.DBRED = RESONANT_DBRED_DBFED; // Load the dead band register
EPwm4Regs.ETPS.bit.INTPRD = 1; // Generate an EPWM4_INT interrupt every time one event occurs
EPwm4Regs.ETSEL.bit.INTSEL = 2; // Enable event TBCTR = TBPRD
EPwm4Regs.TBPRD = RESONANT_MIN_TBPRD;
EPwm4Regs.CMPA.half.CMPA = RESONANT_MIN_TBPRD;
EPwm4Regs.TBPHS.half.TBPHS = 0x0000; // Set timer phase
EPwm4Regs.TBCTR = 0; // clear TB counter
// ePWM5:
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetric
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled
EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW; // TBPRD register is loaded when TBCTR = 0
EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // Disable PWM output synchronization signal
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA register is not loaded until LOADAMODE event occurs
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB register is not loaded until LOADBMODE event occurs
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = ZERO
EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = ZERO
// EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Inverted in relation to EPwm4 - Full-bridge inverter implementation
// EPwm5Regs.AQCTLA.bit.CAD = AQ_SET;
// TODO Using same configuration as ePWM4 for the synchronization test
EPwm5Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm5Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWMxA is the source for both falling-edge and rising-edge delay
EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // Dead-band is fully enabled for both rising-edge delay on output EPWMxA and falling-edge delay on output EPWMxB
EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active high complementary (AHC). EPWMxB is inverted
EPwm5Regs.DBFED = EPwm5Regs.DBRED = RESONANT_DBRED_DBFED; // Load the dead band register
EPwm5Regs.TBPRD = RESONANT_MIN_TBPRD;
EPwm5Regs.CMPA.half.CMPA = RESONANT_MIN_TBPRD;
EPwm5Regs.TBPHS.half.TBPHS = 0x0000; // Set timer phase
EPwm5Regs.TBCTR = 0; // clear TB counter
asm(" EALLOW"); // Enable EALLOW protected register access
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable the clocks to the ePWM module after all ePWM modules are configured to ensure synchronization between the ePWM modules.
asm(" EDIS"); // Disable EALLOW protected register access
__interrupt void INT13_ISR(void) // INT13 or CPU-Timer1
{
// Human-Machine-Interface code
//...
//...
}
__interrupt void EPWM4_INT_ISR(void) // EPWM-4
{
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX