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.

[参考译文] TMS320F28384S:带相移的漏脉冲

Guru**** 2392925 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1386684/tms320f28384s-missing-pulse-with-phase-shift

器件型号:TMS320F28384S

工具与软件:

您好!

我正在运行一个在 ePWM1和 ePWM4之间具有相移的转换器、每个转换器使用上-下计数具有0.5个占空比。 相位 从0度变为180度。

不过、我在特定相位上遇到 ePWM3上脉冲缺失的问题。

为了解决此问题、我曾尝试在 ePWM3上实现 T1/T2事件、但我无法找到如何正确使用 T1/T2事件。

如果您能提供任何建议、我将不胜感激。

下面是我的代码:

void updatePhase(int16 ch, float32 phase)
{
    while(phase > 360.0) phase -= 360.0;
    while(phase < 0.0) phase += 360.0;

    if(phase > 180.0) {
        phase -= 360.0;
    }

    if(phase == 0.0)  {
        ePWM_Regs[ch]->TBPHS.bit.TBPHS = 0;
    }
    else if(phase > 0.0){
        ePWM_Regs[ch]->TBCTL.bit.PHSDIR = 0; 
        ePWM_Regs[ch]->TBPHS.bit.TBPHS = (int16)((float32)ePWM_Regs[ch]->TBPRD * phase * 0.00555555); // 0.00277778 = 1/360
    }
    else{ // phase < 0.0
        ePWM_Regs[ch]->TBCTL.bit.PHSDIR = 1; 
        ePWM_Regs[ch]->TBPHS.bit.TBPHS = (int16)((float32)ePWM_Regs[ch]->TBPRD * -phase * 0.00555555); // 0.00277778 = 1/360
    }

}

void updateDuty_Sym(Uint16 ch, float32 duty)
{
    ePWM_Regs[ch]->CMPA.bit.CMPA = (Uint32)((float32)ePWM_Regs[ch]->TBPRD * duty);
    ePWM_Regs[ch]->CMPB.bit.CMPB = (Uint32)((float32)ePWM_Regs[ch]->TBPRD * (1-duty));
}

void conf_ePWM_Sym(Uint16 ch, float32 freq)
{
    // Set actions
    ePWM_Regs[ch]->AQCTLA.bit.CAD = AQ_SET;
    ePWM_Regs[ch]->AQCTLA.bit.CAU = AQ_CLEAR;
    ePWM_Regs[ch]->AQCTLB.bit.CBD = AQ_SET;
    ePWM_Regs[ch]->AQCTLB.bit.CBU = AQ_CLEAR;

    if(ch==4){
        ePWM_Regs[ch]->TBCTL.bit.PHSEN = TB_DISABLE;
        ePWM_Regs[ch]->EPWMSYNCOUTEN.bit.ZEROEN = 0x1;
        ePWM_Regs[ch]->TBCTL.bit.SYNCOSEL = 0x1;    //TB_CTR_ZERO;

        ePWM_Regs[ch]->TBPHS.bit.TBPHS = 0;

    }
    else if(ch!=4) {
        ePWM_Regs[ch]->TBCTL.bit.PHSEN = TB_ENABLE;
        ePWM_Regs[ch]->EPWMSYNCINSEL.bit.SEL = 0x4;
        ePWM_Regs[ch]->TBCTL.bit.SYNCOSEL = 0x1;    //TB_SYNC_IN;

    }

    SyncSocRegs.SYNCSELECT.bit.SYNCOUT = 0x1;

    // Setup TBCLK
    ePWM_Regs[ch]->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
    ePWM_Regs[ch]->TBCTL.bit.PRDLD = TB_SHADOW;
    ePWM_Regs[ch]->TBCTL.bit.HSPCLKDIV = TB_DIV1;

    ePWM_Regs[ch]->CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
    ePWM_Regs[ch]->CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    ePWM_Regs[ch]->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    ePWM_Regs[ch]->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    ePWM_Regs[ch]->DBCTL.bit.IN_MODE = DBA_RED_DBB_FED;
    ePWM_Regs[ch]->DBCTL.bit.POLSEL = DB_ACTV_HIC;
    ePWM_Regs[ch]->DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;    //deadtime

    updateDuty_Sym(ch, 0.0);
    updatePhase(ch, 0.0);
    updateFreq(ch, freq);
    updateDeadtime(ch, 0.0);
}

 

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

    李东旭先生、

    为了配置 T1/T2事件、您需要配置 T1D、T1U 等的 AQCTLA2寄存器位中发生 T1或 T2事件时将发生的操作 您需要配置 AQTSRCSEL 寄存器以定义 T2SEL 和 T1SEL 的源。  

    DCxEVT1/2、可以在数字比较逻辑子模块中配置。

    此致!

    Ryan Ma