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