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/TMS320C28346:软件强制同步脉冲[SWFSYNC]:操作方法

Guru**** 2604225 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/672473/ccs-tms320c28346-software-forced-synchronization-pulse-swfsync-how-to

器件型号:TMS320C28346

工具/软件:Code Composer Studio

大家好、  

我有三个级联 ePWM 模块、它们彼此同步并去相。 我希望第一个 PWM 与软件同步  

更具体地说:每次 PLL 产生的角度复位时、我想在 ePWM1中创建一个软件事件、然后它将相应地与另外两个 ePWM 同步。

PLL 本身和复位功能在 C++中编程。

我还编写了一个用于设置 PWM 的类。 Voila:

触发::触发(volatile struct ePWM_regs * APwmRegs、unsigned int PWM_PRD、unsigned int PWM_PHASE、bool PWM_SYNC)
{

ThePwm=APwmRegs;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0; //禁用 ePWM 时钟
EDIS;

thePwm->TBPRD=PWM_PRD; //设置计时器周期
ThePwm->TBCTR = 0; //将 TB 计数器清零重置为0

ThePwm->CMPA.half.CMPA = ThePwm->TBPRD; // CMPA 的初始占空比(RS+、ST+、TR+)
PWM->CMPB = 0; // CMPB 的初始占空比(Rs-、ST-、TR-)
thePwm->TBPHS.half.TBPHS = PWM_PHASE; //相位寄存器值
thePwm->TBCTL.bit.CTRMODE=TB_COUNT_UP; //将三角波形设置为向上计数

thePwm->TBCTL.bit.PHSEN = TB_ENABLE; //启用加载相位寄存器值
thePwm->TBCTL.bit.SYNCOSEL=TB_SYNC_IN; //同步

thePwm->TBCTL.bit.PRDLD=TB_SHADOW; //为句点寄存器启用影子寄存器
pwm->CMPCTL.bit.SHDWAMODE=CC_SHADOD; //为 CMPA 启用阴影
pwm->CMPCTL.bit.SHDWBMODE=CC_SHADOD; //为 CMPB 启用阴影
pwm->CMPCTL.bit.LOADAMODE=CC_CTR_ZERO; // ePWMA 的加载基准-在零
pwm->CMPCTL.bit.LOADBMODE=CC_CTR_ZERO; // ePWMB 的加载基准-在零

//TBCLK = SYSCLKOUT /(HSPCLKDIV * CLKDIV)= 300MHz /(12 * 8)= 3.125MHz
ThePwm->TBCTL.bit.HSPCLKDIV = 0x6; //HSPCLKDIV:12分频
PWM->TBCTL.bit.CLKDIV = 0x3; // CLKDIV:除以8

//禁用操作限定符- AQ_NO_ACTION
thePwm->AQCTLA.bit.CAU = AQ_NO_ACTION;
thePwm->AQCTLB.bit.CBU = AQ_NO_ACTION;

pwm->ETSEL.bit.inten = 1; //启用 ePWM 中断
thePwm->ETPS.bit.INTPRD = et_1st; //生成中断所需的事件数(此处:每个事件)
thePwm->ETSEL.bit.INTSEL = et_CTR_ZERO; //活动时触发零中断
PWM->ETCLR.bit.INT = 1; //清除 INT 标志(如果有)

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1; //启用 ePWM 时钟
EDIS;

} 
空触发::同步(bool zeroCrossing_)
{
ThePwm->TBCTL.bit.SWFSYNC = zeroCrossing_; //过零是每次角度复位(再次从2pi 到0)
时返回1或0的函数} 

您能否说明我未能创建 SWFSYNC 事件的可能原因?

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

    Zoi、

    为了使 SWFSYNC 生效、您必须设置和启用同步链。 有关如何执行该操作的完整详细信息、请 参阅 ePWM 用户指南。

    • 确保您已启用 PHSEN
    • 你有一个值被载入 TBPHS
    • 您必须正确配置 EPWMxSYNCO 和 EPWNxSYNCI。
    • 此外、为了使 SWFSYNC 生效、您必须设置 SYNCOSEL = 00。


    此致、
    Cody  

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

    Cody、  

    感谢您的评论。 我已经严格遵循了 ePWM 用户指南中的说明。 如何配置 EPWMxSYNCO 和 EPWMxSYNCI? 我不打算使用硬件同步、因此我只需要 ePWM1的 SWFSYNC。

    在示波器中、我看到我的同步信号和中断调用彼此异步。

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

    Zoi、

    您需要查看用户指南中的"时基计数器同步方案"图。 它们描述了 PWM 的连接方式。 例如、您可以配置 EPWM1SYNCO 和 EPWM2SYNCI 以允许同步这两个 PWM。 您可以使用 SYNCOSEL 和 SYNCIEL 配置 SYNCI 和 SYNCO。

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Zoi、
    同步 PWM 时是否仍有问题?

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

    此致、
    Zoi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最后、问题是由继承问题引起的(例如、如何调用中断内部的函数)。