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.

[参考译文] CCS/TMS320F2.8075万:C2000同步生成PWM

Guru**** 2582405 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/653461/ccs-tms320f28075-c2000-simultaneous-generation-of-pwm

部件号:TMS320F2.8075万

工具/软件:Code Composer Studio

大家好,

我是TI Piccolo 32位控制器的新技术。 我将其用于Power Electronics控制应用程序。

这里我需要生成精确的PWM信号来控制ZVS全桥整流器。需要生成4个信号(PWM2A,PWM2B,PWM6A,PWM6B)。 PWM2B和PWM6B分别是PWM2A和PWM6A的补充信号。

我已经为相同的代码执行了以下代码:

void PWMHandler_s_vdPWM_Turn打开(void)


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

   PWM_Handler_init();


   PWM_Handler_config (2,PWM_base_FREQ_microsec);
   PWM_Handler_config (6,PWM_base_FREQ_microsec);

   EALLOW;
   CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1U;
   EDIS;
}

void PWM_Handler_config (UINT16 u16ChannelID,UINT16 u16Period)


   UINT16 PWM_TBPRD;

   (* ePWM[u16ChannelID]).TBCTL.bit.PRDLD =(UINT16) TB_shadow;
   PWM_TBPRD =(UINT16)((u16Period *(float)(TB_Clock/2)));

   (* ePWM[u16ChannelID]).TBPRD = PWM_TBPRD;
   (* ePWM[u16ChannelID]).TBCTL.bit.CTRMODE =(UINT16) TB_COUNT_UDOWN;
   (* ePWM[u16ChannelID]).TBCTL.bit.HSPCLKDIV =(UINT16) TB_DIV1;
   (* ePWM[u16ChannelID]).TBCTL.bit.CLKDIV =(UINT16) TB_DIV1;

   /*以确保PWM在软件halt *下继续运行
   (* ePWM[u16ChannelID]).TBCTL.bit.FREE_SOFT = 2U;

     (* ePWM[u16ChannelID]).TBCTL.bit.PHSEN =(UINT16) TB_ENABLE;
     (* ePWM[u16ChannelID]).TBCTL.bit.SYNCOSEL =(UINT16) TB_SYNC_IN;

   /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   (* ePWM[u16ChannelID]).ETSEL.bit.SOCAEN = 1U;
   (* ePWM[u16ChannelID]).ETPS.bit.SOCPSSEL = 1U;
   (* ePWM[u16ChannelID]).ETSOCPS.bit.SOCAPRD2 = 5U;

   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   /* PWM2 */
   IF (2 == u16ChannelID){

      /*用于输出a */
         EPwm2Regs.AQCTLA.bit.CAU =(UINT16) AQ_SET;       
         EPwm2Regs.AQCTLA.bit.CBU =(UINT16) AQ_NO_ACTION;    
         EPwm2Regs.AQCTLA.bit.CBD =(UINT16) AQ_CLEAR;       
         EPwm2Regs.AQCTLA.bit.CAD =(UINT16) AQ_NO_ACTION;    
         EPwm2Regs.CMPCTL.bit.SHDWAMODE =(UINT16) CC_SHAME;        

         /*用于输出B */
         EPwm2Regs.AQCTLB.bit.CAU =(UINT16) AQ_CLEAR;       
         EPwm2Regs.AQCTLB.bit.CBU =(UINT16) AQ_NO_ACTION;
         EPwm2Regs.AQCTLB.bit.CBD =(UINT16) AQ_SET;
         EPwm2Regs.AQCTLB.bit.CAD =(UINT16) AQ_NO_ACTION;
         EPwm2Regs.CMPCTL.bit.SHDWBMODE =(UINT16) CC_SHADO;
      }
     

      /* PWM6 */
      IF (6 == u16ChannelID){

         /*用于输出a */
         EPwm6Regs.AQCTLA.bit.CAU =(UINT16) AQ_NO_ACTION;          
         EPwm6Regs.AQCTLA.bit.CBU =(UINT16) AQ_SET;       
         EPwm6Regs.AQCTLA.bit.CBD =(UINT16) AQ_NO_ACTION;          
         EPwm6Regs.AQCTLA.bit.CAD =(UINT16) AQ_CLEAR;       
         EPwm6Regs.CMPCTL.bit.SHDWAMODE =(UINT16) CC_SHAME;        

         /*用于输出B */
         EPwm6Regs.AQCTLB.bit.CAU =(UINT16) AQ_NO_ACTION;
         EPwm6Regs.AQCTLB.bit.CBU =(UINT16) AQ_CLEAR;
         EPwm6Regs.AQCTLB.bit.CBD =(UINT16) AQ_NO_ACTION;
         EPwm6Regs.AQCTLB.bit.CAD =(UINT16) AQ_SET;
         EPwm6Regs.CMPCTL.bit.SHDWBMODE =(UINT16) CC_SHADO;
   }


   /*死区插入*/
   (* ePWM[u16ChannelID]).DBCTL.bit.out模式= DB_FULL启用;
   (* ePWM[u16ChannelID]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
   (* ePWM[u16ChannelID]).DBCTL.bit.in_mode = DBA_All;
   (*ePWM[u16ChannelID]).DBRED.bit.DBRED = 200u;
   (* ePWM[u16ChannelID]).DBFED.bit.DBFED = 200u;


}

通过这种方式,我能够生成所需的PWM,并在互补信号之间生成所需的死区。我的问题是PWM信号何时开始。我希望所有信号都能同时开始,但我看到信号PWM6A和PWM6B的分段出现延迟(~100ms)...什么 我观察到PWM2A和PWM2B一起开始。 同时,信号PWM6B会变为高电平(我推测是因为死区),但不会再切换100毫秒。请从示波器中查找屏幕截图:

由于我正在使用这些PWM以较高的电压控制电源设备,因此在启动时这种行为会导致许多问题(高浪涌等)...有人能告诉我我我在这里做了什么???

提前感谢您的支持,

此致

西山

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

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

    大家好,

    以上代码中有以下小错误。请参阅以下代码:

    void PWMHandler_s_vdPWM_Turn打开(void)

      EALLOW;

      CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;

      EDIS;

      PWM_Handler_init();

      PWM_Handler_config (1,PWM_base_FREQ_microsec);

      PWM_Handler_config (2,PWM_base_FREQ_microsec);

      PWM_Handler_config (6,PWM_base_FREQ_microsec);

      EALLOW;

      CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1U;

      EDIS;

    }

    void PWM_Handler_config (UINT16 u16ChannelID,UINT16 u16Period)

      UINT16 PWM_TBPRD;

      (* ePWM[u16ChannelID]).TBCTL.bit.PRDLD =(UINT16) TB_shadow;

      PWM_TBPRD =(UINT16)((u16Period *(float)(TB_Clock/2)));

      (* ePWM[u16ChannelID]).TBPRD = PWM_TBPRD;

      (* ePWM[u16ChannelID]).TBCTL.bit.CTRMODE =(UINT16) TB_COUNT_UDOWN;

      (* ePWM[u16ChannelID]).TBCTL.bit.HSPCLKDIV =(UINT16) TB_DIV1;

      (* ePWM[u16ChannelID]).TBCTL.bit.CLKDIV =(UINT16) TB_DIV1;

      /*以确保PWM在软件halt *下继续运行

      (* ePWM[u16ChannelID]).TBCTL.bit.FREE_SOFT = 2U;

       IF (1 == u16ChannelID)

       {

          (* ePWM[u16ChannelID]).TBCTL.bit.PHSEN =(UINT16) TB_DISABLE;

          (* ePWM[u16ChannelID]).TBCTL.bit.SYNCOSEL =(UINT16) TB_CTR_ZERO;

       }

       否则

       {

          (* ePWM[u16ChannelID]).TBCTL.bit.PHSEN =(UINT16) TB_ENABLE;

          (* ePWM[u16ChannelID]).TBCTL.bit.SYNCOSEL =(UINT16) TB_SYNC_IN;

       }

      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      (* ePWM[u16ChannelID]).ETSEL.bit.SOCAEN = 1U;

      (* ePWM[u16ChannelID]).ETPS.bit.SOCPSSEL = 1U;

      (* ePWM[u16ChannelID]).ETSOCPS.bit.SOCAPRD2 = 5U;

      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      /* PWM2 */

      IF (2 == u16ChannelID){

          /*用于输出a */

          EPwm2Regs.AQCTLA.bit.CAU =(UINT16) AQ_SET;     

          EPwm2Regs.AQCTLA.bit.CBU =(UINT16) AQ_NO_ACTION;   

          EPwm2Regs.AQCTLA.bit.CBD =(UINT16) AQ_CLEAR;     

          EPwm2Regs.AQCTLA.bit.CAD =(UINT16) AQ_NO_ACTION;   

          EPwm2Regs.CMPCTL.bit.SHDWAMODE =(UINT16) CC_SHAME;     

          /*用于输出B */

          EPwm2Regs.AQCTLB.bit.CAU =(UINT16) AQ_CLEAR;     

          EPwm2Regs.AQCTLB.bit.CBU =(UINT16) AQ_NO_ACTION;

          EPwm2Regs.AQCTLB.bit.CBD =(UINT16) AQ_SET;

          EPwm2Regs.AQCTLB.bit.CAD =(UINT16) AQ_NO_ACTION;

          EPwm2Regs.CMPCTL.bit.SHDWBMODE =(UINT16) CC_SHADO;

        }

        /* PWM6 */

        IF (6 == u16ChannelID){

          /*用于输出a */

          EPwm6Regs.AQCTLA.bit.CAU =(UINT16) AQ_NO_ACTION;       

          EPwm6Regs.AQCTLA.bit.CBU =(UINT16) AQ_SET;     

          EPwm6Regs.AQCTLA.bit.CBD =(UINT16) AQ_NO_ACTION;       

          EPwm6Regs.AQCTLA.bit.CAD =(UINT16) AQ_CLEAR;     

          EPwm6Regs.CMPCTL.bit.SHDWAMODE =(UINT16) CC_SHAME;     

          /*用于输出B */

          EPwm6Regs.AQCTLB.bit.CAU =(UINT16) AQ_NO_ACTION;

          EPwm6Regs.AQCTLB.bit.CBU =(UINT16) AQ_CLEAR;

          EPwm6Regs.AQCTLB.bit.CBD =(UINT16) AQ_NO_ACTION;

          EPwm6Regs.AQCTLB.bit.CAD =(UINT16) AQ_SET;

          EPwm6Regs.CMPCTL.bit.SHDWBMODE =(UINT16) CC_SHADO;

      }

      /*死区插入*/

      (* ePWM[u16ChannelID]).DBCTL.bit.out模式= DB_FULL启用;

      (* ePWM[u16ChannelID]).DBCTL.bit.POLSEL = DB_ACTV_HIC;

      (* ePWM[u16ChannelID]).DBCTL.bit.in_mode = DBA_All;

      (*ePWM[u16ChannelID]).DBRED.bit.DBRED = 200u;

      (* ePWM[u16ChannelID]).DBFED.bit.DBFED = 200u;

    }

    还请查找示波器输出:

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

    您好,Nishant,

    您可以尝试以下几种方法。  

    1.由于这是一个固定频率功率级,您可以使用即时负载一段时间。 如果您还计划更改频率,则可以在初始化时立即加载从属PWM周期,然后在代码中稍后进行更改。

    2.确保初始化两个PWM的PWM计数器。 如果它们应该从相移开始,并且计数器是使用此相移进行初始化的,请确保立即为从属PWM加载周期。

    这应该可以解决问题。

    Hrishi

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

    感谢您的建议。
    我的系统只需要固定频率。我已经完成了您建议的操作,将apt值应用到ePWM通道的A和B比较寄存器。

    关于第2点...是的,我正在按照您的建议行事...

    在上面所示的附加波形中,信号本身的启动存在延迟。一旦开始,就没有相移或任何东西...此延迟大约为100ms ...根据我的理解,我无法将其与相移或相关联 任何其他寄存器。此行为仅在PWM启动期间观察...所有4个PWM信号启动后,我能够控制信号。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    西山

    请将从PWM的周期寄存器的阴影负载行为更改为立即加载  

    (* ePWM[u16ChannelID]).TBCTL.bit.PRDLD =(UINT16) TB_shadow;

    立即加载将确保期间值在开始时生效。

    Hrishi