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.

Field weakening and overmodulation problems

Hello InstaSPIN community,

We are using the  F2806x ISO controlCARD connected in our own designed board. The motor I am using is 4KW – 28V – 117A – 2530 RPM, my VDC is a battery 48V – 500Ah

We completed the lab12b and it is working well. Now we are currently trying to use the field weakening and overmodulation on the controller.

So we start with lab9. When I compile the lab9 some warnings are generated:   #175-D floating-point value does not fit in required integral type  proj_lab09.c

I've tried to change the code:

 if(FW_getFlag_enableFw(fwHandle) == true)
    {
      FW_incCounter(fwHandle);

      if(FW_getCounter(fwHandle) > FW_getNumIsrTicksPerFwTick(fwHandle))
        {
          _iq refValue;
          _iq fbackValue;
          _iq output;

          FW_clearCounter(fwHandle);

          refValue = gMotorVars.VsRef;

          fbackValue = gMotorVars.Vs;

          FW_run(fwHandle, refValue, fbackValue, &output);

          CTRL_setId_ref_pu(ctrlHandle, output);

          gMotorVars.IdRef_kA = _IQmpy(CTRL_getId_ref_pu(ctrlHandle), _IQ(USER_IQ_FULL_SCALE_CURRENT_A/1000));
        }
    }
  else
    {
      CTRL_setId_ref_pu(ctrlHandle, _IQmpy(gMotorVars.IdRef_kA, _IQ(1.0/(USER_IQ_FULL_SCALE_CURRENT_A/1000))));
    }

// read Id and Iq vectors in amps
  gMotorVars.Id_kA = _IQmpy(CTRL_getId_in_pu(ctrlHandle), _IQ(USER_IQ_FULL_SCALE_CURRENT_A/1000));
  gMotorVars.Iq_kA = _IQmpy(CTRL_getIq_in_pu(ctrlHandle), _IQ(USER_IQ_FULL_SCALE_CURRENT_A/1000));

  // calculate vector Is in amps
  gMotorVars.Is_kA = _IQsqrt(_IQmpy(gMotorVars.Id_kA, gMotorVars.Id_kA) + _IQmpy(gMotorVars.Iq_kA, gMotorVars.Iq_kA));

When I run, the motor spins fine until 2500 rpm. At higher speeds like 3200 rpm the velocity oscillates.

What can I try to solve the problem ?

Thanks in Advance !

  • is the issue only the oscillatioin at higher speeds?
    I would first try to reduce the bandwidth of the SpinTAC controller, it may be just slightly too aggressive in this operating area.

    Is this an induction machine or permanent magnet? If Induction, instead of using Field Weakening you can just enable PowerWarp. It automatically creates the field required for the torque demand of the system.
  • Chris,

    Yes the issue is only at higher speeds above 2600 rpm.

    I've tried the lab10b and the motor runs fine until 2600rpm, if I change the gMotorVars.SpeedRef_krpm to 2.7 the motor starts to be bad controlled. I reduced the gMotorVars.SpinTAC.VelCtlBwScale and the same thing happens.

    This is an AC Induction motor and I'll use this controller in traction and pump motors.

    I've tried the lab12b with PowerWarp enabled and the motor accelerates fine, but if I change the gMotorVars.SpeedRef_krpm to 3.6, the motor velocity reachs 3800rpm and then reduces to 3600rpm. I don't know if is this happening because the motor is unloaded.

    With the PowerWarp desabled the motor reachs the maximum velocity of 2900 rpm and the control is perfect.

    I need higher speeds. What is the better method ?

    Thanks !
  • with the induction motor you should use PowerWarp to control your field as long as you can accept the reduction in dynamic performance. What I mean is that if you leave PowerWarp on all the time your system won't respond to changes in load as quickly since the field has to be built. You could only turn on PowerWarp when you are setting a speed reference above the maximum non-PowerWarp speed.

    "I've tried the lab12b with PowerWarp enabled and the motor accelerates fine, but if I change the gMotorVars.SpeedRef_krpm to 3.6, the motor velocity reachs 3800rpm and then reduces to 3600rpm. I don't know if is this happening because the motor is unloaded."

    I suspect this is primarily because the speed controller is too soft. I would increase the BW and see if you can reduce the overshoot. 12b is using an encoder...this motor has an encoder then? And without PowerWarp you can reach 2900 RPM? What modulation are you using, the default 1.0 or are you increasing it using the SVGEN_CURRENT module introduced in lab 10?

    trying to understand the differences in your set-up in lab 10 and lab 12 that would improve the 2600-2900 RPM range with lab 12. Is the only difference the use of the encoder? If so we can investigate the cause.
  • Chris,

    "I would increase the BW and see if you can reduce the overshoot"

    With PowerWarp I increased the BW, the motor reachs 3600rpm and the overshoot was reduced. (lab12b)


    "12b is using an encoder...this motor has an encoder then? And without PowerWarp you can reach 2900 RPM? What modulation are you using, the default 1.0 or are you increasing it using the SVGEN_CURRENT module introduced in lab 10?"

    The motor has an encoder bearing inside and with lab12b without PowerWarp the velocity reachs at a maximum 2900rpm and the control seems to be perfect. In lab10 I'm using the default modulation.


    Thanks !
  • PAULO SIQUEIRA said:
    With PowerWarp I increased the BW, the motor reachs 3600rpm and the overshoot was reduced. (lab12b)

    Great! So using a sensor everything is working quite well. Correct?

    PAULO SIQUEIRA said:
    The motor has an encoder bearing inside and with lab12b without PowerWarp the velocity reachs at a maximum 2900rpm and the control seems to be perfect. In lab10 I'm using the default modulation.

    In lab 10 and lab 12 please tell me the values in user.h

    #define USER_MAX_VS_MAG_PU        (1.0) 

    and that you update to during run-time

    gMotorVars.OverModulation

    assuming these are equal, my only thought at why you would see 2900 vs. 2600 is that perhaps in lab 10 where you are running sensorless the motor parameters are not quite correct.  The Rr value will effect the value of the estimated speed, and I could easily see this accounting for the ~11% error. This means that the rotor may actually be moving at 2900 RPM but FAST is calculating at 2600 RPM due to the Rr value in the model being incorrect.

    To test this, in proj_lab12 FAST is still running and providing the sensorless estimate.  Compare gMotorVars.Speed_krpm to gMotorVars.SpeedQEP_krpm