Other Parts Discussed in Thread: CONTROLSUITE
I am having a problem with HRPWM on 28377. Here is how I set it up:
-
I am running ePWM at 200MHz rate:
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
-
I enabled HRPWM clock:
CpuSysRegs.PCLKCR0.bit.HRPWM = 1;
-
I configured ePWM1 and ePWM2 to create phase shifted 50% clock:
// TBCLK = EPWMCLK / (HSPCLKDIV * CLKDIV) => 200MHz / (1 * 1) = 200MHz
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM
// EPWM Module 1 config - Phase A PWM
EPwm1Regs.TBPRD = PWM_Counts;
EPwm1Regs.CMPA.bit.CMPA = PWM_Counts / 2;
EPwm1Regs.TBPHS.bit.TBPHS = 0; // Set Phase register to zero
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Master module
EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // CLKDIV = 1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // HSPCLKDIV = 1, TBCLK = 200MHz
EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP; // counts up after synchronization
EPwm1Regs.TBCTL.bit.FREE_SOFT = 3; // Free run
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_LD_DISABLE;
EPwm1Regs.CMPCTL2.bit.LOADCMODE = CC_LD_DISABLE;
EPwm1Regs.CMPCTL2.bit.LOADDMODE = CC_LD_DISABLE;
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWM1A is source for both delays
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // set actions for EPWM1A AQ_SET
EPwm1Regs.AQCTLA.bit.CAD = AQ_NO_ACTION;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
EPwm1Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
EPwm1Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;
EPwm1Regs.DBFED.bit.DBFED = 10;
EPwm1Regs.DBRED.bit.DBRED = 10;
EPwm1Regs.TZSEL.bit.OSHT1 = TZ_DISABLE;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
EPwm1Regs.TZEINT.bit.OST = TZ_DISABLE;
// EPWM Module 2 config - SiC1 Phase B PWM
EPwm2Regs.TBPRD = PWM_Counts;
EPwm2Regs.CMPA.bit.CMPA = PWM_Counts / 2;
EPwm2Regs.TBPHS.bit.TBPHS = 0; // Set Phase register to zero
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Slave module
EPwm2Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // sync flow-through
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // CLKDIV = 1
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // HSPCLKDIV = 1
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP; // counts up after synchronization
EPwm2Regs.TBCTL.bit.FREE_SOFT = 3; // Free run
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_LD_DISABLE;
EPwm2Regs.CMPCTL2.bit.LOADCMODE = CC_LD_DISABLE;
EPwm2Regs.CMPCTL2.bit.LOADDMODE = CC_LD_DISABLE;
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWM1A is source for both delays
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // set actions for EPWM1A AQ_SET
EPwm2Regs.AQCTLA.bit.CAD = AQ_NO_ACTION;
EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm2Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
EPwm2Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
EPwm2Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;
EPwm2Regs.DBFED.bit.DBFED = 10;
EPwm2Regs.DBRED.bit.DBRED = 10;
EPwm2Regs.TZSEL.bit.OSHT1 = TZ_DISABLE;
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // Force low id trips
EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
EPwm2Regs.TZEINT.bit.OST = TZ_DISABLE;
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP; // Both edges
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_PHS; // Phase control
EPwm2Regs.HRCNFG.bit.SELOUTB = HR_INVERT_B; // PWMB is inverted PWM A
EPwm2Regs.HRCNFG.bit.AUTOCONV = 1; // automatic scaling enabled
EPwm2Regs.HRMSTEP.bit.HRMSTEP = 33; // (1/200MHz)/150ps = 33.33
....
EDIS;
-
I ran the initialization code and halted the program at a convenient point. I used the debugger to change the content of TBHS and TBHSHR registers. When I change" EPwm2Regs.TBPHS.bit.TBPHS" I see PWM2 phase shifts with respect to PWM1. However no matter what I wright into upper 8 bits of TBPHHR I do not see PWM edge move. I think if I wright value 32 it should jump almost 5ns (almost one 200MHz clock). But it does not happen.
What am I doing wrong? Thank you.
Slobodan Gataric