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/TMS320C28346: Software Forced Synchronization Pulse [SWFSYNC]: how-to

Part Number: TMS320C28346

Tool/software: Code Composer Studio

Hi to everyone, 

I have three cascaded ePWM modules, which they are synchronized -and dephased- with one another. I want the first PWM to be synchronized to software 

More specifically: everytime the angle produced by a PLL resets, I want to create an software event in ePWM1, which then will synchronize accordingly the other two ePWMs.

The PLL itself and the resetting function are programmed in C++.

I have also written a class for setting up the PWMs. Voila:

Firing::Firing(volatile struct EPWM_REGS *APwmRegs, unsigned int PWM_PRD, unsigned int PWM_PHASE, bool PWM_SYNC)
{

    ThePwm=APwmRegs;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;          // Disable ePWM clocks
    EDIS;

    ThePwm->TBPRD=PWM_PRD;                          // Set timer period
    ThePwm->TBCTR = 0;                                        // clear-reset TB counter to 0

    ThePwm->CMPA.half.CMPA = ThePwm->TBPRD;         // initial duty ratio for CMPA (RS+,ST+,TR+)
    ThePwm->CMPB = 0;                                                      // initial duty ratio for CMPB (RS-,ST-,TR-)
    ThePwm->TBPHS.half.TBPHS = PWM_PHASE;            // phase register value
    ThePwm->TBCTL.bit.CTRMODE=TB_COUNT_UP;       // set triangular waveform as count up

    ThePwm->TBCTL.bit.PHSEN = TB_ENABLE;                // enable loading phase register value
    ThePwm->TBCTL.bit.SYNCOSEL= TB_SYNC_IN;         // synchronization 

    ThePwm->TBCTL.bit.PRDLD=TB_SHADOW;                             // enable shadow register for period register
    ThePwm->CMPCTL.bit.SHDWAMODE=CC_SHADOW;             // enable Shadows for CMPA
    ThePwm->CMPCTL.bit.SHDWBMODE=CC_SHADOW;             // enable Shadows for CMPB
    ThePwm->CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;           // load reference for ePWMA - on ZERO
    ThePwm->CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;           // load reference for ePWMB - on ZERO

    //TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV) = 300MHz / (12 * 8) = 3.125MHz
    ThePwm->TBCTL.bit.HSPCLKDIV = 0x6;                      //HSPCLKDIV: divide by 12
    ThePwm->TBCTL.bit.CLKDIV = 0x3;                             // CLKDIV: divide by 8

    // disable action qualifier - AQ_NO_ACTION
    ThePwm->AQCTLA.bit.CAU = AQ_NO_ACTION;
    ThePwm->AQCTLB.bit.CBU = AQ_NO_ACTION;

    ThePwm->ETSEL.bit.INTEN = 1;                              // enable ePWM Interrupts
    ThePwm->ETPS.bit.INTPRD = ET_1ST;                   // number of events needed to generate an interrupt (here: every event)
    ThePwm->ETSEL.bit.INTSEL = ET_CTR_ZERO;     // when active trigger interrupt at ZERO
    ThePwm->ETCLR.bit.INT = 1;                                   // clear the INT flag if any

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;           // Enable ePWM clocks
    EDIS;

}
void Firing::Synchronize(bool zeroCrossing_)
{
ThePwm->TBCTL.bit.SWFSYNC = zeroCrossing_;          //zero crossing is a function that returns 1 or 0 every time the angle resets (from 2pi to 0 again)
}

Could you please indicate possible reasons for which I don't manage to create the SWFSYNC event?