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.

TMS320F28027: 同步信号问题

Part Number: TMS320F28027


关于EPWM配置的问题:

在对PWM的相位进行同步时,要基于同步信号来进行同步,但我实在是不理解通过设置TBCTL.bit.SYNCOSEL这一位是如何影响PWM的相位的。

下面是我目前正在看的例程,可不可以通过波形的方式解释一下下面例程中标红代码的具体应用。

非常感谢。

例:

(*ePWM[n]).TBCTL.bit.PRDLD = TB_IMMEDIATE; // Set Immediate load
(*ePWM[n]).TBPRD = period;
(*ePWM[n]).TBPHS.half.TBPHS = 0;
(*ePWM[n]).TBCTR = 0; //时基寄存器清零

(*ePWM[n]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(*ePWM[n]).TBCTL.bit.PHSEN = TB_DISABLE;
(*ePWM[n]).TBCTL.bit.SYNCOSEL = TB_CTR_CMPB; // Used to sync EPWM(n+1) "down-stream"
(*ePWM[n]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(*ePWM[n]).TBCTL.bit.CLKDIV = TB_DIV1;

// Counter compare submodule registers
(*ePWM[n]).CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
(*ePWM[n]).CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;
(*ePWM[n]).CMPA.half.CMPA = period-68;
(*ePWM[n]).CMPB = period;

// Action Qualifier SubModule Registers
(*ePWM[n]).AQCTLA.bit.ZRO = AQ_SET;
(*ePWM[n]).AQCTLA.bit.PRD = AQ_CLEAR;

// DeadBand Control Register
(*ePWM[n]).DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
(*ePWM[n]).DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi Complimentary
(*ePWM[n]).DBRED = 20; // Initial value
(*ePWM[n]).DBFED = 20; // Initial value

// ePWM(n+1) init. EPWM(n+1) is a slave

//Time Base SubModule Register
(*ePWM[n+1]).TBCTL.bit.PRDLD = TB_SHADOW;
(*ePWM[n+1]).TBPRD = period-1;
(*ePWM[n+1]).TBPHS.half.TBPHS = 0;
(*ePWM[n+1]).TBCTR = 0;

(*ePWM[n+1]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
(*ePWM[n+1]).TBCTL.bit.PHSEN = TB_ENABLE;
(*ePWM[n+1]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Sync "flow through" mode
(*ePWM[n+1]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(*ePWM[n+1]).TBCTL.bit.CLKDIV = TB_DIV1;

// Counter compare submodule registers
(*ePWM[n+1]).CMPA.half.CMPA = period + 10; // Initial value
(*ePWM[n+1]).CMPB = 20; // Initial value
(*ePWM[n+1]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
(*ePWM[n+1]).CMPCTL.bit.SHDWAMODE = CC_SHADOW;
(*ePWM[n+1]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
(*ePWM[n+1]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;

// Action Qualifier SubModule Registers
(*ePWM[n+1]).AQCTLA.bit.CAU = AQ_SET;
(*ePWM[n+1]).AQCTLA.bit.CBU = AQ_CLEAR;
(*ePWM[n+1]).AQCTLA.bit.ZRO = AQ_CLEAR;
(*ePWM[n+1]).AQCTLA.bit.PRD = AQ_CLEAR;

(*ePWM[n+1]).AQCTLB.bit.CBU = AQ_SET;
(*ePWM[n+1]).AQCTLB.bit.CAU = AQ_CLEAR;
(*ePWM[n+1]).AQCTLB.bit.ZRO = AQ_CLEAR;
(*ePWM[n+1]).AQCTLB.bit.PRD = AQ_CLEAR;

  • 同步的两个PWM模块间的相位一般会受两个因素影响,1是同步信号接收之后再添加一个相位值,2是同步信号发出前添加一个相位值。对应到你的问题:

    1的情况下,我们一般通过设置TBPHS寄存器,给同步信号到来之后的设置一个相移,这点在芯片TRM的3.2.2.5 Time-base Counter Modes and Timing Waveforms中几个图示应该画的挺清楚的。

    2的情况就是你提到的设置SYNCOSEL寄存器,比如PWM1和PWM2,如果PWM1的同步信号输出点不是在计数器CTR = 0的时候,而是选择CTR = CMPB的点作为同步信号输出点。这样PWM2的同步就会跟PWM1差0~CMPB个计数点。也就是说,当PWM1计数到CMPB的时候(CTR = CMPB),PWM2才被同步,才开始从0计数(CTR = 0)。

    不知道这样讲能否理解?

  • 非常感谢,我理解你所讲的了。

    那如果我再加一个ePWM[n+2]的话,具体例程如下所示,是不是在PWM2计数到CMPB的时候,PWM3才会被同步,因为我这里设置的同步输出信号等于同步输入信号,而同步输入信号可以顺延到PWM1所设定的CTR=CMPB。我不清楚这样理解对不对?

    例:

    (*ePWM[n+2]).TBCTL.bit.PRDLD = TB_SHADOW;
    (*ePWM[n+2]).TBPRD = period-1;
    (*ePWM[n+2]).TBPHS.half.TBPHS = 0;
    (*ePWM[n+2]).TBCTR = 0;

    (*ePWM[n+2]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
    (*ePWM[n+2]).TBCTL.bit.PHSEN = TB_ENABLE;
    (*ePWM[n+2]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Sync "flow through" mode
    (*ePWM[n+2]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (*ePWM[n+2]).TBCTL.bit.CLKDIV = TB_DIV1;

    // Counter compare submodule registers
    (*ePWM[n+2]).CMPA.half.CMPA = period + 10; // Initial value
    (*ePWM[n+2]).CMPB = 20; // Initial value
    (*ePWM[n+2]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    (*ePWM[n+2]).CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    (*ePWM[n+2]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    (*ePWM[n+2]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    // Action Qualifier SubModule Registers
    (*ePWM[n+2]).AQCTLA.bit.CAU = AQ_SET;
    (*ePWM[n+2]).AQCTLA.bit.CBU = AQ_CLEAR;
    (*ePWM[n+2]).AQCTLA.bit.ZRO = AQ_CLEAR;
    (*ePWM[n+2]).AQCTLA.bit.PRD = AQ_CLEAR;

    (*ePWM[n+2]).AQCTLB.bit.CBU = AQ_SET;
    (*ePWM[n+2]).AQCTLB.bit.CAU = AQ_CLEAR;
    (*ePWM[n+2]).AQCTLB.bit.ZRO = AQ_CLEAR;
    (*ePWM[n+2]).AQCTLB.bit.PRD = AQ_CLEAR;

  • 不是,你的程序中(假设n=1):

    PWM1的同步输出(SYNCOSEL)设置的是CTR = CMPB,所以PWM2的同步点是PWM1的CTR = CMPB

    PWM2的同步输出(SYNCOSEL)设置的是TB_SYNC_IN,也就是跟随同步输入,所以PWM3的同步点 = PWM2的同步点是PWM1的CTR = CMPB

    如果PWM2的SYNCOSEL设置的是TB_CTR_CMPB,那么PWM3会在PWM2的CTR = CMPB同步。