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.

TMS320F28035: pwm1与pwm2无法完全同步,总是有固定相位差

Part Number: TMS320F28035

使用28035两路pwm1与pwm2,

增减计数模式,

AQCTLA.BIT.ZRO=AQ_set;

AQCTLA.BIT.CAU=AQ_CLEAR;

PWM1.TBCTL.BIT.PHSEN=TB_DISABLE;

PWM1.TBCTL.BIT.SYNCOSEL=TB_CTR_ZERO

PWM2.TBCTL.BIT.PHSEN=TB_ENABLE;

PWM2.TBCTL.BIT.SYNCOSEL=TB_SYNC_IN

生成的pwm1A与pwm2A不能完全同步,pwm2之后大概52ns的时间,请问是什么原因造成的,谢谢!

  • pwm2滞后pwm1大概52ns时间

  • 你好,工程师将在工作时间回复你的问题。

  • 你好,看配置没看出来有什么问题,你可以对比一下芯片TRM中第290页的同步配置example“Example 3-9. Code Snippet for Configuration in Figure 3-56”,看一下有什么不同的地方:www.ti.com.cn/.../sprui10.pdf

  • 你好,就是参考上面的设计例程,包括controlsuilt里的例程。发出来的波形不是完全对齐的。是不是在经过这几个寄存器配置后有延时呢。用的是外部有源晶振。从DSP出来经过一个74HC245就没有其他电路了。你能测试出这个现象吗?下面是配置代码。

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    //PWM增计数模式

    (*ePWM[1]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //TB_COUNT_UPDOWN;
    (*ePWM[1]).TBCTL.bit.PRDLD = TB_SHADOW; 
    (*ePWM[1]).TBCTL.bit.PHSEN = TB_DISABLE;
    (*ePWM[1]).TBCTL.bit.SYNCOSEL = 1;
    (*ePWM[1]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (*ePWM[1]).TBCTL.bit.CLKDIV = TB_DIV1; 

    (*ePWM[1]).TBPRD = period/2; 
    (*ePWM[1]).CMPA.half.CMPA = 16; 
    (*ePWM[1]).CMPA.half.CMPAHR = 0; 
    (*ePWM[1]).CMPB = period/2-16; 
    (*ePWM[1]).TBPHS.all = 0;
    (*ePWM[1]).TBCTR = 0;
    (*ePWM[1]).DBFED = 0;
    (*ePWM[1]).DBRED = 0;

    (*ePWM[1]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    (*ePWM[1]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; 
    (*ePWM[1]).CMPCTL.bit.SHDWAMODE = CC_SHADOW; 
    (*ePWM[1]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    (*ePWM[1]).AQCTLA.bit.ZRO = AQ_SET; 
    (*ePWM[1]).AQCTLA.bit.CAU = AQ_CLEAR; 
    (*ePWM[1]).AQCTLB.bit.CBD = AQ_CLEAR; 
    (*ePWM[1]).AQCTLB.bit.PRD = AQ_SET; 

    (*ePWM[1]).DBCTL.bit.IN_MODE = 0; //
    (*ePWM[1]).DBCTL.bit.POLSEL = 0;//
    (*ePWM[1]).DBCTL.bit.OUT_MODE = 2; //

    (*ePWM[1]).AQSFRC.bit.RLDCSF = 3; 

    //PWM2增计数模式

    (*ePWM[2]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; 
    (*ePWM[2]).TBCTL.bit.PHSEN = TB_ENABLE; 
    (*ePWM[2]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    (*ePWM[2]).TBCTL.bit.HSPCLKDIV = TB_DIV1; 
    (*ePWM[2]).TBCTL.bit.CLKDIV = TB_DIV1; 
    (*ePWM[2]).TBCTL.bit.PRDLD = TB_SHADOW; 
    //(*ePWM[2]).TBCTL.bit.PHSDIR = TB_UP;

    (*ePWM[2]).TBPRD = period/2;
    (*ePWM[2]).CMPA.half.CMPA = period/2; 
    (*ePWM[2]).CMPA.half.CMPAHR = 0; 
    (*ePWM[2]).CMPB = 0; 
    (*ePWM[2]).TBPHS.half.TBPHS = 0; 
    (*ePWM[2]).TBCTR = 0;

    (*ePWM[2]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    (*ePWM[2]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; 
    (*ePWM[2]).CMPCTL.bit.SHDWAMODE = CC_SHADOW; 
    (*ePWM[2]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    (*ePWM[2]).AQCTLA.bit.ZRO = AQ_SET; 
    (*ePWM[2]).AQCTLA.bit.CAU = AQ_CLEAR; 
    (*ePWM[2]).AQCTLB.bit.CBD = AQ_CLEAR; 
    (*ePWM[2]).AQCTLB.bit.PRD = AQ_SET; 

    (*ePWM[2]).DBCTL.bit.IN_MODE = DBA_ALL;
    (*ePWM[2]).DBCTL.bit.POLSEL = DB_ACTV_HIC;//DB_ACTV_HIC; 
    (*ePWM[2]).DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //

    (*ePWM[2]).DBFED = 0;
    (*ePWM[2]).DBRED = 0;
    (*ePWM[2]).AQSFRC.bit.RLDCSF = 3; 

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//必要配置结束后使能同步信号
    EDIS;

  • 你好,确认一下你这边测试到的延迟是52ns?

    根据主频60MHz算的话一个时钟周期是16.7ns,52ns应该是3个时钟周期多点,这样的话还算是正常的同步延时。

    可以通过:

    EPwm1Regs.TBPHS.half.TBPHS=3;

    这样设置后可以补偿同步延迟的3个周期。可能在调试的时候回发现并不完全是3个周期,每个PWM都可以根据实际情况调整,因为这也会被外部电路影响.

  • 也就是说按照例程配置也不能完全同步,pwm1A和pwm2A的相位延时是存在的,需要靠相位寄存器修正

  • 是的,理论上也是这样的,因为信号是从PWM1传送到PWM2的,肯定会有一个机械延时。