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

Other Parts Discussed in Thread: LAUNCHXL-F28069M

Hello,


I am using the LAUNCHXL-F28069M with my own power board to control the velocity of a traction AC Induction Motor ( 6.9 kW - 28V - 190A).

My project is based on lab12b and it is working with certain limit of velocity (about 1500 rpm) with the Magnetizing current of 45A.

I need to increase the speed about 3600rpm. I've tried with lab9 and it worked fine but with SpinTac ( lab10b) it didn't work.

When I set gMotorVars.Flag_enableFieldWeakening = 1 and  the gMotorVars.SpeedRef_krpm over 1500 rpm  the motor starts to be bad controlled.

How can I found the cause of this problem ?

Thanks in advance !

  • Paulo,

    My initial guess is that there is an issue with the maximum current in your system, since the value of 190 is greater than what can be represented in IQ24. One quick test you can try is by lowering USER_IQ_FULL_SCALE_CURRENT_A below 127.0.

    Can you post your user.h file? That will help me understand how your system is setup.

    Thanks
  • Hi Adam,

    I re-scaled the variables ( /10). And passed through the identification process again. The user.h is attached.

    With gMotorVars.Flag_enableFieldWeakening = 1 and  the gMotorVars.SpeedRef_krpm over 1500 rpm  the motor starts to be bad controlled.

    Thanks !1325.user.h

  • Paulo,

    What happens when you motor goes over 1.5krpm? Does the speed oscillate? Does it completely stall? Can you look at the Id reference and see if field weakening being applied? Have you tried decreasing the speed loop bandwidth when you go into field weakening?

    Based on our user.h file I don't see anything obviously wrong, one of the TI experts should probably weigh in on it though. When you ran lab 9 was your user.h file identical to this?
  • Adam,

    When the motor goes over 1.5Krpm spikes of current are generated.  I can't observe the Id reference because I have to turn off the controller very fast ( the power mos-fets already burned 3 times during these tests).

    I have tried to decrease the gMotorVars.SpinTAC.VelCtlBw_radps and the problem still happens.

    The user.h  is identical.

    Lab9 - 1.4Krpm

    Lab9 - 2.0Krpm

    Lab9 - 3.6Krpm

    Lab10b - 1.4Krpm

    With these pictures can you see anything wrong ? Or anything that I could try ? Do you recommend I do any other test ?


    Thank You !

  • Paulo,

    Nothing that you showed seems like there are any issues.  I'll try to run a motor tomorrow and see if I can reproduce your case.  There are a couple things you could try.  

    1. You can try enabling PowerWarp instead of using field weakening.

    2. One difference between lab 9 and lab 10b is that 10b also includes overmodulation.  You can try removing the overmodulation code from lab 10b to make it more similar to lab 9.

    Have you setup the deadtime for your power devices?

  • Are you sure that your board can supply 0 and 100% duty to the mosfets?

     Most bootstrapped gate draves can not supply 100% duty. When you have 100% or 0% duty the gate voltage to your high side mosfets will drop and they will operate in the liniear region and blow up.

    As you said over modulation over a certain speed kills 3 mosfets this would be my guess. set maximum overmodulation to 1.1, that limits maximum duty to 3->97% or something like that.

  • Adam,

    I have adjusted the deadtime fo 4us and my power board seems to working well since the controller is operating in a traction motor and I have tested with the speed under 1.4Krpm (with lab12b as reference) the truck can go up on a ramp and the current reaches 150A and the temperature of the power is normal.

    I removed the overmodulation code from lab10b and the results are good:

    Lab10b - 

    The field weakening is working well and I could accelerate the motor to 3.6Krpm with the gMotorVars.SpinTAC.VelCtlBw_radps (5.0). If I increase this variable the motor starts to oscilate.

    Disabling the Field Weakening and enabling the Power Warp the motor reaches 3.6Krpm with the gMotorVars.SpinTAC.VelCtlBw_radps (2.0). If I increase this variable the motor starts to oscilate.

    Including the Field Weakening in lab12b

    Lab12b - 

    With the field weakening I could accelerate the motor over 3.0 Krpm, but to avoid the motor starts to oscilate I had to increase the gMotorVars.SpinTAC.VelCtlBw_radps too much, about (110.0).  Is this right ?

    Disabling the Field Weakening and enabling the Power Warp the motor reaches at a maximum 2.75krpm. Increasing or decreasing the gMotorVars.SpinTAC.VelCtlBw_radps does not make difference. Why the velocity is limited using PowerWarp ?

    I need the speed reaches 3.6krpm using lab12b. What do you recommend now ?

    Thank You !

  • Victor,

    I am using the Field Weakening, I am not enabling overmodulation.

    Thank you for response !
  • Paulo,

    PAULO said:
    The field weakening is working well and I could accelerate the motor to 3.6Krpm with the gMotorVars.SpinTAC.VelCtlBw_radps (5.0). If I increase this variable the motor starts to oscilate.

    I"m glad that you were able to get it to work.  When doing heavy field weakening you will need to schedule the SpinTAC bandwidth value.  Since in field weakening, the motor's torque response has become different, the tuning needs to change as well.

    PAULO said:
    With the field weakening I could accelerate the motor over 3.0 Krpm, but to avoid the motor starts to oscilate I had to increase the gMotorVars.SpinTAC.VelCtlBw_radps too much, about (110.0).  Is this right ?

    That is very interesting, When using an encoder you can get a very stiff speed response and it can work with a large bandwidth, but I would expect that it should need to be decreased when in field weakening.  When running in the rated speed region does a bandwidth of 110 work in lab 12b?

    I would not recommend using PowerWarp along with Lab 12b.  In Lab 12b we are estimating the motor slip in order to control the angle and when PowerWarp de-fluxes the machine it will cause some issues with the slip estimation.  

    PAULO said:
    I need the speed reaches 3.6krpm using lab12b. What do you recommend now ?

    It sounds like using field weakening in lab 12b seems to allow you to accomplish your goal.  I would recommend using that.

  • Adam,

    I did this test now and with bandwidth above (50.0) the motor starts to make noise.

    Without enable the field weakening the maximum velocity is 1.7krpm. (magnetizing current about 49A).

    Enabling the field weakening with the bandwidth (40.0) the motor reaches 2.5krpm. Increasing the SpeedRef the motor starts to oscillate, with the SpeedRef (2.9) the motor stops and starts to be bad controlled.

    If I decrease the USER_MOTOR_MAGNETIZING_CURRENT the motor increase the final velocity but the initial current increase to. Can I change the magnetizing current when the motor is running ?

    Thank You !

  • Paulo,

    You should be able to change the magnetizing current while the motor is running.  This is what field weakening does for ACIM.

  • Adam,

    What I mean is if can I reduce the parameter USER_MOTOR_MAGNETIZING_CURRENT while the motor is running ?  

    I did some tests using the function   CTRL_setMagCurrent_pu(CTRL_Handle handle,const _iq magCurrent_pu). When the motor is over 1.5krmp I start to reduce the  magCurrent_pu. What do you think about using this method ?

    What do you think I could try to get the motor running at 3.6krpm enabling the FieldWeakening ?

    Thank You !

  • Paulo,

    I think your method of reducing the magnetizing current is correct.

    When you apply field weakening, the motor looses available torque, which means that the speed loop needs retuned. I would recommend decreasing the bandwidth of SpinTAC Velocity Control when you are in the field weakening region, this should help with the speed oscillations.

    You could also look into tuning the current loops.
  • Paulo,

    Yes, you can reduce the magnetizing current manually while running, see proj_lab09

          CTRL_setId_ref_pu(ctrlHandle, _IQmpy(gMotorVars.IdRef_A, _IQ(1.0/USER_IQ_FULL_SCALE_CURRENT_A)));

    or you can enable PowerWarp

            CTRL_setFlag_enablePowerWarp(ctrlHandle,gMotorVars.Flag_enablePowerWarp);

    and the Id_ref will be adjusted automatically.

  • Hello,

    I was spending some time doing tests.

    This is as traction motor and before beginning these tests I put the vehicle up on blocks to get the drive wheels up off the ground.

    To get the field weakening working I changed the value of  #define USER_MAX_NEGATIVE_ID_REF_CURRENT_A and the motor reached 3600 without oscillations.

    I did some tests changing the magnetizing current and to get the motor working well I have to adjust the  Kp_Idq and  Ki_Idq.

    Now I took the vehicle down off the blocks and I am driving it.

    I reduced the max speed to 1.0krpm to start the tests (the field weakening isn't used yet). The first thing I have noticed it that with the BANDWIDTH above (25.0) the motor is very nervous and is responding very fast to the Accelerator (SpeedRef), with the BANDWIDTH  (5.0) the initial acceleration is smooth and better to drive in low speed but I am with difficult to adjust the braking: 

    When I accelerate for example to forward and release the pedal (SpeedRef = 0), the motor stops and accelerates to reverse a little and them stops. If I increase the BANDWIDTH the motor stops faster but is a strong brake for low speeds. 

    What could I try to avoid this behavior and let the motor with smooth acceleration and brake in low speeds ?


    Thank You !

  • you are using encoder feedback, correct?

    are you disabling the ForceAngle flag once the vehicle is moving? Your description makes it seem like ForceAngle is kicking in as you approach 0 speed. Or have you guaranteed that your encoder angle is being used for feedback at all times?

    in most traction applications you actually want the pedal to control the torque setting, not the speed. this gives a more natural "coasting" feeling vs. commanding the vehicle to 0 speed (which also uses more energy).
  • Hi Chris,

    Yes, I am using encoder feedback (lab12b as reference).

    Disabling the ForceAngle flag didn't  make difference.

    I think the problem is that the vehicle is too weight (about 3 tons) and because of its inertia the motor can't stop with low BANDWIDTH.

    Any other suggestion apart from using torque control ?

    Thank You !

  • have you tried just slowing down the acceleration? so that when you stop pressing the pedal and 0 speed is set, the acceleration is set slow so you come to a smoother stop?
  • Chris,

    Decreasing the acceleration we have the impression that realeasing the pedal the motor continues to accelerate a little before start stopping, and the motor still stops and accelerate a little to the other side. The problem only happens if the speed reachs at a minimum 0.3Krpm, as the speed is increased the problem also increases.

    Another Question:
    If I stop the vehicle on a ramp and release the pedal it stops, if accelerate again I can control the motor like on a flat floor, but if I release the pedal and want the vehicle go down the ramp with a little and controlled brake, Is it possible ?

    Thanks !
  • I'm not completely following your question.

    "If I stop the vehicle on a ramp and release the pedal it stops, "
    This is because you are commanding 0 speed, so it tries to hold 0 speed.

    "but if I release the pedal and want the vehicle go down the ramp with a little and controlled brake, Is it possible ?"
    not if you are commanding 0 speed
  • Chris,

    As you said: in most traction applications you actually want the pedal to control the torque setting, not the speed. this gives a more natural "coasting" feeling vs. commanding the vehicle to 0 speed.

    I have disabled the SpinTAC Speed Controller and added the torque mode on lab12b, the controller became smoother and when I set IqRef_A=0 the vehicle stops for inertia, the vehicle only brakes when the sense of the IqRef_A is inverted.

    In the torque mode as I increase the IqRef_A the motor began to make a noise, as I increase the IqRef_A the noise increases too (like audible frequency). Why ?

    Using the torque mode does not use the encoder feedback, or is there a method or any application to use both ?

    Thanks !

  • "Using the torque mode does not use the encoder feedback?"
    that depends on your code. If you used lab12 as the basis it should be using the encoder feedback.

    "or is there a method or any application to use both ?"
    there isn't a project that uses encoder for torque mode. Modifying lab12 is required.

    "In the torque mode as I increase the IqRef_A the motor began to make a noise, as I increase the IqRef_A the noise increases too (like audible frequency). Why ?"

    it sounds like the motor has lost synchronization. Are you initializing your encoder to an electrical angle by using RsRecal or injecting Id current initially? You never heard this noise with 12b running the speed loop?
  • Running the speed loop with lab12b the motor never makes this noise.

    I was injecting Id current initially and I have tested now enabling the RsRecal the motor continues making the noise.
  • Paulo,

    My guess as to why your motor is making audible noise could be that there is more Iq current than it necessary.  When you directly set an Iq current the motor will spin as fast as possible given the voltage bus and the load on the motor.  When running a speed controller it will only request the amount of Iq current required to run at the requested speed.

    Since you are using an ACIM with encoder it could be a bad slip estimation but if that were the case you would eventually see the motor not be able to spin at all.

  • Adam,

    When I added the torque mode in lab12b I didn't remove the call of ST_runVelCtl(stHandle, ctrlHandle) function.

    I have commented the line below in the interrupt void mainISR(void and it is working well without noise.

     

    // Run the SpinTAC Components

    if(stCnt++ >= ISR_TICKS_PER_SPINTAC_TICK) {

    ST_runPosConv(stHandle, encHandle, ctrlHandle);

    // ST_runVelCtl(stHandle, ctrlHandle);

    stCnt = 1;

    }

    Thank You !

  • interesting! glad you got that solved...