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.

[参考译文] TMS320F28377S:使用 EPWMXLINK 链接 ePWM10和 ePWM11时出现问题

Guru**** 2540720 points
Other Parts Discussed in Thread: TMS320F28377S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/623622/tms320f28377s-issue-linking-epwm10-and-epwm11-using-epwmxlink

器件型号:TMS320F28377S

大家好、

我有一个小问题。 我使用 TMS320F28377S 来驱动5 H 桥。 每个桥都需要4个 PWM 信号、这些信号具有一定的死区时间、H 桥两个桥臂之间的相移为180°。

我将为每个 H 桥连接两个 ePWM 模块的 CMPA 寄存器(EPWMXLINK.BIT.CMPALINK),这样我就可以只对一个 ePWM 进行编程,并且更改将对两个桥臂都生效。

我将使用 CLA 来计算和更新我的每个 H 桥和连接的 ePWM 模块的占空比。

这对于我的4个 H 桥来说是完美的。 它们使用 ePWM1/2、ePWM3/4、ePWM6/7和 ePWM8/9。 所以这里没有问题。

但链接不适用于 ePWM10/11。 CLA 更新 ePWM10的 CMPA 寄存器的值、对于所有其他 ePWM 对、我也希望反映 ePWM11中的新值、但它不会。

我有一个配置例程、用于启动时的所有 PWM 模块。 我只为每个需要配置的 PWM 模块提供不同的指针。 通过查看 EPWM11.EPWMXLINK.BIT.CMPALINK 寄存器、我可以看到该配置符合预期并链接到 ePWM10 (= 0x09)。

有人想知道为什么它适用于所有的 ePWM 对、而不是10/11?

谢谢、

Jens

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

    您能否发布所有 ePWM 配置代码?

    出于测试目的、您是否尝试将 EPWM10链接到任何非11的 PWM? 和 EPWM11之间的任何 PWM 不是10? 我们没有听说过这方面的任何问题、因此我怀疑这是某个地方的配置问题。

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

    您好、Kris、

    感谢您的回复。 我还没有尝试将 ePWM11链接到除10以外的任何其他模块。 这可能是我应该做的事情、只看发生了什么。 同时、这里是我的配置代码:

    #define EPWM1_LINK 0x00
    #define EPWM2_LINK 0x01
    #define EPWM3_LINK 0x02
    #define EPWM4_LINK 0x03
    #define EPWM5_LINK 0x04
    #define EPWM6_LINK 0x05
    #define EPWM7_LINK 0x06
    #define EPWM8_LINK 0x07
    #define EPWM9_LINK 0x08
    #define EPWM10_LINK 0x09
    #define EPWM11_LINK 0x0A
    #define EPWM12_LINK 0x0B
    
    void pwmInitModules (void)
    {
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;
    
    /*所有 PWM 模块都使用相同的初始化例程,其中包含一些参数*/
    _pwmInitModuleX (&EPwm1Regs、ePWM_PHASE_0DEG、EPWM1_LINK);
    _pwmInitModuleX (&EPwm2Regs、ePWM_PHASE_180deg、EPWM1_LINK);
    
    _pwmInitModuleX (&EPwm3Regs、ePWM_PHASE_0DEG、EPWM3_LINK);
    _pwmInitModuleX (&EPwm4Regs、ePWM_PHASE_180deg、EPWM3_link);
    
    _pwmInitModuleX (&EPwm6Regs、ePWM_PHASE_0DEG、EPWM6_LINK);
    _pwmInitModuleX (&EPwm7Regs、ePWM_PHASE_180deg、EPWM6_LINK);
    
    _pwmInitModuleX (&EPwm8Regs、ePWM_PHASE_0DEG、EPWM8_LINK);
    _pwmInitModuleX (&EPwm9Regs、ePWM_PHASE_180deg、EPWM8_LINK);
    
    _pwmInitModuleX (&EPwm10Regs、ePWM_PHASE_0DEG、EPWM10_LINK);
    _pwmInitModuleX (&EPwm11Regs、ePWM_PHASE_180deg、EPWM10_LINK);
    
    EPwm2Regs.ETSEL.bit.INTEN = 1; //为 EPWM2启用 INT
    
    EALLOW;
    /*这将一次性启动所有配置的 PWM 时钟*/
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    }
    
    //**@简要配置 ePWM 模块的功能。
    *
    *此函数用于配置 ePWM 模块1-11。 这些 PWM 模块使用
    *完全相同的配置、但参数极少除外。
    *数字不均匀的 PWM 模块没有相移、数字偶数的 PWM 模块
    *与数字不均匀的 PWM 相比、相移为180°。
    *一些 PWM 模块可以链接到其他模块。 链接 PWM 模块意味着
    在运行时写入一个模块
    的所有配置*数据将自动写入所有链接的*模块。 结合180°相移和互补 PWM 输出、该
    机制用于控制完整的4 PWM H 桥。
    *
    *@param ePWM_regs* PWM_regs -指向特定于模块的配置结构的指针
    *@param UINT16相移-与链接的模块相比以度为单位的相移
    *@param UINT16 linkPwm -要链接的 PWM 模块
    *@retval void
    *
    / static void _pwmInitModuleX (volatile struct ePWM_regs* PWM_regs、uint16 phaseShift、uint16 linkpwm)
    {
    //设置 TBCLK
    PWM_regs->TBCTL.bit.CTRMODE = TB_COUNT_UP; //向上计数
    PWM_regs->TBPRD = ePWM_TIMER_TBPRD - 1; //设置计时器周期
    
    PWM_regs->TBCTR = 0x0000; //清除计数器
    PWM_regs->TBCTL.bit.HSPCLKDIV = TB_DIV1; // PWM 时钟的 SYSCLKOUT 时钟分频器以实现高分辨率
    PWM_regs->TBCTL.bit.CLKDIV = TB_DIV1; // PWM 时钟到 SYSCLKOUT 的时钟分频器
    
    //将影子寄存器加载设置为零
    PWM_regs->CMPCTL.bit.SHDWAMODE = CC_SHADOD;
    PWM_regs->CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    PWM_regs->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    PWM_regs->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    
    //设置比较值
    pwm_regs->cmpa.bit.cmpA = ePWM_INPLET_CMP; //设置比较 A 值
    
    PWM_regs->AQCTL.bit.SHDWAQAMODE = 1; //将影子寄存器用于操作限定符 EPWMA
    PWM_regs->AQCTL.bit.SHDWAQBMODE = 1; //对操作限定符 EPWMB 使用影子寄存器
    
    PWM_regs->AQCTL.bit.LDAQAMODE = 1;
    PWM_regs->AQCTL.bit.LDAQBMODE = 1;
    
    //设置操作
    if (phaseShift =ePWM_PHASE_0DEG)
    {
    
    PWM_regs->TBCTL.bit.PHSEN = TB_disable; //禁用相位加载
    PWM_regs->TBCTL.bit.SYNCOSEL = TB_SYNC_IN; //只转发任何接收到的同步信号
    
    /*启动后的初始配置是禁用 PWM
    *输出、直至治疗开始。
    *
    *禁用 TOP1桥臂-切断电源*/
    PWM_regs->AQCTLA.bit.PRD = AQ_CLEAR;
    PWM_regs->AQCTLA.bit.CAU = AQ_CLEAR;
    
    /*启用 BOT1桥臂-变压器接地*/
    PWM_regs->AQCTLB.bit.PRD = AQ_SET;
    PWM_regs->AQCTLB.bit.CAU = AQ_SET;
    }
    其他
    {
    PWM_regs->TBCTL.bit.PHSEN = TB_ENABLE; //启用相位加载
    PWM_regs->TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; //不要在相移 ePWM 模块上生成同步信号
    PWM_regs->TBPHS.bit.TBPHS =相移;
    
    /*启动后的初始配置是禁用 PWM
    *输出、直至治疗开始。
    *
    *禁用 TOP1桥臂-切断电源*/
    PWM_regs->AQCTLA.bit.PRD = AQ_CLEAR;
    PWM_regs->AQCTLA.bit.CAU = AQ_CLEAR;
    
    /*启用 BOT1桥臂-变压器接地*/
    PWM_regs->AQCTLB.bit.PRD = AQ_SET;
    PWM_regs->AQCTLB.bit.CAU = AQ_SET;
    }
    
    //低电平有效互补 PWM -设置死区
    PWM_regs->DBCTL.bit.out_mode = DB_full_enable;
    PWM_regs->DBCTL.bit.POLSEL = DB_ACTV_HIC;
    PWM_regs->DBCTL.bit.in_mode = DBA_ALL;
    PWM_regs->DBRED.bit.DBRED = ePWM_DBRED;
    PWM_regs->DBFED.bit.DBFED = ePWM_DBFED;
    
    //中断,我们将在其中更改比较值
    PWM_regs->ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择“零时 INT”事件
    pwm_regs->ETSEL.bit.INTEN = 0; //禁用 INT
    
    PWM_regs->ETPS.bit.INTPSSEL = 1;
    PWM_regs->ETINTPS.bit.INTPRD2 = PWM_EVENT_RATE;
    
    pwm_regs->EPWMXLINK.bit.CMPALINK = linkPwm;
    
    }