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.

[参考译文] TMS320F280025C:PWM 模块未完全同步

Guru**** 2458170 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1064138/tms320f280025c-pwm-modules-not-perfectly-synced

器件型号:TMS320F280025C

您好!

我尝试将 ePWM4_A 和 ePWM7_A 同步、如下代码所示。

这两种模式都设置为递增-递减计数器模式、动作限定器控制寄存器设置为在计数器达到零时切换引脚。

我已启用 ePWM4、以便在 CTR=ZERO 条件下以及通过软件触发时发送 EPWMSYNCOUT 信号、并且 ePWM7的 EPWMSYNCINSEL 寄存器设置为0x04。 此配置在 INIT 函数的末尾附近完成。

对于我的特定应用、我需要发送有限数量的 PWM 信号。

我还有两个模块的 ePWMx_B 在运行--它们的运行频率是 ePWMx_A 引脚的两倍,这是我通过在 CTR=ZERO 和 CTR=PRD 上设置/清除来实现的。

我通过将 CLB 配置为对 ePWM4_B 的上升沿和下降沿进行计数、然后在达到该边沿数后冻结中断中的计数器、从而限制 ePWM 脉冲。 我无法对 ePWMx_A 信号的边沿进行计数的原因是我需要频率加倍的分辨率--有时我可能不得不在 ePWMx_A 的高值之间冻结信号

但是、这两个信号之间似乎存在同步问题。

示波器快照向我们显示了正在发生的确切情况--黄色是 ePWM4_A,紫色是 ePWM7_A 在主循环中、我调用 函数来触发 ePWM4_B 脉冲的(预定义)值(未显示在此快照中)。 当达到该数字时、计数器将被冻结。 经过一个小延迟后、代码再次生成 PWM 信号。 我希望这两个波形看起来完全相同、但它们并不相同。

请帮帮我。

谢谢、此致、

Vishnu

void init(void)
{
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM4 = 1;
    GpioCtrlRegs.GPAGMUX1.bit.GPIO6 = 0x00;
    GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0x01;
    GpioCtrlRegs.GPAGMUX1.bit.GPIO7 = 0x00;
    GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0x01;
    GpioCtrlRegs.GPAQSEL1.bit.GPIO6=0x3;
    GpioCtrlRegs.GPAQSEL1.bit.GPIO7=0x3;
    EDIS;

    EPwm4Regs.TBCTL.bit.CLKDIV = 0x0;
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = 0x1;

    EPwm4Regs.TBCTL.bit.PHSEN=TB_DISABLE;
    EPwm4Regs.TBPHS.bit.TBPHS=0;

    EPwm4Regs.TBCTR=0;
    EPwm4Regs.TBCTL.bit.CTRMODE = TB_FREEZE;

    EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW;

    EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
    EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero

    EPwm4Regs.ETSEL.bit.SOCAEN=0;
    EPwm4Regs.ETSEL.bit.SOCASEL=1;
    EPwm4Regs.ETSOCPS.bit.SOCAPRD2=1;
    EPwm4Regs.ETSEL.bit.SOCAEN=1;

    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM7 = 1;

    GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 0x0;
    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 0x3;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO29 = 0x0;
    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0x3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO28=0x3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO29=0x3;
    EDIS;

    EPwm7Regs.TBCTL.bit.CLKDIV = 0x0;
    EPwm7Regs.TBCTL.bit.HSPCLKDIV = 0x1;

    EPwm7Regs.TBCTL.bit.PHSEN=TB_DISABLE;
    EPwm7Regs.TBPHS.bit.TBPHS=0;

    EPwm7Regs.TBCTR=0;
    EPwm7Regs.TBCTL.bit.CTRMODE = TB_FREEZE;

    EPwm7Regs.TBCTL.bit.PRDLD = TB_SHADOW;

    EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
    EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero

    EPwm7Regs.ETSEL.bit.SOCAEN=0;
    EPwm7Regs.ETSEL.bit.SOCASEL=1;
    EPwm7Regs.ETSOCPS.bit.SOCAPRD2=1;
    EPwm7Regs.ETSEL.bit.SOCAEN=1;

    EPwm7Regs.EPWMXLINK.bit.TBPRDLINK=3;
    EPwm4Regs.EPWMXLINK.bit.TBPRDLINK=6;

    EPwm4Regs.ETPS.bit.INTPSSEL=1;
    EPwm4Regs.ETSEL.bit.INTSEL=0x3;
    EPwm4Regs.ETCNTINITCTL.bit.INTINITEN=1;
    EPwm4Regs.ETCNTINIT.bit.INTINIT=0;

    EPwm4Regs.EPWMSYNCOUTEN.bit.SWEN=1;
    EPwm4Regs.EPWMSYNCOUTEN.bit.ZEROEN=1;
    EPwm7Regs.EPWMSYNCINSEL.bit.SEL=0x04;
    EPwm4Regs.TBCTL.bit.PHSEN=0;
    EPwm7Regs.TBCTL.bit.PHSEN=1;
    EPwm7Regs.TBPHS.bit.TBPHS=0;
}

void generate_pwm(int steps)
{
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    EPwm4Regs.TBPRD = startingPeriod;
    EPwm7Regs.TBPRD = startingPeriod;

    totalSteps=steps;
    resetClbCtr1();
    Clb_writeInterface(CLB1_MATCH2_CTR0_ADDR, steps);


    EPwm4Regs.AQCTLA.bit.ZRO = AQ_TOGGLE;
    EPwm4Regs.AQCTLB.bit.ZRO = AQ_CLEAR;
    EPwm4Regs.AQCTLB.bit.PRD = AQ_SET;
    EPwm7Regs.AQCTLA.bit.ZRO = AQ_TOGGLE;
    EPwm7Regs.AQCTLB.bit.ZRO = AQ_SET;
    EPwm7Regs.AQCTLB.bit.PRD = AQ_CLEAR;
    EPwm7Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
    EPwm4Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
    EPwm4Regs.TBCTL.bit.SWFSYNC=1;

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

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

    您好!

    由于假期休息、主题专家不在办公室、因此请在1月6日前回复。 对给您带来的不便深表歉意。

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

    EPWM7的 TBPHS 是否设置为0? 您希望通过这种方式实现完美的同步?

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

    是的-我认为我没有正确理解 ePWM 同步的工作方式、我不需要强制进行软件同步。  不管怎么说、我在几个地方更改了我的固件、这似乎已经达到了这个目的、所以它与硬件无关-只是一个逻辑错误。

    感谢您的快速响应。

    此致、

    Vishnu