Hi, could you please advise or share an example for how to force continuous outputs on PWMxA and PWMxB? I am working with a HRPWM and need to switch in between two modes 1) complementary output signals of HRPWM at PWMxA and PWMxB and 2) continuously hold both PWM signals at low.
I am using the code below and this requires a complete reprogramming of the DSP (running in debug mode) to enable the PWMs. I am looking for a software controlled solution that can switch in between two modes to make it practical especially when the build configuration is to be changed to Release.
EALLOW;
EPwm3Regs.HRCNFG.bit.SELOUTB = HR_NORM_B;
EDIS;
EPwm3Regs.AQCSFRC.bit.CSFA =1;
EPwm3Regs.AQCSFRC.bit.CSFB =1;
Code of HRPWM configuration:
void HRPWM_Config(period)
{
//
// ePWM channel register configuration with HRPWM
// ePWMxA / ePWMxB toggle low/high with MEP control on Rising edge
//
EALLOW;
EPwm3Regs.HRCNFG.all = 0x0;
EPwm3Regs.HRCNFG.bit.EDGMODE = HR_REP; // MEP control on rising edge
EPwm3Regs.HRCNFG.bit.CTLMODE = HR_CMP; // CMPAHR controls the MEP
EPwm3Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; // Shadow load on CTR=Zero
EPwm3Regs.HRCNFG.bit.EDGMODEB = HR_REP; // MEP control on rising edge
EPwm3Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
EPwm3Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;
EPwm3Regs.HRCNFG.bit.SELOUTB = HR_INVERT_B; // 1: ePWMxB output is inverted version of ePWMxA signal.
#if(AUTOCONVERT)
EPwm3Regs.HRCNFG.bit.AUTOCONV = 1; // Enable auto-conversion
// logic
#endif
EPwm3Regs.HRPCTL.bit.HRPE = 0; // Turn off high-resolution period
// control.
EDIS;
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW; // set Shadow load
EPwm3Regs.TBPRD = period-1; // PWM frequency = 1 / period
EPwm3Regs.CMPA.bit.CMPA = 0; // set duty 0% initially
EPwm3Regs.CMPA.bit.CMPAHR = (0 << 8); // initialize HRPWM extension
EPwm3Regs.CMPB.bit.CMPB = 0; // set duty 0% initially
EPwm3Regs.CMPB.all |= (0 << 8); // initialize HRPWM extension
EPwm3Regs.TBPHS.all = 0;
EPwm3Regs.TBCTR = 0;
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm3Regs.TBCTL.bit.FREE_SOFT = 0x11;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // LOAD CMPA on CTR = 0
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // PWM toggle high/low
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm3Regs.AQCTLB.bit.ZRO = AQ_CLEAR;
EPwm3Regs.AQCTLB.bit.CBU = AQ_SET;
// Interrupt where we will change the Compare Values
//
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event
EPwm3Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm3Regs.ETPS.bit.INTPRD = ET_3RD; // Generate INT on 3rd event
}
