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.

TMS320F28377D: EPWM模块更新比较值(CMPA)的同时开关频率上升

Part Number: TMS320F28377D

您好,我在用TMS320F28377D调试PWM过程中遇到了如下问题:

我所用PWM的功能是:将ePWM1作为主时钟(Master),ePWM2,3,10,11,12作为从时钟(Slave),输出互补死区的12路PWM波。

当我在ePWM的中断中修改PWM的占空比(dutycycle)时,原本应当只改变占空比,不改变频率。

PWM实际输出的高低电平时间和实际开关频率如下所示。实际的占空比和给定占空比不相等;当占空比上升时,实际的输出频率也会上升。只有当占空比=0时,输出频率才近似等于所需的40kHz。

其他功能,如互补死区、多路同步均表现正常。

请问我的代码存在哪些问题,应当如何修改,谢谢!

以下为我的配置函数和调用函数:

配置函数为:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// PWM MACRO DEFINE
// SYSCLK = 200MHz
// EPWMCLK = SYSCLK/2(define=2) = 100MHz
// TBCLK = EPWMCLK/(HSPCLKDIV*CLKDIV) = 100MHz
// We want 40kHz, so 2*EPWM_TIMER_TBPRD=100/40*1000=2500, thus EPWM_TIMER_TBPRD=1250
// Tdb = 1/(100MHz/40) = 400ns
#define freq_sw 40000 // Switching frequency, Hz
#define prd_sw 1.0/40000.0 // Switching period, s
#define EPWM_TIMER_TBPRD 100000000/(freq_sw*2)
#define EPWM_MIN_CMPA 50
#define EPWM_MAX_CMPB 1200
#define EPWM_DB 40
//
// InitEPwm1Gpio - Initialize EPWM1 GPIOs
//
void InitEPwm1Gpio(void)
{
EALLOW;
//
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

调用函数为:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//
// epwm1_isr - EPWM1 ISR
__interrupt void epwm1_isr(void)
{
//--------------------Interrupt User Data Begin--------------------
//PWM
// int i;
// for(i=0;i<=12;i++)
// {
// (*EPWM[i]).TBPRD = MY_EPWM_TIMER_TBPRD;
// }
EPwm1Regs.CMPA.bit.CMPA = (dutycycle[1]*EPWM_TIMER_TBPRD);
EPwm2Regs.CMPA.bit.CMPA = (dutycycle[2]*EPWM_TIMER_TBPRD);
EPwm3Regs.CMPA.bit.CMPA = (dutycycle[3]*EPWM_TIMER_TBPRD);
EPwm10Regs.CMPA.bit.CMPA = (dutycycle[1]*EPWM_TIMER_TBPRD);
EPwm11Regs.CMPA.bit.CMPA = (dutycycle[2]*EPWM_TIMER_TBPRD);
EPwm12Regs.CMPA.bit.CMPA = (dutycycle[3]*EPWM_TIMER_TBPRD);
//--------------------Interrupt User Data End--------------------
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

主函数为:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main()
{
//
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the F2837xD_SysCtrl.c file.
InitSysCtrl();
//
// Step 2. Initialize GPIO: (Cancel)
// This example function is found in the F2837xD_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();
//
// EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//// CpuSysRegs.PCLKCR2.bit.EPWM1ENCLK = 1;
// CpuSysRegs.PCLKCR2.bit.EPWM1=1;
// CpuSysRegs.PCLKCR2.bit.EPWM2=1;
// CpuSysRegs.PCLKCR2.bit.EPWM3=1;
// EDIS;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 已自己解决 错误为

     EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Enable phase loading

    主时钟的PHSEN应设置为

     EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading

    从时钟的PHSEN应设置为

     EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading