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万:用于ZVS FB的PWM

Guru**** 2589265 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/655251/ccs-tms320f28075-pwm-for-zvs-fb

部件号:TMS320F2.8075万
主题中讨论的其他部件: C2000WARE

工具/软件:Code Composer Studio

您好,

我正在为ZVS全桥应用开发TMS320f2.8075万 32位微控制器。

我使用了两组PWM (PWM2A,PWM2B和PWM6A,PWM6B)来生成相移PWM。 PWM2B和6B分别是PWM2A和6A的互补信号。 PWM2A和6A对应于顶部开关,PWM2B和6B对应于底部开关。脉冲宽度是使用CMP寄存器为50 % 占空比设置的。 TBPHS寄存器用于相移PWM。 我发现当PWM打开时,观察到的第一个脉冲小于50 % 占空比,PWM2A和PWM6A的脉冲也不同(见下图)。我尝试打开不同的时间,每个实例显示不同的行为。 请注意,此行为仅在PWM的第一个周期中观察到。  有人能告诉我什么可能出错了吗? 以下是用于PWM模块的配置:

EPwm2Regs.TBPRD = 1200;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;
EPwm2Regs.TBCTL.bit.PRDLD = TB_shadow;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//高速时基时钟预刻度位,TBCLK = EPWMCLK /(HSPCLKDIV x CLKDIV),PWM周期= 2×TBPRD×TBCLK
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.FREE_SOFT = 2U;

EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

EPwm2Regs.CMPA.bit.CMPA = 300;  
EPwm2Regs.CMPB.bit.CMPB = 300;

EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm2Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
EPwm2Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm2Regs.CMPCTL.bit.LOADASYNC=CC_CTR_ZERO;  
EPwm2Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZE;

EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CBU = AQ_NO_ACTION;
EPwm2Regs.AQCTLB.bit.CBD = AQ_NO_ACTION;
EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm2Regs.CMPCTL.bit.LOADASYNC=CC_CTR_ZERO;  
EPwm2Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZE;  

EPwm6Regs.TBPRD = PWM_TBPRD;
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;
EPwm6Regs.TBCTL.bit.PRDLD = TB_shadow;
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//高速时基时钟预刻度位,TBCLK = EPWMCLK /(HSPCLKDIV x CLKDIV),PWM周期= 2×TBPRD×TBCLK
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm6Regs.TBCTL.bit.FREE_SOFT = 2U;

EPwm6Regs.TBCTL.bit.PHSEN = TB_ENable;
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

EPwm6Regs.CMPA.bit.CMPA = 300;
EPwm6Regs.CMPB.bit.CMPB = 300;

EPwm6Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm6Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm6Regs.CMPCTL.bit.LOADASYNC=CC_CTR_ZERO;  
EPwm6Regs.CMPCTL.bit.LOADAMODE=CC_CTR_PRD;  
/*用于输出B */
//操作限定符子模块寄存器
EPwm6Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm6Regs.AQCTLB.bit.CBU = AQ_NO_ACTION;
EPwm6Regs.AQCTLB.bit.CBD = AQ_NO_ACTION;
EPwm6Regs.AQCTLB.bit.CAD =AQ_set;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm6Regs.CMPCTL.bit.LOADASYNC=CC_CTR_ZERO;  
EPwm6Regs.CMPCTL.bit.LOADAMODE=CC_CTR_PRD;  

我正在更新CLA中断中PWM 6的TBPHS寄存器。

图:M是C1和C3之间的差异。

提前感谢!

此致,

Anjana

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

    您是否将ePWM配置包装在中

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

    //<ePWM配置>

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

    这将确保ePWM在配置时不会运行,还将确保所有ePWM一起启动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Devin,

    感谢您的回复。
    是的,我已经这样做了。下面是我用来称呼PWMs的顺序。

    PWM_OFF();//我在这里设置TBCLKSYNC=0;
    PWM2_Config();//配置PWM2
    PWM6_Config();//配置PWM6
    PWM_ON();//此处我设置TBCLKSYNC=1;

    10毫秒延迟后,
    PWM_INIT();//为PWM模块启用时钟

    我观察到的另一点是,如果PWM2的GPIO引脚先进行多路复用,则PWM2将在PWM6之前启动,反之亦然。

    那么,是否预计会出现这种初始延迟呢?

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

    你好,Anjana,

    通常我认为TBCLKSYNC=1是进程中的最后一步,当您希望ePWM启动时,将立即写入。  我想您希望在触发最后一步之前设置GPIO多路复用。

    例如,在c2000ware ePWM_UP_AQ_cpu01.c示例中,顺序为:

    • 启用ePWM时钟
      • 例如,CpuSysRegs.PCLKCR2.bit.EPWM1=1;
    • 设置ePWM GPIO
      • 例如,Initepwm1gpio();
    • 映射ePWM ISR
    • CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    • ePWM外设配置
      • 例如   ,InitEPwm1Example();
    • CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    • 启用ISR标志和全局ISR

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

    很抱歉回复延迟。

    我尝试了您上面提到的启动ePWM的顺序。 现在PWM2和PWM6之间有300ns的延迟。 两者的脉冲宽度或多或少相同。
    如果我们使用相移寄存器,使用死区模块是否有任何限制?

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

    你好,Anjana,

    这似乎更像是初始化问题,而不是模块的限制。 设置TBCLKSYNC=1并向我们发送显示PWM的波形后,是否可以切换GPIO?

    您如何将EPWM2的SyncOut路由到EPWM6的syncdin以触发相位负载? 请参阅设备TRM中的图"时基计数器同步方案"。

    此致,
    克里斯

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

    由于我们尚未收到您的回复,我们希望您的问题得到解决,我们将开始关闭此线程的流程。 如果您的问题仍在继续,您可以停止该流程并发布您的回复。

    感谢您选择TI。

    此致,
    克里斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kris,
    很抱歉回复太晚。

    上述问题已部分解决。

    我已使用PWM 1作为主中继器,使用PWM2和PWM6作为从属设备,并按如下所示进行配置。

    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENable;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

    EPwm6Regs.TBCTL.bit.PHSEN = TB_ENable;
    EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

    当我检查PWM输出时,在闭环模式下运行硬件时,有一个脉冲丢失的情况。

    上述配置详细信息是否是您要查找的?

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

    上述问题已部分解决。

    我已使用PWM 1作为主中继器,使用PWM2和PWM6作为从属设备,并按如下所示进行配置。

    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENable;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

    EPwm6Regs.TBCTL.bit.PHSEN = TB_ENable;
    EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

    当我检查PWM输出时,在闭环模式下运行硬件时,有一个脉冲丢失的情况。

    上述配置详细信息是否是您要查找的?

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

    不完全是。 我正在寻找您如何对SYNCSELECT寄存器进行编程。 您可以在1994页上找到详细信息:

    www.ti.com/.../spruhm8g.pdf

    这将确定同步输出在ePWM模块之间的路由方式。 有关连接的可视化信息,请参阅第2036页上的图16-8时基计数器同步方案。

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

    我没有使用SYNCSELECT寄存器。 我浏览了您上面提到的详细信息,但对此有疑问。
    EPWM1和EPWM2位于同一同步链中,但对于EPWM6,我是否应该使用EPWM4SYNCOUT作为EPWM4和6进行路由,因为它们位于同一链中?
    从控制器的参考手册中,我了解到使用EPwmxRegs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;进行从属配置。是否需要配置SYNCOSEL附加的SYNCSELECT?

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

    SYNCOSEL寄存器配置特定ePWM模块的SYNC OUT信号。 SYNCSELECT寄存器(与所引用的图一起使用)控制来自ePWM的SYNCO信号的路由位置,因此,控制每个模块在其同步连接时看到的内容。

    对于EPWM1和EPWM2,它不应该像您所说的那样发挥作用。 对于EPWM6,可以使用SYNCSELECT配置EPWM1的SYNCO以转至EPWM4链。 如果您尚未配置EPWM4和5,我认为默认值是同步将通过(但您可能需要对此进行一些实验)。 如果EPWM3可用并且您希望保持简单,则可以将EPWM6代码迁移到EPWM3。 任何这些选项都应该正常工作。

    要回答您的问题,您需要使用EPWM4SYNCOUT来处理EPWM6的SYNCI,因为它位于EPWM4链中。

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

    非常感谢! 我真的很困惑PWM模块的配置。 让我检查PWM3是否可用,否则将尝试EPWM4SYNCOUT选项。

    此致,
    Anjana