I am working with the F28M35H52C1 RevB controlCard.
I have an ePWM interrupt configured to occur both when CTR = ZERO and CTR = PRD, as follows:
EPwm2Regs.ETSEL.bit.INTEN = 1; // Enable PWM Interrupt
EPwm2Regs.ETSEL.bit.INTSEL = 0x011; // Choose events to be both Zero and PRD
EPwm2Regs.ETPS.bit.INTPSSEL = 0x0; // Use INTPRD to determine interrupt prescale
EPwm2Regs.ETPS.bit.INTPRD = 0x01; // Interrupt on each event
The only thing the interrupt does is toggle a GPIO pin.
If I look at the GPIO pin and my PWM signals, the GPIO signal is not toggling at the same frequency as the PWM. It appears that the toggle only happens when CTR = ZERO, not when CTR = PRD. In other words, the high-side PWM output is center-aligned with the GPIO square wave.
Am I missing anything with my configuration?
EDIT: I put a break point in the interrupt handler and watched EPwm2Regs.TBCTR. When the breakpoint is hit, this register ranges between 24 and 31. The full period is 18750. This seems to indicate that it is indeed only occuring on the zero of the counter.
For reference, here is my PWM configuration:
EPwm2Regs.TBCTL.bit.CLKDIV = 000; // No Clock prescale - use full SYSCLK
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 000; // No clock division
EPwm2Regs.TBPRD = PWM_HALF_PERIOD; // 2x this period gives # of cycles for PWM period
EPwm2Regs.TBPHS.half.TBPHS = 0; // Set Phase register to zero
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetrical mode
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Master module
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR=Zero
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR=Zero
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // set actions for EPWM1A
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary
EPwm2Regs.DBFED = DEADBANDCOUNT; // FED = 50 TBCLKs
EPwm2Regs.DBRED = DEADBANDCOUNT; // RED = 50 TBCLKs
EPwm2Regs.AQSFRC.bit.RLDCSF = FORCE_IMMEDIATE; // Software Force loads immediate