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.

[参考译文] TMS320F2800157-Q1:ECAP ISR 问题

Guru**** 2614905 points

Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1583482/tms320f2800157-q1-ecap-isr-problem

器件型号:TMS320F2800157-Q1
Thread 中讨论的其他器件:C2000WARESysConfig

我需要使用 F2800157 测量来自 ABZ+PWM 编码器的外部 PWM 信号的占空比。 系统时钟频率为 120MHz。 我使用 GPIO22 作为 eCAP 模块的输入、并确认外部 PWM 信号正确到达该引脚。

我按如下所示配置了 eCAP 模块。 但是、问题在于 ISR 仅触发一次、并且onTimeCount该变量在该单次触发期间保持意外的大值。 您能帮助我解决此问题吗?

无效 initECAP1 (void)

  //将 GPIO5 配置为 ECAP1 输入

  eCAP_SELECTECAPInput (ECAP1_BASE、eCAP_INPUT_GPIO22);
  //禁用时间戳计数器
  eCAP_disableTimeStampCapture (ECAP1_BASE);

  //将 eCAP 配置为捕获模式
  ECAP_STOPCounter (ECAP1_BASE);
  ECAP_enableCaptureMode (ECAP1_BASE);

  //首先在上升沿捕捉、然后在下降沿捕捉
  eCAP_setEventPolarity (ECAP1_BASE、eCAP_EVENT_1、eCAP_Evnt_rising edge);
  eCAP_setEventPolarity (ECAP1_BASE、eCAP_EVENT_2、eCAP_Evnt_falling_edge);

  //事件 2 重置计数器(以便我们可以测量高脉冲宽度)
  eCAP_enableCounterResetOnEvent (ECAP1_BASE、eCA_EVENT_2);

  //除以 1(无预分频器)
  ECAP_setEventPrescaler (ECAP1_BASE、0);

  //捕获事件后停止 2.
  eCAP_setCaptureMode (ECAP1_BASE、eCAP_CONTINUAL_CAPTURE_MODE、eCAP_EVENT_2);

  //如果需要启用同步输入(可选)
  eCAP_disableLoadCounter (ECAP1_BASE);

  //清除挂起的中断
  eCAP_clearInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_ALL);
  eCAP_clearGlobalInterrupt (ECAP1_BASE);

  //为事件 2 启用中断
  eCAP_enableInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_CAPTURE_EVENT_2);

  //启用计数器和时间戳捕获
  eCAP_enableTimeStampCapture (ECAP1_BASE);
  eCAP_startCounter (ECAP1_BASE);

  //第一个捕获
  ECAP_REARM (ECAP1_BASE);
}

// eCAP ISR
__中断 void ecap1ISR (void)

  uint32_t cap1、CAP2;

  //清除中断标志
  eCAP_clearInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_CAPTURE_EVENT_2);
  eCAP_clearGlobalInterrupt (ECAP1_BASE);

  //读取捕获的值
  CAP1 = eCAP_getEventTimeStamp (ECAP1_BASE、eCAP_EVENT_1);
  CAP2 = eCAP_getEventTimeStamp (ECAP1_BASE、eCAP_EVENT_2);

  //准时计算(假设 Event1 =上升、Event2 =下降)
  onTimeCount = CAP2 - cap1;

  captureDone = true;

  // Re - ARM 进行下一次捕获
  ECAP_REARM (ECAP1_BASE);

  INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group4);
}

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

    您好 Loganathan、

    我强烈建议查看我们 C2000WARE 中的示例代码、以便与您创建的代码进行比较、了解初始化例程是什么。 eCAP 示例 2 演示了此情况。

    [引述 userid=“621189" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1583482/tms320f2800157-q1-ecap-isr-problem

    我需要使用 F2800157 测量来自 ABZ+PWM 编码器的外部 PWM 信号的占空比。 系统时钟频率为 120MHz。 我使用 GPIO22 作为 eCAP 模块的输入、并确认外部 PWM 信号正确到达该引脚。

    [/报价]

    好的、第一步是验证输入信号。

    您能否确保 GPIO22 配置了输入?

    如果连接到引脚、那么让我们看一下您的 eCAP 配置。 根据您提供的内容、初始化与我们在 SysConfig 中所做的操作略有不同。 myECAP0BASE 为 ECAP1_BASE。

    //
    	// Disable ,clear all capture flags and interrupts
    	//
    	ECAP_disableInterrupt(myECAP0_BASE,
    		(ECAP_ISR_SOURCE_CAPTURE_EVENT_1  |
    		ECAP_ISR_SOURCE_CAPTURE_EVENT_2  |
    		ECAP_ISR_SOURCE_CAPTURE_EVENT_3  |
    		ECAP_ISR_SOURCE_CAPTURE_EVENT_4  |
    		ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
    		ECAP_ISR_SOURCE_COUNTER_PERIOD   |
    		ECAP_ISR_SOURCE_COUNTER_COMPARE));
    	ECAP_clearInterrupt(myECAP0_BASE,
    		(ECAP_ISR_SOURCE_CAPTURE_EVENT_1  |
    		ECAP_ISR_SOURCE_CAPTURE_EVENT_2  |
    		ECAP_ISR_SOURCE_CAPTURE_EVENT_3  |
    		ECAP_ISR_SOURCE_CAPTURE_EVENT_4  |
    		ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
    		ECAP_ISR_SOURCE_COUNTER_PERIOD   |
    		ECAP_ISR_SOURCE_COUNTER_COMPARE));
    	//
    	// Disables time stamp capture.
    	//
    	ECAP_disableTimeStampCapture(myECAP0_BASE);
    	//
    	// Stops Time stamp counter.
    	//
    	ECAP_stopCounter(myECAP0_BASE);
    	//
    	// Sets eCAP in Capture mode.
    	//
    	ECAP_enableCaptureMode(myECAP0_BASE);
    	//
    	// Sets the capture mode.
    	//
    	ECAP_setCaptureMode(myECAP0_BASE,ECAP_CONTINUOUS_CAPTURE_MODE,ECAP_EVENT_2);
    	//
    	// Sets the Capture event prescaler.
    	//
    	ECAP_setEventPrescaler(myECAP0_BASE, 0U);
    	//
    	// Sets the Capture event polarity.
    	//
    	ECAP_setEventPolarity(myECAP0_BASE,ECAP_EVENT_1,ECAP_EVNT_FALLING_EDGE);
    	ECAP_setEventPolarity(myECAP0_BASE,ECAP_EVENT_2,ECAP_EVNT_RISING_EDGE);
    	ECAP_setEventPolarity(myECAP0_BASE,ECAP_EVENT_3,ECAP_EVNT_FALLING_EDGE);
    	ECAP_setEventPolarity(myECAP0_BASE,ECAP_EVENT_4,ECAP_EVNT_RISING_EDGE);
    	//
    	// Configure counter reset on events
    	//
    	ECAP_enableCounterResetOnEvent(myECAP0_BASE,ECAP_EVENT_1);	
    	ECAP_enableCounterResetOnEvent(myECAP0_BASE,ECAP_EVENT_2);	
    	ECAP_disableCounterResetOnEvent(myECAP0_BASE,ECAP_EVENT_3);
    	ECAP_disableCounterResetOnEvent(myECAP0_BASE,ECAP_EVENT_4);
    	//
    	// Select eCAP input.
    	//
    	ECAP_selectECAPInput(myECAP0_BASE,ECAP_INPUT_GPIO22);
    	//
    	// Sets a phase shift value count.
    	//
    	ECAP_setPhaseShiftCount(myECAP0_BASE,0U);
    	//
    	// Enable counter loading with phase shift value.
    	//
    	ECAP_enableLoadCounter(myECAP0_BASE);
    	//
    	// Configures Sync out signal mode.
    	//
    	ECAP_setSyncOutMode(myECAP0_BASE,ECAP_SYNC_OUT_SYNCI);
    	//
    	// Configures emulation mode.
    	//
    	ECAP_setEmulationMode(myECAP0_BASE,ECAP_EMULATION_STOP);
    	//
    	// Set up the source for sync-in pulse..
    	//
    	ECAP_setSyncInPulseSource(myECAP0_BASE,ECAP_SYNC_IN_PULSE_SRC_DISABLE);
    	//
    	// Starts Time stamp counter for myECAP0.
    	//
    	ECAP_startCounter(myECAP0_BASE);
    	//
    	// Enables time stamp capture for myECAP0.
    	//
    	ECAP_enableTimeStampCapture(myECAP0_BASE);
    	//
    	// Re-arms the eCAP module for myECAP0.
    	//
    	ECAP_reArm(myECAP0_BASE);
    	//
    	// Enables interrupt source for myECAP0.
    	//
    	ECAP_enableInterrupt(myECAP0_BASE,(ECAP_ISR_SOURCE_CAPTURE_EVENT_2));

    [引述 userid=“621189" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1583482/tms320f2800157-q1-ecap-isr-problem

    我按如下所示配置了 eCAP 模块。 但是、问题在于 ISR 仅触发一次、并且onTimeCount该变量在该单次触发期间保持意外的大值。 您能帮助我解决此问题吗?

    [/报价]

    在清除 ISR 底部的中断标志时、我移动了这个位置。

    如果输入源配置正确、您应该会在第一个触发后接收到新的 ISR 触发。

    我看到您正在为捕获事件和全局中断标志正确清除中断。

    // eCAP ISR
    __中断 void ecap1ISR (void)

      uint32_t cap1、CAP2;

      //读取捕获的值
      CAP1 = eCAP_getEventTimeStamp (ECAP1_BASE、eCAP_EVENT_1);
      CAP2 = eCAP_getEventTimeStamp (ECAP1_BASE、eCAP_EVENT_2);

      //准时计算(假设 Event1 =上升、Event2 =下降)
      onTimeCount = CAP2 - cap1;

      captureDone = true;

      // Re - ARM 进行下一次捕获
      ECAP_REARM (ECAP1_BASE);

      //清除中断标志
      eCAP_clearInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_CAPTURE_EVENT_2);
      eCAP_clearGlobalInterrupt (ECAP1_BASE);

      INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group4);
    }

    下面是我在 GPIO22 上修改过的用于 eCAP1_BASE 的示例项目。  

    您可以根据需要进行修改、但我无法重现无法接收连续捕获信号的背对背中断的问题。

    e2e.ti.com/.../7462.ecap_5F00_ex2_5F00_capture_5F00_pwm.zip

    此致、

    Ryan Ma