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/TMS320F28035:ECAP 在 GPIO5上工作、但在 GPIO24、gpio19上工作

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/908524/ccs-tms320f28035-ecap-working-on-gpio5-but-not-on-gpio24-gpio19

器件型号:TMS320F28035
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

我将使用 EPWM2生成 PWM 脉冲,并在 ECAP1上读取占空比和周期。 当我使用 GPIO5进行捕获时、一切都正常、但当选择 GPIO19/GPIO24时、寄存器不会更新。 我想其余的设置不需要受到干扰。

    Dint;                        //禁用所有 CPU 中断

    IER = 0x0000;                    //禁用所有外设中断

    IFR = 0x0000;                    //清除所有中断标志

    EALLOW;

    GpioCtrlRegs.GPAMUX1.bit.GPIO5=3 ;     // 0=GPIO        1=EPWM3B  2=SPISIMOA 3=ECAP1

//   GpioCtrlRegs.GPAPUD.bit.GPIO19=0;

//   GpioCtrlRegs.GPAQSEL2.bit.GPIO19=0;

//   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 3;

    GpioCtrlRegs.GPAMUX2.bit.GPIO24=1 ;     // 0=GPIO        1=EPWM3B  2=SPISIMOA 3=ECAP1

    EDIS;

  ///----------------------------------------------------------

  //--为捕捉配置 eCAP1单元

  ///----------------------------------------------------------

    ECap1Regs.ECEINT.ALL = 0;          //禁用所有 eCAP 中断

    ECap1Regs.ECCTL1.bit.CAPLDEN = 0;      //已禁用捕获结果的加载

    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;     //停止计数器

    ECap1Regs.TSCTR = 0;             //清除计数器

    ECap1Regs.CTRPHS = 0;            //清除计数器相位寄存器

    ECap1Regs.ECCTL2.all = 0x0096;        // ECAP 控制寄存器2

  //位15-11  00000: 保留

  //位10     0:   APWMPOL、无关

  //位9     0:   CAP/APWM、0 =捕捉模式、1 = APWM 模式

  //位8     0:   SWSYNC、0 =无操作(无 s/w 同步)

  //位7-6   10:  SYNCO_SEL、10 =禁用 SYNC OUT 信号

  //位5     0:   SYNCI_EN、0 =禁用同步输入

  //位4     1:   TSCTRSTOP、1 =使能计数器

  //位3     0:   重新布防、0 =不重新布防、1 =重新布防

  //位2-1   11:  STOP_Wrap、11 = 4次捕捉后换行

  //位0     0:   CONT/ONESHT、0 =连续模式

    ECap1Regs.ECCTL1.ALL = 0xC144;        // ECAP 控制寄存器1

  //位15-14  11:  自由/软、11 =忽略仿真挂起

  //位13-9   00000: 预分频、00000 = 1分频

  //位8     1:   CAPLDEN、1 =启用捕捉结果加载

  //位7     0:   CTRRTST4、0 =不在 CAP4事件上复位计数器

  //位6     1:   CAP4POL、0 =上升沿、1 =下降沿

  //位5     0:   CTRRTST3、0 =不在 CAP3事件上复位计数器

  //位4     0:   CAP3POL、0 =上升沿、1 =下降沿

  //位3     0:   CTRRTST2、0 =不在 CAP2事件上复位计数器

  //位2     1:   CAP2POL、0 =上升沿、1 =下降沿

  //位1     0:   CTRRTST1、0 =不在 CAP1事件上复位计数器

  //位0     0:   CAP1POL、0 =上升沿、1 =下降沿

    ECap1Regs.ECEINT.ALL = 0x0008;        //启用所需的 eCAP 中断

  //位15-8 0   :  保留

  //位7     0:   CTR=CMP、0 =比较中断被禁用

  //位6     0:   CTR=PRD、0 =周期中断被禁用

  //位5     0:   CTROVF、0 =溢出中断被禁用

  //位4     0:   CEVT4、0 =事件4中断被禁用

  //位3     1:   CEVT3、1 =启用事件3中断

  //位2     0:   CEVT2、0 =事件2中断被禁用

  //位1     0:   CEVT1、0 =事件1中断被禁用

  //位0     0:   保留

    EALLOW;

    PieCtrlRegs.PIEIER4.bit.INTx1 = 1; //在 PIE 组4中启用 ECAP1_INT

    PieVectTable.ECAP1_INT =&eCAP1_INT_ISR;

    EDIS;

    IER |= 0x0008;            //在 IER 中启用 INT4以启用 PIE 组4

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

    您好、Pujit、

    C2000ware 随附 GPIO5、GPIO19和 GPIO24上 ECAP1输出的示例。 请尝试该示例。

    C:\ti\c2000Ware_3_01_00_00\device_support\f2803x\examples\c28\ECAP_apwm

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

    您好、先生、  

    感谢您的回复。 您建议的示例是在 ECAP 上生成 PWM,但我想在 ECAP 引脚上读取周期和占空比(Gpio19/GPIO24)

    #include "DSP2803x_Device.h"

    #include "DSP28x_Project.h"  //器件头文件和示例 include 文件

    #include "DSP2803x_examples.h"

    #include "DSP2803x_GlobalPrototypes.h"

    #include "math.h"

    #include "IQmathLib.h"

    #include

    #include

    int count1=0;

    int count2=0;

    int count3=0;

    long i=0;

    uint32 pwmDuty;               //测得的 PWM 占空比

    UINT32 PwmPeriod;              //测得的 PWM 周期

    uint32频率;

    uint32速度;

    //这些由链接器定义

    extern UINT16 RamfuncsLoadStart;

    extern UINT16 RamfuncsLoadSize;

    extern UINT16 RamfuncsRunStart;

    void init_epwm1();

    void init_epwm2();

    void init_epwm3();

    void init_eCAP1();

    void init_epwm1_int();

    void init_epwm2_int();

    void init_epwm3/int ();

    void epwm1_int_isr();

    void epwm2_int_isr ();

    void epwm3/int_isr ();

    void eCAP1_int_isr ();

    void main (void)

      InitSysCtrl();

      Dint;

      InitPieCtrl();

      IER = 0x0000;

      IFR = 0x0000;

      InitPieVectTable();

      memcpy (((uint16_t *)&RamfuncsRunStart、(uint16_t *)&RamfuncsLoadStart、(unsigned long)&RamfuncsLoadSize);

      InitFlash();

                     //初始化 DAC

      // init_epwm1();                    //初始化 epwm1调制器

      init_epwm2();

      // init_epwm3();

      init_eCAP1();

     // init_epwm1_int();                  //初始化 epwm1中断

      init_epwm2_int();

     // init_epwm3/int ();

      while (1)

      {

        EPwm2Regs.CMPA.half-CMPA=10;

        对于(i=0;i<65530;i++)

        {

        }

        EPwm2Regs.CMPA.half-CMPA=20;

        对于(i=0;i<65530;i++)

        {

        }

      }

    void init_epwm1()

      Dint;                        //禁用所有 CPU 中断

      IER = 0x0000;                    //禁用所有外设中断

      IFR = 0x0000;                    //清除所有中断标志

      EALLOW;

      GpioCtrlRegs.GPAMUX1.bit.GPIO0=1;         //将 GPIO0配置为 EPWM1A

      GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;         //将 GPIO1配置为 EPWM1B

      EDIS;

      EPwm1Regs.TBCTL.bit.CLKDIV=7;            //设置 PWM1块的时钟

      EPwm1Regs.TBCTL.bit.HSPCLKDIV=7;

      EPwm1Regs.TBPRD=33480;

      EPwm1Regs.TBCTL.bit.CTRMODE=0x2;           //设置 UP_DOWN 计数器模式

      EPwm1Regs.TBCTL.bit.SYNCOSEL=0x1;          //Selecting Down Stream Mode

      EPwm1Regs.AQCTLA.bit.CAU=0x2;            //为 ePWMA 设置操作

      EPwm1Regs.AQCTLA.bit.CAD=0x1;            //清除

      EPwm1Regs.DBCTL.bit.OUT_MODE=0x3;          //启用死区

      EPwm1Regs.DBCTL.bit.POLSEL=0x2;           //选择高电平有效互补模式

      EPwm1Regs.DBFED=00;                 //将下降沿延迟设置为0 CLK 周期

      EPwm1Regs.DBRED=00;                 //将上升沿延迟设置为0 CLK 周期

      EPwm1Regs.CMPA.half.CMPA=16740;

    void init_epwm2()

      Dint;                        //禁用所有 CPU 中断

      IER = 0x0000;                    //禁用所有外设中断

      IFR = 0x0000;                    //清除所有中断标志

      EALLOW;

      GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;         //将 GPIO2配置为 EPWM2A

      GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;         //将 GPIO3配置为 EPWM2B

      EDIS;

      EPwm2Regs.TBCTL.bit.CLKDIV=7;            //设置 PWM2块的时钟

      EPwm2Regs.TBCTL.bit.HSPCLKDIV=7;

      EPwm2Regs.TBPRD=40;

      EPwm2Regs.TBCTL.bit.CTRMODE=0x2;           //设置 UP_DOWN 计数器模式

      EPwm2Regs.TBCTL.bit.SYNCOSEL=0x1;          //Selecting Down Stream Mode

      EPwm2Regs.AQCTLA.bit.CAU=0x2;            //为 ePWMA 设置操作

      EPwm2Regs.AQCTLA.bit.CAD=0x1;            //清除

      EPwm2Regs.DBCTL.bit.OUT_MODE=0x3;          //启用死区

      EPwm2Regs.DBCTL.bit.POLSEL=0x2;           //选择高电平有效互补模式

      EPwm2Regs.DBFED=00;                 //将下降沿延迟设置为0 CLK 周期

      EPwm2Regs.DBRED=00;                 //将上升沿延迟设置为0 CLK 周期

      EPwm2Regs.CMPA.half-CMPA=10;

    void init_epwm3()

      Dint;                        //禁用所有 CPU 中断

      IER = 0x0000;                    //禁用所有外设中断

      IFR = 0x0000;                    //清除所有中断标志

      EALLOW;

      GpioCtrlRegs.GPAMUX1.bit.GPIO4=1;         //将 GPIO3配置为 EPWM3A

      GpioCtrlRegs.GPAMUX1.bit.GPIO5=1;         //将 GPIO4配置为 EPWM3B

      EDIS;

      EPwm3Regs.TBCTL.bit.CLKDIV=7;            //设置 PWM2块的时钟

      EPwm3Regs.TBCTL.bit.HSPCLKDIV=7;

      EPwm3Regs.TBPRD=8370;

      EPwm3Regs.TBCTL.bit.CTRMODE=0x2;           //设置 UP_DOWN 计数器模式

      EPwm3Regs.TBCTL.bit.SYNCOSEL=0x1;          //Selecting Down Stream Mode

      EPwm3Regs.AQCTLA.bit.CAU=0x2;            //为 ePWMA 设置操作

      EPwm3Regs.AQCTLA.bit.CAD=0x1;            //清除

      EPwm3Regs.DBCTL.bit.OUT_MODE=0x3;          //启用死区

      EPwm3Regs.DBCTL.bit.POLSEL=0x2;           //选择高电平有效互补模式

      EPwm3Regs.DBFED=00;                 //将下降沿延迟设置为0 CLK 周期

      EPwm3Regs.DBRED=00;                 //将上升沿延迟设置为0 CLK 周期

      EPwm3Regs.CMPA.half-CMPA=4185;

    void init_eCAP1 ()

        Dint;                        //禁用所有 CPU 中断

        IER = 0x0000;                    //禁用所有外设中断

        IFR = 0x0000;                    //清除所有中断标志

        EALLOW;

        GpioCtrlRegs.GPAMUX1.bit.GPIO5=3 ;     // 0=GPIO        1=EPWM3B  2=SPISIMOA 3=ECAP1

        //GpioCtrlRegs.GPAMUX2.bit.GPIO19=3 ;     // 0=GPIO        1=EPWM3B  2=SPISIMOA 3=ECAP1

        EDIS;

      ///----------------------------------------------------------

      //--为捕捉配置 eCAP1单元

      ///----------------------------------------------------------

        ECap1Regs.ECEINT.ALL = 0;          //禁用所有 eCAP 中断

        ECap1Regs.ECCTL1.bit.CAPLDEN = 0;      //已禁用捕获结果的加载

        ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;     //停止计数器

        ECap1Regs.TSCTR = 0;             //清除计数器

        ECap1Regs.CTRPHS = 0;            //清除计数器相位寄存器

        ECap1Regs.ECCTL2.all = 0x0096;        // ECAP 控制寄存器2

      //位15-11  00000: 保留

      //位10     0:   APWMPOL、无关

      //位9     0:   CAP/APWM、0 =捕捉模式、1 = APWM 模式

      //位8     0:   SWSYNC、0 =无操作(无 s/w 同步)

      //位7-6   10:  SYNCO_SEL、10 =禁用 SYNC OUT 信号

      //位5     0:   SYNCI_EN、0 =禁用同步输入

      //位4     1:   TSCTRSTOP、1 =使能计数器

      //位3     0:   重新布防、0 =不重新布防、1 =重新布防

      //位2-1   11:  STOP_Wrap、11 = 4次捕捉后换行

      //位0     0:   CONT/ONESHT、0 =连续模式

        ECap1Regs.ECCTL1.ALL = 0xC144;        // ECAP 控制寄存器1

      //位15-14  11:  自由/软、11 =忽略仿真挂起

      //位13-9   00000: 预分频、00000 = 1分频

      //位8     1:   CAPLDEN、1 =启用捕捉结果加载

      //位7     0:   CTRRTST4、0 =不在 CAP4事件上复位计数器

      //位6     1:   CAP4POL、0 =上升沿、1 =下降沿

      //位5     0:   CTRRTST3、0 =不在 CAP3事件上复位计数器

      //位4     0:   CAP3POL、0 =上升沿、1 =下降沿

      //位3     0:   CTRRTST2、0 =不在 CAP2事件上复位计数器

      //位2     1:   CAP2POL、0 =上升沿、1 =下降沿

      //位1     0:   CTRRTST1、0 =不在 CAP1事件上复位计数器

      //位0     0:   CAP1POL、0 =上升沿、1 =下降沿

        ECap1Regs.ECEINT.ALL = 0x0008;        //启用所需的 eCAP 中断

      //位15-8 0   :  保留

      //位7     0:   CTR=CMP、0 =比较中断被禁用

      //位6     0:   CTR=PRD、0 =周期中断被禁用

      //位5     0:   CTROVF、0 =溢出中断被禁用

      //位4     0:   CEVT4、0 =事件4中断被禁用

      //位3     1:   CEVT3、1 =启用事件3中断

      //位2     0:   CEVT2、0 =事件2中断被禁用

      //位1     0:   CEVT1、0 =事件1中断被禁用

      //位0     0:   保留

        EALLOW;

        PieCtrlRegs.PIEIER4.bit.INTx1 = 1; //在 PIE 组4中启用 ECAP1_INT

        PieVectTable.ECAP1_INT =&eCAP1_INT_ISR;

        EDIS;

        IER |= 0x0008;            //在 IER 中启用 INT4以启用 PIE 组4

    void init_epwm1_int ()

      EALLOW;

      PieCtrlRegs.PIEIER3.bit.INTx1 = 1;          //启用 epwm1 interupt

      PieVectTable.EPWM1_INT =&epwm1_int_ISR;       //将中断重定向到 ISR

      EDIS;

      IER |= M_INT3;                    //启用 CPU 中断3

      EINT;                        //启用全局中断 INTM

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

      EPwm1Regs.ETSEL.bit.INTEN = 1;             //启用 epwm1中断

      EPwm1Regs.ETSEL.bit.INTSEL=1;            发生 TBCTR=0000事件时为//中断

      EPwm1Regs.ETPS.bit.INTPRD=1;             //在第一个事件发生时生成中断

    void init_epwm2_int ()

      EALLOW;

      PieCtrlRegs.PIEIER3.bit.INTx2 = 1;          //启用 epwm1 interupt

      PieVectTable.EPWM2_INT =&epwm2_int_ISR;       //将中断重定向到 ISR

      EDIS;

      IER |= M_INT3;                    //启用 CPU 中断3

      EINT;                        //启用全局中断 INTM

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

      EPwm2Regs.ETSEL.bit.INTEN = 1;             //启用 epwm1中断

      EPwm2Regs.ETSEL.bit.INTSEL=1;            发生 TBCTR=0000事件时为//中断

      EPwm2Regs.ETPS.bit.INTPRD=1;             //在第一个事件发生时生成中断

    void init_epwm3_int ()

      EALLOW;

      PieCtrlRegs.PIEIER3.bit.INTx3=1;          //启用 epwm1 interupt

      PieVectTable.EPWM3_INT =&epwm3/int_ISR;       //将中断重定向到 ISR

      EDIS;

      IER |= M_INT3;                    //启用 CPU 中断3

      EINT;                        //启用全局中断 INTM

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

      EPwm3Regs.ETSEL.bit.INTEN = 1;             //启用 epwm1中断

      EPwm3Regs.ETSEL.bit.INTSEL=1;            发生 TBCTR=0000事件时为//中断

      EPwm3Regs.ETPS.bit.INTPRD=1;             //在第一个事件发生时生成中断

    中断空 epwm1_int_ISR (空)

      EPwm1Regs.ETCLR.bit.INT=1;              //清除中断标志

      PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;       //确认 PIE 中断

      IFR = 0x0000;

      COUNT1 ++;

      返回;

    中断空 epwm2_int_isr (空)

      EPwm2Regs.ETCLR.bit.INT=1;              //清除中断标志

      PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;       //确认 PIE 中断

      IFR = 0x0000;

      count2++;

      返回;

    中断空 epwm3_int_ISR (空)

      EPwm3Regs.ETCLR.bit.INT=1;              //清除中断标志

      PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;       //确认 PIE 中断

      IFR = 0x0000;

      count3++;

      返回;

    中断空 eCAP1_INT_ISR (空)

      PieCtrlRegs.PIEACK.all = PIEACK_group4;  //必须确认 PIE 组

      ECap1Regs.ECCLR.bit.INT = 1;         //清除 ECAP1中断标志

      ECap1Regs.ECCLR.bit.CEVT3 = 1;        //清除 CEVT3标志

      //计算 PWM 占空比(上升沿到下降沿)

        PwmDuty =(int32) ECap1Regs.CAP2 -(int32) ECap1Regs.CAP1;

      //计算 PWM 周期(上升沿到上升沿)

        PwmPeriod =(Int32) ECap1Regs.CAP3 -(Int32) ECap1Regs.CAP1;

        频率= PwmPeriod/342;

        速度=(120*频率)/46;

      返回;

    请建议 我对以下代码进行哪些更改。

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

    我正在读取另一个引脚上的信号。