Dear All:
I need to configure hrpwm for hi-res duty and period and phase shift control in up count mode. EPWM1A is the master, EPWM2A is the slave shift 120°,
EPWM3A is the slave shift 240°. I am using F28035.
Is it possible to configure HRPWM for all these 3 parts duty, period and phase shift?
According to https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/189224, My code :
// Disable TBCLKSYNC
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
//Write To CMP, TBPRD, TBPHS registers.
(*ePWM[j]).TBCTL.bit.PRDLD = TB_SHADOW;
// set Shadow load
(*ePWM[j]).TBPRD = period;
// PWM frequency = 1/(2*TBPRD)
(*ePWM[j]).CMPA.half.CMPA = period / 2;
// set duty 50% initially
(*ePWM[j]).CMPA.half.CMPAHR = (0 << 8);
// initialize HRPWM extension
(*ePWM[j]).TBPHS.all = 0;
//Configure modes, clock dividers and action qualifier
(*ePWM[j]).TBCTR = 0;
(*ePWM[j]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
// Select up-down count mode
(*ePWM[j]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
(*ePWM[j]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(*ePWM[j]).TBCTL.bit.CLKDIV = TB_DIV1;
// TBCLK = SYSCLKOUT
(*ePWM[j]).TBCTL.bit.FREE_SOFT = 00;
(*ePWM[j]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
// LOAD CMPA on CTR = 0
(*ePWM[j]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
(*ePWM[j]).CMPCTL.bit.SHDWAMODE = CC_SHADOW;
(*ePWM[j]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
(*ePWM[j]).AQCTLA.bit.CAU = AQ_SET;
(*ePWM[j]).AQCTLA.bit.PRD = AQ_CLEAR;
//Configure HRPWM registers
EALLOW;
(*ePWM[j]).HRCNFG.all = 0x0;
(*ePWM[j]).HRCNFG.bit.EDGMODE = HR_BEP;
// MEP control on both edges
(*ePWM[j]).HRCNFG.bit.CTLMODE = HR_CMP;
// CMPAHR and TBPRDHR HR control
(*ePWM[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO_PRD;
// load on CTR = 0 and CTR = TBPRD
(*ePWM[j]).HRCNFG.bit.AUTOCONV = 1;
// Enable autoconversion
(*ePWM[j]).HRPCTL.bit.HRPE = 1;
// Turn on high-resolution period control
//set TBCTL[PHSEN] = 1
(*ePWM[j]).TBCTL.bit.PHSEN = 1;
//set HRPCTL[TBPHSHRLOADE] = 1
(*ePWM[j]).HRPCTL.bit.TBPHSHRLOADE = 1;
//Do the same to all other PWM modules except the TBPHS
…
//Enable TBCLKSYNC
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//Perform a software sync
EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
I do not know if all three parts work well. Am I wrong? Please let me know.