THE CHALLENGE
I was on a business trip earlier this week to visit some customers, and as always I arrived looking to spin motors.
The first visit was well planned; one of the engineers had previously attended an InstaSPIN workshop and wanted me to do a lunch & learn to show the capability of our solution to the rest of the engineering staff at his company. A couple of the guys had already been evaluating their motors with the DRV8301-69M-KIT and DRV8312-69M-KIT with their motors, so no big surprises.
After driving allllll the way across a very large metropolitan city I had a very different experience at my last customer of the day. This was a complete "cold call"; we honestly had no idea what the application was, the customer's capability, or how much they knew about TI's motor control solutions.
Upon entering the conference room our sales person explained that we should show some material and give a demonstration of our latest InstaSPIN-FOC sensorless three phase motor kit.
"That is, unless you have a motor you're using. I'd prefer just to show you on YOUR motor", I said.
"I do have a motor, but you will not be able to spin it", the customer said.
THAT is music to my ears! Nothing like a challenge :)
THE BACKGROUND
After confirming that it was reasonably in the power range of the inverter I brought with me, he incredulously led me back to his office.
He explained that this was a VERY low inductance motor which of course caused very bad current ripple. They were struggling so much with the control that they had wired out large external inductors to each phase in an attempt to help control the switching current. They were using a sort of black box motor inverter and control system for development, about 32 in^2 with a massive heat sink. This only did BLDC control and offered a simple PC interface through UART for configuration. This is a 4-pole vacuum/pump that typically runs at 28V up to 35-40 KRPM (1166-1333 Hz) and must hit the target speed within 3.5 seconds; unloaded they were drawing 12A today, which was something they hoped to reduce. The motor shaft was attached to an impeller and pump housing, but could be considered essentially unloaded as it was not attached to the airflow system which produces the load.
THE SETUP
I had him set his power supply to the maximum of 24V for my BOOSTXL-DRV8301 inverter (which we just announced today) and wired in his motor phase wires (still with the inductors attached). It was great to see that my 5 in^2 inverter with no heat-sink was going to provide more than enough power to run his motor unloaded. I then connected - isolated USB to real-time JTAG - to my InstaSPIN-FOC enabled Piccolo LaunchPad (LAUNCHXL-F28027F), started CCStudio (always free), and started working with the projects included in MotorWare.
Because I already knew this was a very low inductance motor I went straight to proj_lab02c to help me identify the needed parameters. I set-up my user.h file with the following changes from the default values.
#define USER_IQ_FULL_SCALE_FREQ_Hz (1200.0) // First testing limiting to 35 KRPM, just under 1200 Hz
#define USER_PWM_FREQ_kHz (45.0) // due to the large current ripple from high short circuit current and low inductance PWM will need to be faster
#define USER_NUM_CTRL_TICKS_PER_SPEED_TICK (15) // with PWM updated to 45, and the ISR at a /3, the current and estimator are running at 15 KHz so I decimate the SPEED and TRAJ by /15 to get effective 1 kHz
#define USER_NUM_CTRL_TICKS_PER_TRAJ_TICK (15)
#define USER_R_OVER_L_EST_FREQ_Hz (300) // new default for BOOSTXL-DRV8301 as we suspect most motors used with kit will be higher speed; other kits have had default of 100 Hz
#define USER_MAX_ACCEL_EST_Hzps (10.0) // Because I knew I was updating the EST_FREQ_Hz to do my testing at 130 Hz I increased the acceleration so the RampUp would not time out
and I updated the following settings for the Motor
#elif (USER_MOTOR == customer)
#define USER_MOTOR_TYPE MOTOR_Type_Pm
#define USER_MOTOR_NUM_POLE_PAIRS (2)
#define USER_MOTOR_RES_EST_CURRENT (2.0) // 10% of the 20A at full torque rating provided by the customer
#define USER_MOTOR_IND_EST_CURRENT (-1.5) // negative 10% of above, but with low Ls motors keep it < 10% as di/dt increases with the field weakening and may become unstable
#define USER_MOTOR_MAX_CURRENT (10.0) // Safety limit for the continuous current of the BOOSTXL-DRV8301 inverter, although this max current is only a limit on the Iq current reference generated by the speed controller, so in reality it could be set above the continous current
#define USER_MOTOR_FLUX_EST_FREQ_Hz (130.0) // ~10% of rated speed; 40 KRPM @ 4 poles = 1333 Hz
SPINNING?
After building and loading the binary to the LaunchPad I used the Universal GUI inside of CCS --> View --> GUI Composer to instrument the variables. I find this easier than just using the variable Expressions view and it's got some nice variable checks to help debug any issues. I started Motor ID, and watched the resistance find 0.075 ohm. However, when EST_State_RampUp began the motor did not start turning....so I canceled the identification.
BACK TO THE DRAWING BOARD
When a motor won't start spinning during RampUp, the first thing to do is increase the current used during this portion of the test, which is the RES_EST
#define USER_MOTOR_RES_EST_CURRENT (3.0) // 10% of the 20A at full torque rating provided by the customer
#define USER_MOTOR_IND_EST_CURRENT (-1.5) // negative 10% of above, but with low Ls motors keep it < 10% as di/dt increases with the field weakening and may become unstable
I also note that this motor likely has a very small flux (most high speed motors do as they want to insure the top speed is not impeded by the Bemf voltage increasing beyond the bus voltage by a higher flux motor at high frequency). One of the limitations to be aware of is that the smallest flux that can be identified is set by the values of:
USER_IQ_FULL_SCALE_VOLTAGE_V / FAST_EST_Hz / 0.7
For my current settings: 45 V / 15000 Hz / 0.7 = 0.00428 V/Hz
I've seen very small hobby style motors that have flux values of 0.002, and while I don't suspect this motor has a flux THIS small, to be on the safe side I triple my resolution by setting
USER_IQ_FULL_SCALE_VOLTAGE_V (15.0), allowing me to measure 0.0014 V/Hz
and I'll be sure to check after identification that this value isn't TOO SMALL.
SPINNING, YET?
I built and loaded the new binary, and started ID again. The (3.0) A was enough to overcome any cogging and get the motor spinning during RampUp and throughout the identification process.
You can see that the flux of the machine was identified at 8.6 mV/Hz, which at 1200 Hz will still keep my Bemf measurement under the 15.0 V I just set, and significantly under by 24V bus, so my variable scaling checks out.
Ls is 22.6uH. This gives a short circuit current of ~60A, which is an ok design for a 20A continuous motor, but remember the external inductors are still attached (more on that later)!
Of course the customer immediately wanted to see if we could control it running, so I saved all the Motor Parameters and ADC Offsets in my user.h file and compiled proj_lab05b, which allows me to interface to the current and speed PI gains if necessary.
I started out with reasonable accelerations of 5000 RPM/s up to 35 KRPM to make sure we were stable. Without any adjustments to the default PI controllers it worked like a dream. We then tested with higher accelerations of 10 KRPM/s, which should allow us to hit 35 KRPM in 3.5 seconds.
Success!! And the power supply was only measuring 5.9A @ 24V vs. the 12A @ 28V of their existing solution...saving nearly 200W.
INDUCTOR FREE
After taking videos and pulling other employees in to see, his confidence was building and he had to know if we could run without the external inductors. I detached them, used the same settings with proj_lab02c, and a couple minutes later we find a new inductance of only 9.2uH. Notice the resistance also decreased a bit as we reduced the wiring in the process.
Note the design of the motor now. The short circuit current has over doubled to 152A, and you can notice that the motor is completely mis-designed with an R/L of over 7 kHz, 5x the required speed. We discussed how they could create an overall lower cost, smaller, and lower heating motor without an over-designed power stage just by having their motor supplier create a motor with the proper Rs, Ls, and Flux to meet their speed, torque, and acceleration (Isc) requirements...knowing that InstaSPIN-FOC provided the control capability that other solutions cannot.
I again saved this new Ls value and rebuilt and loaded proj_lab05b. The motor still ran exactly as expected to speed, at acceleration, and with the same power usage.
NAME YOUR PRICE
Yes, that's the quote from the customer after this experience. "Name your price". The good news for him - and you - is the InstaSPIN-FOC capability is FREE, just purchase any Piccolo MCU which is enabled by special motor control functionality in ROM. And to duplicate this exact experience one only needs to purchase the $17 LaunchPad and $49 BoosterPack (or any of our other kits of different power range).
My only worry now is that if too many people try InstaSPIN-FOC I won't have any more of these type of customer visits where I get to see the priceless looks on their faces!
Keep spinning those motors,
Chris Clearman
TI Motor Control