Part Number: TMS320F28027
Other Parts Discussed in Thread: C2000WARE, CONTROLSUITE
In another post (https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/677071), I learned how to accomplish High Resolution Phase Control using the "structs" code. Here, I would like to convert to using the "drivers" code to use the driver libraries. Not a single example in the C2000Ware uses high resolution phase control, they all use "PWM_HrControlMode_Duty".
I have followed my structs code almost exactly, but it seems there is not a function to explicitly change the high resolution phase value. There is a function for coarse phase, i.e. PWM_setPhase(myPwm2, 0), but I do not know how to directly change the HR Phase value (in the structs version, I use EPwm2Regs.TBPHS.half.TBPHSHR = 100 << 8).
Here is the relevant code. Can someone help me achieve high resolution phase shift with the driver libraries?
CLK_disableTbClockSync(myClk); Uint16 period = 120; CLK_enablePwmClock(myClk, PWM_Number_1); PWM_setPeriodLoad(myPwm1, PWM_PeriodLoad_Immediate); PWM_setPeriod(myPwm1, period-1); // Set timer period PWM_setCmpA(myPwm1, period / 2); PWM_setPhase(myPwm1, 0x0000); // Phase is 0 initially PWM_setCount(myPwm1, 0x0000); // Clear counter PWM_setCounterMode(myPwm1, PWM_CounterMode_Up); // Count up PWM_disableCounterLoad(myPwm1); // ePWM1 is the master PWM_setSyncMode(myPwm1, PWM_SyncMode_CounterEqualZero); PWM_setHighSpeedClkDiv(myPwm1, PWM_HspClkDiv_by_1); // Clock ratio to SYSCLKOUT PWM_setClkDiv(myPwm1, PWM_ClkDiv_by_1); PWM_setShadowMode_CmpA(myPwm1, PWM_ShadowMode_Shadow); // Load registers every ZERO PWM_setLoadMode_CmpA(myPwm1, PWM_LoadMode_Zero); PWM_setActionQual_Zero_PwmA(myPwm1, PWM_ActionQual_Set); PWM_setActionQual_CntUp_CmpA_PwmA(myPwm1, PWM_ActionQual_Clear); PWM_setHrEdgeMode(myPwm1, PWM_HrEdgeMode_Both); PWM_enableAutoConvert(myPwm1); PWM_setHrControlMode(myPwm1, PWM_HrControlMode_Phase); PWM_setHrShadowMode(myPwm1, PWM_HrShadowMode_CTR_EQ_0); PWM_enableHrPhaseSync(myPwm1); CLK_enablePwmClock(myClk, PWM_Number_2); PWM_setPeriodLoad(myPwm2, PWM_PeriodLoad_Immediate); PWM_setPeriod(myPwm2, period-1); // Set timer period PWM_setCmpA(myPwm2, period / 2); PWM_setPhase(myPwm2, 0); // Phase is 0 initially PWM_setCount(myPwm2, 0x0000); // Clear counter PWM_setCounterMode(myPwm2, PWM_CounterMode_Up); // Count up PWM_enableCounterLoad(myPwm2); PWM_setSyncMode(myPwm2, PWM_SyncMode_EPWMxSYNC); PWM_setHighSpeedClkDiv(myPwm2, PWM_HspClkDiv_by_1); // Clock ratio to SYSCLKOUT PWM_setClkDiv(myPwm2, PWM_ClkDiv_by_1); PWM_setShadowMode_CmpA(myPwm2, PWM_ShadowMode_Shadow); // Load registers every ZERO PWM_setLoadMode_CmpA(myPwm2, PWM_LoadMode_Zero); PWM_setActionQual_Zero_PwmA(myPwm2, PWM_ActionQual_Set); PWM_setActionQual_CntUp_CmpA_PwmA(myPwm2, PWM_ActionQual_Clear); PWM_setHrEdgeMode(myPwm2, PWM_HrEdgeMode_Both); PWM_setHrControlMode(myPwm2, PWM_HrControlMode_Phase); PWM_setHrShadowMode(myPwm2, PWM_HrShadowMode_CTR_EQ_0); PWM_enableHrPhaseSync(myPwm2); PWM_enableAutoConvert(myPwm2); PWM_setPhase(myPwm2, 1); // In sync with ePWM1 and phase shifted by 16.67ns
CLK_enableTbClockSync(myClk);