Part Number: TMS320F28379D
Other Parts Discussed in Thread: C2000WARE
Hello everyone,
I see a strange behaviour on an ePWM when high-resolution period control is enabled. I don't need to actually use TBPRDHR or CMPAHR to see this behaviour, just setting the HRPCTL[HRPE] bit is enough to make it appear.
I have a very simple program which configures EPWM8 for up-down high-resolution period/duty control with TBPRD = 180, then switches between CMPA = 36 and CMPA = 144 in a loop.
Here is the code:
_eallow();
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 1;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM8 = 1;
CpuSysRegs.PCLKCR0.bit.HRPWM = 1;
EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm8Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm8Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm8Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm8Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm8Regs.TBPRD = 180;
EPwm8Regs.CMPA.all = 18;
EPwm8Regs.HRCNFG.bit.EDGMODE = HR_BEP;
EPwm8Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm8Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO_PRD;
EPwm8Regs.HRCNFG.bit.AUTOCONV = 1;
EPwm8Regs.HRPCTL.bit.HRPE = 1;
EPwm8Regs.HRPCTL.bit.TBPHSHRLOADE = 1;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EPwm8Regs.TBCTL.bit.SWFSYNC = 1;
__edis();
while (SFO() != SFO_COMPLETE);
__eallow();
GpioCtrlRegs.GPCDIR.bit.GPIO86 = 1;
GpioCtrlRegs.GPCDIR.bit.GPIO87 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 1;
__edis();
for (;;) {
/* Pulse on GPIO86 when setting CMPA to small value */
GpioDataRegs.GPCSET.bit.GPIO86 = 1;
__asm(" RPT #50 || NOP");
EPwm8Regs.CMPA.bit.CMPA = 18;
GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1;
DELAY_US(10);
while (EPwm8Regs.TBSTS.bit.CTRDIR != 1);
/* Pulse on GPIO87 when setting CMPA to big value */
GpioDataRegs.GPCSET.bit.GPIO87 = 1;
__asm(" RPT #50 || NOP");
EPwm8Regs.CMPA.bit.CMPA = 162;
GpioDataRegs.GPCCLEAR.bit.GPIO87 = 1;
DELAY_US(10);
while (EPwm8Regs.TBSTS.bit.CTRDIR != 1);
}
Here is a picture of the result:
Here is the same picture zoomed in and annotated by myself:
However if I leave HRPE disabled the problem disappears and everything goes as expected.
Can someone from TI reproduce the problem using the code I provided? Is there an explanation for this behaviour?
Cheers,
Pierre
Pierre


