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.

DcBusComp with big DcBus ripple

Hi,

I'm using InstaSpin with DcBusCompensation. But i still see the DcBus ripple on my current Signal. (I have a big ripple (50V) with 300Hz. (3 phase input with low DcBusCapacity))

I have see that the Compensation is scale th Kp from the Current PID-Ctrl. This way there is only a effect when there ist a Error (refValue-fbackvalue)?

Is there a reason why not scale direct the PWM-Output. I think it would be faster. Where is the best place to do it? (Perhaps in the "PWM_write_CmpA" function?)

 Is there any experience with this.

Thank you Dani

 

 

 

  • Daniel Hofstetter said:

    I'm using InstaSpin with DcBusCompensation. But i still see the DcBus ripple on my current Signal. (I have a big ripple (50V) with 300Hz. (3 phase input with low DcBusCapacity))

    DC Bus Compensation does not stop your bus from rippling. It keeps the proper voltage output on the inverter regardless of the actual Bus. To explain the effect, if you have a nominal 350V bus, and your algorithm determines it needs 300V, it may produce a duty cycle of 85.7%.  With DC Bus compensation you are measuring the actual bus, so that if the bus is actually 325V, and you still want the 300V output, you produce 92.3% duty cycle.

    But as you noticed, we get this effect not by directly changing the duty cycle - which can be unstable and saturate - but by scaling the proportional gain of the current controllers.

  • 4375.Current ripple.tif

    Hi,

    I know that the DC Bus Compensation does not stop the ripple an the bus. But i expect that it stop the ripple on the phase current.

    In my "Current ripple.tif" you can see that when the DC Bus(C1 Yellow) is low, then the Phase Current (C4 Green) is also low. I think with a direct compensation it shoud be better, when it's enough fast.

    For my 300Hz ripple i change the DCBus Filter (My Hardware ist fast enough)

    #define USER_DCBUS_POLE_rps (1890.0)  // for 300Hz ripple

    Any idea why there is still ripple on the current?

    Thank you

    Dani

     

  • Hi,

    One possible issue is that the output of the current controllers are already giving the maximum output, so even if it tries to compensate for a drop in DCbus, there is no more voltage left to add to the output.

    Is it possible that you capture the output of the Id and Iq controllers when this is happening?

    -Jorge

  • Dear Chris,

    I'm running my project that developed from Lab11a. I want to check the DcBus Compensation when running the motor with V/f control to calibrate my hardware before running the system with Vector control (will use instaSPIN's). However I have a problem every enable the DcBus Compensation by the following code:

    if (gMotorVars.Flag_enableDcBusComp == true)
    {
       oneOverDcBus = EST_getOneOverDcBus_pu(estHandle);
       Vab_pu.value[0] = _IQmpy(Vab_pu.value[0], oneOverDcBus);
       Vab_pu.value[1] = _IQmpy(Vab_pu.value[1], oneOverDcBus);
    }
    
    SVGEN_run(svgenHandle,&Vab_pu,&(gPwmData.Tabc));
    
    

    The problem is: Every setting gMotorVars.Flag_enableDcBusComp == true on debugging watch window, the motor get big swing on the motor speed and the motor cannot run smoothly.  I checked the result oneOverDcBus versus gAdcData.DcBusVoltage and verify that it is true.

    Where am I wrong?

    Thank you for your help!

    Mr. Tran

  • it looks fine.
    did you verify the value of oneOverDcBus? it should be close to 1.0 with nominal DC bus. A small change near 1.0 should not result in a big swing on the control loop.
  • Dear Chris,

    I captured the screen-shot for two cases:

    a) At VdcBus = 100 Vdc. Please look the gAdcData.dcBus = 0.1071 (p.u) which is equivalent to 107.1 Vdc, and gOneOverDcBus = 10.666 (p.u)

    b) At VdcBus = 330 Vdc. Please look the gAdcData.dcBus = 0.3312 (p.u) which is equivalent to 331.2 Vdc, and gOneOverDcBus = 3.271 (p.u)

    Whether I was wrong in somewhere?

    Thank you for reply as soon as possible.

    Mr. Tran

  • Dear Chris,

    I checked again in my code, and found that, the last report is the result of calculating oneOverDcBus of my method after discussing with you on the topic:

    Which is created by implementing the following codes:

    	if(gMotorVars.Flag_enableDcBusComp == true)
    	{
    		// or Calculate 1/VdcBus_pu by my own function
    		gOneOverDcBus = _IQdiv(_IQ(1.0), VdcBus_pu);                             //VdcBus_pu = _IQ12toIQ(gAdcData.dcBus));
    		Vab_pu.value[0] = _IQmpy(Vab_pu.value[0], gOneOverDcBus);
    		Vab_pu.value[1] = _IQmpy(Vab_pu.value[1], gOneOverDcBus);
    	}

    When running the code using TI's function, I got the result as following:

    	EST_run(estHandle,&Iab_pu_fb,&Vab_pu_fb,gAdcData.dcBus,gMotorVars.SpeedRef_pu);
            if(gMotorVars.Flag_enableDcBusComp == true)
    	{
    		//! \brief using the TI's estimation.
    		//! \notes firstly using this function, user need to call the EST_run() before that.
    		gOneOverDcBus_est = EST_getOneOverDcBus_pu(estHandle);
    
    		Vab_pu.value[0] = _IQmpy(Vab_pu.value[0], gOneOverDcBus_est);
    		Vab_pu.value[1] = _IQmpy(Vab_pu.value[1], gOneOverDcBus_est);
    	}

    Notice that the result in gOneOverDcBus_est = 100 (in IQ24). This result is different from the result which return from my own method for the same gMotorVars.VdcBus_kV = 200V.

    Where did I misunderstand with the concept of 1/VdcBus_pu?

    Many thank you for your ideas.

  • Tran,
    your nominal bus is 1000V? You won't be able to compensate for such a wide range of Vbus. The oneOverDcBus value is expected to be in the 0.75 to 1.25 range...+/- 25 % of Vbus. When you have a value for oneOverDcBus of 10 of course you are going to get a huge jump in your voltage / duty cycle!

    also remember that you can only compensate up to the voltage you have available.
    Ex:
    if you are using 50% duty cycle at 800V, and bus drops to 720V, you can compensate with 60% duty cycle.
    if you are using 95% duty cycle at 800V, and bus drops to 720V, you won't be able to fully compensate
  • //! \brief Defines full scale (or BASE) value for the IQ30 variable of Voltage inside the system
    //! \brief All voltages are converted into (pu) based on the ratio to this value. In other words, this value MUST be larger than the maximum value of any voltage calculated inside the control system.
    //! \brief WARNING: Voltages inside the motor can be greater than the input voltage. So set IQ full-scale Voltage greater than any voltage inside the motor.
    //! \brief WARNING: this value MUST meet the following condition: USER_IQ_FULL_SCALE_VOLTAGE_V > 0.5 * USER_MOTOR_MAX_CURRENT * USER_MOTOR_Ls_d * USER_VOLTAGE_FILTER_POLE_rps, 
    //! \brief WARNING: otherwise the value can saturate and roll-over, causing an inaccurate value
    //! \brief WARNING: this value is OFTEN greater than the maximum measured ADC value, especially with high Bemf motors operating at higher than rated speeds
    //! \brief WARNING: if you know the value of your Bemf constant, and you know you are operating at a multiple speed due to field weakening, be sure to set this value higher than the expected Bemf voltage
    //! \brief It is recommended to start with a value ~3x greater than the USER_ADC_FULL_SCALE_VOLTAGE_V and increase to 4-5x if scenarios where a Bemf calculation may exceed these limits
    //! \brief This value is also used to calculate the minimum flux value: USER_IQ_FULL_SCALE_VOLTAGE_V/USER_EST_FREQ_Hz/0.7
    #define USER_IQ_FULL_SCALE_VOLTAGE_V      (1000.0)   	// 1000.0 in IQ30 format for vfdkit_rev1.0 typical usage (Added by Duongtb; 10-Nov-2015)
    
    //! \brief Defines the maximum phase voltage at the input to the AD converter
    //! \brief The value that will be represented by the maximum ADC input (3.3V) and conversion (0FFFh)
    //! \brief Hardware dependent, this should be based on the voltage sensing and scaling to the ADC input
    #define USER_ADC_FULL_SCALE_VOLTAGE_V     (560)      	// 560V vfdkit_rev1.0 voltage scaling (Added by Duongtb; 10-Nov-2015)
    
    //! \brief Defines the voltage scale factor for the system
    //! \brief Compile time calculation for scale factor (ratio) used throughout the system
    #define USER_VOLTAGE_SF               	  ((float_t)((USER_ADC_FULL_SCALE_VOLTAGE_V)/(USER_IQ_FULL_SCALE_VOLTAGE_V)))
    
    //! \brief Defines the maximum dcbus voltage at the input to the AD converter
    //! \notes The V_DCbus of vfdkit_rev01 is 540Vdc in normal, so if no field weakening is used,
    //! \notes However, in case of regenerating brake, the V_DCbus can go up to 650V or more,
    //! \notes so that the 1000.0V is selected with 20% headroom of the maximum voltage
    //! \notes Added by Duongtb (28-Jan-2016)
    #define USER_VBUS_ADC_FULL_SCALE_VOLTAGE_V (1000.0)
    
    //! \brief Defines the dcbus voltage scale factor for the system
    //! \notes Added by Duongtb (28-Jan-2016)
    #define USER_VBUS_VOLTAGE_SF  			((float_t)((USER_VBUS_ADC_FULL_SCALE_VOLTAGE_V)/(USER_IQ_FULL_SCALE_VOLTAGE_V)))
    

    Dear Chris,

    VdcBus (nominal) in my VFD is 540Vdc.

    But I declared USER_IQ_FULL_SCALE_VOLTAGE_V = 1000, and the VdcBus measurement circuit is designed for monitoring up to 1000Vdc <--> 3.3V on ADC pin.

    So I must understand that the Dc Bus Compensation Algorithm is only right when VdcBus is swing +/-20% around VdcBus_nominal = 540V?

    Because I am in process of calibrating my hardware, so that must increase slowly the VdcBus for testing the operation of our hardware system as well as the firmware.

  • Tran,
    you shouldn't need to use Vbus compensation during development with much lower actual Vbus. When using a lower Vbus for development you should expect lower average voltage to the motor and hence lower torque/speed. Vbus compensation is meant to support run-time control when Vbus has some error / swings. Yes, it is for nominal error, probably 20-25% (assuming you have 20-25% extra duty cycle).
  • Dear Chris,

    Thank you for your advice!

    I will test the feature of DC Bus Compensation late when my hardware is available for this. I can ask for your help for this problem again.