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.

[参考译文] LAUNCHXL-F280025C:ECAP 检测脉冲和周期

Guru**** 2411080 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1542610/launchxl-f280025c-ecap-detect-both-pulse-and-period

器件型号:LAUNCHXL-F280025C


工具/软件:

您好、

我有自行车踏频传感器、它每转一圈产生 48 个中断(圆盘上有 48 个磁体)、我想每 转触发 48 个中断、请参阅下面的我修改了 eCAP_ex2_capture_pwm 示例、我可以计算脉冲宽度和周期、但每转仅触发 24 个中断、因为中断仅发生在事件 4 上

eCAP_clearInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_CAPTURE_EVENT_4);

如何在每个上升沿(每转 48 次触发)触发中断  、同时捕获 4 个事件以进行占空比和脉冲宽度计算

void initeCAP(void)
{
    XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT7, 17);

    // 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));

    // Disables time stamp capture.
    ECAP_disableTimeStampCapture(ECAP1_BASE);

    // Stops Time stamp counter.
    ECAP_stopCounter(ECAP1_BASE);

    // Sets eCAP in Capture mode.
    ECAP_enableCaptureMode(ECAP1_BASE);

    // Sets the capture mode.
    ECAP_setCaptureMode(ECAP1_BASE,ECAP_ONE_SHOT_CAPTURE_MODE,ECAP_EVENT_4);

    // Sets the Capture event prescaler.
    ECAP_setEventPrescaler(ECAP1_BASE, 0U);

    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);


    // Configure counter reset on events
    ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_1);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_2);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_3);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_4);

    // Select eCAP input.
    ECAP_selectECAPInput(ECAP1_BASE, ECAP_INPUT_INPUTXBAR7);

    // Sets a phase shift value count.
    ECAP_setPhaseShiftCount(ECAP1_BASE, 0U);

    // Enable counter loading with phase shift value.
    ECAP_enableLoadCounter(ECAP1_BASE);

    // Configures Sync out signal mode.
    ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_SYNCI);

    // Configures emulation mode.
    ECAP_setEmulationMode(ECAP1_BASE,ECAP_EMULATION_STOP);

    // Set up the source for sync-in pulse..
    ECAP_setSyncInPulseSource(ECAP1_BASE,ECAP_SYNC_IN_PULSE_SRC_DISABLE);

    // Starts Time stamp counter for myECAP0.
    ECAP_startCounter(ECAP1_BASE);

    // Enables time stamp capture for myECAP0.
    ECAP_enableTimeStampCapture(ECAP1_BASE);

    // Re-arms the eCAP module for myECAP0.
    ECAP_reArm(ECAP1_BASE);

    // Enables interrupt source for myECAP0.
    //
    ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);

    Interrupt_register(INT_ECAP1, &CadenceISR);
    Interrupt_enable(INT_ECAP1);

    return;
}

__interrupt void CadenceISR(void)
{
    MOTOR_Vars_t *obj = (MOTOR_Vars_t *)motorHandle_M1;

   
    obj->cmdPot.cap1Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);
    obj->cmdPot.cap2Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);
    obj->cmdPot.cap3Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);
    obj->cmdPot.cap4Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);

    // Calculate pulse width (time high)
    if (obj->cmdPot.cap3Count > obj->cmdPot.cap2Count)
    {
        obj->cmdPot.pulseWidth = obj->cmdPot.cap3Count - obj->cmdPot.cap2Count;
        obj->cmdPot.pulseWidthBigger++;
    }
    else if (obj->cmdPot.cap3Count < obj->cmdPot.cap2Count)
    {
        obj->cmdPot.pulseWidth = obj->cmdPot.cap2Count - obj->cmdPot.cap3Count;
        obj->cmdPot.pulseWidthSmaller++;
    }


    if (obj->cmdPot.cap4Count > obj->cmdPot.cap2Count)
    {
        obj->cmdPot.periodCycles = obj->cmdPot.cap4Count - obj->cmdPot.cap2Count;
        obj->cmdPot.periodBigger++;
    }
    else if (obj->cmdPot.cap4Count < obj->cmdPot.cap2Count)
    {
        obj->cmdPot.periodCycles = obj->cmdPot.cap2Count - obj->cmdPot.cap4Count;
        obj->cmdPot.periodSmaller++;
    }

    if (obj->cmdPot.periodCycles > 0)
    {
        obj->cmdPot.plusecounter++;
        obj->cmdPot.periodSec = (float)obj->cmdPot.periodCycles / 20000000.0f; // Convert to seconds
        obj->cmdPot.revTimeSec = obj->cmdPot.periodSec * 48.0f; // Time for one revolution (48 pulses)

        if (obj->cmdPot.revTimeSec > 0.0f)
        {
            obj->cmdPot.cadenceRPM = 60.0f / obj->cmdPot.revTimeSec; // RPM = 60 / time per revolution (seconds)
        }
    }

    ECAP_clearInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
    ECAP_clearGlobalInterrupt(ECAP1_BASE);
    ECAP_reArm(ECAP1_BASE);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);

    return;
}

Danny

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

    您好、Danny、

    您可以在发生另一个事件时启用以触发除 eCAP_EVENT_4 之外的中断、但是如果您在事件 2 上触发(例如,事件 4 尚未到来)、因此您可能需要读取已触发的事件、并且仅从事件 1/2 中读取并在事件 4 发生之前全部清除中断标志。

    为什么需要在每个上升沿触发中断?

    此致、

    Ryan Ma

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

    您好、Ryan、

    为什么需要在每个上升沿触发中断?

    是的、我的 旋转盘上有 48 个磁体 、可触发 48 个中断、我需要对每次中断都做一些工作(更好的实时快速响应)、以及 用于计算踏频 RPM 的占空比/周期

    您认为是否只有解决方案使用其他 eCAP +中断事件:

    eCAP1 :eCAP_EVENT_1  上升沿上的脉冲计数中断?  

    eCAP2:eCAP_EVENT_4 上升下降时的中断是否用于计算占空比?

    Danny

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

    您好、Danny、

    是的、这样可行。

    此致、

    Ryan Ma