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.

[参考译文] TMS320F28075:绝对单触发模式下的 ECAP 问题

Guru**** 2391565 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1239977/tms320f28075-ecap-issue-in-absolute-one-shot-mode

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

您好、

我的客户在机器中使用 F28075、最近他们想添加一个新功能、该功能使用 ECAP 来捕获方波。

波形为20Hz、它们处理500ms 周期计时器 ISR 中的捕捉值、因此两次进入 ISR 之间有10个波形。

它们使用绝对模式和单次触发模式、根据我的理解、它将在 u32TEST 中存储4个递增的数字(它们使用 u32test 0-3 以存储捕捉值1-4)、并在下一个 ISR 中重新 ARM。 但结果不符合我的预期。

这是 eCAP 的初始化代码。 我认为这可能是由 ECAP 的 SYNC 引起的、因此请禁用它、但没有效果。

void InitECapGpio()
{
	
	 GPIO_SetupPinMux(29, GPIO_MUX_CPU1, 0);
	 GPIO_SetupPinOptions(29, GPIO_INPUT, GPIO_PULLUP | GPIO_ASYNC);
	 
	 XBAR_setInputPin(XBAR_INPUT7, 29);				// Xbar7-eCAP1	
}

/*
 * Function: InitECap
 * Parameter: None
 * Return:      None
 * Description: Ecap初始化  
 *      ____      ____      ____
 *     |    |    |    |    |    |
 * ____|    |____|    |____|    |____
 *     ↑    ↓    ↑    ↓
 *     A    B    C    D
 */
void InitECap(void)
{
	InitECapGpio();
    

	EALLOW;
	SyncSocRegs.SYNCSELECT.bit.ECAP1SYNCIN = 6;         // EXTSYNCIN2
	EDIS;
	
	XBAR_setInputPin(XBAR_INPUT6, 0XFF);			   // Xbar6 EXTSYNCIN2

    //ECAP_setEventPrescaler(ECAP1_BASE,0x5);// 10分频
	//
    // Disable ,clear all capture flags and interrupts
    //
	// 关中断
    ECAP_disableInterrupt(ECAP1_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(ECAP1_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));

    //
    // Disable CAP1-CAP4 register loads
    //
    ECAP_disableTimeStampCapture(ECAP1_BASE);

    //
    // Configure eCAP
    //    Enable capture mode.
    //    One shot mode, stop capture at event 4.
    //    Set polarity of the events to rising, falling, rising, falling edge.
    //    //Set capture in time difference mode.绝对时间
    //    Select input from XBAR7.
    //    Enable eCAP module.
    //    Enable interrupt.
    //
    ECAP_stopCounter(ECAP1_BASE);			
    ECAP_enableCaptureMode(ECAP1_BASE);		// 使能CAP模式
    
    ECAP_setCaptureMode(ECAP1_BASE, ECAP_ONE_SHOT_CAPTURE_MODE, ECAP_EVENT_4);// 事件4后产生停止信号
    
	// 捕捉沿选择
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_1, ECAP_EVNT_RISING_EDGE);	
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_2, ECAP_EVNT_FALLING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_3, ECAP_EVNT_RISING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_4, ECAP_EVNT_FALLING_EDGE);
	
	// 重置计数器
//    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);// 事件1重置计数器
//    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2);
//    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_3);
//    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_4);

    ECAP_disableLoadCounter(ECAP1_BASE);
    ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_SYNCI);

    EALLOW;
    CpuSysRegs.PCLKCR3.bit.ECAP1 = 1;
    EDIS;

    ECAP_startCounter(ECAP1_BASE);			// TSCTR开始计数
    ECAP_enableTimeStampCapture(ECAP1_BASE);// 启用在捕获事件上加载CAP1-4寄存器
    ECAP_reArm(ECAP1_BASE);					// Mod4重新装载
	
}

这是2Hz 计时器 ISR 中的运行时代码。

float32 CPLDVersionCheck(void)
{
	Uint32 u32cap1Count = 0;
	Uint32 u32cap2Count = 0;
	Uint32 u32cap3Count = 0;
	Uint32 u32cap4Count = 0;
	float32 f32Period = 0.0f;
	float32 f32PeriodHigh = 0.0f;
	static float32 f32DutySave = 0.0f;
    static float32 f32DutySave1 = 0.0f;

	u32cap1Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);		
	u32cap2Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);
    u32cap3Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);
    u32cap4Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);

    if((u32cap4Count > u32cap3Count) && (u32cap3Count > u32cap2Count) && (u32cap2Count > u32cap1Count))
    {
        f32PeriodHigh = (float32)(u32cap2Count-u32cap1Count);    // 高电平时间
        f32Period = (float32)(u32cap3Count-u32cap1Count);     // 周期时间
    //  // 计算占空比
        f32DutySave = f32PeriodHigh / f32Period;
    }
	ECap1Regs.TSCTR = 0; //时钟清零
    ECAP_enableTimeStampCapture(ECAP1_BASE);// Enables time stamp capture
    ECAP_reArm(ECAP1_BASE);					// Mod4重新装载	
    ECAP_startCounter(ECAP1_BASE);			// TSCTR开始计数

	return f32DutySave;
}

由于我没有控制卡也没有 EVM 测试、但我确认这是软件问题、您能指出为什么会发生这种情况以及如何更改它吗?

Br

爱玛

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

    您好、专家:

    有人能提供一些更新吗? 我还检查 ECFLG、"No Overflow"。

    Br

    爱玛

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

    尊敬的 Emma:  

    您能告诉我 u32Test 变量是如何更新的吗? 请尽可能分享整个代码。  

    此外、您能否检查 u32cap1Count 到 u32cap4Count 是否正常更新?

    此致、

    Meghavi

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

    U32Test 仅指示  u32cap1Count ,后者是局部变量,因此它们无法在窗口中看到。

    您能帮助在 TI EVM 中重现问题吗?

    Br

    爱玛

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

    尊敬的 Emma:

    您能告诉我为什么要禁用86行的加载计数器吗?

    我认为它应该是 ECAP_enableLoadCounter ()。 您还可以参阅 C2000Ware 中的 driverlib 示例 ecap_ex2_capture_pwm.c。  

    此致、

    Meghavi

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

    Meghavi

    这与 SYNC 有关,实际上客户也尝试 使用  ECAP_enableLoadCounter () ,但没有区别。

    Br

    爱玛