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/TMS320F28379D:编程

Guru**** 2487425 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/626847/ccs-tms320f28379d-programing

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

你(们)好

我正在生成3PWM 波形。 我正在使用 EPW1、2、3。我可以得到3个波形、但我希望 PWM2和3相对于 PWM1的相移

我参考了 TI 提供的 ePWM 参考指南...我使用了示例13...图68

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

    您好 Kudithi、

    对于相移、在 ePWM 2和3上、您将需要通过 TBCTL[PHSEN]位启用相位加载。 您编程到 EPWM2和 EPWM3的每个 TBPHS 寄存器中的值将在同步或类似事件发生时加载到 TBCTR 中。

    此致、

    Kris

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

    谢谢您 Kris

    我执行了它、但我没有得到它...这是我的代码、请仔细检查它

    #include "F28x_Project.h"

    #define PWM_PRD 5000;

    #define PHI 500;

    #define Phi2 50;

     

    //函数原型

    //

    void InitEPwm1Examples(void);

    void InitEPwm2Examples(void);

    void InitEPwm3Examples(void);

    _interrupt void epwm1_ISR (void);

    _interrupt void epwm2_ISR (void);

    _interrupt void epwm3_ISR (void);

     

    //

    //主函

    //

    void main (void)

    //

    //步骤1. 初始化系统控制:

    // PLL、安全装置、启用外设时钟

    //此示例函数位于 F2837xD_SYSCTRL.c 文件中。

    //

      InitSysCtrl();

     

    //

    //步骤2. 初始化 GPIO:

    //此示例函数位于 F2837xD_GPIO.c 文件和中

    //说明了如何将 GPIO 设置为其默认状态。

    //

    //  InitGpio();

     

    //

    //启用 PWM1、PWM2和 PWM3

    //

      CpuSysRegs.PCLKCR2.bit.EPWM1=1;

      CpuSysRegs.PCLKCR2.bit.EPWM2=1;

      CpuSysRegs.PCLKCR2.bit.EPWM3=1;

     

    //

    //在这种情况下、只需初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚

    //这些函数位于 F2837xD_ePWM.c 文件中

    //

      InitEPwm1Gpio();

      InitEPwm2Gpio();

      InitEPwm3Gpio();

     

    //

    //步骤3. 清除所有中断并初始化 PIE 矢量表:

    //禁用 CPU 中断

    //

      Dint;

     

    //

    //将 PIE 控制寄存器初始化为默认状态。

    //默认状态为禁用所有 PIE 中断和标志

    //被清除。

    //此函数位于 F2837xD_PIECTRL.c 文件中。

    //

      InitPieCtrl();

     

    //

    //禁用 CPU 中断并清除所有 CPU 中断标志:

    //

      IER = 0x0000;

      IFR = 0x0000;

     

    //

    //使用指向 shell 中断的指针初始化 PIE 矢量表

    //服务例程(ISR)。

    //这将填充整个表,即使是中断也是如此

    //在本例中未使用。  这对于调试很有用。

    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程

    //此函数可在 F2837xD_PieVect.c 中找到

    //

      InitPieVectTable();

     

    //

    //此示例中使用的中断被重新映射到

    //此文件中的 ISR 函数。

    //

      EALLOW;//这是写入 EALLOW 受保护寄存器所必需的

      PieVectTable.EPWM1_INT =&epwm1_ISR;

      PieVectTable.EPWM2_INT =&epwm2_ISR;

      PieVectTable.EPWM3_INT =&epwm3/ISR;

      EDIS;  //这是禁止写入 EALLOW 受保护寄存器所必需的

     

    //

    //步骤4. 初始化器件外设:

    //

      EALLOW;

      CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;

      EDIS;

     

      InitEPwm1Examples();

      InitEPwm2Examples();

      InitEPwm3Examples();

     

      EALLOW;

      CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

      EDIS;

     

    //

    //步骤5. 特定于用户的代码、启用中断:

    //初始化计数器:

    //

      //EPwm1TimerIntCount = 0;

      // EPwm2TimerIntCount = 0;

      //EPwm3TimerIntCount = 0;

     

    //

    //启用连接到 EPWM1-3 INT 的 CPU INT3:

    //

      IER |= M_INT3;

     

    //

    //在 PIE 中启用 ePWM INTn:组3中断1-3

    //

      PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

      PieCtrlRegs.PIEIER3.bit.INTx2 = 1;

      PieCtrlRegs.PIEIER3.bit.INTx3=1;

     

    //

    //启用全局中断和更高优先级的实时调试事件:

    //

      EINT; //启用全局中断 INTM

      ERTM; //启用全局实时中断 DBGM

     

    //

    //步骤6. 空闲循环。 只需坐下来循环(可选):

    //

      for (;;)

      {

        ASM ("      NOP");

      }

     

    _interrupt void epwm1_ISR (void)

         EPwm1Regs.TBPHS.bit.TBPHS = 0;

     

       EPwm1Regs.ETCLR.bit.INT = 1;

     

      PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    _interrupt void epwm2_ISR (void)

         EPwm2Regs.TBPHS.bit.TBPHS = 0;

     

       EPwm2Regs.ETCLR.bit.INT = 1;

     

      PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

    _interrupt void epwm3_ISR (void)

         EPwm3Regs.TBPHS.bit.TBPHS = 0;

     

       EPwm3Regs.ETCLR.bit.INT = 1;

     

      PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

     

    空 InitEPwm1示例(空)

        EPwm1Regs.TBPRD = 1250;    //设置定时器周期801 TBCLK

      EPwm1Regs.TBPHS.bit.TBPHS = 0;     //相位为0

      EPwm1Regs.TBCTR = 0;          //清除计数器

      //  //设置比较值0  //

      EPwm1Regs.CMPA.bit.CMPA = 1250;  //设置比较值

      EPwm1Regs.CMPB.bit.CMPB = 1250;

      //  //设置计数器模式  //

      EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数

      EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;     //禁用相位加载

     

      EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;

        EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

     

      ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;

     

    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;    //时钟与 SYSCLKOUT 之比

    EPwm1Regs.TBCTL.bit.CLKDIV = 0;

     

    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    //时钟与 SYSCLKOUT 的比率

    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

     

     

     

      //  //设置重影  //

      EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

      EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

     

      EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载

      EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

      //  //设置操作  //

      EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;       //在事件 A 上设置 PWM1A、向上

                             //计数

      EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;      //在事件 A 上清除 PWM1A、

                             //倒计数

     

      EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;       //在事件 B 上设置 PWM1B,向上

                             //计数

      EPwm1Regs.AQCTLB.bit.ZRO= AQ_SET;      //在事件 B 上清除 PWM1B,

                             //倒计数

     

      //  //中断,我们将在其中更改比较值  //

      EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;   //选择零事件时的 INT

      EPwm1Regs.ETSEL.bit.INTEN = 1;         //启用 INT

      EPwm1Regs.ETPS.bit.INTPRD = et_3rd;       //在发生第三个事件时生成 INT

     

     

    空 InitEPwm2Examples(空)

        EPwm2Regs.TBPRD = 1250;    //设置定时器周期801 TBCLK

      EPwm2Regs.TBPHS.bit.TBPHS = 500;     //相位为0

      EPwm2Regs.TBCTR = 0;          //清除计数器

     

     //  //设置比较值0  //

      EPwm2Regs.CMPA.bit.CMPA = 1250;  //设置比较值

      EPwm2Regs.CMPB.bit.CMPB = 1250;

     

     //  //设置计数器模式  //

      EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数

      EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;     //启用相位加载

     

      EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;

      EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;

      EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

     

      EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    //时钟与 SYSCLKOUT 的比率

      EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

     

     

     

      //  //设置重影  //

      EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

      EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

     

      EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载

      EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

      //  //设置操作  //

      EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;       //在事件 A 上设置 PWM1A、向上

                             //计数

      EPwm2Regs.AQCTLA.bit.ZRO = AQ_CLEAR;      //在事件 A 上清除 PWM1A、

                             //倒计数

     

      EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR;       //在事件 B 上设置 PWM1B,向上

                             //计数

      EPwm2Regs.AQCTLB.bit.ZRO= AQ_SET;      //在事件 B 上清除 PWM1B,

                             //倒计数

     

      //  //中断,我们将在其中更改比较值  //

      EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;   //选择零事件时的 INT

      EPwm2Regs.ETSEL.bit.INTEN = 1;         //启用 INT

      EPwm2Regs.ETPS.bit.INTPRD = et_3rd;       //在发生第三个事件时生成 INT

     

     

    空 InitEPwm3Examples(空)

        EPwm3Regs.TBPRD = 1250;    //设置定时器周期801 TBCLK

      EPwm3Regs.TBPHS.bit.TBPHS = 500;     //相位为0

      EPwm3Regs.TBCTR = 0;          //清除计数器

      //  //设置比较值0  //

      EPwm3Regs.CMPA.bit.CMPA = 1250;  //设置比较值

      EPwm3Regs.CMPB.bit.CMPB = 1250;

      //  //设置计数器模式  //

      EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数

     EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;     //启用相位加载

     

    EPwm3Regs.TBCTL.bit.PHSDIR = TB_DOWN;

      EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;

      EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

     

     

     

      EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    //时钟与 SYSCLKOUT 的比率

      EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;

     

     

     

      //  //设置重影  //

      EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

      EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

     

      EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载

      EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

      //  //设置操作  //

      EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;       //在事件 A 上设置 PWM1A、向上

                             //计数

      EPwm3Regs.AQCTLA.bit.ZRO = AQ_CLEAR;      //在事件 A 上清除 PWM1A、

                             //倒计数

     

      EPwm3Regs.AQCTLB.bit.CBU = AQ_CLEAR;       //在事件 B 上设置 PWM1B,向上

                             //计数

      EPwm3Regs.AQCTLB.bit.ZRO= AQ_SET;      //在事件 B 上清除 PWM1B,

                             //倒计数

     

      //  //中断,我们将在其中更改比较值  //

      EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;   //选择零事件时的 INT

      EPwm3Regs.ETSEL.bit.INTEN = 1;         //启用 INT

      EPwm3Regs.ETPS.bit.INTPRD = et_3rd;       //在发生第三个事件时生成 INT