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.

C2000WARE: Effect of power factor in the DC current sensing of the inverter.

Part Number: C2000WARE


Tool/software:

Hi Forum,

here is an interesting observation found. Please participate in the discussion to identify, is it valid or not?

If an inverter driving a low power factor induction motor, Why there is an error in DC current of an inverter?

Why the error occurs only with low power factor induction motors?'

what is the relation between the power factor and DC current sensing of an inverter. 

How to get an accurate dc current sensing irrespective of power factor. (Control algorithm is open loop V/f control only) 

Note: Scaling and sensing happening correctly. As, there are no issues with the high power factor motors operating at the same power and frequency.

Thank you

  • Hi,

    If an inverter driving a low power factor induction motor, Why there is an error in DC current of an inverter?

    Why the error occurs only with low power factor induction motors?'

    what is the relation between the power factor and DC current sensing of an inverter. 

    What is the DC current sensing you're referring to? Are you referring to increased error in the motor phase current sensing when running the induction motor with light load? Or something else?

    Best,

    Kevin

  • Yes, I am referring to increased error in DC current sensing when induction motor running with light load.

    Dc current sensing performed with the help of resistor in the -ve DC bus line. We are using three phase shunts + DC current shunt too.

      

    ADC setup

    // configure the SOCs for M1
    // ISEN_A_M1
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN4,
    MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    ADC_setupPPB(ADCC_BASE, MTR1_IU_ADC_PPB_NUM, ADC_SOC_NUMBER0);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(ADCC_BASE, MTR1_IU_ADC_PPB_NUM, 0);

    // ISEN_B_M1
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN0,
    MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCC_SOC0
    ADC_setupPPB(ADCC_BASE, MTR1_IV_ADC_PPB_NUM, ADC_SOC_NUMBER1);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(ADCC_BASE, MTR1_IV_ADC_PPB_NUM, 0);

    // ISEN_C_M1
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN2,
    MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    ADC_setupPPB(ADCC_BASE, MTR1_IW_ADC_PPB_NUM, ADC_SOC_NUMBER2);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(ADCC_BASE, MTR1_IW_ADC_PPB_NUM, 0);

    // VSEN_A_M1
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN6,
    MTR1_ADC_V_SAMPLEWINDOW);

    // VSEN_B_M1
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN6,
    MTR1_ADC_V_SAMPLEWINDOW);

    // VSEN_C_M1
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER5, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN5,
    MTR1_ADC_V_SAMPLEWINDOW);

    // VSEN_DCBUS_M1-->Trig Interrupt
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER6, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN2,
    MTR1_ADC_V_SAMPLEWINDOW);

    // IDC
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER7, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN1, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    ADC_setupPPB(ADCA_BASE, MTR1_IW_ADC_PPB_NUM, ADC_SOC_NUMBER7);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(ADCA_BASE, MTR1_IW_ADC_PPB_NUM, 0);

    // VOT
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER8, ADC_TRIGGER_EPWM1_SOCA,
    ADC_CH_ADCIN0, MTR1_ADC_V_SAMPLEWINDOW);
    // configure the interrupt sources
    // Interrupt for motor 1
    ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER8);

    Defines

    #define MTR1_ADC_TRIGGER_SOC ADC_TRIGGER_EPWM1_SOCA // EPWM1_SOCA

    #define MTR1_ADC_I_SAMPLEWINDOW 14
    #define MTR1_ADC_V_SAMPLEWINDOW 20

    #define MTR1_IU_ADC_BASE ADCA_BASE // ADCA-A1*/CMP1
    #define MTR1_IV_ADC_BASE ADCC_BASE // ADCC-A9/C8*/CMP2
    #define MTR1_IW_ADC_BASE ADCC_BASE // ADCC-A5/C2*/CMP3

    #define MTR1_IU_ADCRES_BASE ADCARESULT_BASE // ADCA-A1*
    #define MTR1_IV_ADCRES_BASE ADCCRESULT_BASE // ADCC-A9/C8*
    #define MTR1_IW_ADCRES_BASE ADCCRESULT_BASE // ADCC-A5/C2*

    #define MTR1_IU_ADC_CH_NUM ADC_CH_ADCIN1 // ADCA-A1*
    #define MTR1_IV_ADC_CH_NUM ADC_CH_ADCIN8 // ADCC-A9/C8*
    #define MTR1_IW_ADC_CH_NUM ADC_CH_ADCIN2 // ADCC-A5/C2*

    #define MTR1_IU_ADC_SOC_NUM ADC_SOC_NUMBER1 // ADCA-A1* -SOC1-PPB1
    #define MTR1_IV_ADC_SOC_NUM ADC_SOC_NUMBER1 // ADCC-A9/C8* -SOC1-PPB1
    #define MTR1_IW_ADC_SOC_NUM ADC_SOC_NUMBER2 // ADCC-A5/C2* -SOC2-PPB2

    #define MTR1_IU_ADC_PPB_NUM ADC_PPB_NUMBER1 // ADCA-A1* -SOC1-PPB1
    #define MTR1_IV_ADC_PPB_NUM ADC_PPB_NUMBER2 // ADCC-A9/C8* -SOC2-PPB1
    #define MTR1_IW_ADC_PPB_NUM ADC_PPB_NUMBER3 // ADCC-A5/C2*- SOC3-PPB2

    #define MTR1_CMPSS_U_BASE CMPSS1_BASE
    #define MTR1_CMPSS_V_BASE CMPSSLITE2_BASE
    #define MTR1_CMPSS_W_BASE CMPSSLITE3_BASE

    #define MTR1_IU_CMPHP_SEL ASYSCTL_CMPHPMUX_SELECT_1 // CMPSS1H-A1*
    #define MTR1_IU_CMPLP_SEL ASYSCTL_CMPLPMUX_SELECT_1 // CMPSS1L-A1*

    #define MTR1_IV_CMPHP_SEL ASYSCTL_CMPHPMUX_SELECT_2 // CMPSS2H-A9/C8*
    #define MTR1_IV_CMPLP_SEL ASYSCTL_CMPLPMUX_SELECT_2 // CMPSS2L-A9/C8*

    #define MTR1_IW_CMPHP_SEL ASYSCTL_CMPHPMUX_SELECT_3 // CMPSS3H-A5/C2*
    #define MTR1_IW_CMPLP_SEL ASYSCTL_CMPLPMUX_SELECT_3 // CMPSS3L-A5/C2*

    #define MTR1_IU_CMPHP_MUX 4 // CMPSS1H-A1*
    #define MTR1_IU_CMPLP_MUX 4 // CMPSS1L-A1*

    #define MTR1_IV_CMPHP_MUX 2 // CMPSS2H-A9/C8*
    #define MTR1_IV_CMPLP_MUX 2 // CMPSS2L-A9/C8*

    #define MTR1_IW_CMPHP_MUX 1 // CMPSS3H-A5/C2*
    #define MTR1_IW_CMPLP_MUX 1 // CMPSS3L-A5/C2*

    #define MTR1_IU_XBAR_EPWM_MUX XBAR_EPWM_MUX00_CMPSS1_CTRIPH_OR_L // CMPSS1-HP&LP, A1*
    #define MTR1_IV_XBAR_EPWM_MUX XBAR_EPWM_MUX02_CMPSS2_CTRIPH_OR_L // CMPSS2-HP&LP, A9/C8*
    #define MTR1_IW_XBAR_EPWM_MUX XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L // CMPSS3-HP&LP, A5/C2*

    #define MTR1_IU_XBAR_MUX XBAR_MUX00 // CMPSS1-HP&LP
    #define MTR1_IV_XBAR_MUX XBAR_MUX02 // CMPSS2-HP&LP
    #define MTR1_IW_XBAR_MUX XBAR_MUX04 // CMPSS3-HP&LP

    reading adcdata at EPWM interrupt 

    float32_t value;

    // convert phase A current
    value = (float32_t) ADC_readPPBResult(ADCCRESULT_BASE, MTR1_IU_ADC_PPB_NUM);
    pADCData->I_A.value[0] = value * pADCData->current_sf;

    // convert phase B current
    value = (float32_t) ADC_readPPBResult(ADCCRESULT_BASE, MTR1_IV_ADC_PPB_NUM);
    pADCData->I_A.value[1] = value * pADCData->current_sf;

    // convert phase C current
    value = (float32_t) ADC_readPPBResult(ADCCRESULT_BASE, MTR1_IW_ADC_PPB_NUM);
    pADCData->I_A.value[2] = value * pADCData->current_sf;

    // convert phase A voltage
    value = (float32_t) ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER3);
    pADCData->V_V.value[0] = value * pADCData->voltage_sf;

    // convert phase B voltage
    value = (float32_t) ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER4);
    pADCData->V_V.value[1] = value * pADCData->voltage_sf;

    // convert phase C voltage
    value = (float32_t) ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER5);
    pADCData->V_V.value[2] = value * pADCData->voltage_sf;

    // convert dc bus voltage
    value = (float32_t) ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER6);
    pADCData->dcBus_V = value * pADCData->dcBusvoltage_sf;

    // convert phase C current
    value = (float32_t) ADC_readPPBResult(ADCARESULT_BASE, MTR1_IW_ADC_PPB_NUM);
    value = HAL_movingAvg(value, &sma_dci); //Using simple moving average instead of EMA for better stability

     pADCData->dcBus_I = value * 0.0064453125;

    Note: Scaling is correct. Because with PMSM and with IM loading current is matching. Consider only with light load or the IM with low power factor region of operation. It has the issue of error in sensed DC current.

  • Hi,

    Ok, I see. Your DC current sensing is all 3-phase currents combined (like 1-shunt sensing).

    Are you seeing error on your regular 3-phase current sensing signals as well? Or just the DC shunt current sensing? How are you measuring the error as well?

    Are you testing the low power factor induction motor with some load? Or no load? Can you try with some load if not already?

    Best,

    Kevin

  • Hi,

    Yes.We are sensing error in three phase current as well. It is aroud 1-3% only. no much error.

    error we are measuring, between feedback value ( performed RMS with 400 samples at a rate of 4khz) to the current measured through clamp meter. ( measuring device is a decent one only Fluke clamp meter, furture verified with different power meters too)

    From our observation, error in sensed Dc current only observed that too around 200%. Further, error observed only under no load condition. We tested with different induction motors that too, with the motors having power factor ranged from 0.1-0.3. That too under no load only observed this error.

    Played with the switching freq, deadband, samples too..No improvement observed.

    Thanks