Example: Frequency Design Method for DC Motor Speed Control

From the main problem, the dynamic equations and the open-loop transfer function of the DC Motor Speed Control example are:

and the system schematic looks like:

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

With the 1 rad/sec step input, the design criteria are:

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

Create a new m-file and type in the following commands (refer to the main problem for the details of getting those commands).

```J = 0.01;
b = 0.1;
K = 0.01;
R = 1;
L = 0.5;
num = K;
den = [(J*L) ((J*R)+(L*b)) ((b*R)+K^2)];
motor = tf(num,den);
```

## Drawing the original Bode plot

The main idea of frequency-based design is to use the Bode plot of the open-loop transfer function to estimate the closed-loop response. Adding a controller to the system changes the open-loop Bode plot, therefore changing the closed-loop response. Let's first draw the Bode plot for the original open-loop transfer function. Add the following code to the end of your m-file, and then run it in the MATLAB command window.

```
bode(motor)```
You should get the following Bode plot:

From the bode plot above, we see that the phase margin can be greater than about 60 degrees if w is less than 10 rad/sec. Let's add gain to the system so the bandwidth frequency is 10 rad/sec, which will give us a phase margin of about 60 degrees. To find the gain at 10 rad/sec, you can try to read it off the Bode plot (it looks to be slightly more than -40 dB, or 0.01 in magnitude). The bode command, invoked with left-hand arguments, can also be used to give you the exact magnitude:

```[mag,phase,w] = bode(motor,10)
```
```mag =

0.0139
```
To have an open-loop gain of 1 at 10 rad/sec, we need to add a control gain of 1/0.0139 or approximately 72.
```contr=72;
bode(contr*motor);
```
and rerun your m-file. You should have the following Bode plot:

## Plotting the closed-loop response

From the plot above we see that the phase margin is now quite large. Let's see what the closed-loop response look like. Add a % in front of the bode commands to comment them out, and add the following code to the end of your m-file:

```sys_cl=feedback(contr*motor,1);
t=0:0.01:10;
step(sys_cl,t)
```
You will see the following plot:

The settling time is fast enough, but the overshoot and the steady-state error are too high. The overshoot can be reduced by reducing the gain a bit to get a higher phase margin, but this would cause the steady-state error to increase. A lag controller is probably needed.

We can add a lag controller to reduce the steady-state error. At the same time, we should try to reduce the overshoot by reducing the gain. Let's reduce the gain to 50, and try a lag controller of

which should reduce the steady-state error by a factor of 1/0.01 = 100 (but could increase the settling time). Go back and change your m-file so it looks like the following:

```num = K;
den = [(J*L) ((J*R)+(L*b)) ((b*R)+K^2)];
motor = tf(num,den);
Zo = 1;
Po = 0.1;
contr = 50*tf([1 Zo],[1 Po]);
bode(contr*motor)
```
Rerun the file and you will get this plot:

The phase margin looks good. The steady-state error is predicted to be about 1/40dB or 1%, as desired. Close the loop and look at the step response. Add the following lines of code to the end of you m-file and rerun.

```sys_cl=feedback(contr*motor,1);
t=0:0.01:10;
step(sys_cl,t)
```

Now you have a step response that meets the design requirements. The steady-state error is less than 1%, the overshoot is about 5%, and the settling time is about 2 seconds.

Frequency Response Examples
Cruise Control | Motor Speed | Motor Position | Bus Suspension | Inverted Pendulum | Pitch Controller | Ball and Beam

Motor Speed Examples
Modeling | PID | Root Locus | Frequency Response | State Space | Digital Control | Simulink

Tutorials
MATLAB Basics | MATLAB Modeling | PID Control | Root Locus | Frequency Response | State Space | Digital Control | Simulink Basics | Simulink Modeling | Examples