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.

TMS320F280025C: induction motor

Part Number: TMS320F280025C

Tool/software:

Hello,

We are using Motor control SDK 5.02 with our custom board, We are able to run PMSM motor with examples provided in SDK. We want to run AC induction motor with the same board, do you have any example which we can use as reference.

  • Hi,

    Our expert is out of office until early January, please expect a delayed response.

    Best Regards,

    Ben Collier

  • Hello,

    Referring to the Universal Motor Control Lab User's Guide, specifically in the description given for figure 2-8 on page 10, you can see that the control scheme differences between ACIM and PMSM motors have been considered for this lab, as well as in the InstaSPIN-FOC FAST library in general.

    In the Universal Motor Control Lab, you can see a variety of different motor examples in user_mtr1.h. Most of these motors define USER_MOTOR1_TYPE as MOTOR_TYPE_PM (PMSM motors), but a quick search shows me that there are 4 different example ACIM motors, along with the custom ACIM motor template.

    Search results in user_mtr1.h for MOTOR_TYPE_INDUCTION

    These existing ACIM motors should be a great starting reference!

    Regards,
    Jason Osborn

  • hello Jason,

    Thank you for your reply, in some TI documents it is mentioned that for Motor parameter estimation of ACIM rotor must be locked. Is it the case in universal motor control lab.

    Regards

    Prashanth

  • Prashanth,

    If I recall correctly, the InstaSPIN-FOC FAST library takes care of that internally.

    Regards,
    Jason Osborn

  • Hello Jason,

    We tried estimating Induction motor parameters, but estimation stops at EST_STATE_LC and motor is turned off. Our motor is ACIM with rated voltage of 230V and rated current of 9A.

    We are using following parameters.

    #define USER_MOTOR1_TYPE MOTOR_TYPE_INDUCTION
    #define USER_MOTOR1_NUM_POLE_PAIRS (2)
    #define USER_MOTOR1_Rr_Ohm (NULL)
    #define USER_MOTOR1_Rs_Ohm (NULL)
    #define USER_MOTOR1_Ls_d_H (NULL)
    #define USER_MOTOR1_Ls_q_H (NULL)
    #define USER_MOTOR1_RATED_FLUX_VpHz (0.8165*230.0/50.0)
    #define USER_MOTOR1_MAGNETIZING_CURRENT_A (NULL)
    #define USER_MOTOR1_RES_EST_CURRENT_A (3.0f)
    #define USER_MOTOR1_IND_EST_CURRENT_A (-1.0f) 
    #define USER_MOTOR1_MAX_CURRENT_A (11.0)
    #define USER_MOTOR1_FLUX_EXC_FREQ_Hz (5.0f)

    can you help us in identifying the issue. Thanks in advance.

    Regards

    Prashanth

  • Prashanth,

    • What faults are present after the motor stops, if any? What state is the motor state machine in? Also, was there any visible destabilization in the motor rotation or motor current waveform? Without that information, it is difficult for me to know what happened.
    • If the motor is a very low inductance motor, then FLUX_EXC_FREQ_Hz will need to be increased somewhat.
    • Consider section 6.7 'Full Identification of ACIM Motors 'of the InstaSPIN-FOC and InstaSPIN-MOTION User's Guide.
      • Specifically, I would note the advice to adjust IDRATED_DELTA if the phase current magnitude is visibly oscillating (see figure 6-32)

      Regards,
      Jason Osborn

    • Hello Jason,

      I am our current wave forms, the wave form was not steady at 5Hz, but at 20Hz the current signal is steady. 

      Initial USER_MOTOR1_RATED_FLUX_VpHz (0.8165*230.0/50.0) = 3.75 value is set and similar value is visible in debug window during open loop estimation and same is replaced by estimated value after EST_STATE_RATEDFLUX sate and the current in this state is half that of EST_STATE_IDRATED.

      After this state motor is turing off at EST_STATE_LOCKROTOR. at follwing code in motor1_drive.c. Is there issue with bypass locked rotor.

      In the debug window the state is displayed as EST_STATE_LS after motor turn off.

      if(objUser->flag_bypassMotorId == false)
      {
      if((EST_isLockRotor(obj->estHandle) == true) ||
      ( (EST_isMotorIdentified(obj->estHandle) == true)
      && (EST_isIdle(obj->estHandle) == true) ) )
      {
      if(EST_isMotorIdentified(obj->estHandle) == true)
      {
      obj->flagMotorIdentified = true;

      // clear the flag
      obj->flagRunIdentAndOnLine = false;
      obj->flagEnableRunAndIdentify = false;

      // disable the estimator
      EST_disable(obj->estHandle);

      // enable the trajectory generator
      EST_disableTraj(obj->estHandle);
      }

      if(objUser->motor_type == MOTOR_TYPE_INDUCTION)
      {
      // clear the flag
      obj->flagRunIdentAndOnLine = false;
      obj->flagEnableRunAndIdentify = false;
      }
      }
      } // objUser->flag_bypassMotorId = false

       

      Full  screent shot

      Ramp up

      EST_STATE_IDRATED

      EST_STATE_RATEDFLUX

      Regards

      prashanth

    • Prashanth,

      To be clear, the motor is not supposed to move during the Locked Rotor state.

      Here's the intended phase current waveform for the entire ACIM Motor ID Process. This is figure 6-46 of the InstaSPIN-FOC and InstaSPIN-MOTION User's Guide.

      To be clear, is the issue that the motor is not turning back on for EST_State_Ls? If so, I would adjust the value of USER_MOTOR1_IND_EST_CURRENT_A. Recall the guidance that this current should be negative, with a magnitude between 10% and 20% of the rated current of the motor. First I would try tuning it to 20% of the rated motor current, then down to 10% to see if either of these allow the motor to begin moving again.

      Regards,
      Jason Osborn

    • Hello Jason,

      Thank you for your reply. our wave form is similir till EST_STATE_RAMPDOWN after that motor is disabled.

      To be clear, the motor is not supposed to move during the Locked Rotor state

      The program is not wiating in locked rotor state it is quickly changing to EST_STATE_LS and switching off. do we have increase wait times. the wait times are set to zero for ramp down and locked rotor state. 

      As per your earlier comment

      If I recall correctly, the InstaSPIN-FOC FAST library takes care of that internally

      we can avoid locking rotor.

    • follwing fault flag are set

      Phase imbalance, over frequency and startup fail and these are set before rampup state. 

    • The wait times should not be set to 0. Refer to the guide I provided before on the correct values which should be assigned.

      Regards,
      Jason Osborn

    • Hello Jason,

      After adding wait time in EST_STATE_RAMPDOWN and EST_STATE_LOCK. The controller is waiting at lock rotor and getting disabled. After re enabling controller, it is proceeding to EST_STATE_LS and EST_STATE_RR after that we are getting EST_STATE_MOTORIDENTIFIED.

      But during EST_STATE_LS the wave form is as follows it is not running for full wait time set 

      objUser->LsWaitTime[EST_LS_STATE_ERROR] = 0;
      objUser->LsWaitTime[EST_LS_STATE_IDLE] = 0;
      objUser->LsWaitTime[EST_LS_STATE_RAMPUP] = (int_least32_t)(10.0 * USER_M1_ISR_FREQ_Hz);
      objUser->LsWaitTime[EST_LS_STATE_COARSE] = (int_least32_t)(30.0 * USER_M1_ISR_FREQ_Hz);
      objUser->LsWaitTime[EST_LS_STATE_FINE] = (int_least32_t)(30.0 * USER_M1_ISR_FREQ_Hz);
      objUser->LsWaitTime[EST_LS_STATE_DONE] = 0;

    • and motor is not spinning during estimation. The current is set to -2.0 and frequency is 1.5Hz.

    • If the motor is not spinning at all during any point in the estimation process, it is likely that the other issues you're facing are related to that.

      Have you had a chance to read the InstaSPIN-FOC and InstaSPIN-MOTION User's Guide? Section 4.8.1.2 "Entering ACIM Motor Parameters from a Data Sheet to user.h" and Section 5 "Managing Motor Signals" seem like they may be particularly helpful. Typically, if the motor is not spinning, it's because a basic parameter needs correction.

      Additionally, have you verified the voltage, current, and PWM signals on your custom board are all good quality?

      Regards,
      Jason Osborn

    • Hello Jason,

      Yes, we referred to the user guide, our offset calibration for both current and voltage signals are not returning errors.

      the motor is spinning during ramp up and flux estimation. But it is not spinning after re enabling the motor after LOCKED_ROTOR state.

      We do not have detailed datasheet of motor giving motor resistance and inductance, so we are trying to estimate motor parameters.

      the estimation frequency during LS is low less than 2HZ at the frequency motor will not spin. 

      The same board is working fine with PMSM motor it is able estimate motor parameters and run in closed loop with estimated parameters. We verified with different PMSM mottors.

      Regards

      Prashanth

    • We are using following parameters.

      #define USER_MOTOR1_TYPE MOTOR_TYPE_INDUCTION
      #define USER_MOTOR1_NUM_POLE_PAIRS (2)
      #define USER_MOTOR1_Rr_Ohm (NULL)
      #define USER_MOTOR1_Rs_Ohm (NULL)
      #define USER_MOTOR1_Ls_d_H (NULL)
      #define USER_MOTOR1_Ls_q_H (NULL)
      #define USER_MOTOR1_RATED_FLUX_VpHz (0.8165*230.0/50.0)
      #define USER_MOTOR1_MAGNETIZING_CURRENT_A (NULL)
      #define USER_MOTOR1_RES_EST_CURRENT_A (3.0f)
      #define USER_MOTOR1_IND_EST_CURRENT_A (-1.0f) 
      #define USER_MOTOR1_MAX_CURRENT_A (11.0)
      #define USER_MOTOR1_FLUX_EXC_FREQ_Hz (5.0f)

      The number of pole pairs might relate to stator tooth slots/2 if this is a typical non magnet induction motor there are 0 pole pairs. Instead, there are async electrical slip degrees AC induction motors. Perhaps ~EST_CURRENT_A(3.0f) is too low for a motor 9A peak? Perhaps why rotor may never really enter a locked state. You can test lock exists by using your fingers, when it enters lock state try to spin the rotor in either direction. If you can easily spin the rotor shaft, it perhaps is not truly in a locked state when LS tests induction.

    • You can also try reducing state times if LS returns bizarre values during motor identification. A custom PCB returned induction values often act differently than the booster pack DRV class of motor driver boards on TI launch pad. Perhaps try to identify the PMSM on your custom PCB to get an idea of these state times need be adjusted to return more realistic induction values. R/L state is another value that can produce incorrect resistance values. The motor control SDK state machine times may vary based on the CPU clock speed that you configured for x25c if set less than 100MHz. Check if your custom PCB current sensors are inverting the output, that is set (+/-) in user.h or user_motor1.h universal motor SDK.

      objUser->LsWaitTime[EST_LS_STATE_RAMPUP] = (int_least32_t)(10.0 * USER_M1_ISR_FREQ_Hz);
      objUser->LsWaitTime[EST_LS_STATE_COARSE] = (int_least32_t)(30.0 * USER_M1_ISR_FREQ_Hz);
      objUser->LsWaitTime[EST_LS_STATE_FINE] = (int_least32_t)(30.0 * USER_M1_ISR_FREQ_Hz);

    • hello Genatco,

      Sorry for delayed reply, In our custom board PMSM is running fine. The estimated vales are consistent across multiple trials. We tested with different PMSM motors ranging from 110V-6A to 480V 14A. All PMSM motor are working well. 

      Do we have to adjust wait time for ACIM. Rs estimate returns similar values for multiple values. Shall we try with higher inductance estimate current as the motor is not spinning during LS estimation.

      We are using inline hall current sensor without inversion.

      Regards

      prashanth

    • Shall we try with higher inductance estimate current as the motor is not spinning during LS estimation

      Text states rotor remains locked during LS estimation. The lock state control is automatic for induction motors during motor ID process. After motor ID = true isLAB_05 should unlock rotor able to test run induction motor and copy CCS debug script values into user.h, induction motor parameters. 

      Sometimes compiled bool flag states don't always behave in CCS debug, proactive use estimator ROM calls in motor state control functions. 

      // Proper flag setting both motor types isLAB_05
          //
          // if motor is an induction motor, configure default state of PowerWarp
          //
          if(userParams.motor_type == MOTOR_TYPE_INDUCTION)
          {
              motorVars.flagEnablePowerWarp = true;
              EST_setFlag_enablePowerWarp(estHandle, motorVars.flagEnablePowerWarp);
              motorVars.flagBypassLockRotor = false;
              EST_setFlag_bypassLockRotor(estHandle, motorVars.flagBypassLockRotor);
          }
          else
          {
              motorVars.flagEnablePowerWarp = false;
              EST_setFlag_enablePowerWarp(estHandle, motorVars.flagEnablePowerWarp);
              motorVars.flagBypassLockRotor = true;
              EST_setFlag_bypassLockRotor(estHandle, motorVars.flagBypassLockRotor);
          }
                 
                 
                 
                 if( (EST_isLockRotor(estHandle) == true) ||
                           ((EST_isMotorIdentified(estHandle)
                             && EST_isIdle(estHandle)) == true))
                      {
                          if(EST_isMotorIdentified(estHandle) == true)
                          {
                              motorVars.flagMotorIdentified = true;
                              //! \brief     Sets the motor identified flag state in the estimator
                              EST_setFlag_motorIdentified(estHandle, true);
                              //! \brief     Sets the bypass lock rotor flag value in the estimator
                              motorVars.flagBypassLockRotor = true;
                              EST_setFlag_bypassLockRotor(estHandle, motorVars.flagBypassLockRotor);
                              //
                              // set up the PI control according to the identification
                              // motor parameters
                              //
                              userParams.motor_ratedFlux_Wb = motorVars.flux_VpHz / MATH_TWO_PI;
      
                              userParams.motor_Rr_d_Ohm = motorVars.Rr_Ohm;
                              userParams.motor_Rr_q_Ohm = motorVars.Rr_Ohm;
      
                              userParams.motor_Rs_a_Ohm = motorVars.Rs_Ohm;
                              userParams.motor_Rs_b_Ohm = motorVars.Rs_Ohm;
      
                              userParams.motor_Rs_d_Ohm = motorVars.Rs_Ohm;
                              userParams.motor_Rs_q_Ohm = motorVars.Rs_Ohm;
      
                              userParams.motor_Ls_d_H = motorVars.Ls_d_H;
                              userParams.motor_Ls_q_H = motorVars.Ls_q_H;
      
                              CTRL_setParams(ctrlHandle, &userParams);
      
                          }