Other Parts Discussed in Thread: CONTROLSUITE
Tool/software: Code Composer Studio
Hallo, I am new here.
I use a TMS320F28377S LaunchPad Development Kit.
I loaded the Project hrpwm_duty_sfo_cpu01 from the controlSUITE Examples( controlSUITE-> device_support->v210->hprwm_duty_sfo_v8->cpu01->hrpwm_duty_sfo_cpu01).
The Problem i have is that the expectet PWM Period is not the PWM Period i measure.
On page 1442/2352 of the Technical Reference Manual there is a note that the EPWMCLK = SYSCLKOUT/2.
So EPWMCLK should run with 100 MHz ( 10 ns).
The HSPCLKDIV and CLKDIV Divider are set to the factor 1. So the TBCLK Clock should run with 100 MHz (10 ns) refer to page 1443/2352 (Technical Reference Manual)
So i would expect that call the HRPWM_Config function with a value of 10 would generate a PWM Periode of 10*10ns= 100 ns.
The real PWM Period (measured ) is 200 ns.
I don't know why . Can anybody explain why the PWM Period is 200ns instead of 100ns.
I did nothing change in the project example. Using Code Composer Studio Version: 6.2.0.00050
HRPWM_Config(10); // ePWMx target
void HRPWM_Config(period)
{
Uint16 j;
//
// ePWM channel register configuration with HRPWM
// ePWMxA / ePWMxB toggle low/high with MEP control on Rising edge
//
for (j=1;j<PWM_CH;j++)
{
(*ePWM[j]).TBCTL.bit.PRDLD = TB_SHADOW; // set Immediate load
(*ePWM[j]).TBPRD = period-1; // PWM frequency = 1 / period
(*ePWM[j]).CMPA.bit.CMPA = period / 2; // set duty 50% initially
(*ePWM[j]).CMPA.bit.CMPAHR = (1 << 8); // initialize HRPWM extension
(*ePWM[j]).CMPB.bit.CMPB = period / 2; // set duty 50% initially
(*ePWM[j]).CMPB.all |= (1 << 8); // initialize HRPWM extension
(*ePWM[j]).TBPHS.all = 0;
(*ePWM[j]).TBCTR = 0;
(*ePWM[j]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
(*ePWM[j]).TBCTL.bit.PHSEN = TB_DISABLE;
(*ePWM[j]).TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
(*ePWM[j]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(*ePWM[j]).TBCTL.bit.CLKDIV = TB_DIV1;
(*ePWM[j]).TBCTL.bit.FREE_SOFT = 11;
(*ePWM[j]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
(*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.ZRO = AQ_SET; // PWM toggle high/low
(*ePWM[j]).AQCTLA.bit.CAU = AQ_CLEAR;
(*ePWM[j]).AQCTLB.bit.ZRO = AQ_SET;
(*ePWM[j]).AQCTLB.bit.CBU = AQ_CLEAR;
EALLOW;
(*ePWM[j]).HRCNFG.all = 0x0;
(*ePWM[j]).HRCNFG.bit.EDGMODE = HR_FEP; // MEP control on falling edge
(*ePWM[j]).HRCNFG.bit.CTLMODE = HR_CMP;
(*ePWM[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
(*ePWM[j]).HRCNFG.bit.EDGMODEB = HR_FEP; // MEP control on falling edge
(*ePWM[j]).HRCNFG.bit.CTLMODEB = HR_CMP;
(*ePWM[j]).HRCNFG.bit.HRLOADB = HR_CTR_ZERO;
#if (AUTOCONVERT)
(*ePWM[j]).HRCNFG.bit.AUTOCONV = 1; // Enable auto-conversion
// logic
#endif
(*ePWM[j]).HRPCTL.bit.HRPE = 0; // Turn off high-resolution period
// control.
EDIS;
}
}
Thank you very much,
Jonas
