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.

[参考译文] TMS320F280025C:相移 ePWM 问题

Guru**** 2044370 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1054803/tms320f280025c-phase-shift-epwm-problem

器件型号:TMS320F280025C

大家好、

对不起,我和 Subraahmanya 就这个问题交换了意见,但这个问题已经结束,我还有其他问题。

您可以看到屏幕截图。 为什么当我设置相位= 120°时、ePWM2在 ePWM1和 ePWM3的正确相移情况下正常? 能不能更详细地解释一下?  如果我理解正确、我们必须 通过递增和递减计数的 TBPHSDIR 来反转方向、但我不能这么做。

谢谢

我的代码:  

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void set_phase(uint32_t base, uint16_t phi)
{
uint16_t phase;
if(base == myEPWM2_BASE)
{
//EPWM_setCountModeAfterSync(base, EPWM_COUNT_MODE_UP_AFTER_SYNC);
phase = ((float)phi * HWREGH(base + EPWM_O_TBPRD) * 2 / 360); // *2 to adapt scale on UP and DOWN Count mode
}
if(base == myEPWM3_BASE)
{
//EPWM_setCountModeAfterSync(base, EPWM_COUNT_MODE_UP_AFTER_SYNC);
phase = ((float)phi * 2 * HWREGH(base + EPWM_O_TBPRD) * 2 / 360);
}
EPWM_enableSyncOutPulseSource(base, EPWM_SYNC_OUT_PULSE_ON_SOFTWARE);
EPWM_forceSyncPulse(base);
EPWM_setPhaseShift(base, phase);
EPWM_setTimeBaseCounter(base, phase);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
float PWM_Freq_TBCLK = (float) SYSCLK / (PWM_HIGHSPEED_PRESCALER * PWM_PRESCALER);
*TBCLK = 1. / PWM_Freq_TBCLK;
PWM_period = 1. / PWM_FREQ;
time_FED_RED = (FED + RED) * 0.000001;
PWM_period += time_FED_RED;
*TBPRD_boost_3 = PWM_Freq_TBCLK / (PWM_FREQ * 2);
*CMPA_boost_3 = ((float) (100 - duty_boost_3) / 100) * (*TBPRD_boost_3);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void epwm_init(uint32_t base)
{
float PWM_TBPRD_1;
float PWM_TBPRD_2;
float PWM_TBPRD_3;
float PWM_CMPA_1;
float PWM_CMPA_2;
float PWM_CMPA_3;
EPWM_ClockDivider PWM_PARAM_PRESCALER;
EPWM_HSClockDivider PWM_PARAM_HIGHSPEEDPRESCALER;
float TBCLK;
if(base == myEPWM1_BASE)
{
get_pwm_clock_from_freq(base , &PWM_TBPRD_1 , &PWM_TBPRD_2 , &PWM_TBPRD_3 , &PWM_CMPA_1 , &PWM_CMPA_2 , &PWM_CMPA_3 , &PWM_PARAM_PRESCALER , &PWM_PARAM_HIGHSPEEDPRESCALER, &TBCLK);
// Parameters
EPWM_setTimeBasePeriod(base, (uint16_t)PWM_TBPRD_1);
EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_B, (uint16_t)PWM_CMPA_1);
EPWM_setPhaseShift(base, 0U);
EPWM_disablePhaseShiftLoad(base);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX