Dave Wilson, Motion Products Evangelist, Texas Instruments
Throughout this series we have discussed a practical and efficient way to tune the PI controllers in a cascaded velocity loop by simply choosing a factor that determines the desired damping of the system. From this information, plus a rudimentary knowledge of some of the motor and load parameters, the PI coefficients for the velocity loop and the inner current loops can be calculated. We developed this technique by first ignoring certain aspects of the control loop, such as the pole of the current controller. But in blog 6 we reintroduced the current controller’s pole back into the discussion, and evaluated its impact on system performance.
Today, let’s look at the other end of the frequency spectrum. At low frequencies, viscous damping may affect your velocity loop response times by changing the phase margin at the unity-gain frequency. When viscous damping is present, it siphons off part of the motor’s torque to do work to move fluid. Since viscous torque is directly proportional to the speed of the load, we can rewrite the load’s transfer function to be:
where kv is the viscous damping factor
As you can see from Equ. 1, adding the viscous damping term moves the pole that was at s = 0 to s = kv/J. Figure 1 shows how the addition of viscous damping changes the load’s Bode plot.
Figure 1. Effect of Viscous Damping (kv) on the Load Bode Plot
From Figure 1, we see that as viscous damping increases from zero, low frequency gain plateaus to a value of 1/kv. The net effect on the phase plot is to add more phase margin at lower frequencies, since the phase lag of a load with viscous damping will always be less than a load with inertia only. As a result, stability should actually improve for non-zero values of kv. However, the response time may take a hit, depending on where the velocity open-loop unity-gain frequency is with respect to the pole frequencies shown in Figure 1. So if your system response is sluggish and the motor doesn’t seem to put out as much torque as it is rated for, you might want to investigate how much viscous damping your system has.
Before closing out this series, I want to address one more important topic. I have seen and experienced situations myself where the PI coefficients were calculated correctly, but when they were incorporated into the code, the motor either screamed like a banshee or sat there like a lump and did nothing. So what happened? In many cases, it was one of the following problems:
1. Forgetting to account for the sampling frequency effect on the GAIN of the integrator term. Figure 2 shows how to implement a typical integrator for a digital PI controller. To scale the output to match what an analog integrator would provide, we must first multiply the input signal by the sampling period “T”. In order to avoid two separate multiply operations, most code examples simply lump T together with the integrator gain term. If T is not accounted for, you will end up with an integrator gain that is MUCH higher than you anticipated.
Figure 2. Typical Implementation of a Digital Integrator
2. So far we have assumed there are no limitations on the number format itself. If you are using a floating-point processor, then you don’t have to worry about the fractional component of your PI terms. But most motor control applications are implemented on fixed-point machines for cost reasons. The good news is that TI has developed a linkable library that is in the ROM of most of our C2000 processors which solves this problem for you. It is called the “IQ Math” library which stands for “Integer Quotient”. This allows you to handle floating point values with ease on a fixed-point machine without suffering from the performance hit you typically get with a full-blown floating-point package. IQ math creates a new variable type in your code which is designated by a “Q” followed by a number. For example, let’s say you have a 32 bit variable which is typed as a “Q24” variable type. This means that any variable of this type is assumed to have a 24-bit fractional component, and an 8-bit integer part. But what occasionally happens is that someone copies TI example code into their design without realizing that our coefficients are represented in IQ format. For example, if you calculate your I-gain to be 10,000 ($00002710 in Q0 format), but you didn’t realize that the TI code assumes the variable is in Q24 format, you will end up with an integrator gain of 0.596E-3 instead of 10,000. Obviously, a big difference! If you make the same mistake for all of the PI coefficients, the motor will most likely just sit there and do nothing since all the gains are way too low. So, a word to the wise; make sure you know what numerical format your coefficients are represented by.
3. In some cases, the PI coefficients for an AC Induction Motor drive are calculated correctly and the motor runs just fine… until the motor speed exceeds its rated value, at which point the controller response becomes underdamped. The reason for this can be found back in blog 3 of this series. The motor transfer function between q-axis current and electromagnetic torque for an AC induction motor is repeated below.
For speeds up to the rated speed, Id usually stays constant. But to achieve speeds beyond the rated speed, you need to reduce the flux in the machine by lowering the value of Id. You can probably see where I’m going with this. When you reduce Id, you reduce the gain of the entire velocity loop gain. If it is reduced too much, you can end up moving the unity-gain frequency to a lower value where the effect of the two poles at s=0 have more effect on reducing the phase margin. To keep the system response from changing, the Kc (or Kp) term in the speed PI controller can be increased in direct proportion to the reduction in Id.
4. Finally, the scaling of the PI coefficients throughout this series has been done assuming we want to represent real system values throughout the signal chain. For example, the output of the velocity PI controller equals the actual input reference current in amps for the current controller. The output of the current controller equals the actual voltage applied to the motor winding. But in many designs, the PI controller outputs are normalized to “Per Unit” (PU) scaling where a value of 1 represents the maximum value possible, and a value of -1 represents the minimum value possible. For example, a current regulator’s output might be scaled in such a way that 1 corresponds to 100% PWM, and -1 corresponds to 0% PWM. The advantage of this approach is that you can quickly adapt your code to different systems by simply changing your per unit scaling values. To convert from real-value scaling to PU scaling for Ka, Kb, Kc, and Kd (including the sampling period for the integrators), use the following formulae:
where: Iscale is the actual current value corresponding 1.0
Vscale is the actual voltage value corresponding to 1.0
where: Ti corresponds to the sampling period of the current loop.
where: Velscale = the actual velocity value in rad/sec corresponding to 1.0
Iscale = the actual current value corresponding to 1.0
P = the number of rotor poles on the motor
where: Tv corresponds to the sampling period of the velocity loop
The PU scaling for traditional parallel PI structures is:
where: Velscale = the actual velocity value in rad/sec corresponding to 1.0
Iscale = the actual current value corresponding to 1.0
P = the number of rotor poles on the motor
Tv corresponds to the sampling period of the velocity loop
To assist you with the design of your FOC based speed controller, I have created a VisSim simulation (FOC.vsm) which accepts inputs from an Excel spreadsheet (Motor.xlsx). If you open the spreadsheet, you can see the parameters for several different motor/load examples as well as the PI controller coefficients which are automatically calculated. You can also add your own motor and load parameters in the spreadsheet if you want. To create a text output file which is required by the VisSim simulation, you must perform a “Save As” option, and in the “Save as Type” field, select “CSV (Comma delimited) (*.csv).” Assuming that this file is in the same folder as "FOC.vsm", you can then open "FOC.vsm" and simply click the run icon on the toolbar at the top of the page to run the simulation. You can see the speed response (as well as plots of other system variables) by scrolling over to the right side of the simulation window. The simulation creates a step change in the commanded velocity at t=0 which saturates the system, and another step change at t=0.5sec which doesn’t saturate the system, allowing you to evaluate the system response under both conditions. If you would like to evaluate another motor /load example, simply double-click on the Motor/Load Selector Block in the bottom-left corner of the simulation window and choose a different option, as shown below.
Figure 3. Motor/Load Selector Block in the FOC.vsm Simulation File
If you would like to take this simulation out for a test drive, but you don’t have VisSim installed on your machine, simply follow the instructions below:
1. Go to Visual Solutions’ website.
2. In the top right of the browser window, click on “Create account”
3. After you create an account, click on the “Downloads” tab, and select “VisSim Software”.
4. Click on the first link on the top of the page that says “VisSim – Core simulator + UML State Charts + Analyze”
5. Run the installer program. This will install the free 60 day trial version of VisSim.
Congratulations…we made it! Thanks for investing your time with me as we have looked at different ways to make your PI control loop behave. I hope you learned some neat tricks that can help you “stay in tune” with your motor control design.
By the way, if you have suggestions for other motor control topics you would like for me to address in a future blog, I would love to hear from you. :-) And of course…
Keep Those Motors Spinning,