This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hello,
With conventional PWM operation at 500 kHz, the best phase shift granularity I can achieve between two PWM signals in the sync chain is 3° (with SYSCLKOUT = 60 MHz). For my application I need better phase shift granularity, but am having trouble getting phase shift operation to work with the High Resolution PWM.
The relevant code I have is shown below. Can someone help me achieve HRPWM phase shift and/or explain to me why this code does not work?
EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; //configure ePWM1 Uint16 period = 120; // 60MHz/120 = 500 kHz EPwm1Regs.TBPRD = period-1; // PWM frequency = 1 / period EPwm1Regs.CMPA.half.CMPA = period/2; // set duty 50% initially EPwm1Regs.CMPA.half.CMPAHR = (0 << 8); // initialize HRPWM extension EPwm1Regs.TBPHS.half.TBPHS = 0; // initialize coarse phase to 0 EPwm1Regs.TBCTR = 0; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // count up mode EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // EPwm1 is the Master EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // set Immediate load EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // High/low behavior on ePWM1 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; EALLOW; EPwm1Regs.HRCNFG.all = 0x0; EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; // HR_CTR_ZERO_PRD; // Load on CTR = 0 and CTR = TBPRD EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; // Enable autoconversion for HR period EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP; // MEP control on both edges EPwm1Regs.HRCNFG.bit.CTLMODE = HR_PHS; // Selects the register (CMP/TBPRD or TBPHS) that controls the MEP: EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1; // This bit allows you to synchronize ePWM modules with a high-resolution phase on a SYNCIN event EPwm1Regs.TBCTL.bit.PHSDIR = 1; // count up after SYNC event and the new value of the phase (TBPHS) is loaded. EPwm1Regs.HRPCTL.bit.HRPE = 1; // Enable high-resolution period control. EDIS; //configure ePWM2 EPwm2Regs.TBPRD = period-1; // PWM frequency = 1 / period EPwm2Regs.CMPA.half.CMPA = period/2; // set duty 50% initially EPwm2Regs.CMPA.half.CMPAHR = (0 << 8); // initialize HRPWM extension EPwm2Regs.TBPHS.half.TBPHS = 0; EPwm2Regs.TBCTR = 0; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; // set Immediate load EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPwm2 is the slave EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; EALLOW; EPwm2Regs.HRCNFG.all = 0x0; EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; //HR_CTR_ZERO_PRD; // Load on CTR = 0 and CTR = TBPRD EPwm2Regs.HRCNFG.bit.AUTOCONV = 1; // Enable autoconversion for HR period EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP; // MEP control on both edges EPwm2Regs.HRCNFG.bit.CTLMODE = HR_PHS; // Selects the register (CMP/TBPRD or TBPHS) that controls the MEP: EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1; // This bit allows you to synchronize ePWM modules with a high-resolution phase on a SYNCIN event EPwm2Regs.TBCTL.bit.PHSDIR = 1; // count up after SYNC event and the new value of the phase (TBPHS) is loaded. EPwm2Regs.HRPCTL.bit.HRPE = 1; // Enable high-resolution period control. EDIS; //set the phase registers of ePWM2 EPwm2Regs.TBPHS.half.TBPHS = 119; // Gives a coarse phase shift from ePWM1 -> ePWM2 of 9°, or -351° EPwm2Regs.TBPHS.half.TBPHSHR = 100; // Gives a fine phase shift of arbitrary value from ePWM1 -> ePWM2 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS;
I observe with this code that ePWM1 leads ePWM2 by 9°. It works the same as if I never configured any of the HR registers at all and only used the TBPHS.half.TBPHS for phase loading. Essentially, the high resolution seems to not be working.
Any help is sincerely appreciated. Thank you.
-Jeff