TMS320F28379D: TMS320F28379D: 关于UPDOWN计数模式下PWM相移后输出波形异常问题

Part Number: TMS320F28379D

您好!

我在设计移相控制算法的过程中,遇到了如下问题:

希望从模块EPWM6相较于主模块EPWM1超前移相一个角度,这个移相角度在中断adca_isr中由控制器闭环控制并写入EPwm6Regs.TBPHS.bit.TBPHS,以调节电路的电压增益。

开环测试时,即给定一个固定的移相角,为实现EPWM6超前于EPWM1,将EPWM6配置为接收在EPWM1的TBCTR==0时发出的同步信号,此时将EPwm6Regs.TBPHS.bit.TBPHS加载到EPwm6Regs.TBCTR中,在UPDOWN计数模式下,将接收到同步信号后的计数方向设置为EPwm6Regs.TBCTL.bit.PHSDIR = TB_UP。

但此时EPWM6并没有输出正常的PWM波形,而是一直保持为低电平,并且在CCS的debug界面中发现EPwm6Regs.TBCTR会跑到超过EPwm6Regs.TBPRD的值。

image.png

此外,将TBPHS的值设置为0后,或令EPwm6Regs.TBCTL.bit.PHSDIR = TB_DOWN,EPWM6又能正常输出,这是为什么?

我查阅了相关技术手册和帖子,包括https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/758190/tms320f28374s-pwm 这篇帖子的问题和我遇到的问题几乎完全相同,但其中的回复没有解决该问题,文中提到的TBPHS大于TBPRD的可能性也不存在于我的实际情况中(如图)。

以下附上相关代码

初始化:

void InitEPWM6()
{
    EALLOW;
    /*************************EPWM6 initsetup***************************/
    EPwm6Regs.TBPRD = PRD_INIT;
    EPwm6Regs.TBCTR = 0x0000;

    EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm6Regs.TBPHS.bit.TBPHS = 0;
    EPwm6Regs.TBCTL.bit.PHSDIR = TB_DOWN;

    EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm6Regs.CMPA.bit.CMPA = HALF_PRD_INIT;

    EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm6Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm6Regs.DBCTL.bit.OUT_MODE = 3;
    EPwm6Regs.DBCTL.bit.POLSEL = 2;
    EPwm6Regs.DBCTL.bit.IN_MODE = 0;
    EPwm6Regs.DBRED.bit.DBRED = DBT;
    EPwm6Regs.DBFED.bit.DBFED = DBT;

    EPwm6Regs.TZCTL.bit.TZA = 2;
    EPwm6Regs.TZCTL.bit.TZB = 2;
    EDIS;
}

以下是位于adca_isr中的可能相关的代码:

        d1 = 0.5;

        phiPS = 1.379;

        fsw_PRD = 146;

        EPwm6Regs.TBPRD = fsw_PRD;

        EPwm6Regs.CMPA.bit.CMPA = (Uint16)(fsw_PRD * d1);

        EPwm6Regs.TBPHS.bit.TBPHS =  (Uint16)(phiPS * invPI * fsw_PRD);;
        EPwm6Regs.TBCTL.bit.PHSDIR = TB_UP;