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.

CCS/TMS320F28027F: Documentation on Over modulation

Part Number: TMS320F28027F


Tool/software: Code Composer Studio

Hi, 

I am working on over-modulation (2/3) with reference to lab 10. I plot Iq which turns to be quite noisy when SVM enters in overmodulation and I am not so sure about the correct configuration of (SVGENCURRENT) module. Although I am using 3 shunts. In the user manual, I am unable to find the documentation on the configuration of overmodulation. Will appreciate it if can provide the documentation resource on the topic or guide me through the correct configuration. 

Thank you.   

  • Ibraheem,

    Due to US holidays, most of the experts are out of office. Please expect delay in response. Sincere apology for inconvenience.

  • Hi,

    Have you checked the document shown below?

    You can find details about overmodulation on page 228.


    www.ti.com/.../spruhj1h.pdf

    Let me know if you still have questions.

    Best,

    John

  • Thank you, John

    I have gone through the documentation, but I couldn't find any details on the current reconstruction configuration parameters. For example in the following code, 

    // Initialize and setup the 100% SVM generator
    svgencurrentHandle = SVGENCURRENT_init(&svgencurrent, sizeof(svgencurrent));

    // setup svgen current
    {
    float_t minWidth_microseconds = 1.0;
    uint16_t minWidth_counts = (uint16_t) (minWidth_microseconds
    * USER_SYSTEM_FREQ_MHz);
    float_t fdutyLimit = 0.5
    - (2.0 * minWidth_microseconds * USER_PWM_FREQ_kHz * 0.001);
    _iq dutyLimit = _IQ(fdutyLimit);

    SVGENCURRENT_setMinWidth(svgencurrentHandle, minWidth_counts);
    SVGENCURRENT_setIgnoreShunt(svgencurrentHandle, use_all);
    SVGENCURRENT_setMode(svgencurrentHandle, all_phase_measurable);
    SVGENCURRENT_setVlimit(svgencurrentHandle, dutyLimit);
    }

    what does minWidth_microseconds represent? Tweaking it affects what part of the performance?

    What is the significance of the following lines of code in mainISR as if it's trying to adjust the sampling point in the next cycle or something else. I found if I add these lines of code, the current controller seriously goes unstable when SVM enters in overmodulation region as I am using 100% overmodulation unless I remove these lines of code.   

    SVGENCURRENT_IgnoreShunt_e ignoreShuntNextCycle =
    SVGENCURRENT_getIgnoreShunt(svgencurrentHandle);
    SVGENCURRENT_VmidShunt_e midVolShunt = SVGENCURRENT_getVmid(
    svgencurrentHandle);

    // Set trigger point in the middle of the low side pulse
    HAL_setTrigger(halHandle, ignoreShuntNextCycle, midVolShunt); 

    my Main ISR function is below

    interrupt void mainISR(void)
    {
    uint32_t timer0Cnt;
    uint32_t timer1Cnt;

    SVGENCURRENT_MeasureShunt_e measurableShuntThisCycle = SVGENCURRENT_getMode(
    svgencurrentHandle);

    // read the timer 1 value and update the CPU usage module
    timer1Cnt = HAL_readTimerCnt(halHandle, 1);
    CPU_USAGE_updateCnts(cpu_usageHandle, timer1Cnt);

    // read the timer 0 value and update the FEM
    timer0Cnt = HAL_readTimerCnt(halHandle, 0);
    FEM_updateCnts(femHandle, timer0Cnt);
    FEM_run(femHandle);

    // acknowledge the ADC interrupt
    HAL_acqAdcInt(halHandle, ADC_IntNumber_1);

    // convert the ADC data
    HAL_readAdcData(halHandle, &gAdcData);

    // run the current reconstruction algorithm
    SVGENCURRENT_RunRegenCurrent(svgencurrentHandle,
    (MATH_vec3*) (gAdcData.I.value));

    gIavg.value[0] += (gAdcData.I.value[0] - gIavg.value[0]) >> gIavg_shift;
    gIavg.value[1] += (gAdcData.I.value[1] - gIavg.value[1]) >> gIavg_shift;
    gIavg.value[2] += (gAdcData.I.value[2] - gIavg.value[2]) >> gIavg_shift;

    if (measurableShuntThisCycle > two_phase_measurable)
    {
    gAdcData.I.value[0] = gIavg.value[0];
    gAdcData.I.value[1] = gIavg.value[1];
    gAdcData.I.value[2] = gIavg.value[2];
    }

    // run the controller
    CTRL_run(ctrlHandle, halHandle, &gAdcData, &gPwmData);

    // run the PWM compensation and current ignore algorithm
    SVGENCURRENT_compPwmData(svgencurrentHandle, &(gPwmData.Tabc),
    &gPwmData_prev);

    // write the PWM compare values
    HAL_writePwmData(halHandle, &gPwmData);

    {
    /* SVGENCURRENT_IgnoreShunt_e ignoreShuntNextCycle =
    SVGENCURRENT_getIgnoreShunt(svgencurrentHandle);
    SVGENCURRENT_VmidShunt_e midVolShunt = SVGENCURRENT_getVmid(
    svgencurrentHandle);

    // Set trigger point in the middle of the low side pulse
    HAL_setTrigger(halHandle, ignoreShuntNextCycle, midVolShunt); */
    }

    // setup the controller
    CTRL_setup(ctrlHandle);

    // read the timer 1 value and update the CPU usage module
    timer1Cnt = HAL_readTimerCnt(halHandle, 1);
    CPU_USAGE_updateCnts(cpu_usageHandle, timer1Cnt);

    // run the CPU usage module
    CPU_USAGE_run(cpu_usageHandle);

    return;
    } // end of mainISR() function

    Looking forward to your reply,

    Thank you

    Ibraheem

  • You might take a look at the lab10a chapter of the instaSPIN lab user's guide. The value of the "minWidth_microseconds" is dependent on the ADC sampling time and headband value of FET and gate driver, it should be greater than the sum of both values.

    As replied to another thread you posted, set the USER_MAX_VS_MAG_PU to a value below 0.5777, or limit the PWM duty directly.

    e2e.ti.com/.../3577068