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.

[参考译文] TMS320F28379D:F2837 ECAP 捕获双通道 PWM

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/897399/tms320f28379d-f2837-ecap-captures-two-channel-pwm

器件型号:TMS320F28379D

尊敬的支持团队:

    使用 eCAP1捕获 pwm1的第一个上升沿、使用 ecap2捕获 pwm2的第一个上升沿、并计算两个 PWM 的相位。 发现 eCAP1捕获的值始终大于 ecap2捕获的值、无论是 pwm1优先还是 pwm2优先。

    是因为中断优先级? 还是其他原因?

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

    您好!

    我认为两个 ECAP 模块之间没有任何这样的优先级。 是否在同一时间重置两个捕获模块的计数器? 如果您可以共享所使用的软件配置、调试将会更容易。

    此致

    Himanshu

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

    非常感谢您的回复、我 的软件配置如下:


    void main (void)

      InitSysCtrl();

      InitECap1Gpio (20);      //inc A
      GPIO_SetupPinOptions (20、GPIO_INPUT、GPIO_异 步);

      InitECap2Gpio (21);      //inc b
      GPIO_SetupPinOptions (21、GPIO_INPUT、GPIO_异 步);

      Dint;
      InitPieCtrl();
      IER = 0x0000;
      IFR = 0x0000;
      InitPieVectTable();

      EALLOW;
      PieVectTable.ECAP1_INT =&eCAP1_ISR;
      PieVectTable.ECAP2_INT =&ecap2_ISR;
      EDIS;

      InitECapture();

      IER |= M_INT4;
      PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
      PieCtrlRegs.PIEIER4.bit.INTx2 = 1;

      EINT;
      ERTM;

      for (;;)
      {
         asm ("         NOP");
      }



    空 InitECapture()

      ECap1Regs.ECCTL1.bit.CAP1POL = 0;     //上升
      ECap1Regs.ECCTL1.bit.CAP2POL=1;     //fall
      ECap1Regs.ECCTL1.bit.CAP3POL = 0;     //上升
      ECap1Regs.ECCTL1.bit.CAP4POL = 1;     //fall

      ECap1Regs.ECCTL1.bit.CTRRST1 = 0;      //绝对
      ECap1Regs.ECCTL1.bit.CTRRST2 = 0;      //绝对
      ECap1Regs.ECCTL1.bit.CTRST3 = 0;      //绝对
      ECap1Regs.ECCTL1.bit.CTRRST4 = 0;      //绝对

      ECap1Regs.ECCTL1.bit.CAPLDEN = 1;      //启用捕捉单元
      ECap1Regs.ECCTL1.bit.prescale = 0;     ///1

      ECap1Regs.ECCTL2.bit.CAP_APWM = 0;     //捕获模式
      ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;  //连续模式

      ECap1Regs.ECEINT.ALL = 0x0000;
      ECap1Regs.ECCLR.ALL = 0xFFFF;
      ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;    //起始计数器
      ECap1Regs.ECEINT.BIT.CEVT4 = 1;        // 4个事件=__interrupt

      ECap2Regs.ECCTL1.bit.CAP1POL = 0;     //上升
      ECap2Regs.ECCTL1.bit.CAP2POL=1;     //fall
      ECap2Regs.ECCTL1.bit.CAP3POL = 0;     //上升
      ECap2Regs.ECCTL1.bit.CAP4POL = 1;     //fall

      ECap2Regs.ECCTL1.bit.CTRRST1 = 0;      //绝对
      ECap2Regs.ECCTL1.bit.CTRRST2 = 0;      //绝对
      ECap2Regs.ECCTL1.bit.CTRST3 = 0;      //绝对
      ECap2Regs.ECCTL1.bit.CTRRST4 = 0;      //绝对

      ECap2Regs.ECCTL1.bit.CAPLDEN = 1;      //启用捕捉单元
      ECap2Regs.ECCTL1.bit.prescale = 0;     ///1

      ECap2Regs.ECCTL2.bit.CAP_APWM = 0;     //捕获模式
      ECap2Regs.ECCTL2.bit.CONT_ONESHT = 0;  //连续模式

      ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;
      ECap1Regs.ECCTL2.bit.SYNCO_SEL =0;
      ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;
      ECap2Regs.ECCTL2.bit.SYNCO_SEL =0;

      ECap1Regs.ECCTL2.bit.SWSYNC=1;
      ECap2Regs.ECCTL2.bit.SWSYNC=0;

      EALLOW;
      InputXbarRegs.INPUT5SELECT = 0x51;
      GpioDataRegs.GPBDAT.bit.GPIO51=0;
      SyncSockRegs.SYNCSELETC0.bit.ECAP1SYNCIN = 0x5;
      EDIS;

      ECap2Regs.ECEINT.ALL = 0x0000;
      ECap2Regs.ECCLR.ALL = 0xFFFF;
      ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1;    //开始计数器
      ECap2Regs.ECEINT.BIT.CEVT4 = 1;        // 4个事件=__interrupt



    _interrupt void eCAP1_ISR (void)

      A_RISE_TIME1 = ECap1Regs.CAP1;
      A_FALL_TIME1 = ECap1Regs.CAP2;
      A_RISE_TIME2 = ECap1Regs.CAP3;
      A_FALL_TIME2 = ECap1Regs.CAP4;

      ECap1Regs.ECCLR.ALL = 0xFFFF;
      PieCtrlRegs.PIEACX.ALL = PIEACK_group4;


    _interrupt void ecap2_ISR (void)

      B_RISE_TIME1 = ECap2Regs.CAP1;
      b_f跌倒 时间1 = ECap2Regs.CAP2;
      B_RISE_TIME2 = ECap2Regs.CAP3;
      b_fall time_2 = ECap2Regs.CAP4;


     PHASE_Ab1 =  A_RISE_TIME1 - b_RISE_TIME1;
     PHASE_AB2 =  A_FALL_TIME1 - b_FRAL_TIME1;

      ECap2Regs.ECCLR.ALL = 0xFFFF;
      PieCtrlRegs.PIEACX.ALL = PIEACK_group4;

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

    您好!

    如果传入信号频率太高、则可能会导致其中一个 ECAP 模块的计数器溢出、从而导致读数不正确。 我认为最好的方法是在单次触发模式下使用 ECAP 模块并同时启动两个模块的计数器。 而不是测量两个上升沿之间的差值、而是测量下降沿之间的差值、即 ECAP 的第二个事件。 这将有助于两个信号之间的相位差大于180度的情况。 您可以在 ECAP2中断结束时重新启用模块。

    请告诉我建议的配置是否适合您。

    此致

    Himanshu

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

    您好!

      eCAP1和 ecap2的时基是否同步? 如何将它们配置为同步?



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

    您好!

    是的、eCAP1和 ecap2的基极可使用软件或 ePWM 同步事件进行同步、如 TRM 下图所示。

    谢谢

    Himanshu

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

    您好!

       如果我使用软件来同步 eCAP1和 ecap2、这是正确的设置吗? 如果没有,请告诉我如何配置它。

       ECap1Regs.ECCTL2.bit.SWSYNC = 1;     

       ECap2Regs.ECCTL2.bit.SWSYNC = 1;      

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

    您好!

    是同步设置似乎可以、但请记住、同步所做的所有操作都是将相位寄存器中的值加载到计数器中。 因此、您不必在 ECAP 之间使用此同步来测量信号之间的相位差。 如果您只是使用单次捕获模式、那么重置两个 ECAP 模块的计数器并将它们重新布设在一起应该能够完美地工作。 正如我之前建议的、您可以在 ECAP1上的捕获事件3上触发中断、并计算中断期间的增量。

    如果我的回复回答了您的问题、请点击位于我帖子底部的"我的问题已解决"按钮。

    此致

    Himanshu