# DC Motor Speed: Root Locus Controller Design

Key MATLAB commands used in this tutorial are: `tf` , `controlSystemDesigner`

## Contents

From the main problem, the dynamic equations in the Laplace domain and the open-loop transfer function of the DC Motor are the following.

(1)

(2)

(3)

The structure of the control system has the form shown in the figure below.

For the original problem setup and the derivation of the above equations, please refer to the DC Motor Speed: System Modeling page.

For a 1-rad/sec step reference, the design criteria are the following.

- Settling time less than 2 seconds
- Overshoot less than 5%
- Steady-state error less than 1%

Now let's design a controller using the methods introduced in the Introduction: Root Locus Controller Design page. Create a new m-file and type in the following commands.

```
J = 0.01;
b = 0.1;
K = 0.01;
R = 1;
L = 0.5;
s = tf('s');
P_motor = K/((J*s+b)*(L*s+R)+K^2);
```

## Drawing the open-loop root locus

The main idea of root locus design is to predict the closed-loop response from the root locus plot which depicts possible closed-loop pole locations and is drawn from the open-loop transfer function. Then by adding zeros and/or poles via the controller, the root locus can be modified in order to achieve a desired closed-loop response.

We will use for our design the **Control System Designer** graphical user interface. This tool allows you to graphically tune the controller via the root locus plot. Let's first view
the root locus for the uncompenstated plant. This is accomplished by adding the command `controlSystemDesigner('rlocus', P_motor)` to the end of your m-file and running the file at the command line or by going to the **APPS** tab of the MATLAB toolstrip and clicking on the app icon under **Control System Analysis and Design**.

One window titled **Control System Designer** will open initially having the form shown in the figure below. In the window, you will be able to see both the root locus
plot and the closed-loop step response of the transfer function passed via the `controlSystemDesigner` function. If the string `'rlocus'` is omitted from the function call, the default initial window includes the Bode plot, in addition to the root locus plot
and closed-loop step response plot. You can arrange the position of plots from the **VIEW** tab of the **Control System Designer** window. Right-clicking on the root locus plot and selecting **Grid** will make your window appear as follows.

## Finding the loop gain

Recall that our design requirements specify that the settling time be less than 2 seconds and that the overshoot be less than
5%. The location of the system's closed-loop poles provide information regarding the system's transient response. The **Control System Designer** allows you to specify the region in the complex *s*-plane corresponding to specific design requirements. The provided regions correspond to a canonical second-order system,
but in general are a good place to start from even for higher-order systems or systems with zeros.

These desired regions can be added to the root locus plot by right-clicking on the plot and choosing **Design Requirements > New** from the resulting menu. You can add many design requirements including Settling time, Percent overshoot, Damping ratio,
Natural frequency, and generic Region constraint.

Adding our settling time and percent overshoot requirements to the root locus plot produces the following figure.

The resulting desired region for the closed-loop poles is shown by the unshaded region of the above figure. More specifically,
the two rays centered at the origin represent the overshoot requirement; the smaller the angle these rays make with the negative
real-axis, the less overshoot is allowed. The vertical line at *s* = -2 represents the settling time requirement, where the farther to left the closed-loop poles are located the smaller the
settling time is. From examination of the above figure, there are values of the loop gain that will place both closed-loop
poles in the desired region. This can be seen from the fact that the two branches of the root locus are symmetric and pass
through the unshaded region. Furthermore, since the closed-loop system has two poles with no zeros, placing the closed-loop
poles in the shown region will guarantee satisfaction of our transient response requirements.

You can select a specific pair of closed-loop poles from the resulting figure in order to determine the corresponding loop
gain that places the poles at that location. For our system, let's choose to place the closed-loop poles so that they are
located on the vertical branches of the root-locus between the real axis and the boundary of the overshoot requirement. The
pink boxes on the root locus indicate the location of the closed-loop poles for the current loop gain. Clicking on the pink
boxes and dragging them along the root locus to the desired location automatically modifies the controller to place the closed-loop
poles at the indicated position. Let us drag a closed-loop pole to a location near -6 + 2i. The pole location will be indicated
at the bottom of the window along with the corresponding damping ratio and natural frequency. We can also check the corresponding
loop gain in the lower left corner by clicking on **C** in the **Controllers and Fixed Blocks** tab. The loop gain, as we can see in the figure, is approximately 10.

We can check the closed-loop step response for the system with this new gain by moving to the **IOTransfer_r2y: step** tab. If you have accidentally closed this tab, you can re-open it from the **Control System Designer** window by clicking on the **New Plot** menu and selecting **New Step**. In response, a new window titled **New Step to plot** will appear. From the **Select Responses to Plot** menu, then choose **IOTransfer_r2y** and click the button **Plot**. The response of the output *y* of the closed-loop system for a step reference *r* will then appear in the **Control System Designer** window. You can also identify some characteristics of the step response. Specifically, right-click on the figure and under
**Characteristics** choose **Settling Time**. Then repeat for **Steady State**. Your figure will appear as shown below.

From inspection of the above, one can see that there is no overshoot and the settling time is less than one second, therefore, the overshoot and settling time requirements are satisfied. However, we can also observe that the steady-state error is approximately 50%. If we increase the loop gain to reduce the steady-state error, the overshoot will become too large. You can see this for yourself by graphically moving the closed-loop poles vertically upward along the root locus, this corresponds to increasing the loop gain. The step response plot will change automatically to reflect the modified loop gain. We will attempt to add a lag controller to reduce the steady-state error requirement while still satisfying the transient requirements.

## Adding a lag controller

In the above we saw that the overshoot and settling time criteria were met with the proportional controller, but the steady-state
error requirement was not. A **lag compensator** is one type of controller known to be able to reduce steady-state error. However, we must be careful in our design to not
increase the settling time too much. Let's first try adding a lag compensator of the form given below.

(4)

We can use the **Control System Designer** to design our lag compensator. To make the **Control System Designer** have a compensator parameterization corresponding to the one shown above, click on the **Preferences** menu at the top of the **Control System Designer** window. Then From the **Options** tab, select a **Zero/pole/gain** parameterization as shown below.

To add the lag compensator, right click on the root locus plot and select **Edit Compensator**. To add a pole zero pair to your compensator, in the **Compensator Editor** window, right-click the **Dynamics** table and select **Add Pole/Zero > lag**. After that, enter the **Real Zero** and **Real Pole** locations as shown in the following figure.

Note that the maximum phase lag contributed by the compensator and the frequency where it is located are updated to match the pole and zero locations chosen.

## Finding the loop gain with a lag controller

Notice how the root locus has changed to reflect the addition of the pole and zero from the lag compensator as shown in the
figure below. We can again choose closed-loop pole locations to attempt to achieve our desired transient requirements. Let's
attempt to place two of the closed-loop poles in our desired region near the boundary of the overshoot requirement. For example,
a loop gain of approximately 20 (set in the **Compensator Editor**) will place the poles at the positions shown in the figure below.

The corresponding closed-loop step response will then update automatically to match the figure shown below.

As you can see, the response is not quite satisfactory even though two of the closed-loop poles were placed in the desired region. The reason for this is because the closed-loop system no longer has the form of a canonical second-order system. Specifically, there is a third pole on the real axis indicated in the root locus plot above that is outside of the desired region. The fact that this third pole is to the right of the two conjugate poles placed above means that it will slow the system response down, that is why the settling time requirement is no longer met. Additionally, the overshoot requirement is met easily even though the two conjugate poles are near the edge of the allowed region. This is due again to the third pole which is well damped and tends to dominate the response because it is "slower" than the other poles. What this means is that we can further increase the loop gain such that the conjugate poles move beyond the diagonal lines while still meeting the overshoot requirement.

You can now return to the root locus plot and graphically move the conjugate poles farther away from the real axis; this corresponds
to increasing the loop gain. As you move the closed-loop poles a sufficient distance, the limits of the plot should update
automatically. Alternatively, you can change the limits manually by right-clicking on the root locus and selecting **Properties** to open the **Property Editor**. Then you can click on the **Limits** tab and change the imaginary axis limits to [-15,15], for example, as shown below.

Experiment with different gains (closed-loop pole locations) until you achieve the desired response. Below is the root locus with a loop gain of 44 and the corresponding closed-loop step response.

Now the settling time is less than 2 seconds and the steady-state error and overshoot requirements are still met. As you can
see, the root locus design process requires some trial and error. The **Control System Designer** is very helpful in this process. Using the **Control System Designer**, it is very easy to tune your controller and immediately see the effect on the root locus and various analysis plots, like
the closed-loop step response. If we had not been able to get a satisfactory response by tuning the loop gain, we could have
tried moving the pole and zero of the lag compensator or we could have tried a different type of dynamic compensator (additional
poles and/or zeros).