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-F28379D:通过 ECAP 测量电压中的随机跳变

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1238079/launchxl-f28379d-random-jumps-in-the-measure-voltage-via-ecap

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:UCC21710

各位专家、您好!

当我从 eCAP 测量 PWM 脉冲序列时,我一直在直流母线中获得这些随机跳跃。

PWM 脉冲序列来自 UCC21710的 APWM 引脚。

需要注意的一点是、重新布防是另一个 PWM ISR、它每10KHz 执行一次。

当我绘制最终值时、我看到很多干扰:

下面是我的初始化代码和 eCAP ISR 计算、我认为有一种更好的方法可以获得占空比:

void HAL_setupECAP(HAL_MTR_Handle handle)
{
    uint16_t cnt;
    eCAP_INPUTXBAR_init(handle);
    HAL_MTR_Obj *obj = (HAL_MTR_Obj*) handle;
    for (cnt = 0; cnt < 2; cnt++)
    {
        // Disable ,clear all capture flags and interrupts
        ECAP_disableInterrupt(obj->ecapHandle[cnt],
            (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(obj->ecapHandle[cnt],
            (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(obj->ecapHandle[cnt]);
        // Stops Time stamp counter.
        ECAP_stopCounter(obj->ecapHandle[cnt]);
        // Sets eCAP in Capture mode.
        ECAP_enableCaptureMode(obj->ecapHandle[cnt]);
        // Sets the capture mode.
        ECAP_setCaptureMode(obj->ecapHandle[cnt],ECAP_ONE_SHOT_CAPTURE_MODE,ECAP_EVENT_4);
        // Sets the Capture event prescaler.
        ECAP_setEventPrescaler(obj->ecapHandle[cnt], 0U);
        // Sets the Capture event polarity.
        ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_1,ECAP_EVNT_RISING_EDGE);
        ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_2,ECAP_EVNT_FALLING_EDGE);
        ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_3,ECAP_EVNT_RISING_EDGE);
        ECAP_setEventPolarity(obj->ecapHandle[cnt],ECAP_EVENT_4,ECAP_EVNT_FALLING_EDGE);
        // Configure counter reset on events
        ECAP_disableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_1);
        ECAP_disableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_2);
        ECAP_disableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_3);
        ECAP_enableCounterResetOnEvent(obj->ecapHandle[cnt],ECAP_EVENT_4);
        // Sets a phase shift value count.
        ECAP_setPhaseShiftCount(obj->ecapHandle[cnt],0U);
        // Disable counter loading with phase shift value.
        ECAP_disableLoadCounter(obj->ecapHandle[cnt]);
        // Configures Sync out signal mode.
        ECAP_setSyncOutMode(obj->ecapHandle[cnt],ECAP_SYNC_OUT_SYNCI);
        // Configures emulation mode.
        ECAP_setEmulationMode(obj->ecapHandle[cnt],ECAP_EMULATION_STOP);
        // Starts Time stamp counter.
        ECAP_startCounter(obj->ecapHandle[cnt]);
        // Enables time stamp capture.
        ECAP_enableTimeStampCapture(obj->ecapHandle[cnt]);
        // Re-arms the eCAP module.
        //ECAP_reArm(obj->ecapHandle[cnt]);
        //INFO: Re-Arming is done in the PWM ISR(PWM ISR frequency 10 KHz)
    }
}


__interrupt void M2_INT_DCbusECap_ISR(void)
{
    ECAPVars[1].dcbus_counter++;
    uint32_t cap1_count = 0;
    uint32_t cap2_count = 0;
    uint32_t cap3_count = 0;
//    uint32_t cap4_count = 0;
    cap1_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_1); //1st raising edge
    cap2_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_2); //1st falling edge
    cap3_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_3); //2nd raising edge
//    cap4_count = ECAP_getEventTimeStamp(M2_ECAP_VDC_BASE, ECAP_EVENT_4); //2nd falling edge
    ECAPVars[1].dcbus_derivedDT_raw = (float32_t) (cap2_count - cap1_count)
            / (cap3_count - cap1_count);
    ECAPVars[1].dcbus_derivedDT_raw += ECAPVars[1].dcbus_offsetDTRaw;
    if (ECAPVars[1].dcbus_derivedDT_raw > 0.77)
    {
        ECAPVars[1].dcbus_derivedDT_raw = 0.77;
    }
    else if (ECAPVars[1].dcbus_derivedDT_raw <= 0.1)
    {
        ECAPVars[1].dcbus_derivedDT_raw = 0.10;
    }
    //Converting floating point representation into fixed point representation and feeding it to the IIR filter pow(2,15)
    m2_iir_dcbus.input = (int16_t) (ECAPVars[1].dcbus_derivedDT_raw * 32768);
    m2_iir_dcbus.calc(&m2_iir_dcbus);

    //Converting fixed point representation back to floating point representation.pow(2,15)
    ECAPVars[1].dcbus_derivedDTFiltered = __divf32(m2_iir_dcbus.output*2,32768.0) * 100;
    if (ECAPVars[1].dcbus_derivedDTFiltered > 77)
    {
        ECAPVars[1].dcbus_derivedDTFiltered = 77;
    }
    else if (ECAPVars[1].dcbus_derivedDTFiltered <= 10)
    {
        ECAPVars[1].dcbus_derivedDTFiltered = 10;
    }

//    ECAPVars[1].dcbus_derivedDTFiltered = ECAPVars[1].dcbus_derivedDT_raw * 100; //Temporary no filtering
    ECAPVars[1].dcbus = 359.275 - (4.60373 * ECAPVars[1].dcbus_derivedDTFiltered);
    ECAP_clearGlobalInterrupt(M2_ECAP_VDC_BASE);
    ECAP_clearInterrupt(M2_ECAP_VDC_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);
}

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

    你好、

    您的 eCAP 设置看起来很正常、您是否在发生特定事件时在 PWM ISR 中进行一次性捕获并重新布防?

    您能否发送您的图设置配置?

    此致!

    马瑞安

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

    您好、Ryan、

    是的,我正在进行一次性捕捉,我有一个 PWM ISR 每10KHz (100us )执行一次,在这个 ISR 中,我重新布防 ECAP 模块。

    如何发送绘图设置配置,是否有可以发送的任何配置文件?

    PS:我在捕获的占空比上包括了一个平均滤波器,毛刺似乎减少,但仍然存在。

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

    您只需发送您为绘图设置选择的配置的屏幕快照、然后我就可以查看是否可以复制您在幻灯片上看到的内容。

    此致!

    马瑞安

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

    请找到屏幕截图、如果需要其他内容、请告诉我。

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

    你好、

    您是否已验证所看到的内容不是由您捕获的引脚上的噪声引起的?

    此致!

    马瑞安

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

    您好、Ryan、我发现了问题、电机拾取了噪音。 电机未接地、一旦我将电机底盘接地、突然的尖峰就消失了。

    感谢您的帮助!