TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28035: 28035在使用的时候出现漏波情况

Part Number:TMS320F28035

Hi  TI 工程师,

我们在使用DSP28035过程中发现, CSFA/CSFB使能DPWM时会出现漏波的情况,请问漏波的原理是什么,我们如何解决这个问题?

下面的代码是CSFA/CSFB的控制,出现的现象如下图(波形为1B与2B);

              if((gVolt_Out>>gVolt_Convert) <= (PERIOD+1))

              {

                     gFreq_Burst_Flag = 1;

                     EALLOW;

                     EPwm1Regs.AQCSFRC.bit.CSFA = EPWM_LOW; 

                     EPwm1Regs.AQCSFRC.bit.CSFB = EPWM_LOW;

                     EPwm2Regs.AQCSFRC.bit.CSFA = EPWM_LOW;

                     EPwm2Regs.AQCSFRC.bit.CSFB = EPWM_LOW;

                     EDIS;

              }

              if(((gVolt_Out>>gVolt_Convert) > (PERIOD+2))&&(gFreq_Burst_Flag == 1))

              {

                     gFreq_Burst_Flag = 0;

                     EALLOW;

                     EPwm1Regs.AQCSFRC.bit.CSFA = EPWM_ENABLE;

                     EPwm1Regs.AQCSFRC.bit.CSFB = EPWM_ENABLE;

                  EPwm2Regs.AQCSFRC.bit.CSFA = EPWM_ENABLE;

                     EPwm2Regs.AQCSFRC.bit.CSFB = EPWM_ENABLE;       

                     EDIS;

              }

在开关驱动时,都有可能出现先使能与后使能不同步的情况,并且1A/2A、1B/2B都可能出现。

 

程序中PWM的初始配置如下;

 

void InitEPwm1()

{

       EPwm1Regs.AQCSFRC.bit.CSFA = EPWM_LOW;

       EPwm1Regs.AQCSFRC.bit.CSFB = EPWM_LOW;

 

       EALLOW;

       EPwm1Regs.TBPRD = gPeriod_Value/2;                // Set timer period

       EPwm1Regs.TBPHS.half.TBPHS = 0x0000;            // Phase is 0

       EPwm1Regs.TBCTR = 0x0000;                       // Clear counter

 

       // Setup TBCLK

       EPwm1Regs.TBCTL.bit.CTRMODE   = TB_COUNT_UPDOWN;    // Count up/down

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

       EPwm1Regs.TBCTL.bit.PRDLD     = TB_SHADOW;

       EPwm1Regs.TBCTL.bit.SYNCOSEL  = TB_SYNC_IN;

       EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;        // Clock ratio to SYSCLKOUT

       EPwm1Regs.TBCTL.bit.CLKDIV    = TB_DIV1;

 

       EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;     // Load registers every ZERO

       EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

       EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

       EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;

 

       // Setup compare

       EPwm1Regs.CMPA.half.CMPA = gPeriod_Value/2 – gDeadTime_Value1;

       EPwm1Regs.CMPB           = gDeadTime_Value1;

 

       // Set action

       EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;           

       EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;    

 

       EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;            

       EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;        

 

       //****************************************************************************************

       //TZ部分,用COMP1触发,用来做逐波限流功能

    EPwm1Regs.TZSEL.bit.OSHT2 = 1;

       EPwm1Regs.TZSEL.bit.CBC2  = 1;

 

       EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;

       EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;

  

       // Enable TZ interrupt

       EPwm1Regs.TZEINT.bit.OST = 1;

 

       /****************************************************************************************/

       //AD触发部分

       EPwm1Regs.ETSEL.bit.SOCAEN = 1;             // Enable SOC on A group

       EPwm1Regs.ETSEL.bit.SOCASEL     = ET_CTRD_CMPA;   // Select SOC from from CPMA on PRD//采样方式

       EPwm1Regs.ETPS.bit.SOCAPRD       = 1;             // Generate pulse on 1st event

 

       EPwm1Regs.ETSEL.bit.SOCBEN = 1;             // Enable SOC on A group

       EPwm1Regs.ETSEL.bit.SOCBSEL     = ET_CTRD_CMPA;   // Select SOC from from CPMA on PRD//采样方式

       EPwm1Regs.ETPS.bit.SOCBPRD       = 1;            // Generate pulse on 1st event // ET_CTRD_CMPB

 

       EDIS;

}

 

 

void InitEPwm2()

{

       EPwm2Regs.AQCSFRC.bit.CSFA = EPWM_LOW;

       EPwm2Regs.AQCSFRC.bit.CSFB = EPWM_LOW;

 

       EALLOW;

       EPwm2Regs.TBPRD = gPeriod_Value/2;                // Set timer period

       EPwm2Regs.TBPHS.half.TBPHS = 0x0000;            // Phase is 0

       EPwm2Regs.TBCTR = 0x0000;                       // Clear counter

 

       // Setup TBCLK

       EPwm2Regs.TBCTL.bit.CTRMODE   = TB_COUNT_UPDOWN;    // Count up/down

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

       EPwm2Regs.TBCTL.bit.PRDLD     = TB_SHADOW;

       EPwm2Regs.TBCTL.bit.SYNCOSEL  = TB_SYNC_IN;

       EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;        // Clock ratio to SYSCLKOUT

       EPwm2Regs.TBCTL.bit.CLKDIV    = TB_DIV1;

 

       EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;     // Load registers every ZERO

       EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

       EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

       EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;

 

       // Setup compare

       EPwm2Regs.CMPA.half.CMPA = gPeriod_Value/2 – gDeadTime_Value2;

       EPwm2Regs.CMPB           = gDeadTime_Value2;

 

       // Set actions

       EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;           

       EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;    

 

       EPwm2Regs.AQCTLB.bit.PRD = AQ_SET;           

       EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;     

 

       //****************************************************************************************

       //TZ部分,用COMP1触发,用来做逐波限流功能(待验证)

    EPwm2Regs.TZSEL.bit.OSHT2 = 1;

       EPwm2Regs.TZSEL.bit.CBC2  = 1;

  

Green Deng:

你好,根据图示,你说的应该是PWM封波不完整吧?这个情况是每次都会出现还是偶尔会出现一次?

,

clark cheng:

偶尔出现,我自己判断是1B/2B使能分别在零点的前后,导致一个有波一个没有,不知道这个猜测对不对。

,

Green Deng:

偶尔出现的话看一下这个帖子的内容是否有帮助:https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/207601/tms320f28062-aqcsfrc 

,

clark cheng:

if((gVolt_Out>>gVolt_Convert) <= (PERIOD+1))
{gFreq_Burst_Flag = 1;EALLOW;EPwm1Regs.AQCSFRC.bit.CSFA = EPWM_LOW;EPwm1Regs.AQCSFRC.bit.CSFB = EPWM_LOW;EPwm2Regs.AQCSFRC.bit.CSFA = EPWM_LOW;EPwm2Regs.AQCSFRC.bit.CSFB = EPWM_LOW;EDIS;
}
if(((gVolt_Out>>gVolt_Convert) > (PERIOD+2))&&(gFreq_Burst_Flag == 1))
{gFreq_Burst_Flag = 0;EALLOW;EPwm1Regs.AQCSFRC.bit.CSFA = EPWM_ENABLE;EPwm1Regs.AQCSFRC.bit.CSFB = EPWM_ENABLE;EPwm2Regs.AQCSFRC.bit.CSFA = EPWM_ENABLE;EPwm2Regs.AQCSFRC.bit.CSFB = EPWM_ENABLE;EDIS;
}

应该和这个没有关系。

我上面的代码是在完成初始化之后开始运行的,中断时间是100us,每隔几个毫秒就会开关CSFA/CSFB寄存器,在每次开关的时候会有概率出现,并且此时操作PWM开关的只有这段代码。

,

clark cheng:

另外,我在CSFA/CSFB使能前后关闭时钟(代码如下),这个问题能够解决,但会引入新的问题。

if((gVolt_Out>>gVolt_Convert) <= (PERIOD+1))
{gFreq_Burst_Flag = 1;EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;EPwm1Regs.AQCSFRC.bit.CSFA = EPWM_LOW;EPwm1Regs.AQCSFRC.bit.CSFB = EPWM_LOW;EPwm2Regs.AQCSFRC.bit.CSFA = EPWM_LOW;EPwm2Regs.AQCSFRC.bit.CSFB = EPWM_LOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;EDIS;
}
if(((gVolt_Out>>gVolt_Convert) > (PERIOD+2))&&(gFreq_Burst_Flag == 1))
{gFreq_Burst_Flag = 0;EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;EPwm1Regs.AQCSFRC.bit.CSFA = EPWM_ENABLE;EPwm1Regs.AQCSFRC.bit.CSFB = EPWM_ENABLE;EPwm2Regs.AQCSFRC.bit.CSFA = EPWM_ENABLE;EPwm2Regs.AQCSFRC.bit.CSFB = EPWM_ENABLE;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;EDIS;
}

,

Green Deng:

你好,我就你的问题与我们这边的同事交流了一下,大致上也没有检查出问题所在。所以为了更有效解决你的问题,我建议将帖子发布到英文E2E论坛上问一下,英文论坛有更资深的FAE和BU可以为你提供支持:

https://e2e.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum 

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28035: 28035在使用的时候出现漏波情况
分享到: 更多 (0)