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.

ACI Motor ID: Bypassing Lock Rotor

Some ACI motors can't have their shaft locked for proper Motor ID. 
Here is a solution, though it requires more effort / tuning.

 

Start Running lab 2b Motor ID like normal: calculate the offsets, R over L, Rs, rated magnetizing current and finally rated flux.

Once the state changes to lock rotor (gMotorVars.EstState == EST_State_LockRotor), you can just halt CPU execution and update user.h with the following parameters:

#define USER_MOTOR_Rr: gMotorVars.Rs_Ohm
#define USER_MOTOR_Rs: gMotorVars.Rs_Ohm
#define USER_MOTOR_Ls_d: controller_obj->Lhf (for 06x) or ctrl.Lhf (for 02x)
#define USER_MOTOR_Ls_q: (USER_MOTOR_Ls_d)
#define USER_MOTOR_RATED_FLUX: This should have already been populated with the rated flux of the motor, ex: 220 VAC and 60 Hz (0.8165*220.0/60.0)
#define USER_MOTOR_MAGNETIZING_CURRENT: gMotorVars.MagnCurr_A

 

Up until now, it is assumed that Rr = Rs, which is not true, but it is a starting point.

What you need to do next, is to

For this you need to set the Rr value in pu.  You can call this function in the updateGlobalVariables_motor() function.

EST_setRr_pu(obj->estHandle, Rr_pu + RrDelta_pu);

 

But first you need to create the variable:
volatile _iq RrDelta = _IQ30(0.0); // Delta to adjust the internal Rr, note that it is an IQ30 value. Start with _IQ30(0.0) and lower the delta, _IQ30(-0.05), _IQ30(-0.1), _IQ30(-0.15), etc.

and you will need to initialize the starting Rr_pu. This needs to be done once AFTER you load the gUserParams and the motor is running, but not in a continous background loop like in updateGlobalVariables_motor().

Ex, to initialize this logic and interface to the RrDelta tuning you can create the following state in the for loop:

If(flag_tune_Rr == false)

{

  Rr_pu = EST_getRr_pu(obj->estHandle);

  RrDelta_pu = _IQ30(0.0);

}

Else

{

  EST_setRr_pu(obj->estHandle, Rr_pu + RrDelta_pu);

}

 And the procedure would be, run motor with flag_tune_Rr = false. Then set the flag to true and start tuning RrDelta_pu in the watch window.

 

Once both speeds match, record the value in user.h USER_MOTOR:

#define USER_MOTOR_Rr: Use EST_getRr_Ohm(obj->estHandle);

 

  • wa wa. ....

    Chris:

    that good idea!

    but I feel that not covenient,.... I have to buy RPM-METER!

    If  invert sale to abroad. means our client have to buy RPM-METER.

    ACI ID ,at Rr stage. must hold the shaft , some situation can't not admit. like as big power motor. what can hold the shaft of >100kw ACI motor?  so that is.....

    if let shaft spin, just short Rr ID time .can useful? or other way?

  • Yes, I see how in your case this doesn't help. This was meant to help if you have an induction motor compressor or a motor that is linked into some mechanical system and can't be uncoupled.

    Certainly we have not provided a global solution for ACI motor parameter ID like some of the drives companies have for a certain segment of motor/drive combination.

    We are looking at how we could address though....

     

  • Hi Chris,

    And when setting Rr = Rs and the speed measured with a sensor and gMotorVars.Speed_krpm match ?

    How to get the correct value of Rr ?
  • use  the

    EST_getRr_Ohm(obj->estHandle);

     

    function to pull the value

  • Chris,

     Yes, this function is used to get the value of Rr, that is the same I've populated in user.h that is the same Rs, that is incorrect. Right ?

      If I am " Bypassing Lock Rotor " and setting the value of Rr = Rs the velocity of the motor is correct, is there any problem let the value of Rr =Rs ?

     

     

     

  • if Rr is incorrect the estimated speed will read incorrectly.

    per the procedure in the first post you start with Rr = Rs and then you adjust Rr using
    EST_setRr_pu(obj->estHandle, Rr_pu + RrDelta_pu);

    as you are adjusting this value the value of Rr inside the estimator is changed, so Rr =! Rs

    you can verify this by pulling the updated Rr value using
    EST_getRr_Ohm(obj->estHandle);
  • Chris,

    I have set the Rr = Rs and comparing the gMotorVars.Speed_krpm, the gMotorVars.SpeedQEP_krpm and the velocity measured with a digital tachometer, the three values are the same in any speed I set.

    Doing the procedure described in first post and reducing the Rr value does not make difference in my system.