introduction to control

507
Introduction: System Modeling The first step in the control design process is to develop appropriate mathematical models of the system derived either from physical laws or experimental data. In this section, we introduce the state-space and transfer function representations of dynamic systems. We then review some basic approaches to modeling mechanical and electrical systems and show how to enter these models into MATLAB for further analysis. Key MATLAB commands used in this tutorial are: ss , tf Contents Dynamic Systems State-Space Representation Transfer Function Representation Learning Control Engineering Using MATLAB

Upload: naderjsa

Post on 16-Apr-2015

235 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Introduction to Control

Introduction: System Modeling

The first step in the control design process is to develop appropriate mathematical models of the system

derived either from physical laws or experimental data. In this section, we introduce the state-space and

transfer function representations of dynamic systems. We then review some basic approaches to modeling

mechanical and electrical systems and show how to enter these models into MATLAB for further analysis.

Key MATLAB commands used in this tutorial are: ss , tf

Contents

Dynamic Systems

State-Space Representation

Transfer Function Representation

Learning Control Engineering

Using MATLAB

Page 2: Introduction to Control

Mechanical Systems

Example: Mass-Spring-Damper System

Entering State-Space Models into MATLAB

Entering Transfer Function Models into MATLAB

Electrical Systems

Example: RLC Circuit

System Identification

System Conversions

Dynamic Systems

Dynamic systems are systems that change or evolve in time according to a fixed rule. For many physical

systems, this rule can be stated as a set of first-order differential equations:

(1)

In the above equation, is the state vector, a set of variables representing the configuration of the system

at time . For instance in a simple mechanical mass-spring-damper system, the two state variables could be

the position and velocity of the mass. is the vector of control inputs at time , representing the

externally applied "forces" on the system, and is a possibly nonlinear function giving the time derivative

(rate of change) of the state vector, for a particular state, input, and time.

The state at any future time, , may be determined exactly given knowledge of the initial state, ,

and the time history of the inputs, , between and by integrating Eq.(1). Though the state variables

themselves are not unique, there is a minimum number of state variables, , required in a given system for

the above to hold true. is referred to as the system order and determines the dimensionality of the state-

space. The system order usually corresponds to the number of independent energy storage elements in the

system.

The relationship given in Eq.(1) is very general and can be used to describe a wide variety of different

systems; unfortunately, it may be very difficult to analyze. There are two common simplifications which

make the problem more tractable. First, if the function, , does not depend explicitly on time,

i.e. , then the system is said to be time invariant. This is often a very reasonable assumption,

since the underlying physical laws themselves do not typically depend on time. For time invariant systems,

the parameters or coefficients of the function, , are constant. The control input, however, may still be time

dependent, .

The second common assumption concerns the linearity of the system. In reality, nearly every physical

system is nonlinear. In other words, is typically some complicated function of the state and inputs. These

nonlinearities arise in many different ways, one of the most common in control systems being "saturation"

in which an element of the system reaches a hard physical limit to its operation. Fortunately, over a

Page 3: Introduction to Control

sufficiently small operating range (think tangent line near a curve), the dynamics of most systems are

approximately linear, that is .

Until the advent of digital computers (and to a large extent thereafter), it was only practical to

analyze linear time invariant (LTI) systems. Consequently, most of the results of control theory are based

on these assumptions. Fortunately, as we shall see, these results have proven to be remarkably effective

and many significant engineering challenges have been solved using LTI techniques. In fact, the true

power of feedback control systems are that they work (are robust) in the presence of the unavoidable

modeling uncertainty.

State-Space Representation

For continuous linear time invariant (LTI) systems, the standard state-space representation is given below:

(2)

(3)

where is the vector of state variables (nx1), is the time derivative of state vector (nx1), is the input or

control vector (px1), is the output vector (qx1), is the system matrix (nxn), is the input matrix

(nxp), is the output matrix (qxn), is the feedforward matrix (qxp).

The output equation, Eq.(3), is necessary because often there are state variables which are not directly

observed or are otherwise not of interest. The output matrix, , is used to specify which state variables (or

combinations thereof) are available for use by the controller. Also often there is no direct feedforward in

which case is the zero matrix.

The state-space representation, also referred to as the time-domain representation, can easily handle multi-

input/multi-output (MIMO) systems, systems with non-zero initial conditions, and nonlinear systems via

Eq.(1). Consequently, the state-space representation is used extensively in "modern" control theory.

Transfer Function Representation

LTI systems have the extremely important property that if the input to the system is sinusoidal, then the

output will also be sinusoidal at the same frequency but in general with different magnitude and phase.

These magnitude and phase differences as a function of frequency are known as the frequency response of

the system.

Using the Laplace transform, it is possible to convert a system's time-domain representation into a

frequency-domain output/input representation, known as the transfer function. In so doing, it also

transforms the governing differential equation into an algebraic equation which is often easier to analyze.

The Laplace transform of a time domain function, , is defined below:

(4)

where the parameter is a complex frequency variable. It is very rare in practice that you will

have to directly evaluate a Laplace transform (though you should certainly know how). It is much more

Page 4: Introduction to Control

common to look up the transform of the function you are interested in in a table such as the one found

here: Laplace Transform Table

The Laplace transform of the nth derivative of a function is particularly important:

(5)

Frequency-domain methods are most often used for analyzing LTI single-input/single-output

(SISO) systems, e.g. those governed by a constant coefficient differential equation as follows:

(6)

The Laplace transform of this equation is given below:

(7)

where and are the Laplace Transforms of and respectively. Note that when finding

transfer functions, we always assume that the each of the initial conditions, , , , etc. is zero. The

transfer function from input to output is therefore:

(8)

It is useful to factor the numerator and denominator of the transfer function into the so called zero-pole-

gain form:

(9)

The zeros of the transfer function, , are the roots of the numerator polynomial, i.e. the values of s

such that . The poles of the transfer function, , are the roots of the denominator polynomial,

i.e. the values of s such that . Both the zeros and poles may be complex valued (have both real and

imaginary parts). The systemGain is .

Note that we can also determine the transfer function directly form the state-space representation as

follows:

(10)

Mechanical Systems

Newton's laws of motion form the basis for analyzing mechanical systems. Newton’s second law, Eq. (11),

states that the sum of the forces acting on a body equals its mass times acceleration. Newton's third law, for

our purposes, states that if two bodies are connected, then they experience the same magnitude force acting

in opposite directions.

(11)

Page 5: Introduction to Control

When applying this equation, it is best to construct a free body diagram (FBD) of the sysetm showing all

applied forces.

Example: Mass-Spring-Damper System

The free body diagram for this system is shown below. The spring force is proportional to the displacement

of the mass, , and the viscous damping force is proportional to the velocity of the mass, . Both

forces oppose the motion of the mass and are therefore shown in the negative -direction. Note also,

that corresponds to the position of the mass when the spring is unstretched.

Now we proceed by summing the forces and applying Newton’s second law, Eq. (11), in each direction of

the problem. In this case, there are no forces acting in the -direction; however, in the -direction we have:

(12)

This equation, known as the governing equation, completely characterizes the dynamic state of the system.

Later, we will see how to use this to calculate the response of the system to any external input, , as

well as analyze system properties such as stability and performance.

To determine the state-space representation of the mass-spring-damper system, we must reduce the second

order governing equation to a set of two first order differential equations. To this end, we choose the

position and velocity as our state variables.

(13)

Note also that these state variables correspond to the potential energy in the spring and the kinetic energy

of the mass respectively. Often when choosing state variables it is helpful to consider the independent

energy storage elements in the system.

The state equation in this case is as follows:

Page 6: Introduction to Control

(14)

If, for instance, we are interested in controlling the position of the mass, then the output equation is as

follows:

(15)

Entering State-Space Models into MATLAB

Now we will show you how to enter the equations derived above into a m-file for MATLAB. Let's

assign numerical values to each of the variables.

m mass 1.0 kg

k spring constant 1.0 N/m

b damping constant 0.2 Ns/m

F input force 1.0 N

Create a new m-file and enter the following commands.

m = 1;

k = 1;

b = 0.2;

F = 1;

A = [0 1; -k/m -b/m];

B = [0 1/m]';

C = [1 0];

D = [0];

sys = ss(A,B,C,D)

sys =

a =

x1 x2

x1 0 1

x2 -1 -0.2

b =

u1

x1 0

Page 7: Introduction to Control

x2 1

c =

x1 x2

y1 1 0

d =

u1

y1 0

Continuous-time state-space model.

The Laplace transform for this system assuming zero initial conditions is

(16)

and therefore the transfer function from force input to displacement output is

(17)

Entering Transfer Function Models into MATLAB

Now we will show how to enter the transfer function derived above into MATLAB. Enter the following

commands into the m-file in which you defined the system parameters.

s = tf('s');

sys = 1/(m*s^2+b*s+k)

sys =

1

---------------

s^2 + 0.2 s + 1

Continuous-time transfer function.

Note that we have used the symbolic s variable here to define our transfer function model. We recommend

using this method most of the time; however, in some circumstances, for instance in older versions of

MATLAB or when interfacing with SIMULINK, you may need to define the transfer function model using

Page 8: Introduction to Control

the numerator and denominator polynomial coefficients directly. In these cases, use the following

commands:

num = [1];

den = [m b k];

sys = tf(num,den)

sys =

1

---------------

s^2 + 0.2 s + 1

Continuous-time transfer function.

Electrical Systems

Like Newton’s laws in mechanical systems, Kirchoff’s circuit laws are the basic analytical tool in electrical

systems.Kirchoff’s current law (KCL) states that the sum of the electrical currents entering and exiting a

node in a circuit must be equal. Kirchoff’s voltage law (KVL) states that the sum of voltage differences

around any closed loop in the circuit is zero. When applying KVL, the source voltages are typically taken

as positive and the load voltages taken as negative.

Example: RLC Circuit

We will now consider a simple series combination of three passive electrical elements: a resistor, an

inductor, and a capacitor, known as an RLC Circuit.

Since this circuit is a single loop, each node only has one input and output; therefore, application of KCL

simply shows that the current is the same throughout the circuit at any given time, . Now applying KVL

around the loop and using the sign conventions indicated in the diagram, we arrive at the following

governing equation.

Page 9: Introduction to Control

(18)

We note that that the governing equation for the RLC circuit has an analogous form to the mass-spring-

damper mechanical system. In particular, they are both second order systems where the charge (integral of

current) corresponds to displacement, the inductance to mass, the resistance to viscous damping, and the

inverse capacitance to the spring stiffness. These analogies and others like them turn out to be quite useful

conceptually in understanding the behavior of dynamical systems.

The state-space representation is found by choosing the charge and current as the state variables.

(19)

where,

(20)

The state equation is therefore:

(21)

We choose the current as ouput as follows:

(22)

The transfer function representation may be found by taking the Laplace transform as we did for the mass-

spring-damper or from the state-space equation as follows:

(23)

(24)

The RLC state-space and transfer fcuntion models can be entered into MATLAB using the same procedure

as discussed for the mass-spring-damper system above.

System Identification

In this section, we have seen how to model systems using basic physical principles; however, often this is

not possible either because the parameters of the system are uncertain, or the underlying processes are

simply not known. In these cases, we must rely on experimental measurements and statistical techniques to

develop a system model, a process known as system identification.

System identification may be performed using either time-domain or frequency-domain data, see

the Introduction: System Identification page.

Page 10: Introduction to Control

Also refer to MATLAB’s System Identification Toolbox for more information on this subject.

System Conversions

Most operations in MATLAB can be performed on either the transfer function, the state-space model, or

the zero-pole-gain form. Furthermore, it is simple to transfer between these if the other form of

representation is required. If you need to learn how to convert from one representation to the other, see

the Introduction: System Conversions page.

Introduction: System Analysis

Once appropriate mathematical models of a system have been obtained, either in state-space or transfer

function form, we may then analyze these models to predict how the system will respond in both the time

and frequency domains. To put this in context, control systems are often designed to improve stability,

speed of response, steady-state error, or prevent oscillations. In this section, we will show how to

determine these dynamic properties from the system models.

Key MATLAB commands used in this tutorial

are: tf , ssdata , pole , eig , step , pzmap , bode , ltiview

Contents

Time Response Overview

Frequency Response Overview

Stability

System Order

First Order Systems

Second Order Systems

Time Response Overview

The time response represents how the state of a dynamic system changes in time when subjected to a

particular input. Since the models we have derived consist of differential equations, some integration must

be performed in order to determine the time response of the system. For some simple systems, a closed-

form analytical solution may be available. However, for most systems, especially nonlinear systems or

those subject to complicated input forces, this integration must be carried out numerically. Fortunately,

MATLAB provides many useful resources for calculating time responses for many types of inputs, as we

shall see in the following sections.

The time response of a linear dynamic system consists of the sum of the transient response which depends

on the initial conditions and the steady-state response which depends on the system input. These

correspond to the free (homogeneous or zero input) and the forced (inhomogeneous or non-zero input)

solutions of the governing differential equations respectively.

Page 11: Introduction to Control

Frequency Response Overview

All the examples presented in this tutorial are modeled by linear constant coefficient differential equations

and are thus linear time-invariant (LTI). LTI systems have the extremely important property that if the

input to the system is sinusoidal, then the steady-state output will also be sinusoidal at the same frequency

but in general with different magnitude and phase. These magnitude and phase differences as a function of

frequency comprise the frequency response of the system.

The frequency response of a system can be found from the transfer function in the following way: create a

vector of frequencies (varying between zero or "DC" to infinity) and compute the value of the plant

transfer function at those frequencies. If is the open-loop transfer function of a system and is the

frequency vector, we then plot versus . Since is a complex number, we can plot both its

magnitude and phase (the Bode Plot) or its position in the complex plane (the Nyquist Diagram). Both

methods display the same information in different ways.

Stability

For our purposes, we will use the Bounded Input Bounded Output (BIBO) definition of stability which

states that a system is stable if the output remains bounded for all bounded (finite) inputs. Practically, this

means that the system will not “blow up” while in operation.

The transfer function representation is especially useful when analyzing system stability. If all poles of the

transfer function (values of s at which the denominator equals zero) have negative real parts, then the

system is stable. If any pole has a positive real part, then the system is unstable. If we view the poles on the

complex s-plane, then all poles must be in the left half plane (LHP) to ensure stability. If any pair of poles

is on the imaginary axis, then the system is marginally stable and the system will oscillate. The poles of a

LTI system model can easily be found in MATLAB using the pole command, an example if which is

shown below:

s = tf('s');

G = 1/(s^2+2*s+5)

pole(G)

G =

1

-------------

s^2 + 2 s + 5

Continuous-time transfer function.

ans =

-1.0000 + 2.0000i

-1.0000 - 2.0000i

Page 12: Introduction to Control

Thus this system is stable since the real parts of the poles are both negative. The stability of a system may

also be found from the state-space representation. In fact, the poles of the transfer function are the

eigenvalues of the system matrix A. We can use the eig command to calculate the eigenvalues using

either the LTI system model directly, eig(G) or the system matrix as shown below.

[A,B,C,D] = ssdata(G);

eig(A)

ans =

-1.0000 + 2.0000i

-1.0000 - 2.0000i

System Order

The order of a dynamic system is the order of the highest derivative of its governing differential equation.

Equivalently, it is the highest power of s in the denominator of its transfer function. The important

properties of first, second, and higher order systems will be reviewed in this section.

First Order Systems

First order systems are the simplest dynamic systems to analyze. Some common examples include cruise

control systems and RC circuits.

The general form of the first order differential equation is as follows

(1)

The first order transfer function is

(2)

DC Gain

The DC gain, , is the ratio of the magnitude of the steady-state step response to the magnitude of the step

input. From the Final Value Theorem, for stable transfer functions the DC gain is the value of the transfer

function when s=0. For first order systems equal to .

Time Constant

The time constant is the time it takes for the system to reach 63% of the steady-state value for

a step response or to decrease to 37% of the inital value for an impulse response. More generally, it

represents the time scale for which the dynamics of the system are significant.

Poles/Zeros

There is a single real pole at . Therefore, the system is stable if is positive and unstable if is

negative. There are no zeros.

Step Response

Page 13: Introduction to Control

We can calculate the system time response to a step input of magnitude u using the MATLAB following

commands:

k_dc = 5;

Tc = 10;

u = 2;

s = tf('s');

G = k_dc/(Tc*s+1)

step(u*G)

G =

5

--------

10 s + 1

Continuous-time transfer function.

Note: MATLAB also provides a powerful GUI (LTI Viewer) for analyzing LTI systems which can be

accessed using,ltiview('step',G).

If you right click on the step response graph and select Characteristics, you can choose to have several

system metrics overlaid on the response: peak response, settling time, rise time, and steady-state.

Settling Time

Page 14: Introduction to Control

The settling time, , is the time required for the system ouput to fall within a certain percentage (i.e. 2%)

of the steady state value for a step input or equivalently to decrease to a certain percentage of the initial

value for an impulse input. The settling times for first order system for the most common tolerances are

provided in the table below. Note that the tighter the tolerance, the longer the system response takes to

settle to within this tolerance, as expected.

10% 5% 2% 1%

Ts=2.3/a=2.3Tc Ts=3/a=3Tc Ts=3.9/a=3.9Tc Ts=4.6/a=4.6Tc

Rise Time

The rise time, , is the time required for the system output to rise from some lower level x% to some

higher level y% of the final steady-state value. For first order systems, the typical range is 10% - 90%.

Bode Plots

The Bode Plots show the magnitude and phase of the system frequency response, . We can generate

the Bode plots in MATLAB using the bode(G) command.

bode(G)

Again the same results could be obtained using the LTI viewer GUI, ltiview('bode',G)

Page 15: Introduction to Control

The Bode plots use a logarithmic frequency scale, so that a larger range of frequencies are visible. Also,

the magnitude is represented using the logarithmic decibel unit (dB) defined as:

(3)

Like frequency, the decibel scale allows us to view a much larger range of magnitudes on a single plot.

Also, as we shall see in subsequent tutorials, when systems are combined or controllers are added, transfer

functions are often multiplied together. Using the dB scale, we may simply add the magnitudes of the

transfer functions. Note, we may also add the phase angles though these are not shown on a log scale.

The low frequency magnitude of the first order bode plot is . The magnitude plot has a bend at

the frequency equal to the absolute value of the pole (ie. ), and then decreases at 20dB for every

factor of ten increase in frequency (-20dB/decade). The phase plot is asymptotic to 0 degrees at low

frequency, and asymptotic to -90 degrees at high frequency. Between frequency 0.1a and 10a, the phase

changes by approximately -45 degrees for every factor of ten increase in frequency (-45 degrees/decade).

We will see in the Frequency Methods for Controller Design Section how to use Bode Plots to calculate

closed loop stability and performance of feedback systems.

Second Order Systems

Second order systems are commonly encountered in practice, and are the simplest type of dynamic system

to exhibit oscillations. In fact many real higher order systems are modeled as second order to facilitate

analysis. Examples include mass-spring-damper systems and RLC circuits.

The general form of the first order differential equation is as follows

(4)

The first order transfer function is

(5)

DC Gain

The DC gain, , again is the ratio of the magnitude of the steady-state step response to the magnitude of

the step input, and for stable systems it is the value of the transfer function when . For second order

systems,

(6)

Damping Ratio

The damping ratio is a dimensionless quantity charaterizing the energy losses in the system due to such

effects as viscous friction or electrical resistance. From the above definitions,

(7)

Page 16: Introduction to Control

Natural Frequency

The natural frequency is the frequency (in rad/s) that the system will oscillate at when there is no

damping, .

(8)

Poles/Zeros

The second order transfer function has two poles at:

(9)

Under Damped System

If , then the system is under damped. Both poles are complex valued with negative real parts;

therefore the system is stable but oscillates while approaching the steady-state value.

k_dc = 1;

w_n = 10;

zeta = 0.2;

s = tf('s');

G1 = k_dc*w_n^2/(s^2 + 2*zeta*w_n*s + w_n^2);

pzmap(G1)

axis([-3 1 -15 15])

step(G1)

axis([0 3 0 2])

Page 17: Introduction to Control

Settling Time

The settling time, , is the time required for the system ouput to fall within a certain percentage of the

steady state value for a step input or equivalently to decrease to a certain percentage of the initial value for

an impulse input. For a second order, underdamped system, the settling time can be approximated by the

following equation:

(10)

The settling times for the most common tolerances are presented in the following table:

10% 5% 2% 1%

Ts=2.3/(zeta*wn) Ts=3/(zeta*w_n) Ts=3.9/(zeta*w_n) Ts=4.6/(zeta*w_n)

Percent Overshoot

The percent overshoot is the percent by which a system exceeds its final steady-state value. For a second

order under damped system, the percent overshoot is diretly related to the damping ratio by the following

equation:

(11)

For second order under damped systems, the 2% settling time, , rise time, , and percent overshoot,

%OS, are related to the damping and natural frequency as shown below.

(12)

Page 18: Introduction to Control

(13)

(14)

Over Damped Systems

If , then the system is over damped. Both poles are real and negative; therefore the system is stable

and does not oscillate. The step response and a pole-zero map of an over damped system are calculated

below:

zeta = 1.2;

G2 = k_dc*w_n^2/(s^2 + 2*zeta*w_n*s + w_n^2);

pzmap(G2)

axis([-20 1 -1 1])

step(G2)

axis([0 1.5 0 1.5])

Page 19: Introduction to Control

Critically Damped Systems

If , then the system is critically damped. Both poles are real and have the same magnitude, .

Critically damped systems approach steady-state quickest without oscillating. Now change the value of the

damping to 1, and replot the step response and pole-zero map.

zeta = 1;

G3 = k_dc*w_n^2/(s^2 + 2*zeta*w_n*s + w_n^2);

pzmap(G3)

axis([-11 1 -1 1])

step(G3)

Page 20: Introduction to Control

axis([0 1.5 0 1.5])

Undamped Systems

If , then the system is undamped. In this case, the poles are purely imaginary; therefore the system is

marginally stable and oscillates indefinitely.

zeta = 0;

G4 = k_dc*w_n^2/(s^2 + 2*zeta*w_n*s + w_n^2);

pzmap(G4)

axis([-1 1 -15 15])

Page 21: Introduction to Control

step(G4)

axis([0 5 -0.5 2.5])

Bode Plot

We show the Bode Magnitude and Phase Plots for all damping conditions of a second order system below:

bode(G1,G2,G3,G4)

legend('under damped: zeta < 1','over damped: zeta > 1','critically

damped: zeta = 1','undamped: zeta = 0')

Page 22: Introduction to Control

The magnitude of the bode plot of a second order system drops off at -40dB per decade, while the relative

phase changes from 0 to -180 degrees at -90 degrees per decade. For the under damped systems, we also

see a resonance peak near the natural frequency, = 10 rad/s. The sharpness of the peak depends on the

damping in the system, and is charaterized by the quality factor, or Q-Factor, defined below. The Q-factor

is an important property in signal processing.

(15)

Introduction: PID Controller Design

In this tutorial we will introduce a simple yet versatile feedback compensator structure, the Proportional-

Integral-Derivative (PID) controller. We will discuss the effect of each of the pid parameters on the closed-

loop dynamics and demonstrate how to use a PID controller to improve the system performance.

Key MATLAB commands used in this tutorial are: tf , step , pid , feedback , pidtool , pidtune

Contents

PID Overview

The Characteristics of P, I, and D Controllers

Example Problem

Open-Loop Step Response

Page 23: Introduction to Control

Proportional Control

Proportional-Derivative Control

Proportional-Integral Control

Proportional-Integral-Derivative Control

General Tips for Designing a PID Controller

Automatic PID Tuning

PID Overview

In this tutorial, we will consider the following unity feedback system:

The output of a PID controller, equal to the control input to the plant, in the time-domain is as follows:

(1)

First, let's take a look at how the PID controller works in a closed-loop system using the schematic shown

above. The variable ( ) represents the tracking error, the difference between the desired input value ( ) and

the actual output ( ). This error signal ( ) will be sent to the PID controller, and the controller computes

both the derivative and the integral of this error signal. The control signal ( ) to the plant is equal to the

proportional gain ( ) times the magnitude of the error plus the integral gain ( ) times the integral of the

error plus the derivative gain ( ) times the derivative of the error.

This control signal ( ) is sent to the plant, and the new output ( ) is obtained. The new output ( ) is then

fed back and compared to the reference to find the new error signal ( ). The controller takes this new error

signal and computes its derivative and its integral again, ad infinitum.

The transfer function of a PID controller is found by taking the Laplace transform of Eq.(1).

(2)

= Proportional gain = Integral gain = Derivative gain

We can define a PID controller in MATLAB using the transfer function directly, for example:

Kp = 1;

Ki = 1;

Kd = 1;

s = tf('s');

Page 24: Introduction to Control

C = Kp + Ki/s + Kd*s

C =

s^2 + s + 1

-----------

s

Continuous-time transfer function.

Alternatively, we may use MATLAB's pid controller object to generate an equivalent continuous-time

controller as follows:

C = pid(Kp,Ki,Kd)

C =

1

Kp + Ki * --- + Kd * s

s

with Kp = 1, Ki = 1, Kd = 1

Continuous-time PID controller in parallel form.

Let's convert the pid object to a transfer function to see that it yields the same result as above:

tf(C)

ans =

s^2 + s + 1

-----------

s

Continuous-time transfer function.

The Characteristics of P, I, and D Controllers

A proportional controller ( ) will have the effect of reducing the rise time and will reduce but never

eliminate the steady-state error. An integral control ( ) will have the effect of eliminating the steady-state

error for a constant or step input, but it may make the transient response slower. A derivative control ( )

will have the effect of increasing the stability of the system, reducing the overshoot, and improving the

transient response.

The effects of each of controller parameters, , , and on a closed-loop system are summarized in the

table below.

Page 25: Introduction to Control

CL RESPONSE RISE TIME OVERSHOOT SETTLING TIME S-S ERROR

Kp Decrease Increase Small Change Decrease

Ki Decrease Increase Increase Eliminate

Kd Small Change Decrease Decrease No Change

Note that these correlations may not be exactly accurate, because , , and are dependent on each

other. In fact, changing one of these variables can change the effect of the other two. For this reason, the

table should only be used as a reference when you are determining the values for , and .

Example Problem

Suppose we have a simple mass, spring, and damper problem.

The modeling equation of this system is

(3)

Taking the Laplace transform of the modeling equation, we get

(4)

The transfer function between the displacement and the input then becomes

(5)

Let

M = 1 kg

b = 10 N s/m

k = 20 N/m

F = 1 N

Plug these values into the above transfer function

Page 26: Introduction to Control

(6)

The goal of this problem is to show you how each of , and contributes to obtain

Fast rise time

Minimum overshoot

No steady-state error

Open-Loop Step Response

Let's first view the open-loop step response. Create a new m-file and run the following code:

s = tf('s');

P = 1/(s^2 + 10*s + 20);

step(P)

The DC gain of the plant transfer function is 1/20, so 0.05 is the final value of the output to an unit step

input. This corresponds to the steady-state error of 0.95, quite large indeed. Furthermore, the rise time is

about one second, and the settling time is about 1.5 seconds. Let's design a controller that will reduce the

rise time, reduce the settling time, and eliminate the steady-state error.

Proportional Control

From the table shown above, we see that the proportional controller (Kp) reduces the rise time, increases

the overshoot, and reduces the steady-state error.

The closed-loop transfer function of the above system with a proportional controller is:

(7)

Let the proportional gain ( ) equal 300 and change the m-file to the following:

Page 27: Introduction to Control

Kp = 300;

C = pid(Kp)

T = feedback(C*P,1)

t = 0:0.01:2;

step(T,t)

C =

Kp = 300

P-only controller

T =

300

----------------

s^2 + 10 s + 320

Continuous-time transfer function.

The above plot shows that the proportional controller reduced both the rise time and the steady-state error,

increased the overshoot, and decreased the settling time by small amount.

Proportional-Derivative Control

Now, let's take a look at a PD control. From the table shown above, we see that the derivative controller

(Kd) reduces both the overshoot and the settling time. The closed-loop transfer function of the given

system with a PD controller is:

(8)

Let equal 300 as before and let equal 10. Enter the following commands into an m-file and run it in

the MATLAB command window.

Kp = 300;

Kd = 10;

C = pid(Kp,0,Kd)

Page 28: Introduction to Control

T = feedback(C*P,1)

t = 0:0.01:2;

step(T,t)

C =

Kp + Kd * s

with Kp = 300, Kd = 10

Continuous-time PD controller in parallel form.

T =

10 s + 300

----------------

s^2 + 20 s + 320

Continuous-time transfer function.

This plot shows that the derivative controller reduced both the overshoot and the settling time, and had a

small effect on the rise time and the steady-state error.

Proportional-Integral Control

Before going into a PID control, let's take a look at a PI control. From the table, we see that an integral

controller (Ki) decreases the rise time, increases both the overshoot and the settling time, and eliminates

the steady-state error. For the given system, the closed-loop transfer function with a PI control is:

(9)

Let's reduce the to 30, and let equal 70. Create an new m-file and enter the following commands.

Kp = 30;

Ki = 70;

Page 29: Introduction to Control

C = pid(Kp,Ki)

T = feedback(C*P,1)

t = 0:0.01:2;

step(T,t)

C =

1

Kp + Ki * ---

s

with Kp = 30, Ki = 70

Continuous-time PI controller in parallel form.

T =

30 s + 70

------------------------

s^3 + 10 s^2 + 50 s + 70

Continuous-time transfer function.

Run this m-file in the MATLAB command window, and you should get the following plot. We have

reduced the proportional gain (Kp) because the integral controller also reduces the rise time and increases

the overshoot as the proportional controller does (double effect). The above response shows that the

integral controller eliminated the steady-state error.

Proportional-Integral-Derivative Control

Now, let's take a look at a PID controller. The closed-loop transfer function of the given system with a PID

controller is:

(10)

Page 30: Introduction to Control

After several trial and error runs, the gains = 350, = 300, and = 50 provided the desired response.

To confirm, enter the following commands to an m-file and run it in the command window. You should get

the following step response.

Kp = 350;

Ki = 300;

Kd = 50;

C = pid(Kp,Ki,Kd)

T = feedback(C*P,1);

t = 0:0.01:2;

step(T,t)

C =

1

Kp + Ki * --- + Kd * s

s

with Kp = 350, Ki = 300, Kd = 50

Continuous-time PID controller in parallel form.

Now, we have obtained a closed-loop system with no overshoot, fast rise time, and no steady-state error.

General Tips for Designing a PID Controller

When you are designing a PID controller for a given system, follow the steps shown below to obtain a

desired response.

Obtain an open-loop response and determine what needs to be improved

Add a proportional control to improve the rise time

Add a derivative control to improve the overshoot

Page 31: Introduction to Control

Add an integral control to eliminate the steady-state error

Adjust each of Kp, Ki, and Kd until you obtain a desired overall response. You can always refer to the

table shown in this "PID Tutorial" page to find out which controller controls what characteristics.

Lastly, please keep in mind that you do not need to implement all three controllers (proportional,

derivative, and integral) into a single system, if not necessary. For example, if a PI controller gives a good

enough response (like the above example), then you don't need to implement a derivative controller on the

system. Keep the controller as simple as possible.

Automatic PID Tuning

MATLAB provides tools for automatically choosing optimal PID gains which makes the trial and error

process described above unnecessary. You can access the tuning algorithm directly using pidtune or

through a nice graphical user interface (GUI) using pidtool.

The MATLAB automated tuning algorithm chooses PID gains to balance performance (response time,

bandwidth) and robustness (stability margins). By default the algorthm designs for a 60 degree phase

margin.

Let's explore these automated tools by first generating a proportional controller for the mass-spring-damper

system by entering the following commands:

pidtool(P,'p')

The pidtool GUI window, like that shown below, should appear.

Page 32: Introduction to Control

Notice that the step response shown is slower than the proportional controller we designed by hand. Now

click on theShow Parameters button on the top right. As expected the proportional gain constant, Kp, is

lower than the one we used, Kp = 94.85 < 300.

We can now interactively tune the controller parameters and immediately see the resulting response int he

GUI window. Try dragging the resposne time slider to the right to 0.14s, as shown in the figure below. The

response does indeeed speed up, and we can see Kp is now closer to the manual value. We can also see all

the other performance and robustness parameters for the system. Note that the phase margin is 60 degrees,

the default for pidtool and generally a good balance of robustness and performance.

Page 33: Introduction to Control

Now let's try designing a PID controller for our system. By specifying the previously designed or

(baseline) controller, C, as the second parameter, pidtool will design another PID controller (instead of P or

PI) and will compare the response of the system with the automated controller with that of the baseline.

pidtool(P,C)

We see in the output window that the automated controller responds slower and exhibits more overshoot

than the baseline. Now choose the Design Mode: Extended option at the top, which reveals more tuning

parameters.

Page 34: Introduction to Control

Now type in Bandwidth: 32 rad/s and Phase Margin: 90 deg to generate a controller similar in performance

to the baseline. Keep in mind that a higher bandwidth (0 dB crossover of the open-loop) results in a faster

rise time, and a higher phase margin reduces the overshoot and improves the system stability.

Finally we note that we can generate the same controller using the command line tool pidtune instead of

the pidtool GUI

opts = pidtuneOptions('CrossoverFrequency',32,'PhaseMargin',90);

[C, info] = pidtune(P, 'pid', opts)

C =

1

Kp + Ki * --- + Kd * s

s

with Kp = 320, Ki = 169, Kd = 31.5

Continuous-time PID controller in parallel form.

Page 35: Introduction to Control

info =

Stable: 1

CrossoverFrequency: 32

PhaseMargin: 90

Introduction: Root Locus Controller Design

In this tutorial we will introduce the root locus, show how to create it using MATlAB, and demonstrate

how to design feedback controllers using the root locus that satisfy certain performance criteria.

Key MATLAB commands used in this tutorial are: feedback , rlocus , step , sisotool

Contents

Closed-Loop Poles

Plotting the Root Locus of a Transfer Function

Choosing a Value of K from the Root Locus

Closed-Loop Response

Using SISOTOOL for Root Locus Design

Closed-Loop Poles

The root locus of an (open-loop) transfer function is a plot of the locations (locus) of all possible

closed-loop poles with proportional gain K and unity feedback.

The closed-loop transfer function is:

(1)

and thus the poles of the closed-loop poles of the closed-loop system are values of such

that .

If we write , then this equation has the form:

(2)

(3)

Page 36: Introduction to Control

Let = order of and = order of (the order of a polynomial is the highest power of that appears

in it).

We will consider all positive values of K. In the limit as , the poles of the closed-loop system

are or the poles of . In the limit as , the poles of the closed-loop system are or

the zeros of .

No matter what we pick K to be, the closed-loop system must always have poles, where is the number

of poles of . The root locus must have branches, each branch starts at a pole of and goes to a

zero of . If has more poles than zeros (as is often the case), and we say that has zeros

at infinity. In this case, the limit of as is zero. The number of zeros at infinity is , the

number of poles minus the number of zeros, and is the number of branches of the root locus that go to

infinity (asymptotes).

Since the root locus is actually the locations of all possible closed-loop poles, from the root locus we can

select a gain such that our closed-loop system will perform the way we want. If any of the selected poles

are on the right half plane, the closed-loop system will be unstable. The poles that are closest to the

imaginary axis have the greatest influence on the closed-loop response, so even though the system has

three or four poles, it may still act like a second or even first order system depending on the location(s) of

the dominant pole(s).

Plotting the Root Locus of a Transfer Function

Consider an open-loop system which has a transfer function of

(4)

How do we design a feedback controller for the system by using the root locus method? Say our design

criteria are 5% overshoot and 1 second rise time. Make a MATLAB file called rl.m. Enter the transfer

function, and the command to plot the root locus:

s = tf('s');

sys = (s + 7)/(s*(s + 5)*(s + 15)*(s + 20));

rlocus(sys)

axis([-22 3 -15 15])

Page 37: Introduction to Control

Choosing a Value of K from the Root Locus

The plot above shows all possible closed-loop pole locations for a pure proportional controller. Obviously

not all of those closed-loop poles will satisfy our design criteria, To determine what part of the locus is

acceptable, we can use the command sgrid(Zeta,Wn) to plot lines of constant damping ratio and

natural frequency. Its two arguments are the damping ratio ( ) and natural frequency ( ) [these may be

vectors if you want to look at a range of acceptable values]. In our problem, we need an overshoot less than

5% (which means a damping ratio of greater than 0.7) and a rise time of 1 second (which means a natural

frequency greater than 1.8). Enter the following in the MATLAB command window:

Zeta = 0.7;

Wn = 1.8;

sgrid(Zeta,Wn)

Page 38: Introduction to Control

On the plot above, the two dotted lines at about a 45 degree angle indicate pole locations with = 0.7; in

between these lines, the poles will have > 0.7 and outside of the lines < 0.7. The semicircle indicates

pole locations with a natural frequency = 1.8; inside the circle, < 1.8 and outside the circle > 1.8.

Going back to our problem, to make the overshoot less than 5%, the poles have to be in between the two

white dotted lines, and to make the rise time shorter than 1 second, the poles have to be outside of the

white dotted semicircle. So now we know only the part of the locus outside of the semicircle and in betwen

the two lines are acceptable. All the poles in this location are in the left-half plane, so the closed-loop

system will be stable.

From the plot above we see that there is part of the root locus inside the desired region. So in this case, we

need only a proportional controller to move the poles to the desired region. You can use

the rlocfind command in MATLAB to choose the desired poles on the locus:

[k,poles] = rlocfind(sys)

Click on the plot the point where you want the closed-loop pole to be. You may want to select the points

indicated in the plot below to satisfy the design criteria.

Note that since the root locus may have more than one branch, when you select a pole, you may want to

find out where the other pole (poles) are. Remember they will affect the response too. From the plot above,

we see that all the poles selected (all the "+" signs) are at reasonable positions. We can go ahead and use

the chosen K as our proportional controller.

Closed-Loop Response

Page 39: Introduction to Control

In order to find the step response, you need to know the closed-loop transfer function. You could compute

this using the rules of block diagrams, or let MATLAB do it for you (there is no need to enter a value

for K if the rlocfind command was used):

K = 350;

sys_cl = feedback(K*sys,1)

sys_cl =

350 s + 2450

--------------------------------------

s^4 + 40 s^3 + 475 s^2 + 1850 s + 2450

Continuous-time transfer function.

The two arguments to the function feedback are the numerator and denominator of the open-loop

system. You need to include the proportional gain that you have chosen. Unity feedback is assumed.

If you have a non-unity feedback situation, look at the help file for the MATLAB function feedback,

which can find the closed-loop transfer function with a gain in the feedback loop.

Check out the step response of your closed-loop system:

step(sys_cl)

As we expected, this response has an overshoot less than 5% and a rise time less than 1 second.

Using SISOTOOL for Root Locus Design

Another way to complete what was done above is to use the interactive MATLAB GUI called sisotool.

Using the same model as above, first define the plant, .

s = tf('s');

Page 40: Introduction to Control

plant = (s + 7)/(s*(s + 5)*(s + 15)*(s + 20));

The sisotool function can be used for analysis and design. In this case, we will focus on using the Root

Locus as the design method to improve the step response of the plant. To begin, type the following into the

MATLAB command window:

sisotool(plant)

The following window should appear. To start, select the tab labeled Graphical Tuning. Within this

window, turn off Plot 2and make sure Plot 1 is the Root Locus and verify that Open Loop 1 is selected.

Finally, click the button labeled Show Design Plot to bring up the tunable Root Locus plot.

Page 41: Introduction to Control

In the same fashion, select the tab labeled Analysis Plots. Within this window, for Plot 1, select Step. In

the Contents of Plots subwindow, select Closed Loop r to y for Plot 1. If the window does not

automatically pop up, click the button labeled Show Analysis Plot.

The next thing to do is to add the design requirements to the Root Locus plot. This is done directly on the

plot by right-clicking and selecting Design Requirements, New. Design requirements can be set for the

Settling Time, the Percent Overshoot, the Damping Ratio, the Natural Frequency, or a Region Constraint.

There is no direct requirement for Rise Time, but the natural frequency can be used for this.

Here, we will set the design requirements for the damping ratio and the natural frequency just like was

done with sgrid. Recall that the requirements call for = 0.7 and = 1.8. Set these within the design

requirements. On the plot, any area which is still white, is an acceptable region for the poles.

Zoom into the Root Locus by right-clicking on the axis and select Properties, then click the label Limits.

Change the real axis to -25 to 5 and the imaginary to -2.5 to 2.5.

Page 42: Introduction to Control

Also, we can see the current values of some key parameters in the response. In the Step response, right-

click on the plot and go to Characteristics and select Peak Response. Do the same for the Rise Time. There

should now be two large dots on the screen indicating the location of these parameters. Click each of these

dots to bring up a screen with information.

Both plots should appear as shown here:

As the characteristics show on the Step response, the overshoot is acceptable, but the rise time is incredibly

off.

To fix this, we need to choose a new value for the gain K. Similarly to the rlocfind command, the gain

of the controller can be changed directly on the root locus plot. Click and drag the pink box on the origin to

the acceptable area where the poles have an imaginary component as shown below.

At the bottom of the plot, it can be seen that the loop gain has been changed to 361. Looking at the Step

response, both of the values are acceptable for our requirements.

Page 43: Introduction to Control

Introduction: Frequency Domain Methods for Controller Design

The frequency response method of controller design may be less intuitive than other methods you have

studied previously. However, it has certain advantages, especially in real-life situations such as modeling

transfer functions from physical data. In this tutorial, we will see how we can use the open-loop frequency

response of a system to predict its behavior in closed-loop.

Key MATLAB commands used in this tutorial

are: bode , nyquist , margin , lsim , step , feedback , sisotool

Contents

Gain and Phase Margin

Nyquist Diagram

The Cauchy Criterion

Closed-Loop Performance from Bode Plots

Closed-Loop Stability from the Nyquist Diagram

Gain and Phase Margin

Consider the following unity feedback system:

where is a variable (constant) gain and is the plant under consideration. The gain margin is defined

as the change in open-loop gain required to make the system unstable. Systems with greater gain margins

can withstand greater changes in system parameters before becoming unstable in closed-loop.

Page 44: Introduction to Control

The phase margin is defined as the change in open-loop phase shift required to make a closed-loop system

unstable.

The phase margin also measures the system's tolerance to time delay. If there is a time delay greater

than in the loop (where is the frequency where the phase shift is 180 deg), the system will

become unstable in closed-loop. The time delay, can be thought of as an extra block in the forward path

of the block diagram that adds phase to the system but has no effect on the gain. That is, a time delay can

be represented as a block with magnitude of 1 and phase (in radians/second).

For now, we won't worry about where all this comes from and will concentrate on identifying the gain and

phase margins on a Bode plot.

The phase margin is the difference in phase between the phase curve and -180 degrees at the point

corresponding to the frequency that gives us a gain of 0 dB (the gain crossover frequency, ). Likewise,

the gain margin is the difference between the magnitude curve and 0 dB at the point corresponding to the

frequency that gives us a phase of -180 degrees (the phase crossover frequency, ).

One nice thing about the phase margin is that you don't need to replot the Bode in order to find the new

phase margin when changing the gains. If you recall, adding gain only shifts the magnitude plot up. This is

equivalent to changing the y-axis on the magnitude plot. Finding the phase margin is simply a matter of

finding the new cross-over frequency and reading off the phase margin. For example, suppose you entered

the command bode(sys). You will get the following bode plot:

s = tf('s');

sys = 50/(s^3 + 9*s^2 + 30*s +40);

bode(sys)

grid on

title('Bode Plot with No Gain')

Page 45: Introduction to Control

You should see that the phase margin is about 100 degrees. Now suppose you added a gain of 100, by

entering the command bode(100*sys). You should get the following plot:

bode(100*sys)

grid on

title('Bode Plot with Gain = 100')

As you can see the phase plot is exactly the same as before, and the magnitude plot is shifted up by 40 dB

(gain of 100). The phase margin is now about -60 degrees. This same result could be achieved if the y-axis

of the magnitude plot was shifted down 40 dB. Try this, look at the first Bode plot, find where the curve

Page 46: Introduction to Control

crosses the -40 dB line, and read off the phase margin. It should be about 90 degrees, the same as the

second Bode plot.

We can have MATLAB calculate and display the gain and phase margins using

the margin(sys) command. This command returns the gain and phase margins, the gain and phase

cross over frequencies, and a graphical representation of these on the Bode plot. Let's check it out:

margin(100*sys)

Bandwidth Frequency

The bandwidth frequency is defined as the frequency at which the closed-loop magnitude response is equal

to -3 dB. However, when we design via frequency response, we are interested in predicting the closed-loop

behavior from the open-loop response. Therefore, we will use a second-order system approximation and

say that the bandwidth frequency equals the frequency at which the open-loop magnitude response is

between -6 and -7.5 dB, assuming the open-loop phase response is between -135 deg and -225 deg. For a

complete derivation of this approximation, consult your textbook.

In order to illustrate the importance of the bandwidth frequency, we will show how the output changes

with different input frequencies. We will find that sinusoidal inputs with frequency less than Wbw (the

bandwidth frequency) are tracked "reasonably well" by the system. Sinusoidal inputs with frequency

greater than Wbw are attenuated (in magnitude) by a factor of 0.707 or greater (and are also shifted in

phase).

Let's say we have the following closed-loop transfer function representing a system:

Page 47: Introduction to Control

(1)

sys = 1/(s^2 + 0.5*s + 1);

bode(sys)

Since this is the closed-loop transfer function, our bandwidth frequency will be the frequency

corresponding to a gain of -3 dB. Looking at the plot, we find that it is approximately 1.4 rad/s. We can

also read off the plot that for an input frequency of 0.3 radians, the output sinusoid should have a

magnitude about one and the phase should be shifted by perhaps a few degrees (behind the input). For an

input frequency of 3 rad/sec, the output magnitude should be about -20 dB (or 1/10 as large as the input)

and the phase should be nearly -180 (almost exactly out-of-phase). We can use the lsim command to

simulate the response of the system to sinusoidal inputs.

First, consider a sinusoidal input with a frequency lower than Wbw. We must also keep in mind that we

want to view the steady state response. Therefore, we will modify the axes in order to see the steady state

response clearly (ignoring the transient response).

sys = 1/(s^2 + 0.5*s + 1);

w = 0.3;

t = 0:0.1:100;

u = sin(w*t);

[y,t] = lsim(sys,u,t);

plot(t,y,t,u)

axis([50 100 -2 2])

Page 48: Introduction to Control

Note that the output (blue) tracks the input (green) fairly well; it is perhaps a few degrees behind the input

as expected. However, if we set the frequency of the input higher than the bandwidth frequency for the

system, we get a very distorted response (with respect to the input):

sys = 1/(s^2 + 0.5*s + 1);

w = 3;

t = 0:0.1:100;

u = sin(w*t);

[y,t] = lsim(sys,u,t);

plot(t,y,t,u)

axis([90 100 -1 1])

Again, note that the magnitude is about 1/10 that of the input, as predicted, and that it is almost exactly out

of phase (180 degrees behind) the input. Feel free to experiment and view the response for several different

frequencies , and see if they match the Bode plot.

Nyquist Diagram

Page 49: Introduction to Control

The Nyquist plot allows us to predict the stability and performance of a closed-loop system by observing

its open-loop behavior. The Nyquist criterion can be used for design purposes regardless of open-loop

stability (remember that the Bode design methods assume that the system is stable in open-loop).

Therefore, we use this criterion to determine closed-loop stability when the Bode plots display confusing

information.

Note: The MATLAB nyquist command does not provide an adequate representation for systems that

have open-loop poles in the jw-axis. Therefore, we suggest that you copy the nyquist1.m file as a new m-

file. This m-filecreates more accurate Nyquist plots, since it correctly deals with poles and zeros on

the jw-axis.

The Nyquist diagram is basically a plot of where is the open-loop transfer function and is a

vector of frequencies which encloses the entire right-half plane. In drawing the Nyquist diagram, both

positive and negative frequencies (from zero to infinity) are taken into account. We will represent positive

frequencies in red and negative frequencies in green. The frequency vector used in plotting the Nyquist

diagram usually looks like this (if you can imagine the plot stretching out to infinity):

However, if we have open-loop poles or zeros on the jw axis, will not be defined at those points, and

we must loop around them when we are plotting the contour. Such a contour would look as follows:

Please note that the contour loops around the pole on the jw axis. As we mentioned before, the

MATLAB nyquistcommand does not take poles or zeros on the jw axis into account and therefore

produces an incorrect plot. To correct this, please download and use nyquist1.m. If we have a pole on the

jw axis, we have to use nyquist1. If there are no poles or zeros on the jw-axis, or if we have pole-zero

cancellation, we can use either the nyquist command ornyquist1.m.

The Cauchy Criterion

The Cauchy criterion (from complex analysis) states that when taking a closed contour in the complex

plane, and mapping it through a complex function , the number of times that the plot of encircles

the origin is equal to the number of zeros of enclosed by the frequency contour minus the number of

Page 50: Introduction to Control

poles of enclosed by the frequency contour. Encirclements of the origin are counted as positive if they

are in the same direction as the original closed contour or negative if they are in the opposite direction.

When studying feedback controls, we are not as interested in as in the closed-loop transfer function:

(2)

If encircles the origin, then will enclose the point -1. Since we are interested in the closed-

loop stability, we want to know if there are any closed-loop poles (zeros of ) in the right-half plane.

More details on how to determine this will come later.

Therefore, the behavior of the Nyquist diagram around the -1 point in the real axis is very important;

however, the axis on the standard nyquist diagram might make it hard to see what's happening around

this point. To correct this, you can add the lnyquist.m function to your files. The lnyquist.m command

plots the Nyquist diagram using a logarithmic scale and preserves the characteristics of the -1 point.

To view a simple Nyquist plot using MATLAB, we will define the following transfer function and view

the Nyquist plot:

(3)

s = tf('s');

sys = 0.5/(s - 0.5);

nyquist(sys)

axis([-1 0 -1 1])

Now we will look at the Nyquist diagram for the following transfer function:

(4)

Note that this function has a pole at the origin. We will see the difference between using

the nyquist, nyquist1, andlnyquist commands with this particular function.

Page 51: Introduction to Control

sys = (s + 2)/(s^2);

nyquist(sys)

nyquist1(sys)

lnyquist(sys)

Page 52: Introduction to Control

Note that the nyquist plot is not the correct one, the nyquist1 plot is correct, but it's hard to see what

happens close to the -1 point, and the lnyquist plot is correct and has an appropriate scale.

Closed-Loop Performance from Bode Plots

In order to predict closed-loop performance from open-loop frequency response, we need to have several

concepts clear:

The system must be stable in open-loop if we are going to design via Bode plots.

If the gain crossover frequency is less than the phase crossover frequency (i.e. ), then the closed-

loop system will be stable.

For second-order systems, the closed-loop damping ratio is approximately equal to the phase margin

divided by 100 if the phase margin is between 0 and 60 degrees. We can use this concept with caution if

the phase margin is greater than 60 degrees.

For second-order systems, a relationship between damping ratio, bandwidth frequency, and settling time is

given by an equation described on the Extras: Bandwidth page.

A very rough estimate that you can use is that the bandwidth is approximately equal to the natural

frequency.

Let's use these concepts to design a controller for the following system:

Page 53: Introduction to Control

Where is the controller and is:

(5)

The design must meet the following specifications:

Zero steady state error.

Maximum overshoot must be less than 40%.

Settling time must be less than 2 seconds.

There are two ways of solving this problem: one is graphical and the other is numerical. Within MATLAB,

the graphical approach is best, so that is the approach we will use. First, let's look at the Bode plot. Create

a m-file with the following code:

sys = 10/(1.25*s + 1);

bode(sys)

There are several characteristics of the system that can be read directly from this Bode plot. First of all, we

can see that the bandwidth frequency is around 10 rad/sec. Since the bandwidth frequency is roughly the

same as the natural frequency (for a first order system of this type), the rise time is 1.8/BW = 1.8/10

= 1.8 seconds. This is a rough estimate, so we will say the rise time is about 2 seconds.

The phase margin for this system is approximately 95 degrees. The relation damping ratio =

PM/100 only holds forPM < 60. Since the system is first-order, there should be no overshoot.

The last major point of interest is steady-state error. The steady-state error can be read directly off the Bode

plot as well. The constant ( , , or ) is found from the intersection of the low frequency asymptote

Page 54: Introduction to Control

with the w = 1 line. Just extend the low frequency line to the w = 1 line. The magnitude at this point is

the constant. Since the Bode plot of this system is a horizontal line at low frequencies (slope = 0), we know

this system is of type zero. Therefore, the intersection is easy to find. The gain is 20 dB (magnitude 10).

What this means is that the constant for the error function is 10. The steady-state error is 1/(1+Kp) =

1/(1+10) = 0.091.

If our system was type one instead of type zero, the constant for the steady-state error would be found in a

manner similar to the following.

Let's check our predictions by looking at a step response plot. This can be done by adding the following

two lines of code into the MATLAB command window.

sys_cl = feedback(sys,1);

step(sys_cl)

title('Closed-Loop Step Response, No Controller')

Page 55: Introduction to Control

As you can see, our predictions were very good. The system has a rise time of about 2 seconds, has no

overshoot, and has a steady-state error of about 9%. Now we need to choose a controller that will allow us

to meet the design criteria. We choose a PI controller because it will yield zero steady-state error for a step

input. Also, the PI controller has a zero, which we can place. This gives us additional design flexibility to

help us meet our criteria. Recall that a PI controller is given by:

(6)

The first thing we need to find is the damping ratio corresponding to a percent overshoot of 40%. Plugging

in this value into the equation relating overshoot and damping ratio (or consulting a plot of this relation),

we find that the damping ratio corresponding to this overshoot is approximately 0.28. Therefore, our phase

margin should be at least 30 degrees. We must have a bandwidth frequency greater than or equal to 12 if

we want our settling time to be less than 1.75 seconds which meets the design specs.

Now that we know our desired phase margin and bandwidth frequency, we can start our design. Remember

that we are looking at the open-loop Bode plots. Therefore, our bandwidth frequency will be the frequency

corresponding to a gain of approximately -7 dB.

Let's see how the integrator portion of the PI or affects our response. Change your m-file to look like the

following (this adds an integral term but no proportional term):

plant = 10/(1.25*s + 1);

contr = 1/s;

bode(contr*plant, logspace(0,2))

Our phase margin and bandwidth frequency are too small. We will add gain and phase with a zero. Let's

place the zero at 1 for now and see what happens. Change your m-file to look like the following:

plant = 10/(1.25*s + 1);

contr = (s + 1)/s;

bode(contr*plant, logspace(0,2))

Page 56: Introduction to Control

It turns out that the zero at 1 with a unit gain gives us a satisfactory answer. Our phase margin is greater

than 60 degrees (even less overshoot than expected) and our bandwidth frequency is approximately 11

rad/s, which will give us a satisfactory response. Although satisfactory, the response is not quite as good as

we would like. Therefore, let's try to get a higher bandwidth frequency without changing the phase margin

too much. Let's try to increase the gain to 5 and see what happens. This will make the gain shift and the

phase will remain the same.

plant = 10/(1.25*s + 1);

contr = 5 * ((s + 1)/s);

bode(contr*plant, logspace(0,2))

That looks really good. Let's look at our step response and verify our results. Add the following two lines

to your m-file:

sys_cl = feedback(contr*plant,1);

step(sys_cl)

Page 57: Introduction to Control

As you can see, our response is better than we had hoped for. However, we are not always quite as lucky

and usually have to play around with the gain and the position of the poles and/or zeros in order to achieve

our design requirements.

Closed-Loop Stability from the Nyquist Diagram

Consider the negative feedback system:

Remember from the Cauchy criterion that the number N of times that the plot of G(s)H(s) encircles -1 is

equal to the number Z of zeros of 1 + G(s)H(s) enclosed by the frequency contour minus the

number P of poles of 1 + G(s)H(s) enclosed by the frequency contour (N = Z - P). Keeping

careful track of open- and closed-loop transfer functions, as well as numerators and denominators, you

should convince yourself that:

The zeros of 1 + G(s)H(s) are the poles of the closed-loop transfer function.

The poles of 1 + G(s)H(s) are the poles of the open-loop transfer function.

The Nyquist criterion then states that:

P = the number of open-loop (unstable) poles of G(s)H(s).

Page 58: Introduction to Control

N = the number of times the Nyquist diagram encircles -1.

clockwise encirclements of -1 count as positive encirclements.

counter-clockwise encirclements of -1 count as negative encirclements.

Z = the number of right-half-plane (positive, real) poles of the closed-loop system.

The important equation whih relates these three quantities is:

(7)

Note: This is only one convention for the Nyquist criterion. Another convention states that a

positive N counts the counter-clockwise or anti-clockwise encirclements of -1. The P and Z variables

remain the same. In this case the equation becomes Z = P - N. Throughout these tutorials, we will use a

positive sign for clockwise encirclements.

It is very important (and somewhat tricky) to learn how to count the number of times that the diagram

encircles -1. Therefore, we will go into some detail to help you visualize this. You can view this movie as

an example.

Another way of looking at it is to imagine you are standing on top of the -1 point and are following the

diagram from beginning to end. Now ask yourself: How many times did I turn my head a full 360 degrees?

Again, if the motion was clockwise, N is positive, and if the motion is anti-clockwise, N is negative.

Knowing the number of right-half plane (unstable) poles in open loop (P), and the number of encirclements

of -1 made by the Nyquist diagram (N), we can determine the closed-loop stability of the system. If Z = P

+ N is a positive, nonzero number, the closed-loop system is unstable.

We can also use the Nyquist diagram to find the range of gains for a closed-loop unity feedback system to

be stable. The system we will test looks like this:

where G(s) is:

(8)

This system has a gain K which can be varied in order to modify the response of the closed-loop system.

However, we will see that we can only vary this gain within certain limits, since we have to make sure that

our closed-loop system will be stable. This is what we will be looking for: the range of gains that will make

this system stable in the closed-loop.

The first thing we need to do is find the number of positive real poles in our open-loop transfer function:

Page 59: Introduction to Control

roots([1 -8 15])

ans =

5

3

The poles of the open-loop transfer function are both positive. Therefore, we need two anti-clockwise (N

= -2) encirclements of the Nyquist diagram in order to have a stable closed-loop system (Z = P + N).

If the number of encirclements is less than two or the encirclements are not anti-clockwise, our system will

be unstable.

Let's look at our Nyquist diagram for a gain of 1:

sys = (s^2 + 10*s + 24)/(s^2 - 8*s + 15);

nyquist(sys)

There are two anti-clockwise encirclements of -1. Therefore, the system is stable for a gain of 1. Now we

will see how the system behaves if we increase the gain to 20:

nyquist(20*sys)

Page 60: Introduction to Control

The diagram expanded. Therefore, we know that the system will be stable no matter how much we increase

the gain. However, if we decrease the gain, the diagram will contract and the system might become

unstable. Let's see what happens for a gain of 0.5:

nyquist(0.5*sys)

The system is now unstable. By trial and error we find that this system will become unstable for gains less

than 0.80. We can verify our answers by zooming in on the Nyquist plots as well as by looking at the

closed-loop steps responses for gains of 0.79, 0.80, and 0.81.

Gain Margin

We already defined the gain margin as the change in open-loop gain expressed in decibels (dB), required at

180 degrees of phase shift to make the system unstable. Now we are going to find out where this comes

from. First of all, let's say that we have a system that is stable if there are no Nyquist encirclements of -1,

such as:

(9)

Looking at the roots, we find that we have no open loop poles in the right half plane and therefore no

closed-loop poles in the right-half-plane if there are no Nyquist encirclements of -1. Now, how much can

we vary the gain before this system becomes unstable in closed-loop? Let's look at the following figure:

The open-loop system represented by this plot will become unstable in closed loop if the gain is increased

past a certain boundary. The negative real axis area between -1/a (defined as the point where the 180

Page 61: Introduction to Control

degree phase shift occurs...that is, where the diagram crosses the real axis) and -1 represents the amount of

increase in gain that can be tolerated before closed-loop instability.

If we think about it, we realize that if the gain is equal to a, the diagram will touch the -1 point:

(10)

or

(11)

Therefore, we say that the gain margin is a units. However, we mentioned before that the gain margin is

usually measured in decibels. Hence, the gain margin is:

(12)

We will now find the gain margin of the stable, open-loop transfer function we viewed before. Recall that

the function is:

(13)

and that the Nyquist diagram can be viewed by typing:

sys = 50/(s^3 + 9*s^2 + 30*s + 20);

nyquist(sys)

As we discussed before, all that we need to do to find the gain margin is find a, as defined in the preceding

figure. To do this, we need to find the point where there is exactly 180 degrees of phase shift. This means

that the transfer function at this point is real (has no imaginary part). The numerator is already real, so we

Page 62: Introduction to Control

just need to look at the denominator. Whens = jw, the only terms in the denominator that will have

imaginary parts are those which are odd powers of s. Therefore, for G(jw) to be real, we must have:

(14)

which means w = 0 (this is the rightmost point in the Nyquist diagram) or w = sqrt(30). We can

then find the value ofG(jw) at this point using polyval:

w = sqrt(30);

polyval(50,j*w)/polyval([1 9 30 40],j*w)

ans =

-0.2174

The answer is: -0.2174 + 0i. The imaginary part is zero, so we know that our answer is correct. We

can also verify by looking at the Nyquist plot again. The real part also makes sense. Now we can proceed

to find the gain margin.

We found that the 180 degrees phase shift occurs at -0.2174 + 0i. This point was previously defined

as -1/a. Therefore, we now have a, which is the gain margin. However, we need to express the gain

margin in decibels:

(15)

(16)

(17)

We now have our gain margin. Let's see how accurate it is by using a gain of a = 4.6 and zooming in on

the Nyquist plot:

a = 4.6;

nyquist(a*sys)

The plot appears to go right through the -1 point. We will now verify the accuracy of our results by

viewing the zoomed Nyquist diagrams and step responses for gains of 4.5, 4.6, and 4.7.

Page 63: Introduction to Control

Phase Margin

We have already discussed the importance of the phase margin. Therefore, we will only talk about where

this concept comes from. We have defined the phase margin as the change in open-loop phase shift

required at unity gain to make a closed-loop system unstable. Let's look at the following graphical

definition of this concept to get a better idea of what we are talking about.

Let's analyze the previous plot and think about what is happening. From our previous example we know

that this particular system will be unstable in closed-loop if the Nyquist diagram encircles the -1 point.

However, we must also realize that if the diagram is shifted by theta degrees, it will then touch the -1

point at the negative real axis, making the system marginally stable in closed-loop. Therefore, the angle

required to make this system marginally stable in closed-loop is called the phase margin (measured in

degrees). In order to find the point we measure this angle from, we draw a circle with radius of 1, find the

point in the Nyquist diagram with a magnitude of 1 (gain of zero dB), and measure the phase shift needed

for this point to be at an angle of 180 degrees.

Introduction: State-Space Methods for Controller Design

In this section, we will show how to design controllers and observers using state-space (or time-domain)

methods.

Key MATLAB commands used in this tutorial are: eig , ss , lsim , place , acker

Contents

Modeling

Stability

Controllability and Observability

Control Design Using Pole Placement

Introducing the Reference Input

Observer Design

Page 64: Introduction to Control

Modeling

There are several different ways to describe a system of linear differential equations. The state-space

representationwas introduced in the Introduction: System Modeling section. For a SISO LTI system, the

state-space form is given below:

(1)

(2)

where x is a n by 1 vector representing the state (commonly position and velocity variable in mechanical

systems), u is a scalar representing the input (commonly a force or torque in mechanical systems), and y is

a scalar representing the output. The matrices A (n by n), B (n by 1), and C (1 by n) determine the

relationships between the state and input and output variables. Note that there are n first-order differential

equations. State space representation can also be used for systems with multiple inputs and outputs

(MIMO), but we will only use single-input, single-output (SISO) systems in these tutorials.

To introduce the state space design method, we will use the magnetically suspended ball as an example.

The current through the coils induces a magnetic force which can balance the force of gravity and cause

the ball (which is made of a magnetic material) to be suspended in midair. The modeling of this system has

been established in many control text books (including Automatic Control Systems by B. C. Kuo, the

seventh edition).

The equations for the system are given by:

(3)

(4)

where h is the vertical position of the ball, i is the current through the electromagnet, V is the applied

voltage, M is the mass of the ball, g is gravity, L is the inductance, R is the resistance, and K is a coefficient

Page 65: Introduction to Control

that determines the magnetic force exerted on the ball. For simplicity, we will choose values M = 0.05

Kg, K = 0.0001, L = 0.01 H, R = 1 Ohm,g = 9.81 m/sec^2. The system is at equilibrium

(the ball is suspended in midair) whenever h = K i^2/Mg (at which point dh/dt = 0). We linearize

the equations about the point h = 0.01 m (where the nominal current is about 7 amp) and get the state

space equations:

(5)

(6)

where:

(7)

is the set of state variables for the system (a 3x1 vector), u is the input voltage (delta V), and y (the output),

is delta h. Enter the system matricies into a m-file.

A = [ 0 1 0

980 0 -2.8

0 0 -100 ];

B = [ 0

0

100 ];

C = [ 1 0 0 ];

Stability

One of the first things we want to do is analyze whether the open-loop system (without any control) is

stable. As discussed in the Introduction: System Analysis section, the eigenvalues of the system matrix, A,

(equivalent to the poles of the transfer fucntion) determine the stability. The eigenvalues of the A matrix

are the values of s where det(sI - A) = 0.

poles = eig(A)

poles =

31.3050

-31.3050

-100.0000

One of the poles is in the right-half plane, (i.e. has positive real part which means that the system is

unstable in open-loop.

To check out what happens to this unstable system when there is a nonzero initial condition, add the

following lines to yourm-file and it again:

Page 66: Introduction to Control

t = 0:0.01:2;

u = zeros(size(t));

x0 = [0.01 0 0];

sys = ss(A,B,C,0);

[y,t,x] = lsim(sys,u,t,x0);

plot(t,y)

title('Open-Loop Response to Non-Zero Initial Condition')

xlabel('Time (sec)')

ylabel('Ball Position (m)')

It looks like the distance between the ball and the electromagnet will go to infinity, but probably the ball

hits the table or the floor first (and also probably goes out of the range where our linearization is valid).

Controllability and Observability

A system is controllable if there exists a control input, u(t), that transfers any state of the system to zero in

finite time. It can be shown that an LTI system is controllable if and only if its controllabilty matrix, CO,

has full rank (i.e. if rank(CO) = n where n is the number of states ). The rank of the controllability matrix

of an LTI model can be determined in MATLAB using the

commands rank(ctrb(A,B)) or rank(ctrb(sys)).

(8)

All the state variables of a system may not be directly measurable, for instance if the component is in an

inaccessible location. In these cases it is neccesary to estimate the values of the unknown internal state

variables using only the available system outputs. A system is observable if the initial state, x(t_0), can be

Page 67: Introduction to Control

determined from the system output, y(t), over some finite time t_0 < t < t_f. For LTI systems, the system is

observable if and only if the observability matrix, OB, has full rank (i.e. if rank(OB) = n where n is the

number of states). The observability of an LTI model can be determined in MATLAB using the

command rank(obsv(A,C)) or rank(obsv(sys)).

(9)

Controllability and observability are dual concepts. A system (A,B) is controllable if and only if a system

(A',C,B',D) is observable. This fact will be useful when designing an observer, as we shall see below.

Control Design Using Pole Placement

Let's build a controller for this system using pole placement. The schematic of a full-state feedback system

is shown below. By full-state, we mean that all state variables are known to the controller at all times. For

instance in this system, we would need a sensor measuring the ball position, another measuring velocity,

and a third measuring current in the electro-magnet.

For simplicity, let's assume the reference is zero, R=0. The input is then

(10)

The state-space equations for the closed-loop feedback system are therefore

(11)

(12)

The stability and time domain performance of the closed-loop feedback system are determined primarily

by the location of the poles (eigenvalues) of the matrix (A-BK). Since the matrices A and B*K are both 3

by 3 matrices, there will be 3 poles for the system. By choosing an appropriate K matrix we can place these

closed-loop poles anywhere we want. We can use the MATLAB function place to find the control

matrix, K, which will give the desired poles.

Before attempting this method, we have to decide where we want the closed-loop poles to be. Suppose the

criteria for the controller were settling time < 0.5 sec and overshoot < 5%, then we might try to place the

Page 68: Introduction to Control

two dominant poles at -10 +/- 10i (at zeta = 0.7 or 45 degrees with sigma = 10 > 4.6*2). The third pole

we might place at -50 to start, and we can change it later depending on what the closed-loop behavior is.

Remove the lsim command from your m-file and everything after it, then add the following lines to

your m-file:

p1 = -10 + 10i;

p2 = -10 - 10i;

p3 = -50;

K = place(A,B,[p1 p2 p3]);

sys_cl = ss(A-B*K,B,C,0);

lsim(sys_cl,u,t,x0);

xlabel('Time (sec)')

ylabel('Ball Position (m)')

The overshoot is too large (there are also zeros in the transfer function which can increase the overshoot;

you do not see the zeros in the state-space formulation). Try placing the poles further to the left to see if the

transient response improves (this should also make the response faster).

p1 = -20 + 20i;

p2 = -20 - 20i;

p3 = -100;

K = place(A,B,[p1 p2 p3]);

sys_cl = ss(A-B*K,B,C,0);

lsim(sys_cl,u,t,x0);

xlabel('Time (sec)')

Page 69: Introduction to Control

ylabel('Ball Position (m)')

This time the overshoot is smaller. Consult your textbook for further suggestions on choosing the desired

closed-loop poles.

Compare the control effort required (K) in both cases. In general, the farther you move the poles, the more

control effort it takes.

Note: If you want to place two or more poles at the same position, place will not work. You can use a

function calledacker which works similarly to place:

K = acker(A,B,[p1 p2 p3])

Introducing the Reference Input

Now, we will take the control system as defined above and apply a step input (we choose a small value for

the step, so we remain in the region where our linearization is valid). Replace t,|u|, and lsim in your m-

file with the following:

t = 0:0.01:2;

u = 0.001*ones(size(t));

sys_cl = ss(A-B*K,B,C,0);

lsim(sys_cl,u,t);

xlabel('Time (sec)')

ylabel('Ball Position (m)')

axis([0 2 -4E-6 0])

Page 70: Introduction to Control

The system does not track the step well at all; not only is the magnitude not one, but it is negative instead

of positive!

Recall the schematic above, we don't compare the output to the reference; instead we measure all the states,

multiply by the gain vector K, and then subtract this result from the reference. There is no reason to expect

that K*x will be equal to the desired output. To eliminate this problem, we can scale the reference input to

make it equal to K*x steadystate. This scale factor is often called Nbar; it is introduced as shown in the

following schematic:

We can get Nbar from MATLAB by using the function rscale (place the following line of code after K =

...).

Nbar = rscale(sys,K)

Nbar =

-285.7143

Note that this function is not standard in MATLAB. You will need download it here, rscale.m, and save it

to your current workspace. Now, if we want to find the response of the system under state feedback with

this introduction of the reference, we simply note the fact that the input is multiplied by this new

factor, Nbar:

Page 71: Introduction to Control

lsim(sys_cl,Nbar*u,t)

title('Linear Simulation Results (with Nbar)')

xlabel('Time (sec)')

ylabel('Ball Position (m)')

axis([0 2 0 1.2*10^-3])

and now a step can be tracked reasonably well.

Observer Design

When we can't measure all the states x (often the case in practice), we can build an observer to estimate

them, while measuring only the output y = C x. For the magnetic ball example, we will add three new,

estimated states to the system. The schematic is as follows:

The observer is basically a copy of the plant; it has the same input and almost the same differential

equation. An extra term compares the actual measured output y to the estimated output y_hat; this will

Page 72: Introduction to Control

cause the estimated states \hat{x} to approach the values of the actual states x. The error dynamics of the

observer are given by the poles of (A-LC).

First, we need to choose the observer gain L. Since we want the dynamics of the observer to be much faster

than the system itself, we need to place the poles at least five times farther to the left than the dominant

poles of the system. If we want to use place, we need to put the three observer poles at different

locations.

op1 = -100;

op2 = -101;

op3 = -102;

Because of the duality between controllability and observability, we can use the same technique used to

find the control matrix, but replacing the matrix B by the matrix C and taking the transposes of each matrix

L = place(A',C',[op1 op2 op3])';

The equations in the block diagram above are given for \hat{x}. It is conventional to write the combined

equations for the system plus observer using the original state x plus the error state: e = x - \hat{x}.

We use as state feedback u = -K \hat{x}. After a little bit of algebra (consult your textbook for more

details), we arrive at the combined state and error equations with the full-state feedback and an observer.

At = [ A-B*K B*K

zeros(size(A)) A-L*C ];

Bt = [ B*Nbar

zeros(size(B)) ];

Ct = [ C zeros(size(C)) ];

To see how the response looks to a nonzero initial condition with no reference input, add the following

lines into your m-file. We typically assume that the observer begins with zero initial condition, \hat{x}

= 0. This gives us that the initial condition for the error is equal to the initial condition of the state.

sys = ss(At,Bt,Ct,0);

lsim(sys,zeros(size(t)),t,[x0 x0]);

title('Linear Simulation Results (with observer)')

xlabel('Time (sec)')

ylabel('Ball Position (m)')

Page 73: Introduction to Control

Responses of all the states are plotted below. Recall that lsim gives us x and e; to get \hat{x}, we

need to compute x - e.

t = 0:1E-6:0.1;

x0 = [0.01 0.5 -5];

[y,t,x] = lsim(sys,zeros(size(t)),t,[x0 x0]);

n = 3;

e = x(:,n+1:end);

x = x(:,1:n);

x_est = x - e;

% Save state variables explicitly to aid in plotting

h = x(:,1); h_dot = x(:,2); i = x(:,3);

h_est = x_est(:,1); h_dot_est = x_est(:,2); i_est = x_est(:,3);

plot(t,h,'-r',t,h_est,':r',t,h_dot,'-b',t,h_dot_est,':b',t,i,'-g',t,i_est,':g')

xlabel('Time (sec)')

Page 74: Introduction to Control

We can see that the observer estimates the states quickly and tracks the states well in the steady-state.

Introduction: Digital Controller Design

In this section we will discuss converting continuous time models into discrete time (or difference

equation) models. We will also introduce the z-transform and show how to use it to analyze and design

controllers for discrete time systems.

Key MATLAB commands used in this tutorial are: c2d , pzmap , zgrid , step , rlocus

Contents

Introduction

Zero-Hold Equivalence

Conversion Using c2d

Example: Mass-Spring-Damper

Stability and Transient Response

Discrete Root Locus

Introduction

The figure below shows the typical continuous feedback system that we have been considering so far in

this tutorial. Almost all of the continuous controllers can be built using analog electronics.

The continuous controller, enclosed in the dashed square, can be replaced by a digital controller, shown

below, that performs same control task as the continuous controller. The basic difference between these

controllers is that the digital system operates on discrete signals (or samples of the sensed signal) rather

than on continuous signals.

Different types of signals in the above digital schematic can be represented by the following plots.

Page 75: Introduction to Control

The purpose of this Digital Control Tutorial is to show you how to use MATLAB to work with discrete

functions either in transfer function or state-space form to design digital control systems.

Zero-Hold Equivalence

In the above schematic of the digital control system, we see that the digital control system contains both

discrete and the continuous portions. When designing a digital control system, we need to find the discrete

equivalent of the continuous portion so that we only need to deal with discrete functions.

For this technique, we will consider the following portion of the digital control system and rearrange as

follows.

The clock connected to the D/A and A/D converters supplies a pulse every T seconds and each D/A and

A/D sends a signal only when the pulse arrives. The purpose of having this pulse is to require that Hzoh(z)

have only samples u(k) to work on and produce only samples of output y(k); thus, Hzoh(z) can be realized

as a discrete function.

Page 76: Introduction to Control

The philosophy of the design is the following. We want to find a discrete function Hzoh(z) so that for a

piecewise constant input to the continuous system H(s), the sampled output of the continuous system

equals the discrete output. Suppose the signal u(k) represents a sample of the input signal. There are

techniques for taking this sample u(k) and holding it to produce a continuous signal uhat(t). The sketch

below shows that the uhat(t) is held constant at u(k) over the interval kT to (k+1)T. This operation of

holding uhat(t) constant over the sampling time is called zero-order hold.

The zero-order held signal uhat(t) goes through H2(s) and A/D to produce the output y(k) that will be the

piecewise same signal as if the discrete signal u(k) goes through Hzoh(z) to produce the discrete output

y(k).

Now we will redraw the schematic, placing Hzoh(z) in place of the continuous portion.

By placing Hzoh(z), we can design digital control systems dealing with only discrete functions.

Note: There are certain cases where the discrete response does not match the continuous response due to a

hold circuit implemented in digital control systems. For information, see Lagging effect associated with the

hold.

Conversion Using c2d

Page 77: Introduction to Control

There is a MATLAB function called c2d that converts a given continuous system (either in transfer

function or state-space form) to a discrete system using the zero-order hold operation explained above. The

basic command for this in MATLAB issys_d = c2d(sys,Ts,'zoh')

The sampling time (Ts in sec/sample) should be smaller than 1/(30*BW), where BW is the closed-loop

bandwidth frequency.

Example: Mass-Spring-Damper

Transfer Function

Suppose you have the following continuous transfer function

(1)

Assuming the closed-loop bandwidth frequency is greater than 1 rad/sec, we will choose the sampling time

(Ts) equal to 1/100 sec. Now, create an new m-file and enter the following commands.

M = 1;

b = 10;

k = 20;

s = tf('s');

sys = 1/(M*s^2+b*s+k);

Ts = 1/100;

sys_d = c2d(sys,Ts,'zoh')

sys_d =

4.837e-05 z + 4.678e-05

-----------------------

z^2 - 1.903 z + 0.9048

Sample time: 0.01 seconds

Discrete-time transfer function.

State-Space

The continuous time state-space model is as follows:

(2)

(3)

Page 78: Introduction to Control

All constants are the same as before. The following m-file converts the above continuous state-space to

discrete state-space.

A = [0 1;

-k/M -b/M];

B = [ 0;

1/M];

C = [1 0];

D = [0];

Ts = 1/100;

sys = ss(A,B,C,D);

sys_d = c2d(sys,Ts,'zoh')

sys_d =

a =

x1 x2

x1 0.999 0.009513

x2 -0.1903 0.9039

b =

u1

x1 4.837e-05

x2 0.009513

c =

x1 x2

y1 1 0

d =

u1

y1 0

Sample time: 0.01 seconds

Discrete-time state-space model.

From these matrices, the discrete state-space can be written as

(4)

(5)

Now you have the discrete time state-space model.

Page 79: Introduction to Control

Stability and Transient Response

For continuous systems, we know that certain behaviors results from different pole locations in the s-plane.

For instance, a system is unstable when any pole is located to the right of the imaginary axis. For discrete

systems, we can analyze the system behaviors from different pole locations in the z-plane. The

characteristics in the z-plane can be related to those in the s-plane by the expression

(6)

T = Sampling time (sec/sample)

s = Location in the s-plane

z = Location in the z-plane

The figure below shows the mapping of lines of constant damping ratio (zeta) and natural frequency (Wn)

from the s-plane to the z-plane using the expression shown above.

If you noticed in the z-plane, the stability boundary is no longer imaginary axis, but is the unit circle z=1.

The system is stable when all poles are located inside the unit circle and unstable when any pole is located

outside.

For analyzing the transient response from pole locations in the z-plane, the following three equations used

in continuous system designs are still applicable.

(7)

(8)

Page 80: Introduction to Control

(9)

where,

zeta = Damping ratio

Wn = Natural frequency (rad/sec)

Ts = Settling time

Tr = Rise time

Mp = Maximum overshoot

Important: The natural frequency (Wn) in z-plane has the unit of rad/sample, but when you use the

equations shown above, the Wn must be in the unit of rad/sec.

Suppose we have the following discrete transfer function

(10)

Create an new m-file and enter the following commands. Running this m-file in the command window

gives you the following plot with the lines of constant damping ratio and natural frequency.

numDz = 1;

denDz = [1 -0.3 0.5];

sys = tf(numDz,denDz,-1); % the -1 indicates that the sample time is undetermined

pzmap(sys)

axis([-1 1 -1 1])

zgrid

Page 81: Introduction to Control

From this plot, we see poles are located approximately at the natural frequency of 9pi/20T (rad/sample)

and the damping ratio of 0.25. Assuming that we have a sampling time of 1/20 sec (which leads to Wn =

28.2 rad/sec) and using three equations shown above, we can determine that this system should have the

rise time of 0.06 sec, a settling time of 0.65 sec and a maximum overshoot of 45% (0.45 more than the

steady-state value). Let's obtain the step response and see if these are correct. Add the following commands

to the above m-file and rerun it in the command window. You should get the following step response.

sys = tf(numDz,denDz,1/20);

step(sys,2.5);

As you can see from the plot, the rise time, settling time and overshoot came out to be what we expected.

This shows how you can use the locations of poles and the above three equations to analyze the transient

response of the system.

Discrete Root Locus

The root-locus is the locus of points where roots of characteristic equation can be found as a single gain is

varied from zero to infinity. The characteristic equation of an unity feedback system is

(11)

where G(z) is the compensator implemented in the digital controller and Hzoh(z) is the plant transfer

function in z.

The mechanics of drawing the root-loci are exactly the same in the z-plane as in the s-plane. Recall from

the continuous Root-Locus Tutorial, we used the MATLAB function called sgrid to find the root-locus

region that gives an acceptable gain (K). For the discrete root-locus analysis, we will use the function zgrid

that has the same characteristics as sgrid. The command zgrid(zeta, Wn) draws lines of constant damping

ratio (zeta) and natural frequency (Wn).

Page 82: Introduction to Control

Suppose we have the following discrete transfer function

(12)

and the requirements are a damping ratio greater than 0.6 and a natural frequency greater than 0.4

rad/sample (these can be found from design requirements, sampling time (sec/sample) and three equations

shown in the previous section). The following commands draw the root-locus with the lines of constant

damping ratio and natural frequency. Create an new m-file and enter the following commands. Running

this m-file should give you the following root-locus plot.

numDz = [1 -0.3];

denDz = [1 -1.6 0.7];

sys = tf(numDz,denDz,-1);

rlocus(sys)

axis([-1 1 -1 1])

zeta = 0.4;

Wn = 0.3;

zgrid(zeta,Wn)

From this plot, you should realize that the system is stable because all poles are located inside the unit

circle. Also, you see two dotted lines of constant damping ratio and natural frequency. The natural

frequency is greater than 0.3 outside the constant-Wn line, and the damping ratio is greater than 0.4 inside

the constant-zeta line. In this example, we do have the root-locus drawn in the desired region. Therefore, a

gain (K) chosen from one of the loci in the desired region should give you the response that satisfies design

requirements.

Page 83: Introduction to Control

Introduction: Simulink Modeling

In Simulink, it is very straightforward to represent and then simulate a mathematical model representing a

physical system. Models are represented graphically in Simulink as block diagrams. A wide array of blocks

are available to the user in provided libraries for representing various phenomena and models in a range of

formats. One of the primary advantages of employing Simulink (and simulation in general) for the analysis

of dynamic systems is that it allows us to quickly analyze the response of complicated systems that may be

prohibitively difficult to analyze analytically. Simulink is able to numerically approximate the solutions to

mathematical models that we are unable to, or don't wish to, solve "by hand."

In general, the mathematical equations representing a given system that serve as the basis for a Simulink

model can be derived from physical laws. In this page we will demonstrate how to derive a mathematical

model and then implement that model in Simulink. This model is then employed in the Introduction:

Simulink Control page in order to demonstrate how to employ Simulink to design and simulate the control

for a system.

Contents

Train system

Free-body diagram and Newton's second law

Constructing the Simulink model

Running the model

Train system

In this example, we will consider a toy train consisting of an engine and a car. Assuming that the train only

travels in one dimension (along the track), we want to apply control to the train so that it starts and comes

to rest smoothly, and so that it can track a constant speed command with minimal error in steady state.

The mass of the engine and the car will be represented by and , respectively. Furthermore, the engine

and car are connected via a coupling with stiffness . In other words, the coupling is modeled as a spring

with a spring constant . The force represents the force generated between the wheels of the engine and

the track, while represents the coefficient of rolling friction.

Free-body diagram and Newton's second law

The first step in deriving the mathematical equations that govern a physical system is to draw the free-body

diagram(s) representing the system. This is done below for our train system.

Page 84: Introduction to Control

From Newton's second law, we know that the sum of the forces acting on a body is equal to the product of

the mass of the body and its acceleration. In this case, the forces acting on the engine in the horizontal

direction are the spring force, the rolling resistance, and the force generated at the wheel/track interface.

The forces acting on the train car in the horizontal direction are the spring force and the rolling

resistance. In the vertical direction, the weight forces are balanced by the normal forces applied by the

ground . Therefore, there will be no acceleration in the vertical direction.

We will model the spring as generating a force that is linearly proportional to the deformation of the

spring, , where and are the displacements of the engine and car, respectively. Here it is

assumed that the spring is undeformed when and equal zero. The rolling resistance forces are modeled

as being linearly proportional to the product of the corresponding velocities and normal forces (which are

equal to the weight forces).

Applying Newton's second law in the horizontal direction based on the above free-body diagrams leads to

the following governing equations for the train system.

(1)

(2)

Constructing the Simulink model

This set of system equations can now be represented graphically without further manipulation.

Specifically, we will construct two copies (one for each mass) of the general

expression or . First, open Simulink and open a new model window. Then drag two

Sum blocks (from the Math Operations library) into your model window and place them approximately as

shown in the figure below.

Page 85: Introduction to Control

The outputs of each of these Sum blocks represents the sum of the forces acting on each mass. Multiplying

each output signal by will give us the corresponding acceleration of each mass. Now drag two Gain

blocks (from the Math Operations Library) into your model and attach each one with a line from the output

of one of the Sum blocks. Label these two signals as "Sum_F1" and "Sum_F2" in order to make your

model more clear. This is accomplished by double-clicking in the space above each of the two signal lines

and entering the desired label.

These Gain blocks should contain for each of the masses. We will define the variables M1 and M2 in

the MATLAB workspace, so we can just enter the corresponding variable names in each of the Gain

Page 86: Introduction to Control

blocks. Double-click on the upper Gain block and enter "1/M1" into the Gain field. Similarly, enter "1/M2"

in the Gain field of the second Gain block.

You will notice that the gains did not appear in the image of the Gain blocks, rather the blocks display a

value of -K-. This is because the blocks are too small on the screen to show the full variable name inside

the triangle. The blocks can be resized so that the actual gain value can be seen. To resize a block, select it

by clicking on it once. Small squares will appear at the corners. Drag one of these squares to stretch the

block. Your model should appear as below.

The outputs of these gain blocks are the accelerations of each of the masses (the train engine and car). The

governing equations we derived above depend on the velocities and displacements of the masses. Since

velocity can be determined by integrating acceleration, and position can be determined by integrating

velocity, we can generate these signals employing integrator blocks. Drag a total of four Integrator blocks

from the Continuous library into your model, two for each of our two accelerations. Connect these blocks

and label the signals as shown below. Specifically, the first inegrator takes the acceleration of mass 1

("x1_ddot") as an input and generates the velocity of mass 1 ("x1_dot"). The second integrator then takes

this velocity and outputs the displacement of the first mass ("x1"). The same pattern holds for the

integrators for the second mass.

Page 87: Introduction to Control

Now, drag two Scopes from the Sinks library into your model and connect them to the outputs of these

integrators. Label them "x1" and "x2".

Now we are ready to add the forces acting on each mass. First, we need to adjust the inputs on each Sum

block to represent the proper number of forces (we will worry about the signs later). Since there is a total

of three forces acting on mass 1, double-click on the corresponding Sum block and change the List of

Page 88: Introduction to Control

signs field to "|+++". The symbol "|" serves as a spacer. There are only 2 forces acting on mass 2,

therefore, we can leave that Sum block alone for now.

The first force acting on mass 1 is just the input force, . Drag a Signal Generator block from the Sources

library and connect it to the uppermost input of the corresponding Sum block. Label this signal as "F".

Page 89: Introduction to Control

The next force acting on mass 1 is the rolling resistance force. Recall that this force is modeled as follows.

(3)

To generate this force, we can tap off the velocity signal and multiply by an appropriate gain. Drag a Gain

block into your model window. Tap off the "x1_dot" signal and connect it to the input of this new Gain

block (draw this line in several steps if necessary). Connect the output of the Gain block to the second

input of the Sum block. Double-click the Gain block and enter "mu*g*M1" into the Gain field. The rolling

resistance force, however, acts in the negative direction. Therefore, change the list of signs of the Sum

block to "|+-+". Next, resize the Gain block to display the full gain and label the output of the Gain block

"Frr1". Your model should now appear as follows.

The last force acting on mass 1 is the spring force. Recall that this force is equal to the following.

(4)

Therefore, we need to generate a signal which we can then be multiplied by a gain to create the

force. Drag a Subtraction block (or a Sum block or an Addition block) below the rest of your model. In

order to change the direction of this block, right-click on the block and choose Format > Flip block from

the resulting menu. Alternatively, you can select the block then hit Ctrl-I. Now, tap off the "x2" signal and

connect it to the negative input of the Subtract block. Also, tap off the "x1" signal and connect it to the

positive input. This will cause signal lines to cross. Lines may cross, but they are only actually connected

where a small block appears (such as at a tap point).

Page 90: Introduction to Control

Now, we can multiply this difference by the spring constant to generate the spring force. Drag a Gain block

into your model to the left of the Subtraction block. Change the value of the Gain block to "k" and connect

the output of the Subtract block to its input. Then connect the output of the Gain block to the third input of

the Sum block for mass 1 and label the signal "Fs". Since the spring force acts on mass 1 in the negative

direction, it is necessary to again change the list of signs of the Sum block to "|+--". Your model should

appear as follows.

Page 91: Introduction to Control

We can now apply forces to mass 2. For the first force, we will use the same spring force we just

generated, except that it is applied to mass 2 in the positive direction. Simply tap off the spring force signal

"Fs" and connect it to the first input of the Sum block for mass 2.

The last force applied to mass 2 is its rolling resistance force. This force is generated in an analogous

manner to the rolling resistance force applied to mass 1. Tap off the signal "x2_dot" and multiply it by a

Gain block with value "mu*g*M2". Then connect the output of the Gain block to the second input of the

corresponding Sum block and label the signal "Frr2". Changing the second input of the Sum block to be

negative will lead to the following model.

Page 92: Introduction to Control

Now the model is complete. We simply need to supply the proper input and define the output of interest.

The input to the system is the force generated by the engine. Within the Simulink model, we have

already defined the force to be the output of a Signal Generator block. The output of the system, which

we will observe and ultimately try to control, will be the velocity of the train engine. Add another Scope

block to your model from the Sinks library. Tap a line from the "x1_dot" signal and connect it to the Scope

block. Label this scope as "x1_dot" and your model should appear as in the following.

Now, the model is complete and should be saved. You can also download the completed model here.

Page 93: Introduction to Control

Running the model

Before running the model, we need to assign numerical values to each of the variables used in the model.

For the train system, we will employ the following values.

= 1 kg

= 0.5 kg

= 1 N/sec

= 1 N

= 0.02 sec/m

= 9.8 m/s^2

Create a new m-file and enter the following commands.

M1 = 1;

M2 = 0.5;

k = 1;

F = 1;

mu = 0.02;

g = 9.8;

Execute your m-file in the MATLAB command window to define these values. Simulink will recognize

these MATLAB variables for use in the model.

Now, we need to give an appropriate input to the engine. Double-click on the Signal Generator block

(outputs "F"). Selectsquare from the Wave form drop-down menu and set the Frequency field to equal

"0.001". You may leave the Units as the default Hertz. Also enter "-1" into the Amplitude field (positive

amplitude steps negative before stepping positive).

Page 94: Introduction to Control

The last step before running the simulation is to select an appropriate simulation time. To view one cycle

of the 0.001 Hz square wave, we should simulate the model for 1000 seconds. Select Parameters from

the Simulation menu at the top of the model window and change the Stop Time field to "1000". Close the

dialog box.

Now, run the simulation and open the "x1_dot" scope to examine the velocity output (hit autoscale). The

input was a square wave with two steps, one positive and one negative. Physically, this means that the

engine first went forward, then backward. The velocity output reflects this.

In this page we derived the mathematical model for the train system from first principles and then

represented the derived equations within Simulink. An alternative option that is now available is to

represent a dynamic system employing the physical modeling tool Simscape. Simscape is an addition to

Simulink that allows a user to model a system employing blocks that represent physical quantities (and

objects) such as inertias and joints, or resistances and inductors. Employing Simscape allows the user to

simulate a physical system without deriving the governing mathematical equations.

Continuing on to the Introduction: Simulink Control page, we will employ the model derived in this page

to demonstrate how to use Simulink to design the control for our train system.

Introduction: Simulink Control

Contents

The open-loop plant model

Implementing a PID controller in Simulink

Running the closed-loop model

Extracting a model into MATLAB

Controller design within Simulink

Page 95: Introduction to Control

The open-loop plant model

In the Introduction: Simulink Modeling page we demonstrated how Simulink can be employed to simulate

a physical system. More generally, Simulink can also simulate the complete control system, including the

control algorithm in addition to the physical plant. As mentioned previously, Simulink is especially useful

for generating the approximate solutions of mathematical models that may be prohibitively difficult to

solve "by hand." For example, consider that you have a nonlinear plant. A common approach is to generate

a linear approximation of the plant and then use the linearized model to design a controller using analytical

techniques. Simulink can then be employed to simulate the performance of your controller when applied to

the full nonlinear model. Simulink can be employed for generating the linearized model and MATLAB can

be employed for designing the controller as described in the other Introduction pages. Various control

design facilities of MATLAB can also be accessed directly from within Simulink. We will demonstrate

both approaches in this page.

Recall the Simulink model of the toy train system derived in the Introduction: Simulink Modeling page and

pictured below.

You can generate this model yourself, or you can download the completed model here. Assuming that the

train only travels in one dimension (along the track), we want to apply control to the train engine so that it

starts and comes to rest smoothly, and so that it can track a constant speed command with minimal error in

steady state.

Implementing a PID controller in Simulink

Let us first create the structure for simulating the train system in unity feedback with a PID controller. In

order to make our Simulink model more understandable, we will first save the train model into its own

Page 96: Introduction to Control

subsystem block. To accomplish this, delete the three scope blocks and replace each one by an Out1 block

from the Sinks library. Label each Out1 block with the corresponding variable name, "x1_dot", "x1", and

"x2". Then delete the Signal Generator block and replace it with an In1 block from the Sources library.

Label this input "F" for the force generated between the train engine and the railroad track. Your model

should now appear as follows.

Next select all of the blocks in your model (Ctrl A) and select Create Subsystem from the Edit menu at the

top of the model window. With a little rearranging and relabeling, your model will appear as shown below.

Page 97: Introduction to Control

Now we can add a controller to our system. We will employ a PID controller which can be implemented

using a PID Controller block from the Continuous library. Placing this block in series with the train

subsystem, your model will appear as follows. In the following, we model the controller as generating the

force "F" directly. This neglects the dynamics with which the train engine generates the torque applied to

the wheels, and subsequently neglects the dynamics of how the force is generated at the wheel/track

interface. This simplified approach is taken at this point since we only wish to introduce the basic

functionality of Simulink for controller design and analysis.

Double-clicking on the PID Controller block, we will initially set the Integral (I) gain field equal to 0 and

will leave theProportional (P) and Derivative (D) gains as their defaults of 1 and 0, respectively. Next add

a Sum block from the Math Operations library. Double-click on this block and modify the List of

signs field to "|+-". Since we wish to control the velocity of the toy train engine, we will feedback the

engine's velocity. This is accomplished by 4ring a line off of the "x1_dot" signal and connecting it to the

negative sign of the Sum block. The output of the Sum block will be the velocity error for the train engine

and should be connected to the input of the PID Controller block. Connecting the blocks as described and

adding labels, your model should appear as follows.

Page 98: Introduction to Control

Next add a Signal Builder block from the Sources library to represent the velocity commanded to the train.

Since we wish to design a controller to bring the train smoothly up to speed and smoothly to rest, we will

test the system with a velocity command that steps up to 1 m/s followed by a step back down to 0 m/s

(recall that our system is a toy train). To generate this type of command signal, double-click on the Signal

Builder block. Then choose Change time range from the Axesmenu at the top of the block's dialog

window. Set the Max time field to "300" seconds. Next, set the step up to occur at 10 seconds and the step

down to occur at 150 seconds. This is accomplished by clicking on the corresponding portions of the signal

graph (left and right vertical lines) and either dragging the line to the desired position, or entering the

desired time in the T field at the bottom of the window. When done, your signal should appear as follows.

Page 99: Introduction to Control

Also add a Scope block from the Sinks library and use it to replace the Out1 block for the train's velocity.

Relabeling the blocks, your model will appear as follows.

We are now ready to run the closed-loop simulation. If you wish to skip the above steps, you may

download the completed model with control here.

Running the closed-loop model

Before running the model, we need to assign numerical values to each of the variables used in the model.

For the train system, we will employ the following values.

= 1 kg

= 0.5 kg

= 1 N/sec

= 1 N

= 0.02 sec/m

= 9.8 m/s^2

Create a new m-file and enter the following commands.

M1 = 1;

M2 = 0.5;

k = 1;

F = 1;

Page 100: Introduction to Control

mu = 0.02;

g = 9.8;

Execute your m-file in the MATLAB command window to define these values. Simulink will recognize

these MATLAB variables for use in the model. Next we need to set the time for which our simulation will

run to match the time range of the command from the Signal Builder block. This is accomplished by

selecting Parameters from the Simulation menu at the top of the model window and changing the Stop

Time field to "300". Now, run the simulation and open the "x1_dot" scope to examine the velocity output

(hit autoscale). The result as shown below demonstrates that the closed-loop system is unstable for this

controller.

Since the performance achieved above is unsatisfactory, we need to redesign our controller. We will first

demonstrate how to extract a model from Simulink into MATLAB for analysis and design. Then we will

demonstrate how to design the control from directly within Simulink.

Extracting a model into MATLAB

The Simulink Control Design toolbox offers the functionality to extract a model from Simulink into the

MATLAB workspace. This is especially useful for complicated, or nonlinear simulation models. This is

also useful for generating discrete-time (sampled) models. For this example, let us extract a continous-time

model of our train subsystem. First we need to identify the inputs and outputs of the model we wish to

extract. The input to the train system is the force . We can designate this fact by right-clicking on the

signal representing "F" (output of the PID block) and choosing Linearization Points > Input Point from the

resulting menu. Likewise, we can designate the output of the train system by right-clicking on the "x1_dot"

signal and choosing Linearization Points > Output Point from the resulting menu. These inputs and outputs

will now be indicated by small arrow symbols as shown in the following figure. Since we wish to extract a

model of the train by itself, without control, we need to further delete the feedback signal, otherwise we

will extract the closed-loop model from to . Your model should now appear as follows.

Page 101: Introduction to Control

We can now extract the model by opening the Linear Analysis Tool. This is accomplished by

selecting Control Design > Linear Analysis from under the Tools menu at the top of the model window.

Following these steps will open the window shown below.

Page 102: Introduction to Control

This tool generates an LTI object from a (possibly nonlinear) Simulink model and allows you to specify

the point about which the linearization is performed. Since our Simulink model is already linear, our

choice of operating point will have no effect and we can leave it as the default Model Initial

Condition. In order to generate the linearized model, select the Linearize button in the above figure,

which is indicated by the green triangle. The Linear Analysis Tool window should now appear as shown

below.

Inspecting the above, the step response of the linearized model was automatically generated. Comparing

this step response to the one generated by the simulation of the open-loop train system in the Introduction:

Simulink Modeling page, you can see that the responses are identical. This makes sense since the

simulation model was already linear. Additionally, the linearization process generated the

object linsys1 shown in the Linear Analysis Workspace above. This LTI object can be exported for use

within MATLAB by simply dragging the object into the MATLAB Workspacewindow.

Having extracted this model, we can now employ all of the facilities that MATLAB offers for controller

design. For example, let us employ the following commands to generate and analyze the closed-loop

system reflecting the Simulink model created above.

sys_cl = feedback(linsys1,1);

pole(sys_cl)

Page 103: Introduction to Control

ans =

-1.5261

0.0000

0.0670 + 1.1977i

0.0670 - 1.1977i

Examination of the above demonstrates that the closed-loop system in its current state has poles with

positive real part and, therefore, is unstable. This agrees with the result of our closed-loop simulation from

above. We can then employ MATLAB to design a new controller. Instead, we will demonstrate how to

access some of MATLAB's functionality from directly within Simulink.

Controller design within Simulink

Rather than performing the controller design in MATLAB, we can also launch interactive tools to tune our

controller from within Simulink. One manner in which this can be done is to double-click on the PID

Controller in the model and select theTune button to launch the PID Tuner GUI. Rather than do this, will

launch the more general Simulink Control Design GUI by selecting Linear Analysis > Compensator

Design from under the Tools menu located at the top of the model window. Following these steps will

open the Control and Estimation Tools Manager window shown below.

Page 104: Introduction to Control

The first thing that needs to be done is to identify the controller block that is to be tuned. This is

accomplished by first clicking on the Select Blocks button, and then selecting the PID Controller block

from the resulting window as shown below. Next click the OK button. Note that controllers represented in

other types of blocks (Transfer Function, State Space, etc.) can also be tuned.

Before we proceed to tune our controller, we must first identify the inputs and outputs of the closed-loop

system we wish to analyze. This is done in the same manner we did when extracting a model into

MATLAB. Specifically, right-click on the velocity command signal (output of the Signal Builder block)

and choose Linearization Points > Input Point from the resulting menu to identify the input of our closed-

loop system. Similarly, right-click on the train engine velocity signal ("x1_dot") and select Linearization

Points > Output Point from the menu to choose the output of our system. Your model should now appear

as follows where the small arrow symbols identify the input and output of the model.

Now that we have identified the block to tune and our input and output signals, we can now commence

with tuning the controller. Select the Tune Blocks button in the Control and Estimation Tools

Page 105: Introduction to Control

Manager window. This will open theDesign Configuration Window shown below which provides some

introduction on how to employ the interactive design tool. In essence, this GUI is the SISO Design

Tool that is available from within MATLAB as well.

Clicking the Next button, we will choose the design plots we wish to employ for designing our controller.

In this example, we will employ a root locus design approach and hence will choose a Plot Type of Root

Locus for Plot 1 as shown below. Since the root locus approach to design employs a plot from the open-

loop system for placing the closed-loop poles, we will leave the choice of Open/Closed Loops as Open

Loop 1 (this is our only choice!).

Page 106: Introduction to Control

Clicking the Next button again will allow us to choose our analysis plots. We use the step response plot to

assess how well we are able to meet our goal of bringing the train up to speed smoothly with minimal

steady-state error to a constant speed command. Therefore, we will choose a Plot Type of Step from the

drop-down menu under Plot 1 as shown below. We will also select Plot 1 under the Plot Contents portion

of the window for the only system that is defined. There is only one system available because we have

defined only a single input and single output for our system.

Selecting the Next Button will then open the SISO Design Tool with a root locus plot and a step response

plot. The root locus plot shown below displays the closed-loop pole locations of the train system plant

under simple proportional control. Examining the plot, one can see that many values of loop gain will place

closed-loop poles in the right-half plane leading to an unstable response.

Page 107: Introduction to Control

If we decrease the loop gain sufficiently, we can move the closed-loop poles into the left-half plane and we

can stabilize our system. This can be accomplished graphically by "grabbing" the pink boxes marking the

closed-loop pole locations and dragging them toward the open-loop pole locations (marked by x's). A loop

gain of approximately 0.1 will stabilize the system. Examining the corresponding step response, which will

change automatically in response to the gain change if theReal-Time Update box is checked in the LTI

Viewer window, you can see that while the response is stable its steady-state error is quite large.

Recall that adding integral control is one way to reduce the steady-state error for a system. In this case,

adding an integrator via the controller will make the system type 1, where type 1 systems can track step

references with zero steady-state error. Recall the following form of a PI controller.

(1)

Therefore, a PI controller will add an integrator and a zero to our open-loop system. The integrator can be

added to the system by right-clicking in the field of the root locus plot and selecting Add Pole/Zero >

Integrator from the resulting menu. Similarly, the zero can be added by right-clicking on the root locus plot

and selecting Add Pole/Zero > Real zerofrom the resulting menu. Then click where along the real axis you

wish to place the zero. We will place the zero just to the right of the plant pole on the real axis. You can

move the zero by clicking on it and dragging it to a new location. Once you have placed the zero, then grab

the pink boxes representing the closed-loop poles and attempt to line the three dominant poles up so that

they have the same real part. There also will be a real closed-loop pole to the left that is "faster" than the

Page 108: Introduction to Control

rest, and a closed-loop pole at the origin that is cancelled by a closed-loop zero at the origin. The resulting

root locus plot is shown below.

The compensator can also be edited by directly typing in pole and zero locations. This can be done by

choosing Edit Compensator from the Design menu located at the top of the SISO Design Task window.

The window that opens is shown below. We will more precisely place the zero at -0.15 and will choose a

loop gain equal to 0.01.

Page 109: Introduction to Control

The resulting closed-loop step response plot is shown below demonstrating that the train engine is brought

to speed smoothly and with zero steady-state error for a constant speed command.

The control gains that have been chosen can then be applied to the Simulink model by clicking the Update

Simulink Block Parameters button under the Compensator Editor tab of the Control and Estimation Tools

Manager window (see above). The simulation can then be run with this newly tuned controller. Clicking on

the Scope block for the train engine's velocity and selecting autoscale will produce a plot like the one

shown below.

Overall this response seems to meet our goals of bringing the train up to speed and to rest smoothly, while

maintaining minimal steady-state error. This response matches the result generated with the SISO Design

Tool above because that analysis and the Simulink model used the exact same linear model.

Page 110: Introduction to Control

Cruise Control: System Modeling

Key MATLAB commands used in this tutorial are: ss , tf

Contents

Physical setup

System equations

System parameters

State-space model

Transfer function model

Physical setup

Automatic cruise control is an excellent example of a feedback control system found in many modern

vehicles. The purpose of the cruise control system is to maintain a constant vehicle speed despite

external disturbances, such as changes in wind or road grade. This is accomplished by measuring the

vehicle speed, comparing it to the desired or reference speed, and automatically adjusting the throttle

according to a control law.

We consider here a simple model of the vehicle dynamics, shown in the free-body diagram (FBD) above.

The vehicle, of mass m, is acted on by a control force, u. The force u represents the force generated at the

road/tire interface. For this simplified model we will assume that we can control this force directly and will

neglect the dynamics of the powertrain, tires, etc., that go into generating the force. The resistive forces,

bv, due to rolling resistance and wind drag, are assumed to vary linearly with the vehicle velocity, v, and

act in the direction opposite the vehicle's motion.

System equations

With these assumptions we are left with a first-order mass-damper system. Summing forces in the x-

direction and applying Newton's 2nd law, we arrive at the following system equation:

(1)

Since we are interested in controlling the speed of the vehicle, the output equation is chosen as follows

(2)

System parameters

Page 111: Introduction to Control

For this example, let's assume that the parameters of the system are:

(m) vehicle mass 1000 kg

(b) damping coefficient 50 N.s/m

State-space model

First-order systems have only has a single energy storage mode, in this case the kinetic energy of the car,

and therefore only one state variable is needed, the velocity. The state-space representation is therefore:

(3)

(4)

We enter this state-space model into MATLAB using the following commands:

m = 1000;

b = 50;

A = -b/m;

B = 1/m;

C = 1;

D = 0;

cruise_ss = ss(A,B,C,D);

Transfer function model

Taking the Laplace transform of the governing differential equation and assuming zero initial conditions,

we find the transfer function of the cruise control system to be:

(5)

We enter the transfer function model into MATLAB using the following commands:

s = tf('s');

P_cruise = 1/(m*s+b);

DC Motor Speed: System Modeling

Key MATLAB commands used in this tutorial are: tf , ss

Contents

Physical setup

System equations

Design requirements

MATLAB representation

Page 112: Introduction to Control

Physical setup

A common actuator in control systems is the DC motor. It directly provides rotary motion and, coupled

with wheels or drums and cables, can provide translational motion. The electric equivalent circuit of the

armature and the free-body diagram of the rotor are shown in the following figure.

For this example, we will assume that the input of the system is the voltage source (V) applied to the

motor's armature, while the output is the rotational speed of the shaft d(theta)/dt. The rotor and shaft are

assumed to be rigid. We further assume a viscous friction model, that is, the friction torque is proportional

to shaft angular velocity.

The physical parameters for our example are:

(J) moment of inertia of the rotor 0.01 kg.m^2

(b) motor viscous friction constant 0.1 N.m.s

(Ke) electromotive force constant 0.01 V/rad/sec

(Kt) motor torque constant 0.01 N.m/Amp

(R) electric resistance 1 Ohm

(L) electric inductance 0.5 H

System equations

In general, the torque generated by a DC motor is proportional to the armature current and the strength of

the magnetic field. In this example we will assume that the magnetic field is constant and, therefore, that

the motor torque is proportional to only the armature current i by a constant factor Kt as shown in the

equation below. This is referred to as an armature-controlled motor.

(1)

The back emf, e, is proportional to the angular velocity of the shaft by a constant factor Ke.

(2)

In SI units, the motor torque and back emf constants are equal, that is, Kt = Ke; therefore, we will use K to

represent both the motor torque constant and the back emf constant.

From the figure above, we can derive the following governing equations based on Newton's 2nd law and

Kirchhoff's voltage law.

Page 113: Introduction to Control

(3)

(4)

1. Transfer Function

Applying the Laplace transform, the above modeling equations can be expressed in terms of the Laplace

variable s.

(5)

(6)

We arrive at the following open-loop transfer function by eliminating I(s) between the two above

equations, where the rotational speed is considered the output and the armature voltage is considered the

input.

(7)

2. State-Space

In state-space form, the governing equations above can be expressed by choosing the rotational speed and

electric current as the state variables. Again the armature voltage is treated as the input and the rotational

speed is chosen as the output.

(8)

(9)

Design requirements

First consider that our uncompensated motor rotates at 0.1 rad/sec in steady state for an input voltage of 1

Volt (this is demonstrated in the DC Motor Speed: System Analysis page where the system's open-loop

response is simulated). Since the most basic requirement of a motor is that it should rotate at the desired

speed, we will require that the steady-state error of the motor speed be less than 1%. Another performance

requirement for our motor is that it must accelerate to its steady-state speed as soon as it turns on. In this

case, we want it to have a settling time less than 2 seconds. Also, since a speed faster than the reference

may damage the equipment, we want to have a step response with overshoot of less than 5%.

In summary, for a unit step command in motor speed, the control system's output should meet the

following requirements.

Settling time less than 2 seconds

Overshoot less than 5%

Page 114: Introduction to Control

Steady-state error less than 1%

MATLAB representation

1. Transfer Function

We can represent the above open-loop transfer function of the motor in MATLAB by defining the

parameters and transfer function as follows. Running this code in the command window produces the

output shown below.

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)

P_motor =

0.01

---------------------------

0.005 s^2 + 0.06 s + 0.1001

Continuous-time transfer function.

2. State Space

We can also represent the system using the state-space equations. The following additional MATLAB

commands create a state-space model of the motor and produce the output shown below when run in the

MATLAB command window.

A = [-b/J K/J

-K/L -R/L];

B = [0

1/L];

C = [1 0];

D = 0;

motor_ss = ss(A,B,C,D)

motor_ss =

a =

x1 x2

x1 -10 1

x2 -0.02 -2

Page 115: Introduction to Control

b =

u1

x1 0

x2 2

c =

x1 x2

y1 1 0

d =

u1

y1 0

Continuous-time state-space model.

The above state-space model can also be generated by converting your existing transfer function model

into state-space form. This is again accomplished with the ss command as shown below.

motor_ss = ss(P_motor);

DC Motor Position: System Modeling

Key MATLAB commands used in this tutorial are: tf , ss

Contents

Physical setup

System equations

Design requirements

MATLAB representation

Physical setup

A common actuator in control systems is the DC motor. It directly provides rotary motion and, coupled

with wheels or drums and cables, can provide translational motion. The electric equivalent circuit of the

armature and the free-body diagram of the rotor are shown in the following figure.

Page 116: Introduction to Control

For this example, we will assume the following values for the physical parameters. These values were

derived by experiment from an actual motor in Carnegie Mellon's undergraduate controls lab.

(J) moment of inertia of the rotor 3.2284E-6 kg.m^2

(b) motor viscous friction constant 3.5077E-6 N.m.s

(Kb) electromotive force constant 0.0274 V/rad/sec

(Kt) motor torque constant 0.0274 N.m/Amp

(R) electric resistance 4 Ohm

(L) electric inductance 2.75E-6H

In this example, we assume that the input of the system is the voltage source (V) applied to the motor's

armature, while the output is the position of the shaft (theta). The rotor and shaft are assumed to be rigid.

We further assume a viscous friction model, that is, the friction torque is proportional to shaft angular

velocity.

System equations

In general, the torque generated by a DC motor is proportional to the armature current and the strength of

the magnetic field. In this example we will assume that the magnetic field is constant and, therefore, that

the motor torque is proportional to only the armature current i by a constant factor Kt as shown in the

equation below. This is referred to as an armature-controlled motor.

(1)

The back emf, e, is proportional to the angular velocity of the shaft by a constant factor Kb.

(2)

In SI units, the motor torque and back emf constants are equal, that is, Kt = Ke; therefore, we will use K to

represent both the motor torque constant and the back emf constant.

From the figure above, we can derive the following governing equations based on Newton's 2nd law and

Kirchhoff's voltage law.

(3)

(4)

1. Transfer Function

Applying the Laplace transform, the above modeling equations can be expressed in terms of the Laplace

variable s.

(5)

(6)

Page 117: Introduction to Control

We arrive at the following open-loop transfer function by eliminating I(s) between the two above

equations, where the rotational speed is considered the output and the armature voltage is considered the

input.

(7)

However, during this example we will be looking at the position as the output. We can obtain the position

by integrating the speed, therefore, we just need to divide the above transfer function by s.

(8)

2. State-Space

The differential equations from above can also be expressed in state-space form by choosing the motor

position, motor speed and armature current as the state variables. Again the armature voltage is treated as

the input and the rotational position is chosen as the output.

(9)

(10)

Design requirements

We will want to be able to position the motor very precisely, thus the steady-state error of the motor

position should be zero when given a commanded position. We will also want the steady-state error due to

a constant disturbance to be zero as well. The other performance requirement is that the motor reaches its

final position very quickly without excessive overshoot. In this case, we want the system to have a settling

time of 40 ms and an overshoot smaller than 16%.

If we simulate the reference input by a unit step input, then the motor position output should have:

Settling time less than 40 milliseconds

Overshoot less than 16%

No steady-state error, even in the presence of a step disturbance input

MATLAB representation

1. Transfer Function

Page 118: Introduction to Control

We can represent the above open-loop transfer function of the motor in MATLAB by defining the

parameters and transfer function as follows. Running this code in the command window produces the

output shown below.

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

s = tf('s');

P_motor = K/(s*((J*s+b)*(L*s+R)+K^2))

P_motor =

0.0274

-------------------------------------------

8.878e-12 s^3 + 1.291e-05 s^2 + 0.0007648 s

Continuous-time transfer function.

2. State Space

We can also represent the system using the state-space equations. The following additional MATLAB

commands create a state-space model of the motor and produce the output shown below when run in the

MATLAB command window.

A = [0 1 0

0 -b/J K/J

0 -K/L -R/L];

B = [0 ; 0 ; 1/L];

C = [1 0 0];

D = [0];

motor_ss = ss(A,B,C,D)

motor_ss =

a =

x1 x2 x3

x1 0 1 0

x2 0 -1.087 8487

x3 0 -9964 -1.455e+06

b =

u1

x1 0

x2 0

x3 3.636e+05

Page 119: Introduction to Control

c =

x1 x2 x3

y1 1 0 0

d =

u1

y1 0

Continuous-time state-space model.

The above state-space model can also be generated by converting your existing transfer function model

into state-space form. This is again accomplished with the ss command as shown below.

motor_ss = ss(P_motor);

Suspension: System Modeling

Key MATLAB commands used in this tutorial are: ss , step

Contents

Physical setup

System parameters

Equations of motion

Transfer function models

Entering equations in MATLAB

Physical setup

Designing an automotive suspension system is an interesting and challenging control problem. When the

suspension system is designed, a 1/4 model (one of the four wheels) is used to simplify the problem to a

1D multiple spring-damper system. A diagram of this system is shown below. This model is for an active

suspension system where an actuator is included that is able to generate the control force U to control the

motion of the bus body.

Page 120: Introduction to Control

System parameters

(M1) 1/4 bus body mass 2500 kg

(M2) suspension mass 320 kg

(K1) spring constant of suspension system 80,000 N/m

(K2) spring constant of wheel and tire 500,000 N/m

(b1) damping constant of suspension system 350 N.s/m

(b2) damping constant of wheel and tire 15,020 N.s/m

(U) control force

Equations of motion

From the picture above and Newton's law, we can obtain the dynamic equations as the following:

(1)

(2)

Transfer function models

Assume that all of the initial conditions are zero, so that these equations represent the situation where the

vehicle wheel goes up a bump. The dynamic equations above can be expressed in the form of transfer

functions by taking the Laplace Transform. The specific derivation from the above equations to the transfer

functions G1(s) and G2(s) is shown below where each transfer function has an output of, X1-X2, and

inputs of U and W, respectively.

(3)

(4)

Page 121: Introduction to Control

(5)

(6)

(7)

or

(8)

Find the inverse of matrix A and then multiply with inputs U(s)and W(s) on the righthand side as follows:

(9)

(10)

When we want to consider the control input U(s) only, we set W(s) = 0. Thus we get the transfer function

G1(s) as in the following:

(11)

When we want to consider the disturbance input W(s) only, we set U(s) = 0. Thus we get the transfer

function G2(s) as in the following:

(12)

Entering equations in MATLAB

We can generate the above transfer function models in MATLAB by entering the following commands in

the MATLAB command window.

M1 = 2500;

M2 = 320;

K1 = 80000;

K2 = 500000;

b1 = 350;

b2 = 15020;

s = tf('s');

G1 = ((M1+M2)*s^2+b2*s+K2)/((M1*s^2+b1*s+K1)*(M2*s^2+(b1+b2)*s+(K1+K2))-(b1*s+K1)*(b1*s+K1));

G2 = (-M1*b2*s^3-M1*K2*s^2)/((M1*s^2+b1*s+K1)*(M2*s^2+(b1+b2)*s+(K1+K2))-(b1*s+K1)*(b1*s+K1));

Page 122: Introduction to Control

Inverted Pendulum: System Modeling

Key MATLAB commands used in this tutorial are: tf , ss , set

Contents

Problem setup and design requirements

Force analysis and system equations

MATLAB representation

Problem setup and design requirements

The system in this example consists of an inverted pendulum mounted to a motorized cart. The inverted

pendulum system is an example commonly found in control system textbooks and research literature. Its

popularity derives in part from the fact that it is unstable without control, that is, the pendulum will simply

fall over if the cart isn't moved to balance it. Additionally, the dynamics of the system are nonlinear. The

objective of the control system is to balance the inverted pendulum by applying a force to the cart that the

pendulum is attached to. A real-world example that relates directly to this inverted pendulum system is the

attitude control of a booster rocket at takeoff.

In this case we will consider a two-dimensional problem where the pendulum is contrained to move in the

vertical plane shown in the figure below. For this system, the control input is the force that moves the

cart horizontally and the outputs are the angular position of the pendulum and the horizontal position of

the cart .

For this example, let's assume the following quantities:

(M) mass of the cart 0.5 kg

(m) mass of the pendulum 0.2 kg

(b) coefficient of friction for cart 0.1 N/m/sec

(l) length to pendulum center of mass 0.3 m

Page 123: Introduction to Control

(I) mass moment of inertia of the pendulum 0.006 kg.m^2

(F) force applied to the cart

(x) cart position coordinate

(theta) pendulum angle from vertical (down)

For the PID, root locus, and frequency response sections of this problem, we will be interested only in the

control of the pendulum's position. This is because the techniques used in these sections are best-suited for

single-input, single-output (SISO) systems. Therefore, none of the design criteria deal with the cart's

position. We will, however, investigate the controller's effect on the cart's position after the controller has

been designed. For these sections, we will design a controller to restore the pendulum to a vertically

upward position after it has experienced an impulsive "bump" to the cart. Specifically, the design criteria

are that the pendulum return to its upright position within 5 seconds and that the pendulum never move

more than 0.05 radians away from vertical after being disturbed by an impulse of magnitude 1 Nsec. The

pendulum will initially begin in the vertically upward equilibrium, = .

In summary, the design requirements for this system are:

Settling time for of less than 5 seconds

Pendulum angle never more than 0.05 radians from the vertical

Employing state-space design techniques, we are more readily able to address a multi-output system. In our

case, the inverted pendulum system is single-input, multi-output (SIMO). Therefore, for the state-space

section of the Inverted Pendulum example, we will attempt to control both the pendulum's angle and the

cart's position. To make the design more challenging in this section, we will command a 0.2-meter step in

the cart's desired position. Under these conditions, it is desired that the cart achieve its commanded

position within 5 seconds and have a rise time under 0.5 seconds. It is also desired that the pendulum settle

to its vertical position in under 5 seconds, and further, that the pendulum angle not travel more than 20

degrees (0.35 radians) way from the vertically upward position.

In summary, the design requirements for the inverted pendulum state-space example are:

Settling time for and of less than 5 seconds

Rise time for of less than 0.5 seconds

Pendulum angle never more than 20 degrees (0.35 radians) from the vertical

Steady-state error of less than 2% for and

Force analysis and system equations

Below are the free-body diagrams of the two elements of the inverted pendulum system.

Page 124: Introduction to Control

Summing the forces in the free-body diagram of the cart in the horizontal direction, you get the following

equation of motion.

(1)

Note that you can also sum the forces in the vertical direction for the cart, but no useful information would

be gained.

Summing the forces in the free-body diagram of the pendulum in the horizontal direction, you get the

following expression for the reaction force .

(2)

If you substitute this equation into the first equation, you get one of the two governing equations for this

system.

(3)

To get the second equation of motion for this system, sum the forces perpendicular to the pendulum.

Solving the system along this axis greatly simplifies the mathematics. You should get the following

equation.

(4)

To get rid of the and terms in the equation above, sum the moments about the centroid of the

pendulum to get the following equation.

(5)

Combining these last two expressions, you get the second governing equation.

(6)

Page 125: Introduction to Control

Since the analysis and control design techniques we will be employing in this example apply only to linear

systems, this set of equations needs to be linearized. Specifically, we will linearize the equat ions about the

vertically upward equillibrium position, = , and will assume that the system stays within a small

neighborhood of this equillbrium. This assumption should be reasonably valid since under control we

desire that the pendulum not deviate more than 20 degrees from the vertically upward position.

Let represent the deviation of the pedulum's position from equilibrium, that is, = + . Again

presuming a small deviation ( ) from equilibrium, we can use the following small angle approximations of

the nonlinear functions in our system equations:

(7)

(8)

(9)

After substiting the above approximations into our nonlinear governing equations, we arrive at the two

linearized equations of motion. Note has been substituted for the input .

(10)

(11)

1. Transfer Function

To obtain the transfer functions of the linearized system equations, we must first take the Laplace

transform of the system equations assuming zero initial conditions. The resulting Laplace transforms are

shown below.

(12)

(13)

Recall that a transfer function represents the relationship between a single input and a single output at a

time. To find our first transfer function for the output and an input of we need to

eliminate from the above equations. Solve the first equation for .

(14)

Then substitute the above into the second equation.

(15)

Rearranging, the transfer function is then the following

(16)

where,

Page 126: Introduction to Control

(17)

From the transfer function above it can be seen that there is both a pole and a zero at the origin. These can

be canceled and the transfer function becomes the following.

(18)

Second, the transfer function with the cart position as the output can be derived in a similar manner to

arrive at the following.

(19)

2. State-Space

The linearized equations of motion from above can also be represented in state-space form if they are

rearranged into a series of first order differential equations. Since the equations are linear, they can then be

put into the standard matrix form shown below.

(20)

(21)

The matrix has 2 rows because both the cart's position and the pendulum's position are part of the output.

Specifically, the cart's position is the first element of the output and the pendulum's deviation from its

equilibrium position is the second element of .

MATLAB representation

1. Transfer Function

We can represent the transfer functions derived above for the inverted pendulum system within MATLAB

employing the following commands. Note that you can give names to the outputs (and inputs) to

differentiate between the cart's position and the pendulum's position. Running this code in the command

window produces the output shown below.

M = 0.5;

m = 0.2;

b = 0.1;

I = 0.006;

Page 127: Introduction to Control

g = 9.8;

l = 0.3;

q = (M+m)*(I+m*l^2)-(m*l)^2;

s = tf('s');

P_cart = (((I+m*l^2)/q)*s^2 - (m*g*l/q))/(s^4 + (b*(I + m*l^2))*s^3/q -

((M + m)*m*g*l)*s^2/q - b*m*g*l*s/q);

P_pend = (m*l*s/q)/(s^3 + (b*(I + m*l^2))*s^2/q - ((M + m)*m*g*l)*s/q -

b*m*g*l/q);

sys_tf = [P_cart ; P_pend];

inputs = {'u'};

outputs = {'x'; 'phi'};

set(sys_tf,'InputName',inputs)

set(sys_tf,'OutputName',outputs)

sys_tf

sys_tf =

From input "u" to output...

4.182e-06 s^2 - 0.0001025

x: ---------------------------------------------------------

2.3e-06 s^4 + 4.182e-07 s^3 - 7.172e-05 s^2 - 1.025e-05 s

1.045e-05 s

phi: -----------------------------------------------------

2.3e-06 s^3 + 4.182e-07 s^2 - 7.172e-05 s - 1.025e-05

Page 128: Introduction to Control

Continuous-time transfer function.

2. State-Space

We can also represent the system using the state-space equations. The following additional MATLAB

commands create a state-space model of the inverted pendulum and produce the output shown below when

run in the MATLAB command window. Again note that the names of the inputs, outputs, and states can be

specified to make the model easier to understand.

M = .5;

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

p = I*(M+m)+M*m*l^2; %denominator for the A and B matrices

A = [0 1 0 0;

0 -(I+m*l^2)*b/p (m^2*g*l^2)/p 0;

0 0 0 1;

0 -(m*l*b)/p m*g*l*(M+m)/p 0];

B = [ 0;

(I+m*l^2)/p;

0;

m*l/p];

C = [1 0 0 0;

0 0 1 0];

D = [0;

0];

states = {'x' 'x_dot' 'phi' 'phi_dot'};

Page 129: Introduction to Control

inputs = {'u'};

outputs = {'x'; 'phi'};

sys_ss =

ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs)

sys_ss =

a =

x x_dot phi phi_dot

x 0 1 0 0

x_dot 0 -0.1818 2.673 0

phi 0 0 0 1

phi_dot 0 -0.4545 31.18 0

b =

u

x 0

x_dot 1.818

phi 0

phi_dot 4.545

c =

x x_dot phi phi_dot

x 1 0 0 0

phi 0 0 1 0

d =

u

x 0

phi 0

Page 130: Introduction to Control

Continuous-time state-space model.

The above state-space model can also be converted into transfer function form employing the tf command

as shown below. Conversely, the transfer function model can be converted into state-space form using

the ss command.

sys_tf = tf(sys_ss)

sys_tf =

From input "u" to output...

1.818 s^2 - 44.55

x: --------------------------------------

s^4 + 0.1818 s^3 - 31.18 s^2 - 4.455 s

4.545 s + 2.539e-16

phi: ----------------------------------

s^3 + 0.1818 s^2 - 31.18 s - 4.455

Continuous-time transfer function.

Examining the above, note the existance of some terms with very small coefficients. These terms should

actually be zero and show up due to numerical round-off errors that accumulate in the conversion

algorithms that MATLAB employs. If you set these coefficients to zero, then the above transfer function

models will match those generated earlier in the Transfer Function section of the example.

Cruise Control: System Analysis

Key MATLAB commands used in this tutorial are: ss , step

Contents

System model and parameters

Performance specifications

Open-loop step response

Open-loop poles/zeros

Page 131: Introduction to Control

Open-loop Bode plot

System model and parameters

The transfer function model for the cruise control problem is given below. Please see the Cruise Control:

System Modeling page for the derivation.

(1)

The parameters used in this example are as follows:

(m) vehicle mass 1000 kg

(b) damping coefficient 50 N.s/m

(u) nominal control force 500 N

Performance specifications

The next step is to come up with some design criteria that the compensated system should achieve. When

the engine gives a 500 Newton force, the car will reach a maximum velocity of 10 m/s (22 mph), see open-

loop step response section below. An automobile should be able to accelerate up to that speed in less than 5

seconds. In this application, a 10% overshoot and 2% steady-state error on the velocity are sufficient.

Keeping the above in mind, we have proposed the following design criteria for this problem:

Rise time < 5 s

Overshoot < 10%

Steady-state error < 2%

Open-loop step response

The open-loop response of the system, without any feedback control, to a step input force of 500 Newtons

is simulated in MATLAB as follows:

m = 1000;

b = 50;

u = 500;

s = tf('s');

P_cruise = 1/(m*s+b);

step(u*P_cruise)

Page 132: Introduction to Control

We see that the open-loop system exhibits no overshoot or oscillations (characteristic of first-order

systems), and does reach the desired steady-state speed of 10 m/s; however, the rise time is much too slow,

~60 s. Therefore we need to design a feedback controller which speeds up the response significantly

without negatively affecting the other dynamic performance metrics.

Open-loop poles/zeros

The cruise control system has a single pole at s = -b/m which we can see plotted on the s-plane using the

following MATLAB commands:

pzmap(P_cruise)

axis([-1 1 -1 1])

Page 133: Introduction to Control

We observe that the open-loop system is stable and does not oscillate since the pole is real and negative.

Furthermore, the speed of response is determined by the magnitude of this pole, b/m: the larger the

magnitude, the quicker the system approaches the steady-state value. Since we're typically not able to

change the system parameters to change the dynamic response of the system, we must instead design

controllers which alter the poles and zeros of the closed-loop system to meet the desired performance

specifications.

Open-loop Bode plot

We are also interested in the open-loop frequency response of the system which we find using the

following MATLAB command:

bode(P_cruise)

Page 134: Introduction to Control

We see that the Bode plots exhibit the definitive features of first-order systems, including a -3 dB

magnitude and -45 deg phase at the corner frequency of w = b/m = 0.05 rad/s and -20 dB/dec roll-off at

high frequencies.

DC Motor Speed: System Analysis

Key MATLAB commands used in this tutorial are: tf , ltiview

Contents

Open-loop response

LTI model characteristics

Response to other types of inputs

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)

Page 135: Introduction to Control

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%

Open-loop response

First create a new m-file and type in the following commands (refer to the main problem for the details of

getting these 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);

Now let's see how the original open-loop system performs. Add the following ltiview command onto

the end of the m-file and run it in the MATLAB command window. The string 'step' passed to the

function specifies to generate a unit step response plot for the system P_motor. The range of

numbers 0:0.1:5 specify that the step response plot should include data points for times from 0 to 5

seconds in steps of 0.1 seconds. The resulting plot is shown in the figure below, where you can view some

of the system's characteristics by right clicking on the figure and choosing from theCharacteristics menu

such performance aspects as Settling Time and Steady State.

ltiview('step', P_motor, 0:0.1:5);

Page 136: Introduction to Control

From the plot we see that when 1 Volt is applied to the system the motor can only achieve a maximum

speed of 0.1 rad/sec, ten times smaller than our desired speed. Also, it takes the motor 2.07 seconds to

reach its steady-state speed; this does not satisfy our 2 second settling time criterion.

LTI model characteristics

Since our open-loop transfer function has the form of a canonical second-order system, we should be able

to accurately predict the step response characteristics observed above based on the transfer function's pole

locations. You can graphically see the location of the poles (and zeros) of theP_motor system from

within the LTI Viewer by right-clicking on the plot area and selecting Plot Types > Pole/Zero from the

resulting menu. Performing this action will change the LTI Viewer to the following map where the blue x's

identify the locations of poles.

Page 137: Introduction to Control

From the above you can see that the open-loop transfer function has two real poles, one at s = -2 and one

at s = -10. Since both poles are real, there is no oscillation in the step response (or overshoot) as we have

already seen. Futhermore, since the one pole is 5 times more negative than the other, the slower of the two

poles will dominate the dynamics. That is, the pole at s = -2 primarily determines the speed of response of

the system and the system behaves similarly to a first-order system.

Let's see just how closely a first-order model approximates our original motor model. Enter the following

command at the MATLAB command line to build a first-order transfer function with pole at s = -2 and

steady-state value matching the original transfer function.

rP_motor = 0.1/(0.5*s+1)

rP_motor =

0.1

---------

0.5 s + 1

Page 138: Introduction to Control

Continuous-time transfer function.

We can then import this new model into the LTI Viewer. This is accomplished by selecting Import from

the File menu at the top of the LTI Viewerwindow. From the resulting window choose rP_motor from

the Systems in Workspace area and then click the OK button. The LTI Viewer will now show plots of both

the original and the reduced transfer functions. You can then switch back to step response plots by again

choosing Plot Types from the right-click menu. You can remove the plot annotations by right-clicking on

the plot and using the Characteristics submenu. You can also add a legend by clicking the legend icon on

the toolbar. Now the LTI Viewer should appear as shown below.

From the above, we can see that a first-order approximation of our motor system is relatively accurate. The

primary difference can be seen at t = 0 where a second order system will have a derivative of zero, but our

first-order model will not.

With a first-order system, the settling time is equal to

Page 139: Introduction to Control

(4)

where tau is the time constant which in this case is 0.5. Therefore, our first-order model has a settling time

of 2 seconds which is close to the 2.07 seconds of our actual system. Throughout the rest of the pages of

this example, different controllers will be designed to reduce the steady-state error significantly and the

settling time slightly while still meeting the given overshoot requirement.

Response to other types of inputs

While the requirements for this example are given in terms of the system's step response, it is likely that

the system will in practice be subject to other types of inputs. Even so, a system's step response can give

insight into how the system will respond to other types of signals. In order to determine the system's

specific response to other types of inputs, you can employ Simulink or the MATLAB command lsim.

Furthermore, you can simulate the system's response to other types of inputs straight from the LTI Viewer.

This is accomplished by right-clicking on the displayed plots and choosing Plot Types > Linear

Simulation. The following window will then appear.

Page 140: Introduction to Control

Within this window set the End time (sec) to "5" and the Interval (sec) to "0.1". Then under the System

inputs section of the window, you can import an input signal, or design one from a select set of choices. In

this instance, click the Design signal button and choose a Signal type of Sine wave from within the

window that appears. Then change the Frequency (Hz) to "0.2" and leave the Amplitude and Duration

(secs) as their default values. Then click the Insert button at the bottom of the Signal Designer window and

the Simulate button at the bottom of the Linear Simulation Tool window. The responses of our two

currently identified systems to the sine wave input are then produced in the LTI Viewer window. If you

double-click on the y-axis of the plot, you can then change the limits to match the figure shown below.

DC Motor Position: System Analysis

Key MATLAB commands used in this tutorial

are: tf , step , isstable , pole , feedback , pzmap , damp

Contents

Open-loop response

Closed-loop response

Page 141: Introduction to Control

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)

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

Position: System Modeling page.

For a 1-radian step reference, the design criteria are given are the following.

Settling time less than 0.040 seconds

Overshoot less than 16%

No steady-state error, even in the presence of a step disturbance input

Open-loop response

First create a new m-file and type in the following commands (refer to the main problem for the details of

getting these commands).

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

s = tf('s');

P_motor = K/(s*((J*s+b)*(L*s+R)+K^2));

Now let's see how the uncompensated open-loop system performs. Specifically, we will use the MATLAB

command step to analyze the open-loop step response. Add the following commands onto the end of the

m-file and run it in the MATLAB command window and you will get the associated plot shown below.

t = 0:0.001:0.2;

step(P_motor,t)

Page 142: Introduction to Control

From the above plot, we can see that when 1 volt is applied to the system the motor position grows

unbounded. This is obviously at odds with the given requirements, in particular, that there be no steady-

state error. The open-loop response of the system is not even stable. Stability of a system can be verified

with the MATLAB command isstable where a returned value of TRUE (1) indicates that the system is

stable and a returned value of FALSE (0) indicates that the system is not stable.

isstable(P_motor)

ans =

0

Stability of the system can also be determined from the poles of the transfer function where the poles can

be identified using the MATLAB command poleas shown below.

pole(P_motor)

ans =

1.0e+06 *

0

-1.4545

-0.0001

Page 143: Introduction to Control

As indicated by this function, one of the poles of the open-loop transfer function is on the imaginary axis

while the other two poles are in the left half of the complex s-plane. A pole on the imaginary axis indicates

that the free response of the system will not grow unbounded, but also will not decay to zero. Even though

the free response will not grow unbounded, a system with a pole on the imaginary axis can grow

unbounded when given an input, even when the input is bounded. This fact is in agreement with what we

have already seen. In this particular case, the pole at the origin behaves like an integrator. Therefore, when

the system is given a step input its output continues to grow to infinity in the same manner that an integral

of a constant would grow to infinity as the upper limit of the integral is made larger.

Closed-loop response

Let's now consider the closed-loop response of the system where the system schematic has the following

structure.

The closed-loop transfer function for the above with the controller C(s) simply set equal to 1 can be

generated using the MATLAB command feedbackas shown below.

sys_cl = feedback(P_motor,1)

sys_cl =

0.0274

----------------------------------------------------

8.878e-12 s^3 + 1.291e-05 s^2 + 0.0007648 s + 0.0274

Continuous-time transfer function.

Page 144: Introduction to Control

The corresponding unit step response can be generated by adding the above and following command to

your m-file. The annotations for the peak response, settling time, and final value can be added to the plot

from the right-click menu under Characteristics.

step(sys_cl,t)

Examining the above closed-loop step response, the addition of feedback has stabilized the system. In fact,

the steady-state error appears to be driven to zero and the overshoot is less than 16%, though the settle time

requirement is not met. The character of the resulting step response is again indicated by the location of the

poles of the system's transfer function just like the system's stability properties were. The MATLAB

command pzmap will plot the poles (and zeros) of a given transfer function as shown below.

pzmap(sys_cl)

Page 145: Introduction to Control

The above plot shows that the closed-loop system has one real pole at -1.45e6 and a pair of complex poles

at -29.6+35.3j and -29.6-35.3j as indicated by the locations of the blue x's. The damping and natural

frequencies associated with these poles can be determined by right-clicking on the associated poles in the

resulting plot. This information can also be determined using the MATLAB command damp as shown

below.

damp(sys_cl)

Eigenvalue Damping Frequency

-2.96e+01 + 3.53e+01i 6.43e-01 4.61e+01

-2.96e+01 - 3.53e+01i 6.43e-01 4.61e+01

-1.45e+06 1.00e+00 1.45e+06

(Frequencies expressed in rad/seconds)

Page 146: Introduction to Control

Since the one real pole is so much faster than the complex conjugate poles (its real part is much more

negative) its effect on the dynamic response of the system will be mimimal. Therefore, the damping (zeta =

0.643) and the natural frequency (Wn = 46.1) of the complex conjugate poles will primarily indicate the

response of the closed-loop system.

Adding the following commands to your m-file will calculate the overshoot and 2% settle time predicted

by these poles assuming that they dominate, in other words, that we have a canonical underdamped

second-order system.

[Wn,zeta,poles] = damp(sys_cl);

OS = exp((-zeta(1)*pi)/sqrt(1-zeta(1)^2))

Ts = 4/(zeta(1)*Wn(1))

OS =

0.0716

Ts =

0.1351

The above results closely match the overshoot and settle time from the step response plot above which

explicitly captured the effect of the third, non-dominant pole.

Throughout the rest of the pages of this example, different controllers will be designed to reduce the settle

time of the closed-loop step response to meet the given 40 millisecond requirement while still meeting the

other system requirements, including the zero steady-state error in the presence of a step disturbance.

Suspension: System Analysis

Key MATLAB commands used in this tutorial are: ss , step

Contents

System model

System parameters

Design requirements

Open-loop step response

System model

The state-space and transfer function models of the bus suspension problem were derived in

the Suspension: System Modeling page.

System parameters

(M1) 1/4 bus body mass 2500 kg

(M2) suspension mass 320 kg

Page 147: Introduction to Control

(K1) spring constant of suspension system 80,000 N/m

(K2) spring constant of wheel and tire 500,000 N/m

(b1) damping constant of suspension system 350 N.s/m

(b2) damping constant of wheel and tire 15,020 N.s/m

(U) control force

Design requirements

A good bus suspension system should have satisfactory road holding ability, while still providing comfort

when riding over bumps and holes in the road. When the bus is experiencing any road disturbance (i.e. pot

holes, cracks, and uneven pavement),the bus body should not have large oscillations, and the oscillations

should dissipate quickly. Since the distance X1-W is very difficult to measure, and the deformation of the

tire (X2-W) is negligible, we will use the distance X1-X2 instead of X1-W as the output in our problem.

Keep in mind that this is an estimation.

The road disturbance (W) in this problem will be simulated by a step input. This step could represent the

bus coming out of a pothole. We want to design a feedback controller so that the output (X1-X2) has an

overshoot less than 5% and a settling time shorter than 5 seconds. For example, when the bus runs onto a

10 cm high step, the bus body will oscillate within a range of +/- 5 mm and return to a smooth ride within 5

seconds.

Open-loop step response

We can use MATLAB to display how the original open-loop system performs (without any feedback

control). Add the following commands into the m-file and run it in the MATLAB command window to see

the response of unit step actuated force input, U(s). Note that the step command will generate the unit step

inputs for each input.

M1 = 2500;

M2 = 320;

K1 = 80000;

K2 = 500000;

b1 = 350;

b2 = 15020;

s = tf('s');

G1 =

((M1+M2)*s^2+b2*s+K2)/((M1*s^2+b1*s+K1)*(M2*s^2+(b1+b2)*s+(K1+K2))-

(b1*s+K1)*(b1*s+K1));

Page 148: Introduction to Control

step(G1)

From this graph of the open-loop response for a unit step actuated force, we can see that the system is

under-damped. People sitting in the bus will feel very small amount of oscillation. Moreover, the bus takes

an unacceptably long time to reach the steady state (the settling time is very large). Now enter the

following commands to see the response for a step disturbance input, W(s), with magnitude 0.1 m.

G2 = (-M1*b2*s^3-

M1*K2*s^2)/((M1*s^2+b1*s+K1)*(M2*s^2+(b1+b2)*s+(K1+K2))-

(b1*s+K1)*(b1*s+K1));

step(0.1*G2)

Page 149: Introduction to Control

From this graph of the open-loop response for 10 cm step disturbance, we can see that when the bus passes

a 10 cm high bump on the road, the bus body will oscillate for an unacceptably long time(~50 seconds)

with an initial amplitude of 8 cm. People sitting in the bus will not be comfortable with such an oscillation

due to the large overshoot and long settling time.

The solution to these problems is to add a feedback controller into the system to improve the performance.

The schematic of the closed-loop system is the following, which will be discussed in much more detail in

the controller design sections.

Page 150: Introduction to Control

Published with MATLAB® 7.14

Inverted Pendulum: System Analysis

Key MATLAB commands used in this tutorial are: tf , ss , zpkdata , impulse , lsim

Contents

Open-loop impulse response

Open-loop step response

From the main problem, we derived the open-loop transfer functions of the inverted pendulum system as

the following.

(1)

(2)

where

(3)

Recall that the above two transfer functions are valid only for small values of the angle phi where is the

deviation of the pendulum from the vertically upward position. Also, the absolute pendulum angle is

equal to + .

For the original problem setup and the derivation of the above transfer functions, please refer to

the Inverted Pendulum: System Modeling page.

Considering the response of the pendulum to a 1-Nsec impulse applied to the cart, the design requirements

for the pendulum are:

Settling time for of less than 5 seconds

Pendulum angle never more than 0.05 radians from the vertical

Additionally, the requirements for the response of the system to a 0.2-meter step command in cart position

are:

Settling time for and of less than 5 seconds

Rise time for of less than 0.5 seconds

Pendulum angle never more than 20 degrees (0.35 radians) from the vertical

Open-loop impulse response

Page 151: Introduction to Control

We will begin by looking at the open-loop response of the inverted pendulum system. Create a new m-

file and type in the following commands to create the system model (refer to the main problem for the

details of getting these commands).

M = 0.5;

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

q = (M+m)*(I+m*l^2)-(m*l)^2;

s = tf('s');

P_cart = (((I+m*l^2)/q)*s^2 - (m*g*l/q))/(s^4 + (b*(I + m*l^2))*s^3/q -

((M + m)*m*g*l)*s^2/q - b*m*g*l*s/q);

P_pend = (m*l*s/q)/(s^3 + (b*(I + m*l^2))*s^2/q - ((M + m)*m*g*l)*s/q -

b*m*g*l/q);

sys_tf = [P_cart ; P_pend];

inputs = {'u'};

outputs = {'x'; 'phi'};

set(sys_tf,'InputName',inputs)

set(sys_tf,'OutputName',outputs)

We can now examine the open-loop impulse response of the system. Specifically, we will examine how the

system responds to an impulsive force applied to the cart employing the MATLAB command impulse.

Add the following commands onto the end of the m-file and run it in the MATLAB command window to

get the associated plot shown below.

t=0:0.01:1;

impulse(sys_tf,t);

title('Open-Loop Impulse Response')

Page 152: Introduction to Control

As you can see from the plot, the system response is entirely unsatisfactory. In fact, it is not stable in open

loop. Although the pendulum's position is shown to increase past 100 radians (15 revolutions), the model is

only valid for small . You can also see that the cart's position moves infinitely far to the right, though

there is no requirement on cart position for an impulsive force input.

The poles of a system can also tell us about its time response. Since our system has two outputs and one

input, it is described by two transfer functions. In general, all transfer functions from each input to each

output of a multi-input, multi-output (MIMO) system will have the same poles (but different zeros) unless

there are pole-zero cancellations. We will specifically examine the poles and zeros of the system using the

MATLAB function zpkdata. The parameter 'v' shown below returns the poles and zeros as column

vectors rather than as cell arrays.

The zeros and poles of the system where the pendulum position is the output are found as shown below:

[zeros poles] = zpkdata(P_pend,'v')

zeros =

0

poles =

5.5651

-5.6041

Page 153: Introduction to Control

-0.1428

Likewise, the zeros and poles of the system where the cart position is the output are found as follows:

[zeros poles] = zpkdata(P_cart,'v')

zeros =

4.9497

-4.9497

poles =

0

5.5651

-5.6041

-0.1428

As predicted, the poles for both transfer functions are identical. The pole at 5.5651 indicates that the

system is unstable since the pole has positive real part. In other words, the pole is in the right half of the

complex s-plane. This agrees with what we observed above.

Open-loop step response

Since the system has a pole with positive real part its response to a step input will also grow unbounded.

We will verify this using the lsim command which can be employed to simulate the response of LTI

models to arbitrary inputs. In this case, a 1-Newton step input will be used. Adding the following code to

your m-file and running it in the MATLAB command window will generate the plot shown below.

t = 0:0.05:10;

u = ones(size(t));

[y,t] = lsim(sys_tf,u,t);

plot(t,y)

title('Open-Loop Step Response')

axis([0 3 0 50])

legend('x','phi')

Page 154: Introduction to Control

You can also identify some important characteristics of the response using the lsiminfo command as

shown.

step_info = lsiminfo(y,t);

cart_info = step_info(1)

pend_info = step_info(2)

cart_info =

SettlingTime: 9.9959

Min: 0

MinTime: 0

Max: 8.7918e+21

MaxTime: 10

pend_info =

SettlingTime: 9.9959

Min: 0

MinTime: 0

Page 155: Introduction to Control

Max: 1.0520e+23

MaxTime: 10

The above results confirm our expectation that the system's response to a step input is unstable.

It is apparent from the analysis above that some sort of control will need to be designed to improve the

response of the system. Four example controllers are included with these tutorials: PID, root locus,

frequency response, and state space. You may select a choice from the menu to the left for further details.

Note: The solutions shown in the PID, root locus, and frequency response examples may not yield a

workable controller for the inverted pendulum problem. As stated previously, when we treat the inverted

pendulum as a single-input, single-output system, we ignore the position of the cart, . Where possible in

these examples, we will show what happens to the cart's position when a controller is implemented on the

system.

Inverted Pendulum: PID Controller Design

Key MATLAB commands used in this tutorial are: tf , impulse , feedback , pid

Contents

System structure

PID control

What happens to the cart's position?

In this page we will design a PID controller for the inverted pendulum system. In the design process we

will assume a single-input, single-output plant as described by the following transfer function. Otherwise

stated, we will attempt to control the pendulum's angle without regard for the cart's position.

(1)

where,

(2)

More specifically, the controller will attempt to maintain the pendulum vertically upward when the cart is

subjected to a 1-Nsec impulse. Under these conditions, the design criteria are:

Settling time of less than 5 seconds

Pendulum should not move more than 0.05 radians away from the vertical

For the original problem setup and the derivation of the above transfer function, please consult the Inverted

Pendulum: System Modeling page.

System structure

Page 156: Introduction to Control

The structure of the controller for this problem is a little different than the standard control problems you

may be used to. Since we are attempting to control the pendulum's position, which should return to the

vertical after the initial disturbance, the reference signal we are tracking should be zero. This type of

situation is often referred to as a regulator problem. The external force applied to the cart can be considered

as an impulsive disturbance. The schematic for this problem is depicted below.

You may find it easier to analyze and design for this system if we first rearrange the schematic as follows.

The resulting transfer function for the closed-loop system from an input of force to an output of

pendulum angle is then determined to be the following.

(3)

Before we begin designing our PID controller, we first need to define our plant within MATLAB. Create a

new m-file and type in the following commands to create the plant model (refer to the main problem for

the details of getting these commands).

M = 0.5;

m = 0.2;

Page 157: Introduction to Control

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

q = (M+m)*(I+m*l^2)-(m*l)^2;

s = tf('s');

P_pend = (m*l*s/q)/(s^3 + (b*(I + m*l^2))*s^2/q - ((M + m)*m*g*l)*s/q -

b*m*g*l/q);

Next we will define a PID controller.

PID control

This closed-loop transfer function can be modeled in MATLAB by copying the following code to the end

of your m-file (whether you're using the transfer function form or the state-space representation of the

plant). Specifically, we define our controller using the pid object within MATLAB. We then use

thefeedback command to generate the closed-loop transfer function as depicted in the figure above

where the disturbance force is the input and the deviation of the pendulum angle from the vertical is

the output.

Kp = 1;

Ki = 1;

Kd = 1;

C = pid(Kp,Ki,Kd);

T = feedback(P_pend,C);

Now we can begin to tune our controller. First let's examine the response of the closed-loop system to an

impulse disturbance for this initial set of control gains. Enter the following code to the end of your m-file

and run in the MATLAB command window. You should generate the response plot shown below.

t=0:0.01:10;

impulse(T,t)

title('Response of Pendulum Position to an Impulse Disturbance under

PID Control: Kp = 1, Ki = 1, Kd = 1');

Page 158: Introduction to Control

This response is still not stable. Let's begin to modify the response by increasing the proportional gain.

Increase the variable to see what effect it has on the response. If you modify your m-file to the

following where = 100 and run in the command window, you should get the response plot shown

below.

Kp = 100;

Ki = 1;

Kd = 1;

C = pid(Kp,Ki,Kd);

T = feedback(P_pend,C);

t=0:0.01:10;

impulse(T,t)

axis([0, 2.5, -0.2, 0.2]);

title('Response of Pendulum Position to an Impulse Disturbance under

PID Control: Kp = 100, Ki = 1, Kd = 1');

Page 159: Introduction to Control

Right-clicking on the resulting plot and choosing Characteristics from the resulting menu allows you to

identify important characteristics of the response. Specifically, the settling time of the response is

determined to be 1.64 seconds, which is less than the requirement of 5 seconds. Since the steady-state error

approaches zero in a sufficiently fast manner, no additional integral action is needed. You can set the

integral gain constant to zero to see for yourself that some integral control is needed. The peak

response, however, is larger than the requirement of 0.05 radians. Recall that overshoot often can be

reduced by increasing the amount of derivative control. After some trial and error it is found that a

derivative gain of = 20 provides a satisfactory response. Modifying your m-file as follows and re-

running should produce the response plot shown below

Kp = 100;

Ki = 1;

Kd = 20;

C = pid(Kp,Ki,Kd);

T = feedback(P_pend,C);

t=0:0.01:10;

impulse(T,t)

axis([0, 2.5, -0.2, 0.2]);

Page 160: Introduction to Control

title('Response of Pendulum Position to an Impulse Disturbance under

PID Control: Kp = 100, Ki = 1, Kd = 20');

As you can see, the overshoot has been reduced so that the pendulum does not move more than 0.05

radians away from the vertical. Since all of the given design requirements have been met, no further

iteration is needed.

What happens to the cart's position?

At the beginning of this page, a block diagram for the inverted pendulum system was given. The diagram

was not entirely complete. The block representing the response of the cart's position was not included

because that variable is not being controlled. It is interesting though, to see what is happening to the cart's

position when the controller for the pendulum's angle is in place. To see this we need to consider the full

system block diagram as shown in the following figure.

Page 161: Introduction to Control

Rearranging, we get the following block diagram.

In the above, the block is the controller designed for maintaining the pendulum vertical. The closed-

loop transfer function from an input force applied to the cart to an output of cart position is, therefore,

given by the following.

(4)

Referring to the Inverted Pendulum: System Modeling page, the transfer function for is defined as

follows.

(5)

where,

Page 162: Introduction to Control

(6)

Adding the following commands to your m-file (presuming and are still defined) will

generate the response of the cart's position to the same impulsive disturbance we have been considering.

P_cart = (((I+m*l^2)/q)*s^2 - (m*g*l/q))/(s^4 + (b*(I + m*l^2))*s^3/q -

((M + m)*m*g*l)*s^2/q - b*m*g*l*s/q);

T2 = feedback(1,P_pend*C)*P_cart;

t = 0:0.01:5;

impulse(T2, t);

title('Response of Cart Position to an Impulse Disturbance under PID

Control: Kp = 100, Ki = 1, Kd = 20');

As you can see, the cart moves in the negative direction with approximately constant velocity. Therefore,

although the PID controller stabilizes the angle of the pendulum, this design would not be feasible to

implement on an actual physical system.

Suspension: PID Controller Design

Key MATLAB commands used in this tutorial are: tf , feedback , step , rlocus

Contents

Page 163: Introduction to Control

Adding a PID controller

Plotting the closed-loop response

Choosing the gains for the PID controller

From the main problem, the dynamic equations in transfer function form are the following:

(1)

(2)

where,

(3)

and the system schematic is the following where F(s)G1(s) = G2(s).

For the original problem and the derivation of the above equations and schematic, please refer to

the Suspension: System Modeling page.

We want to design a feedback controller so that when the road disturbance (W) is simulated by a unit step

input, the output (X1-X2) has a settling time less than 5 seconds and an overshoot less than 5%. For

example, when the bus runs onto a 10 cm high step, the bus body will oscillate within a range of +/- 5 mm

and will stop oscillating within 5 seconds.

The system model can be represented in MATLAB by creating a new m-file and entering the following

commands (refer to the main problem for the details of getting those commands).

m1 = 2500;

m2 = 320;

k1 = 80000;

k2 = 500000;

Page 164: Introduction to Control

b1 = 350;

b2 = 15020;

nump=[(m1+m2) b2 k2];

denp=[(m1*m2) (m1*(b1+b2))+(m2*b1) (m1*(k1+k2))+(m2*k1)+(b1*b2)

(b1*k2)+(b2*k1) k1*k2];

G1=tf(nump,denp);

num1=[-(m1*b2) -(m1*k2) 0 0];

den1=[(m1*m2) (m1*(b1+b2))+(m2*b1) (m1*(k1+k2))+(m2*k1)+(b1*b2)

(b1*k2)+(b2*k1) k1*k2];

G2=tf(num1,den1);

numf=num1;

denf=nump;

F=tf(numf,denf);

Adding a PID controller

Recall that the transfer function for a PID controller is:

(4)

where Kp is the proportional gain, Ki is the integral gain, and Kd is the derivative gain. Let's assume that

we will need all three of these gains in our controller. To begin, we might start with guessing a gain for

each: Kp=208025, Ki=832100 and Kd=624075. This can be implemented into MATLAB by adding the

following code into your m-file:

Kd = 208025;

Kp = 832100;

Ki = 624075;

C = pid(Kp,Ki,Kd);

Now let's simulate the response of the system (the distance X1-X2) to a step disturbance on the road. From

the schematic above we can find the transfer function from the road disturbance W to the output(X1-X2),

and simulate:

sys_cl=F*feedback(F*G1,C);

Page 165: Introduction to Control

Plotting the closed-loop response

Now we have created the closed-loop transfer function in MATLAB that will represent the plant, the

disturbance, as well as the controller. Let's see what the closed-loop step response for this system looks

like before we begin the control process. Keep in mind that we are going to use a 0.1 m high step as our

disturbance, to simulate this, all we need to do is to multiply sys_cl by 0.1. Add the following code your

m-file. You should see the response (X1-X2) to a step W like this:

t=0:0.05:5;

step(0.1*sys_cl,t)

title('Closed-Loop Response to 0.1-m High Step w/ PID Controller')

From the graph, the percent overshoot is 9mm, which is larger than the 5mm requirement, but the settling

time is satisfied, less than 5 seconds. To choose the proper gain that yields reasonable output from the

beginning, we start with choosing a pole and two zeros for PID controller. A pole of this controller must be

at zero and one of the zeros has to be very close to the pole at the origin, at 1. The other zero, we will put

further from the first zero, at 3, actually we can adjust the second-zero's position to get the system to fulfill

the requirement. Add the following command in the m-file, so you can adjust the second-zero's location

and choose the gain to have a rough idea what gain you should use for Kd, Kp, and Ki.

z1=1;

z2=3;

Page 166: Introduction to Control

p1=0;

C = ((s+z1)*(s+z2))/(s+p1);

rlocus(C*G1)

title('root locus with PID controller')

Add the code [k,poles]=rlocfind(C*G1) onto the end of your m-file to help you choose a specific

loop gain. After running in the command window, go to the root locus plot and select a point near those

indicated by the cross marks on the plot below.

Page 167: Introduction to Control

After doing this, you should see the following output in the MATLAB command window.

Select a point in the graphics window

selected_point =

-4.3957 + 9.3168i

k =

4.7992e+04

Page 168: Introduction to Control

poles =

1.0e+02 *

-2.0116

-0.0415 + 0.0932i

-0.0415 - 0.0932i

-0.0729

-0.0059

Note that the values returned in your MATLAB command window may not be exactly the same, but

should at least have the same order of magnitude.

We will explain the root locus method in more detail in the Suspension: Root Locus Controller

Design page.

Choosing the gains for the PID controller

Now that we have the closed-loop transfer function, controlling the system is simply a matter of tuning the

Kd, Kp, and Ki gains. From the figure above, we can see that the system has larger damping than required,

but the settling time is very short. This response still doesn't satisfy the 5% overshoot requirement. As

mentioned before, this can be rectified by adjusting the Kp, Ki and Kd gains to obtain a better response.

Let's increase Kp, Ki, and KD by a factor of 2 to see what will happen. Go back to your m-file and

multiply Kp, Ki, Kd by 2 and then rerun the program, you should get the following plot.

Kd=2*Kd;

Kp=2*Kp;

Ki=2*Ki;

C=pid(Kp,Ki,Kd);

sys_cl=F*feedback(F*G1,C);

step(0.1*sys_cl,t)

title('Closed-Loop Response to 0.1-m High Step w/ High-Gain PID

Controller')

Page 169: Introduction to Control

To compare this graph with the graph of low-gain PID controller, you can change the axis:

axis([0 5 -.01 .01])

Page 170: Introduction to Control

Now we see that the percent overshoot and settling time meet the requirements of the system. The percent

overshoot is about 5% of the input's amplitude and settling time is 2 seconds which is less than the 5

second requirement.

For this problem, it turns out that the PID design method adequately controls the system. This can been

seen by looking at the root locus plot. Such a task can be achieved by simply changing only the gains of a

PID controller. Feel free to play around with all three of the parameters, Kp, Ki, and Kd, as we suggested,

but you will most likely get the response to have either a large percent overshoot or a long settling time.

DC Motor Position: PID Controller Design

Key MATLAB commands used in this tutorial are: tf , step , feedback

Contents

Proportional control

PI control

PID control

From the main problem, the open-loop transfer function of the DC Motor is given as follows.

(1)

Page 171: Introduction to Control

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

Position: System Modeling page.

For a 1-radian step reference, the design criteria are the following.

Settling time less than 0.040 seconds

Overshoot less than 16%

No steady-state error, even in the presence of a step disturbance input

Now let's design a PID controller and add it into the system. First create a new m-file and type in the

following commands (refer to main problem for the details of getting these commands).

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

s = tf('s');

P_motor = K/(s*((J*s+b)*(L*s+R)+K^2));

Recall that the transfer function for a PID controller has the following form.

(2)

Proportional control

Let's first try using a proportional controller with gain ranging from 1 to 21. An array of LTI models, each

with a different proportional gain, can be built using a for loop. The closed-loop transfer functions can be

Page 172: Introduction to Control

generated using the feedback command. Add the following code to the end of your m-file and run it in

the MATLAB command window:

Kp = 1;

for i = 1:3

C(:,:,i) = pid(Kp);

Kp = Kp + 10;

end

sys_cl = feedback(C*P_motor,1);

Now let's see what the step responses look like. Add the following code to the end of your m-file and again

run it in the command window. You should generate the plot shown in the figure below.

t = 0:0.001:0.2;

step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t)

ylabel('Position, \theta (radians)')

title('Response to a Step Reference with Different Values of K_p')

legend('K_p = 1', 'K_p = 11', 'K_p = 21')

Page 173: Introduction to Control

Let's also consider the system's response to a step disturbance. In this case, we will assume a reference of

zero and look at the how the system responds to the disturbance by itself. The feedback command can

still be employed for generating the closed-loop transfer function where there is still negative feedback,

however, now only the plant transfer function P(s) is in the forward path and the controller C(s) is

considered to be in the feedback path. Refer back to the block diagram at the top of this page to see the

structure of the system. Add the following to the end of your m-file and run it in the command window.

You should generate the plot shown in the figure below.

dist_cl = feedback(P_motor,C);

step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t)

ylabel('Position, \theta (radians)')

title('Response to a Step Disturbance with Different Values of K_p')

legend('K_p = 1', 'K_p = 11','K_p = 21')

The above plots show that the system has no steady-state error in response to the step reference by itself,

no matter the choice of proportional gain Kp. This is due to the fact that the plant has an integrator, that is,

the system is type 1. However, the system has significant steady-state error when the disturbance is added.

Specifically, the response due to the reference and disturbance applied simultaneously is equal to the sum

of the two graphs shown above. This follows from the property of superposition that holds for linear

systems. Therefore, to have zero steady-state error in the presence of a disturbance, we need the

Page 174: Introduction to Control

disturbance response to decay to zero. The larger the value of Kp the smaller the steady-state error is due to

the disturbance, but it never reaches zero. Furthermore, employing increasingly larger values of Kp has the

adverse effect of increasing the overshoot and settle time as can be seen from the step reference plot.

Recall from the DC Motor Position: System Modeling page that adding an integral term will eliminate the

steady-state error and a derivative term can reduce the overshoot and settling time.

PI control

Let's first try a PI controller to get rid of the steady-state error due to the disturbance. We will set Kp = 21

and test integral gains Ki ranging from 100 to 500. Change your m-file to the following and run in the

command window. You should generate a figure like the one shown below.

Kp = 21;

Ki = 100;

for i = 1:5

C(:,:,i) = pid(Kp,Ki);

Ki = Ki + 200;

end

sys_cl = feedback(C*P_motor,1);

t = 0:0.001:0.4;

step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t)

ylabel('Position, \theta (radians)')

title('Response to a Step Reference with K_p = 21 and Different Values

of K_i')

legend('K_i = 100', 'K_i = 300', 'K_i = 500')

Page 175: Introduction to Control

Now let's see what happened to the step disturbance response. Change the following commands in your m-

file and re-run in the command window. You should generate a plot like the one shown in the figure below.

dist_cl = feedback(P_motor,C);

step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t)

ylabel('Position, \theta (radians)')

title('Response to a Step Disturbance with K_p = 21 and Different

Values of K_i')

legend('K_i = 100', 'K_i = 300', 'K_i = 500')

Page 176: Introduction to Control

The integral control has reduced the steady-state error to zero, even when a step disturbance is present; that

was the goal for adding the integral term. For the response to the step reference, all of the reponses look

similar with the amount of oscillation increasing slightly as Ki is made larger. However, the response due

to the disturbance changes significantly as the integral gain Ki is changed. Specifically, the larger the value

of Ki employed, the faster the error decays to zero. We will choose Ki = 500 because the error due to the

disturbance decays to zero quickly, even though the response to the reference has a longer settling time and

more overshoot. We will attempt to reduce the settling time and overshoot by adding a derivative term to

the controller.

PID control

Adding a derivative term to the controller means that we now have all three terms of the PID controller.

We will investigate derivative gains Kd ranging from 0.05 to 0.25. Go back to the m-file and make the

following changes. Running the altered m-file will generate a graph like the one shown below.

Kp = 21;

Ki = 500;

Kd = 0.05;

for i = 1:3

Page 177: Introduction to Control

C(:,:,i) = pid(Kp,Ki,Kd);

Kd = Kd + 0.1;

end

sys_cl = feedback(C*P_motor,1);

t = 0:0.001:0.1;

step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t)

ylabel('Position, \theta (radians)')

title('Response to a Step Reference with K_p = 21, K_i = 500 and

Different Values of K_d')

legend('K_d = 0.05', 'K_d = 0.15', 'K_d = 0.25')

Let's see what happened to the step disturbance response, change the following commands in your m-file

and re-run at the command line.

dist_cl = feedback(P_motor,C);

t = 0:0.001:0.2;

Page 178: Introduction to Control

step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t)

ylabel('Position, \theta (radians)')

title('Response to a Step Disturbance with K_p = 21, K_i = 500 and

Different values of K_d')

legend('K_d = 0.05', 'K_d = 0.15', 'K_d = 0.25')

It looks like when Kd = 0.15, we can meet our design requirements. To determine the precise

characteristics of the step response you can use the right-click menu of the step response plot, or you can

use the MATLAB command stepinfo as shown below.

stepinfo(sys_cl(:,:,2))

ans =

RiseTime: 0.0046

SettlingTime: 0.0338

SettlingMin: 0.9183

SettlingMax: 1.1211

Overshoot: 12.1139

Undershoot: 0

Page 179: Introduction to Control

Peak: 1.1211

PeakTime: 0.0121

From the above, we see that the response to a step reference has a settling time of roughly 34ms (< 40 ms),

overshoot of 12% (< 16%), and no steady-state error. Additionally, the step disturbance response also has

no steady-state error. So now we know that if we use a PID controller with

Kp = 21, Ki = 500, and Kd = 0.15,

all of our design requirements will be satisfied.

DC Motor Speed: PID Controller Design

Key MATLAB commands used in this tutorial are: tf , step , feedback

Contents

Proportional control

PID control

Tuning the gains

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.

Page 180: Introduction to Control

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: PID 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);

Recall that the transfer function for a PID controller is:

(4)

Proportional control

Let's first try employing a proportional controller with a gain of 100, that is, C(s) = 100. To determine the

closed-loop transfer function, we use thefeedback command. Add the following code to the end of your

m-file.

Kp = 100;

C = pid(Kp);

sys_cl = feedback(C*P_motor,1);

Now let's examine the closed-loop step response. Add the following commands to the end of your m-file

and run it in the command window. You should generate the plot shown below. You can view some of the

system's characteristics by right-clicking on the figure and choosing Characteristics from the resulting

menu. In the figure below, annotations have specifically been added for Settling Time, Peak Response,

and Steady State.

t = 0:0.01:5;

step(sys_cl,t)

grid

title('Step Response with Proportional Control')

Page 181: Introduction to Control

From the plot above we see that both the steady-state error and the overshoot are too large. Recall from

the Introduction: PID Controller Design page that increasing the proportional gain Kp will reduce the

steady-state error. However, also recall that increasing Kp often results in increased overshoot, therefore, it

appears that not all of the design requirements can be met with a simple proportional controller.

This fact can be verified by experimenting with different values of Kp. Specifically, you can employ

the SISO Design Tool by entering the commandsisotool(P_motor) then opening a closed-loop step

response plot from the Analysis Plots tab of the Control and Estimation Tools Managerwindow. With

the Real-Time Update box checked, you can then vary the control gain in the Compensator Editor tab and

see the resulting effect on the closed-loop step response. A little experimentation verifies what we

anticipated, a proportional controller is insufficient for meeting the given design requirements; derivative

and/or integral terms must be added to the controller.

PID control

Recall from the Introduction: PID Controller Design page adding an integral term will eliminate the

steady-state error to a step reference and a derivative term will often reduce the overshoot. Let's try a PID

controller with small Ki and Kd. Modify your m-file so that the lines defining your control are as follows.

Running this new m-file gives you the plot shown below.

Kp = 75;

Ki = 1;

Page 182: Introduction to Control

Kd = 1;

C = pid(Kp,Ki,Kd);

sys_cl = feedback(C*P_motor,1);

step(sys_cl,[0:1:200])

title('PID Control with Small Ki and Small Kd')

Inspection of the above indicates that the steady-state error does indeed go to zero for a step input.

However, the time it takes to reach steady-state is far larger than the required settling time of 2 seconds.

Tuning the gains

In this case, the long tail on the step response graph is due to the fact that the integral gain is small and,

therefore, it takes a long time for the integral action to build up and eliminate the steady-state error. This

process can be sped up by increasing the value of Ki. Go back to your m-file and change Kito 200 as in the

following. Rerun the file and you should get the plot shown below. Again the annotations are added by

right-clicking on the figure and choosing Characteristics from the resulting menu.

Kp = 100;

Ki = 200;

Kd = 1;

Page 183: Introduction to Control

C = pid(Kp,Ki,Kd);

sys_cl = feedback(C*P_motor,1);

step(sys_cl, 0:0.01:4)

grid

title('PID Control with Large Ki and Small Kd')

As expected, the steady-state error is now eliminated much more quickly than before. However, the

large Ki has greatly increased the overshoot. Let's increase Kd in an attempt to reduce the overshoot. Go

back to the m-file and change Kd to 10 as shown in the following. Rerun your m-file and the plot shown

below should be generated.

Kp = 100;

Ki = 200;

Kd = 10;

C = pid(Kp,Ki,Kd);

sys_cl = feedback(C*P_motor,1);

step(sys_cl, 0:0.01:4)

Page 184: Introduction to Control

grid

title('PID Control with Large Ki and Large Kd')

As we had hoped, the increased Kd reduced the resulting overshoot. Now we know that if we use a PID

controller with

Kp = 100, Ki = 200, and Kd = 10,

all of our design requirements will be satisfied.

Cruise Control: PID Controller Design

Key MATLAB commands used in this tutorial are: tf , step , feedback

Contents

System model and parameters

Performance specifications

PID overview

Proportional control

PI control

Page 185: Introduction to Control

PID control

System model and parameters

The transfer function model for the cruise control problem is given below. Please see the Cruise Control:

System Modeling page for the derivation.

(1)

The parameters used in this example are as follows:

(m) vehicle mass 1000 kg

(b) damping coefficient 50 N.s/m

(r) reference speed 10 m/s

Performance specifications

Rise time < 5 s

Overshoot < 10%

Steady-state error < 2%

PID overview

The block diagram of a typical unity feedback system is shown below.

Recall from the Introduction: PID Controller Design page, the transfer function of a PID controller is

(2)

We can define a PID controller in MATLAB using the transfer function directly:

Kp = 1;

Ki = 1;

Kd = 1;

s = tf('s');

C = Kp + Ki/s + Kd*s

Page 186: Introduction to Control

C =

s^2 + s + 1

-----------

s

Continuous-time transfer function.

Alternatively, we may use MATLAB's pid controller object to generate an equivalent continuous time

controller as follows:

C = pid(Kp,Ki,Kd)

C =

1

Kp + Ki * --- + Kd * s

s

with Kp = 1, Ki = 1, Kd = 1

Continuous-time PID controller in parallel form.

Proportional control

The first thing to do in this problem is to find a closed-loop transfer function with a proportional control (C

= Kp) added.

By reducing the unity feedback block diagram, the closed-loop transfer function with a proportional

controller becomes:

(3)

Recall from the Introduction: PID Controller Design page, a proportional controller, Kp, decreases the rise

time, which is desirable in this case.

Page 187: Introduction to Control

For now, use Kp equal 100 and a reference speed of 10 m/s. Create a new m-file and enter the following

commands.

m = 1000;

b = 50;

r = 10;

s = tf('s');

P_cruise = 1/(m*s + b);

Kp = 100;

C = pid(Kp);

T = feedback(C*P_cruise,1)

t = 0:0.1:20;

step(r*T,t)

axis([0 20 0 10])

T =

100

------------

1000 s + 150

Continuous-time transfer function.

Page 188: Introduction to Control

Note that we have used the MATLAB feedback command to simplify the block diagram reduction of

the closed-loop system. Please verify for yourself that the result agrees with the closed-loop transfer

function, T, derived above.

Running the m-file in MATLAB should give you the step response above. As you can see from the plot,

neither the steady-state error nor the rise time satisfy our design criteria.

You can increase the proportional gain, Kp, to reduce the rise time and the steady-state error. Change the

existing m-file so that Kp equals 5000 and rerun it in the MATLAB command window. You should see the

following plot.

Kp = 5000;

C = pid(Kp);

T = feedback(C*P_cruise,1);

step(r*T,t)

axis([0 20 0 10])

Page 189: Introduction to Control

The steady-state error is now essentially zero, and the rise time has been reduced substantially. However,

this response is unrealistic because a real cruise control system generally can not change the speed of the

vehicle from 0 to 10 m/s in less than 0.5 seconds due to power limitations of the engine and drivetrain.

Actuator limitations are very frequently encountered in practice in control systems engineering, and

consequently, the required control action must always be considered when proposing a new controller. We

will discuss this issue much more in subsequent tutorials.

The solution to this problem in this case is to choose a lower proportional gain, Kp, that will give a

reasonable rise time, and add an integral controller to eliminate the steady-state error.

PI control

The closed-loop transfer function of this cruise control system with a PI controller (C = Kp + Ki/s) is:

(4)

Recall from the Introduction: PID Controller Design page, an addition of an integral controller to the

system eliminates the steady-state error. For now, let Kp equal 600 and Ki equal 1 and see what happens to

the response. Change your m-file to the following.

Kp = 600;

Ki = 1;

Page 190: Introduction to Control

C = pid(Kp,Ki);

T = feedback(C*P_cruise,1);

step(r*T,t)

axis([0 20 0 10])

Now adjust both the proportional gain, Kp, and the integral gain, Ki, to obtain the desired response. When

you adjust the integral gain, Ki, we suggest you to start with a small value since a large Ki can destabilize

the response. When Kp equals 800 and Ki equals 40, the step response will look like the following:

Kp = 800;

Ki = 40;

C = pid(Kp,Ki);

T = feedback(C*P_cruise,1);

Page 191: Introduction to Control

step(r*T,t)

axis([0 20 0 10])

PID control

For this particular example, no implementation of a derivative controller was needed to obtain the required

output. However, you might want to see how to work with a PID control for the future reference. The

closed-loop transfer function for this cruise control system with a PID controller (C = Kp + Ki/s + Kd*s)

is:

(5)

Let Kp equal 1, Ki equal 1, and Kd equal 1 and enter the following commands into an new m-file.

Kp = 1;

Ki = 1;

Kd = 1;

C = pid(Kp,Ki,Kd);

T = feedback(C*P_cruise,1);

Page 192: Introduction to Control

Plot the step response and adjust all of Kp, Kd, and Ki until you obtain satisfactory results. We will leave

this as an exercise for you to work on.

Suggestion: Usually choosing appropriate gains requires a trial and error process. The best way to attack

this tedious process is to adjust one variable (Kp, Ki, or Kd) at a time and observe how changing one

variable influences the system output. The characteristics of Kp, Ki, and Kd are summarized in

the Introduction: PID Controller Design page.

Cruise Control: Root Locus Controller Design

Key MATLAB commands used in this tutorial are: tf , rlocus , feedback , step

Contents

System model

System parameters

Performance specifications

Proportional control

Lag controller

System model

The transfer function model for the cruise control problem is given below. Please see the Cruise Control:

System Modeling page for the derivation.

(1)

System parameters

For this example, let's assume that the parameters of the system are

(m) vehicle mass 1000 kg

(b) damping coefficient 50 N.s/m

(r) reference speed 10 m/s

and the block diagram of a typical unity feedback system is shown below.

Performance specifications

Rise time < 5 sec

Page 193: Introduction to Control

Overshoot < 10%

Steady-state error < 2%

Proportional control

Recall from the Introduction: Root Locus Controller Design page, the root-locus plot shows the locations

of all possible closed-loop poles when a single gain is varied from zero to infinity. Thus, only a

proportional controller, K_P, will be considered to solve this problem. The closed-loop transfer function

becomes:

(2)

Also, from the Introduction: Root Locus Controller Design page, we know that the MATLAB

command sgrid can be used to display an acceptable region of the root-locus plot. To use the sgrid,

both the damping ratio, zeta, and the natural frequency, Wn, need to be determined first. The following two

equations will be used to find the damping ratio and the natural frequency:

(3)

(4)

where

wn = Natural Frequency [rad\s]

zeta = Damping Ratio

Tr = Rise time [s]

Mp = Maximum Overshoot

One of our design criteria is to have a rise time of less than 5 seconds. From the first equation, we see that

the natural frequency must be greater than 0.36. Also using the second equation, we see that the damping

ratio must be greater than 0.6, since the maximum overshoot must be less than 10%.

Now, we are ready to generate a root-locus plot and use the sgrid to find an acceptable region on the

root-locus. Create a new m-file and enter the following commands.

m = 1000;

b = 50;

r = 10;

s = tf('s');

P_cruise = 1/(m*s+b);

Page 194: Introduction to Control

rlocus(P_cruise)

axis([-0.6 0 -0.6 0.6]);

sgrid(0.6, 0.36)

The two dotted lines in an angle indicate the locations of constant damping ratio (zeta=0.6); the damping

ratio is greater than 0.6 in between these lines and less than 0.6 outside the lines. The semi-ellipse indicates

the locations of constant natural frequency (Wn=0.36); the natural frequency is greater than 0.36 outside

the semi-ellipse, and smaller than 0.36 inside.

We can then find a gain to place the closed-loop poles in the desired region by employing

the rlocfind command. Add the code[Kp,poles]=rlocfind(P_cruise) onto the end of your

m-file to help you choose a specific loop gain. After running in the command window, you should see a

prompt asking you to pick a point on the root-locus plot. Since you want to pick a point in between dotted

lines (zeta>0.6) and outside the semi-ellipse (Wn>0.36), click on the real axis just outside the semi-ellipse

(around -0.4) as indicated by the cross mark in the following figure.

Page 195: Introduction to Control

After doing this, you should see the following output in the MATLAB command window.

Select a point in the graphics window

selected_point =

-0.4002 + 0.0019i

Kp =

350.2419

Page 196: Introduction to Control

poles =

-0.4002

Note that the value returned from your MATLAB command window may not be exactly the same, but

should at least have the same order of magnitude. This returned value can be used as the gain for the

compensator and the closed-loop step response can be generated as follows.

Kp = 350.2419;

sys_cl = feedback(Kp*P_cruise,1);

t = 0:0.1:20;

step(r*sys_cl,t)

With the gain Kp you just chose, the rise time and the overshoot criteria have been met; however, a steady-

state error of more than 10% remains.

Lag controller

Page 197: Introduction to Control

To reduce the steady-state error, a lag controller will be added to the system. The transfer function of the

lag controller is:

(5)

The closed-loop transfer function (not including Kp) now becomes:

(6)

Finally, including the loop gain Kp, the closed-loop transfer function becomes:

(7)

If you read the "Lag or Phase-Lag Compensator using Root-Locus" section in the Lead and Lag

Compensator Design page, the pole and the zero of a lag controller need to be placed close together. Also,

it states that the steady-state error will be reduced by a factor of zo/po. For these reasons, let zo equal 0.3

and po equal 0.03.

Create a new m-file, and enter the following commands.

zo = 0.3;

po = 0.03;

s = tf('s');

C_lag = (s+zo)/(s+po);

rlocus(C_lag*P_cruise);

axis([-0.6 0 -0.4 0.4])

sgrid(0.6,0.36);

Page 198: Introduction to Control

Using the rlocfind command again, we can choose a new loop gain Kp. Enter the

code [Kp,poles]=rlocfind(C_lag*P_cruise) into the command window and click on the real

axis around -0.4 as shown in the following figure.

Page 199: Introduction to Control

After doing this, you should see the following output in the MATLAB command window.

Select a point in the graphics window

selected_point =

-0.4002 - 0.0012i

Kp =

1.2936e+03

Page 200: Introduction to Control

poles =

-0.9733

-0.4003

We can then generate the new closed-loop step response as follows.

Kp = 1293.6;

sys_cl = feedback(Kp*C_lag*P_cruise,1);

t = 0:0.1:20;

step(r*sys_cl,t)

axis([0 20 0 12])

As you can see, the steady-state error has been reduced to near zero. The overshoot is a result of the zero

added in the lag controller. For now all of the design criteria have been met and no further iterations are

Page 201: Introduction to Control

needed; however, you should experiment with different zo and po values to see what their effect is on the

closed-loop system response.

DC Motor Speed: Root Locus Controller Design

Key MATLAB commands used in this tutorial are: tf , sisotool

Contents

Drawing the open-loop root locus

Finding the loop gain

Adding a lag controller

Finding the loop gain with a lag controller

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%

Page 202: Introduction to Control

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 SISO Design Tool graphical user interface. This tool allows the 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 sisotool('rlocus', P_motor) to the end of

your m-file and running the file at the command line.

Two windows will initially open, one is the SISO Design Task which will open with the root locus of the

uncompensated plant, and the other is Control and Estimation Tool Manager which allows you to design

compensators, analyze plots, etc. Right-click on the root locus plot and click on Grid. Your plot will then

appear as follows.

Page 203: Introduction to Control

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 SISO Designt Tool 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.

Page 204: Introduction to Control

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.

Page 205: Introduction to Control

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 damping 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. Releasing the

mouse button will further show at the bottom of the window the corresponding loop gain, which in this

case is approximately 10.

We can also generate the closed-loop step response for the system with this new gain. From the Control

and Estimation Tool Manager, click on theAnalysis Plots tab and under Plot1, choose Step, a blank

window titled LTI Viewer for SISO Design Task will appear. Right-click on this window and then

from Systems menu choose the first item which is Closed Loop r to y (blue). The closed-loop step response

will then appear in the figure. 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.

Page 206: Introduction to Control

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

Page 207: Introduction to Control

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 SISO Design Tool to design our lag compensator. To make the SISO Design Tool have a

compensator parameterization corresponding to the one shown above, click on the Edit menu at the top of

the Control and Estimation Tools Manager window and choose SISO Tool Preferences. Then From

the Options tab, select a Zero/pole/gain parameterization as shown below.

You can then add the lag compensator from under the Compensator Editor tab of the Control and

Estimation Tools Manager window. Specifically, right-click in the Dynamics section of the window and

select Add Pole/Zero > Lag. Then enter the Real Zero and Real Pole locations as shown in the following

figure.

Page 208: Introduction to Control

Note that the 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 will place

the poles at the positions shown in the figure below.

Page 209: Introduction to Control

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

below.

Page 210: Introduction to Control

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.

Page 211: Introduction to Control

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. Before you do this, however, you likely need to

change the limits on the imaginary axis so that you can move the poles a sufficient distance. In order to

change these limits, double-click on the root locus plot to open the Property Editor, then click on

the Limits tab and change the imaginary axis limits to [-15,15] 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.

Page 212: Introduction to Control
Page 213: Introduction to Control

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 SISO Design Tool is

very helpful in this process. Using the SISO Design Tool, 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).

DC Motor Position: Root Locus Controller Design

Key MATLAB commands used in this tutorial

are: tf , rlocus , sgrid , pole , minreal , feedback , step

Contents

Drawing the open-loop root locus

Model reduction

Page 214: Introduction to Control

Integral control

PI control

PID control

Determining gain using rlocfind command

From the main problem, the open-loop transfer function of the DC Motor is given as follows.

(1)

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

Position: System Modeling page.

With a 1-radian step reference, the design criteria are the following.

Settling time less than 0.040 seconds

Overshoot less than 16%

No steady-state error, even in the presence of a step disturbance input

Now let's design a controller using the root locus method.

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

these commands).

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

Page 215: Introduction to Control

s = tf('s');

P_motor = K/(s*((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. Let's first view the root locus for the plant. Add the following commands to the end

of your m-file and run it in the MATLAB command window to generate a plot like the one shown below.

rlocus(P_motor)

title('Root Locus - P Control')

sgrid(.5, 0)

sigrid(100)

The commands sgrid and sigrid are functions that mark regions of the complex plane corresponding

to certain parameters. sgrid is a function in the Control System Toolbox; however, to use sigrid you will

have to download it here. The variables in the sgrid command are the damping ratio (zeta = 0.5) and the

natural frequency (Wn = 0). The variable in the sigrid command is the sigma term.

The zeta and sigma used above correspond to an overshoot of 16% and a settling time of 0.040 seconds,

Page 216: Introduction to Control

respectively, for a canonical second-order system. Even though our motor transfer function is third order, it

will be explained that these second-order based definitions will work well. No value is given for Wn since

we have no requirement on rise time.

From the above figure, the two open-loop poles near the origin cannot be distinguished because the scale

of the axes is set to show the third pole which is much farther to the left than the other two poles. The

MATLAB command pole can be employed to determine the exact values of the open-loop poles.

poles = pole(P_motor)

poles =

1.0e+06 *

0

-1.4545

-0.0001

The open-loop pole located very far to the left (further than -1e6) does not affect the closed-loop dynamics

unless very large gains are used. These large gains place two of the closed-loop poles in the right-half

complex s-plane where the system becomes unstable. Since we will not use gains that will make the

closed-loop system unstable, we can neglect this pole by performing a model reduction.

Model reduction

In general, the real part of a pole indicates how quickly the transient portion of the corresponding mode

decays to zero (assuming negative real part). Therefore, if you have a transfer function which has one (or

more) poles much farther to the left in the complex plane (more negative) than the other poles, their effect

on the dynamic response will be hidden by the slower, more dominant poles. In the case of our motor

position example, the transient closed-loop response for small gains will not be affected much by the open-

loop pole at -1.45e6. The correct way to neglect this pole in order to maintain its steady-state contribution

is to keep the DC gain of the transfer function the same, as follows:

(2)

As shown above, the poles of the open-loop transfer function can be identified using the MATLAB

command pole. The two poles that dominate are difficult to identify from above because of the scientific

notation, but they can be seen more clearly by recognizing that they are the first and third elements of the

resulting vector which we have named poles.

poles(1), poles(3)

ans =

0

ans =

Page 217: Introduction to Control

-59.2260

We would then like to construct the reduced transfer function to neglect the pole at 1.45e-6 without

affecting the steady-state behavior of the system. This can be accomplished with the MATLAB

command minreal. Add the following commands to your m-file and re-run.

poles = pole(P_motor);

rP_motor = minreal(P_motor*(s/max(abs(poles)) + 1))

rP_motor =

2122

-------------

s^2 + 59.23 s

Continuous-time transfer function.

You can then check that the other poles have not been affected by again using the pole command as

shown below.

pole(rP_motor)

ans =

0

-59.2260

Now we can draw the root locus of the reduced system. Add the following commands to the end of your

m-file and run it in the command window.

rlocus(rP_motor)

title('Root Locus - P Control')

axis([ -300 100 -200 200])

sgrid(.5, 0)

sigrid(100)

Page 218: Introduction to Control

If you examined the original root locus near the origin, it would closely approximate the locus of the

reduced transfer function shown above. We can see from this new plot that the closed-loop poles are never

fast enough to meet the settling time requirement (that is, they never move to the left of the sigma= 100

vertical line). Also, recall that we need an integrator in the controller (not just in the system) to remove the

steady-state error due to a constant disturbance.

Integral control

Now, let's try using integral control to remove the steady-state error due to a constant disturbance. Modify

your m-file such that it appears like the following. Note that this adds a 1 / s term to the forward path of the

system. Run this m-file and you will obtain a plot like the one shown below.

C = 1/s;

rlocus(C*rP_motor)

title('Root Locus - I Control')

axis([ -300 100 -200 200])

sgrid(.5, 0)

sigrid(100)

Page 219: Introduction to Control

From this root locus we can see that the closed-loop system under integral control is never stable,

therefore, a different controller must be employed.

PI control

Now, let's modify the integral controller to a PI controller. Using PI instead of I control adds a zero to the

open-loop system. We'll place this zero at s = -20. The zero must lie between the open-loop poles of the

system in this case so that the closed-loop system will be stable. Change the lines defining the controller in

your m-file to the following. Re-run your m-file and you will obtain a plot like the one shown below.

C = (s + 20) / s;

rlocus(C*rP_motor)

title('Root Locus - PI Control')

axis([ -300 100 -200 200])

sgrid(.5, 0)

sigrid(100)

Page 220: Introduction to Control

We have managed to stabilize the system and achieve zero steady-state error to a constant disturbance, but

the system is still not fast enough.

PID control

In order to pull the root locus further to the left, to make it faster, we need to place a second open-loop

zero, resulting in a PID controller. After some experimentation, we place the two PID zeros at s = -60

and s = -70. Change the lines defining the controller in your m-file to the following. Re-run your m-file

and you will generate a plot like the one shown below.

C = (s + 60)*(s + 70) / s;

rlocus(C*rP_motor)

title('Root Locus - PID Control')

axis([ -300 100 -200 200])

sgrid(.5, 0)

sigrid(100)

Page 221: Introduction to Control

Now, we can see that two of the closed-loop poles can be placed well within both the settling time and

percent overshoot requirements. The third closed-loop pole moves from the open-loop pole at s = -59.2 to

the open-loop zero at s = -60. This closed-loop pole nearly cancels with the zero (which remains in the

closed-loop transfer function) because they are so close together. Therefore, we can neglect its effect. Let's

reduce our new model again by performing the zero-pole cancelation using the minreal command. We pass

0.1 as a tolerance parameter as follows. The root locus for this further reduced system with controller is

shown below. Note how closely it resembles the root locus without the pole-zero cancelation.

rsys_ol = minreal(C*rP_motor, 0.1);

rlocus(rsys_ol)

title('Root Locus - PID Control')

axis([ -300 100 -200 200])

sgrid(.5, 0)

sigrid(100)

Page 222: Introduction to Control

Even though the one open-loop zero was canceled, the other open-loop zero remains in the closed-loop

transfer function and cannot be neglected. The effect of an additional zero (if there is no cancellation) is in

general to speed up the response and add overshoot. Therefore, we have to be conservative in picking

where on the root locus we want the closed-loop poles to lie.

Determining gain using rlocfind command

If you recall, we need the settling time and the overshoot to be as small as possible, particularly because of

the effect of the extra zero. Large damping corresponds to points on the root locus near the real axis. A fast

response corresponds to points on the root locus far to the left of the imaginary axis. To find the gain

corresponding to a point on the root locus, we can use the rlocfind command. Specifically, enter the

command [k,poles] = rlocfind(rsys_ol) in the MATLAB command window.

Then go to the plot and select a point on the root locus on left side of the loop, close to the real axis as

shown below with the small + marks. This will ensure that the response will be nearly as fast as possible

with minimal overshoot. These pole locations indicate that the response would have almost no overshoot if

it were a canonical second-order system. Recall, however, that the presence of the zero will add some

overshoot.

Page 223: Introduction to Control

After doing this, you should see the following output in the MATLAB command window.

Select a point in the graphics window

selected_point =

-1.3744e+002 +1.3043e+001i

k =

Page 224: Introduction to Control

0.1308

poles =

1.0e+002 *

-1.3874 + 0.1323i

-1.3874 - 0.1323i

Note that the values returned in your MATLAB command window may not be exactly the same, but

should at least have the same order of magnitude. You can also get the step response plots for the reference

and disturbance with this specific controller and loop gain by executing the following code in the

command window. These commands should produce the plots shown below where the annotations to the

figures are added by choosingCharacteristics from the right-click menu of each of the plots.

sys_cl = feedback(k*rsys_ol,1);

t = 0:0.0001:0.1;

step(sys_cl, t)

grid

ylabel('Position, \theta (radians)')

title('Response to a Step Reference with PID Control')

Page 225: Introduction to Control

dist_cl = feedback(P_motor,k*C);

figure;step(dist_cl, t)

grid

ylabel('Position, \theta (radians)')

title('Response to a Step Disturbance with PID Control')

Page 226: Introduction to Control

From the above, you can see that in response to a step reference the system has an overshoot of

approximately 14%, a settling time just under 0.04 seconds, and no steady-state error. Also, the response to

a step disturbance reaches a steady-state value of zero. Therefore, all of the design requirements have been

met.

In this example we placed the zeros of our compensator in order to reshape the root locus so that the

closed-loop poles could be placed in the region of the complex plane that would achieve our given design

requirements. It is in general helpful to understand the principles of how the root locus is drawn, however,

MATLAB can be very helpful in refining the design and verifying the resulting performance.

Suspension: Root Locus Controller Design

Key MATLAB commands used in this tutorial are: tf , roots , rlocus , sgrid , step

Contents

Plotting the root locus

Adding a notch filter

Finding the gain from the root locus

Page 227: Introduction to Control

Plotting the closed-loop response

From the main problem, the dynamic equations in transfer function form are the following:

(1)

(2)

where,

(3)

and the system schematic is the following where F(s)G1(s) = G2(s).

For the original problem and the derivation of the above equations and schematic, please refer to

the Suspension: System Modeling page.

We want to design a feedback controller so that when the road disturbance (W) is simulated by a unit step

input, the output (X1-X2) has a settling time less than 5 seconds and an overshoot less than 5%. For

example, when the bus runs onto a 10 cm high step, the bus body will oscillate within a range of +/- 5 mm

and will stop oscillating within 5 seconds.

The system model can be represented in MATLAB by creating a new m-file and entering the following

commands (refer to the main problem for the details of getting those commands).

m1 = 2500;

m2 = 320;

k1 = 80000;

k2 = 500000;

b1 = 350;

b2 = 15020;

Page 228: Introduction to Control

nump=[(m1+m2) b2 k2];

denp=[(m1*m2) (m1*(b1+b2))+(m2*b1) (m1*(k1+k2))+(m2*k1)+(b1*b2)

(b1*k2)+(b2*k1) k1*k2];

G1=tf(nump,denp);

num1=[-(m1*b2) -(m1*k2) 0 0];

den1=[(m1*m2) (m1*(b1+b2))+(m2*b1) (m1*(k1+k2))+(m2*k1)+(b1*b2)

(b1*k2)+(b2*k1) k1*k2];

G2=tf(num1,den1);

numf=num1;

denf=nump;

F=tf(numf,denf);

We are now ready to design a controller using the root locus design method.

First let's see what the open-loop poles of the system are:

R = roots(denp)

R =

-23.9758 +35.1869i

-23.9758 -35.1869i

-0.1098 + 5.2504i

-0.1098 - 5.2504i

Therefore, the dominant poles are the roots -0.1098+/-5.2504i, which are close to the imaginary axis with a

small damping ratio.

Plotting the root locus

The main idea of root locus design is to estimate the closed-loop response from the open-loop root locus

plot. By adding zeros and/or poles to the original system (adding a compensator), the root locus and thus

the closed-loop response will be modified. Let's first view the root locus for the plant. In your m-file, add

the following command and then run the file, you should get the root locus plot below:

rlocus(G1)

z=-log(0.05)/sqrt(pi^2+(log(0.05)^2))

Page 229: Introduction to Control

sgrid(z,0)

z =

0.6901

Note from the specification, we required the overshoot, , to be less than 5% and damping ratio, , can

be find from approximation damping ratio equation, . The

command sgrid is used to overlay the desired percent overshoot line on the close-up root locus; you can

find more information from commands list.

From the plot above, we see that there are two pair of poles and zeros that are very close together. These

poles and zeros are almost on the imaginary axis, they might make the bus system marginally stable, which

might cause a problem. We have to make all of the poles and zeros move into the left-half plane as far as

possible to avoid an unstable system. We have to put two zeros very close to the two poles on the

imaginary axis of uncompensated system for pole-and-zero cancellation. Moreover, we will put another

two poles further to the left on the real axis to get fast response.

Adding a notch filter

We will probably need two zeros near the two poles on the complex axis to draw the root locus, leading

those poles to the compensator zeros instead of to the plant zeros on the imaginary axis. We'll also need

two poles placed far to the left to pull the locus to the left. It seems that a notch filter (2-lead controller)

Page 230: Introduction to Control

will probably do the job. Let's try putting the poles at 30 and 60 and the zeros at 3+/-3.5i. In your m-file

add the following lines of code:

z1=3+3.5i;

z2=3-3.5i;

p1=30;

p2=60;

numc=conv([1 z1],[1 z2]);

denc=conv([1 p1],[1 p2]);

C=tf(numc,denc);

rlocus(C*G1)

Now let's change the axis to see the details of the root locus.

axis([-40 10 -30 30])

z=-log(0.05)/sqrt(pi^2+(log(0.05)^2))

sgrid(z,0)

Page 231: Introduction to Control

z =

0.6901

Finding the gain from the root locus

Now that we have moved the root locus across the 5% damping ratio line, we can choose a gain that will

satisfy the design requirements. Recall that we want the settling time and the overshoot to be as small as

possible. Generally, to get a small overshoot and a fast response, we need to select a gain corresponding to

a point on the root locus near the real axis and far from the imaginary axis or the point that the root locus

crosses the desired damping ratio line. But in this case, we need the cancellation of poles and zeros near the

imaginary axis, so we need to select a gain corresponding to a point on the root locus near the zeros and

percent overshoot line. There is a method to do this with the rlocfind command in MATLAB. Add the

code[k,poles]=rlocfind(C*G1) onto the end of your m-file to help you choose a specific loop

gain. After running in the command window, go to the root locus plot and select a point near those

indicated by the cross marks on the plot below.

Page 232: Introduction to Control

After doing this, you should see the following output in the MATLAB command window.

Select a point in the graphics window

selected_point =

-2.8555 + 3.6335i

k =

1.0030e+08

Page 233: Introduction to Control

poles =

1.0e+02 *

-0.6321 + 5.9650i

-0.6321 - 5.9650i

-0.0296 + 0.1306i

-0.0296 - 0.1306i

-0.0292 + 0.0368i

-0.0292 - 0.0368i

Note that the value returned from your MATLAB command window may not be exactly the same, but

should at least have the same order of magnitude. This returned value can be used as the gain for the

compensator. Recall that the schematic of the system is the following:

and the closed-loop transfer function can be derived as following:

k = 1.0030e+08;

sys_cl=F*feedback(G1,k*C);

Plotting the closed-loop response

Let's see what the closed-loop step response looks like with this compensator. Keep in mind that we are

going to use a 0.1-m high step as the disturbance. To simulate this, simply multiply sys_cl by 0.1. Add the

following commands into the m-file and put % marks in front of all rlocus andrlocfind commands.

Page 234: Introduction to Control

t=0:0.01:2;

step(0.1*sys_cl,t)

title('Closed-Loop Response to 0.1-m High Step w/ Notch Filter')

From this plot we see that when the bus encounters a 0.1 m step on the road, the maximum deviation of the

bus body from the wheel (or the road) is about 3.75 mm, and the oscillations settle in 2 seconds. Thus this

response is satisfactory.

Inverted Pendulum: Root Locus Controller Design

Key MATLAB commands used in this tutorial

are: tf , rlocus , pole , zero , zpk , feedback , impulse

Contents

System structure

Root locus design

PID control

What happens to the cart's position?

In this page we will design a controller for the inverted pendulum system using the root locus design

method. In the design process we will assume a single-input, single-output plant as described by the

Page 235: Introduction to Control

following transfer function. Otherwise stated, we will attempt to control the pendulum's angle without

regard for the cart's position.

(1)

where,

(2)

More specifically, the controller will attempt to maintain the pendulum vertically upward when the cart is

subjected to a 1-Nsec impulse. Under these conditions, the design criteria are:

Settling time of less than 5 seconds

Pendulum should not move more than 0.05 radians away from the vertical

For the original problem setup and the derivation of the above transfer function, please consult the Inverted

Pendulum: System Modeling page.

System structure

The structure of the controller for this problem is a little different than the standard control problems you

may be used to. Since we are attempting to control the pendulum's position, which should return to the

vertical after the initial disturbance, the reference signal we are tracking should be zero. This type of

situation is often referred to as a regulator problem. The external force applied to the cart can be considered

as an impulsive disturbance. The schematic for this problem is depicted below.

You may find it easier to analyze and design for this system if we first rearrange the schematic as follows.

Page 236: Introduction to Control

The resulting transfer function for the closed-loop system from an input of force to an output of

pendulum angle is then determined to be the following.

(3)

Before we begin designing our controller, we first need to define our plant within MATLAB. Create a

new m-file and type in the following commands to create the plant model (refer to the main problem for

the details of getting these commands).

M = 0.5;

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

q = (M+m)*(I+m*l^2)-(m*l)^2;

s = tf('s');

P_pend = (m*l*s/q)/(s^3 + (b*(I + m*l^2))*s^2/q - ((M + m)*m*g*l)*s/q -

b*m*g*l/q);

Root locus design

We will now begin to design a controller for our system employing a root locus design method. We can

use the MATLAB command rlocus for generating the root locus plots. Adding the following commands

to your m-file and running it in the MATLAB command window will create the root locus plot shown

below. This plot displays all possible closed-loop pole locations as a simple proportional control gain is

varied from 0 to infinity. The root locus is the same whether the multiplicative gain is in the forward or

feedback path of the closed-loop system.

Page 237: Introduction to Control

rlocus(P_pend)

title('Root Locus of Plant (under Proportional Control)')

As you can see, one of the branches of the root locus is entirely in the right-half of the complex -plane.

This means that no matter the choice of gain , there will always be a closed-loop pole in the right-half

plane making the system's impulse response unstable.

To solve this problem, we need to add a pole at the origin (an integrator) via the controller to cancel the

plant zero at the origin. This addition will produce two closed-loop poles in the right-half plane. In our

subsequent design we can then modify our controller to draw these poles into the left-half plane, thereby

stabilizing the closed-loop system. Modifying your m-file with the following commands and re-running in

the MATLAB command window will produce the root locus plot shown below.

C = 1/s;

rlocus(C*P_pend)

title('Root Locus with Integral Control')

Page 238: Introduction to Control

Let's also examine the locations of the system's open-loop poles and zeros so that we may begin to think

about how to draw the root locus branches into the left-half plane. Entering the following commands into

the MATLAB command window will generate the following output.

zeros = zero(C*P_pend)

poles = pole(C*P_pend)

zeros =

0

poles =

0

5.5651

-5.6041

-0.1428

As you can see, there are four poles and only one zero. This means that the root locus will have three

asymptotes: one along the real axis in the negative direction, and the other two at 120 degree angles to this

one.

Page 239: Introduction to Control

This configuration is also unsatisfactory because we still have branches of the root locus that are entirely in

the right-half complex plane. In general, we can pull the branches of our root locus to the left in the

complex plane by adding zeros to our system. Adding a zero to our controller will reduce the number of

asymptotes from three to two. These two asymptotes will be parallel to the imaginary axis and will

intersect the real axis at the location calculated from the following expression.

(4)

Therefore, for our system as described so far, we have the following assuming a minimum-phase zero

(negative).

(5)

Based on the above, the farthest we can pull the asymptotes to the left in the complex plane is

approximately -0.1 for a negligibly small zero. Recall that 2% settling time can be estimated from the

following equation.

(6)

Therefore, dominant closed-loop poles with real parts that approach -0.1 will not be sufficient to meet the 5

second settling time that we require.

PID control

In the above discussion we demonstrated that adding a zero to our integral controller could pull the

branches of the root locus to the left in the complex plane, but we were not able to the pull the dominant

branches far enough to the left. A possible solution is to add yet another zero. If we place both zeros on the

negative real axis between the two plant poles, then the two branches in the right-half plane will be pulled

into the left-half plane and will terminate at these two zeros. Let's specifically evaluate the root locus for a

controller with an integrator and zeros at -3 and -4. Note that this controller is actually a PID controller.

We can create this controller within MATLAB using the zpk command which creates a model by

specifying the zeros, poles, and gain of the system. Modifying your m-file with the following commands

and re-running will produce the root locus plot shown below.

z = [-3 -4];

p = 0;

k = 1;

C = zpk(z,p,k);

rlocus(C*P_pend)

title('Root Locus with PID Controller')

Page 240: Introduction to Control

Examining the above root locus helps us to determine whether or not our given requirements can be met.

Specifically, since it is desired that the settling time of the system be less than 5 seconds, the real parts of

our dominant closed-loop poles should be less than approximately -4/5 = -0.8. In other words, our

dominatnt closed-loop poles should be located in the complex -plane to the left of a vertical line

at . Inspection of the above shows that this is possible. Since it is also desired that the pendulum

not move more than 0.05 radians away from vertical, we also want to ensure that the closed-loop system

has sufficient damping. Placing the dominant closed-loop poles near the real axis will increase the system's

damping (small ).

To find the gain corresponding to a specific point on the root locus, we can use the rlocfind command.

Specifically, enter the command [k,poles] = rlocfind(C*P_pend) in the MATLAB command

window.

Then go to the plot and select a point on the root locus on left side of the loop, close to the real axis as

shown below with the small + marks. Selecting these poles will ensure that the system settles sufficiently

fast and, hopefully, that it has sufficient damping.

Page 241: Introduction to Control

After doing this, you should see an output like the following in the MATLAB command window.

Select a point in the graphics window

selected_point =

-3.5367 + 0.7081i

Page 242: Introduction to Control

k =

20.2396

poles =

0

-85.1333

-3.5232 + 0.7086i

-3.5232 - 0.7086i

Note that the values returned in your MATLAB command window may not be exactly the same, but they

should at least have the same order of magnitude.

Then we can check the impulse response of our closed-loop system to see if our requirements are actually

met for a gain of approximately 20. Add the following commands to your m-file and re-run to generate a

closed-loop impulse response like the one shown below.

K = 20;

T = feedback(P_pend,K*C);

impulse(T)

title('Response of Pendulum Angle to an Impulse Disturbance under PID

Control');

Page 243: Introduction to Control

Examination of the above demonstrates that all of the given requirements are met.

What happens to the cart's position?

At the beginning of this page, a block diagram for the inverted pendulum system was given. The diagram

was not entirely complete. The block representing the response of the cart's position was not included

because that variable is not being controlled. It is interesting though, to see what is happening to the cart's

position when the controller for the pendulum's angle is in place. To see this we need to consider the full

system block diagram as shown in the following figure.

Page 244: Introduction to Control

Rearranging, we get the following block diagram.

In the above, the block is the controller designed for maintaining the pendulum vertical. The closed-

loop transfer function from an input force applied to the cart to an output of cart position is, therefore,

given by the following.

(7)

Referring to the Inverted Pendulum: System Modeling page, the transfer function for is defined as

follows.

(8)

where,

Page 245: Introduction to Control

(9)

Adding the following commands to your m-file (presuming and are still defined) will

generate the response of the cart's position to the same impulsive disturbance we have been considering.

P_cart = (((I+m*l^2)/q)*s^2 - (m*g*l/q))/(s^4 + (b*(I + m*l^2))*s^3/q -

((M + m)*m*g*l)*s^2/q - b*m*g*l*s/q);

T2 = feedback(1,P_pend*C)*P_cart;

t = 0:0.01:8.5;

impulse(T2, t);

title('Response of Cart Position to an Impulse Disturbance under PID

Control');

As you can see, the cart's position goes unstable for this impulse disturbance. Therefore, although the PID

controller stabilizes the angle of the pendulum, this design would not be feasible to implement on an actual

physical system.

Aircraft Pitch: Frequency Domain Methods for Controller Design

Key MATLAB commands used in this tutorial

are: tf , step , feedback , pole , margin , stepinfo

Page 246: Introduction to Control

Contents

Open-loop response

Closed-loop response

Lead compensator

From the main problem, the open-loop transfer function for the aircraft pitch dynamics is

(1)

where the input is elevator deflection angle and the output is the aircraft pitch angle .

For the original problem setup and the derivation of the above transfer function please refer to the Aircraft

Pitch: System Modeling page

For a step reference of 0.2 radians, the design criteria are the following.

Overshoot less than 10%

Rise time less than 2 seconds

Settling time less than 10 seconds

Steady-state error less than 2%

Open-loop response

Let's first begin by examining the behavior of the open-loop plant. Specifically, create a new m-file, and

enter the following commands. Note the scaling of the step response by 0.2 to account for the fact that the

input is a step of 0.2 radians (11 degrees). Running this m-file in the MATLAB command window should

give you the step response plot shown below.

t = [0:0.01:10];

s = tf('s');

P_pitch = (1.151*s + 0.1774)/(s^3 + 0.739*s^2 + 0.921*s);

step(0.2*P_pitch,t);

axis([0 10 0 0.8]);

ylabel('pitch angle (rad)');

title('Open-loop Step Response');

grid

Page 247: Introduction to Control

Examination of the above plot indicates that the open-loop system is unstable for a step input, that is, its

output grows unbounded when given a step input. This is due to the fact that the transfer function has a

pole at the origin.

Closed-loop response

Let's now close the loop on our plant and see if that stabilizes the system. Consider the following unity

feedback architecture for our system.

The following code entered in the MATLAB command window generates the closed-loop transfer function

assuming the unity-feedback architecture above and a unity-gain controller, C(s) = 1.

Page 248: Introduction to Control

sys_cl = feedback(P_pitch,1)

sys_cl =

1.151 s + 0.1774

----------------------------------

s^3 + 0.739 s^2 + 2.072 s + 0.1774

Continuous-time transfer function.

Examining the poles of this transfer function using the pole command as shown below, it can be seen that

this closed-loop system is indeed stable since all of the poles have negative real part.

pole(sys_cl)

ans =

-0.3255 + 1.3816i

-0.3255 - 1.3816i

-0.0881

Stability of this closed-loop system can also be determined using the frequency response of the open-loop

system. The margin command generates the Bode plot for the given transfer function with annotations

for the gain margin and phase margin of the system when the loop is closed as demonstrated below.

margin(P_pitch), grid

Page 249: Introduction to Control

Examination of the above demonstrates that the closed-loop system is indeed stable since the phase margin

and gain margin are both positive. Specifically, the phase margin equals 46.9 degrees and the gain margin

is infinite. It is good that this closed-loop system is stable, but does it meet our requirements? Add the

following code to your m-file and re-run and you will generate the step response plot shown below.

sys_cl = feedback(P_pitch,1);

step(0.2*sys_cl), grid

ylabel('pitch angle (rad)');

title('Closed-loop Step Response')

Page 250: Introduction to Control

Examination of the above demonstrates that the settle time requirement of 10 seconds is not close to being

met. One way to address this is to make the system response faster, but then the overshoot shown above

will likely become a problem. Therefore, the overshoot must be reduced in conjunction with making the

system response faster. We can accomplish these goals by adding a compensator to reshape the Bode plot

of the open-loop system. The Bode plot of the open-loop system indicates behavior of the closed-loop

system. More specifically,

the gain crossover frequency is directly related to the closed-loop system's speed of response, and

the phase margin is inversely related to the closed-loop system's overshoot.

Therefore, we need to add a compensator that will increase the gain crossover frequency and increase the

phase margin as indicated in the Bode plot of the open-loop system.

Lead compensator

A type of compensator that can accomplish both of our goals is a lead compensator. Referring to the Lead

and Lag Compensators page, a lead compensator adds positive phase to the system. Additional positive

phase increases the phase margin, thus, increasing the damping. The lead compensator also generally

increases the magnitude of the open-loop frequency response at higher frequencies, thereby, increasing the

gain crossover frequency and overall speed of the system. Therefore, the settling time should decrease as a

result of the addition of a lead compensator. The general form of the transfer function of a lead

compensator is the following.

Page 251: Introduction to Control

(2)

We thus need to find , T and K. Typically, the gain K is set to satisfy requirements on steady-state error.

Since our system is already type 1 (the plant has an integrator) the steady-state error for a step input will be

zero for any value of K. Even though the steady-state error is zero, the slow tail on the response can be

attributed to the fact the velocity-error constant is too small. This deficiency can be addressed by

employing a value of K that is greater than 1, in other words, a value of K that will shift the magnitude plot

upward. Through some trial and error, we will somewhat arbitrarily choose K = 10. Running the following

code in the MATLAB window will demonstrate the effect of adding this K.

K = 10;

margin(K*P_pitch), grid

figure;

sys_cl = feedback(K*P_pitch,1);

step(0.2*sys_cl), grid

title('Closed-loop Step Response with K = 10')

Page 252: Introduction to Control
Page 253: Introduction to Control

From examination of the above Bode plot, we have increased the system's magnitude at all frequencies and

have pushed the gain crossover frequency higher. The effect of these changes are evident in the closed-

loop step response shown above. Unfortunately, the addition of the K has also reduced the system's phase

margin as evidenced by the increased overshoot in the system's step response. As mentioned previously,

the lead compensator will help add damping to the system in order to reduce the overshoot in the step

response.

Continuing with the design of our compensator, we will next address the parameter which is defined as

the ratio between the zero and pole. The larger the separation between the zero and the pole the greater the

bump in phase where the maximum amount of phase that can be added with a single pole-zero pair is 90

degrees. The following equation captures the maximum phase added by a lead compensator as a function

of .

(3)

Relationships between the time response and frequency response of a standard underdamped second-order

system can be derived. One such relationship that is a good approximation for damping ratios less than

approximately 0.6 or 0.7 is the following.

(4)

While our system does not have the form of a standard second-order system, we can use the above

relationship as a starting point in our design. As we are required to have overshoot less than 10%, we need

our damping ratio to be approximately larger than 0.59 and thus need a phase margin greater than about

59 degrees. Since our current phase margin (with the addition of K) is approximately 10.4 degrees, an

additional 50 degrees of phase bump from the lead compensator should be sufficient. Since it is known that

the lead compensator will further increase the magnitude of the frequency response, we will need to add

more than 50 degrees of phase lead to account for the fact that the gain crossover frequency will increase to

a point where the system has more phase lag. We will somewhat arbitrarily add 5 degrees and aim for a

total bump in phase of 50+5 = 55 degrees.

We can then use this number to solve the above relationship for as shown below.

(5)

From the above, we can calculate that must be less than approximately 0.10. For this value of , the

following relationship can be used to determine the amount of magnitude increase that will be supplied by

the lead compensator at the location of the maximum bump in phase.

(6)

Examining the Bode plot shown above, the magnitude of the uncompensated system equals -10 dB at

approximately 6.1 rad/sec. Therefore, the addition of our lead compensator will move the gain crossover

Page 254: Introduction to Control

frequency from 3.49 rad/sec to approximately 6.1 rad/sec. Using this information, we can then calculate a

value of T from the following in order to center the maximum bump in phase at the new gain crossover

frequency in order to maximize the system's resulting phase margin.

(7)

With the values K = 10, = 0.10, and T = 0.52 calculated above, we now have a first attempt at our lead

compensator. Adding the following lines to your m-file and running at the command line will generate the

plot shown below demonstrating the effect of your lead compensator on the system's frequency response.

K = 10;

alpha = 0.10;

T = 0.52;

C_lead = K*(T*s + 1) / (alpha*T*s + 1);

margin(C_lead*P_pitch), grid

Examination of the above demonstrates that the lead compensator increased the system's phase margin and

gain crossover frequency as desired. We now need to look at the actual closed-loop step response in order

to determine if we are close to meeting our requirements. Replace the step response code in your m-file

with the following and re-run in the MATLAB command window.

Page 255: Introduction to Control

sys_cl = feedback(C_lead*P_pitch,1);

step(0.2*sys_cl), grid

title('Closed-loop Step Response with K = 10, alpha = 0.10, and T =

0.52')

Examination of the above demonstrates that we are close to meeting our requirements. Using the

MATLAB command stepinfo as shown below we can see precisely the characteristics of the closed-

loop step response.

stepinfo(0.2*sys_cl)

ans =

RiseTime: 0.2073

SettlingTime: 8.9835

SettlingMin: 0.1819

SettlingMax: 0.2240

Overshoot: 11.9781

Undershoot: 0

Peak: 0.2240

Page 256: Introduction to Control

PeakTime: 0.4870

From the above, all of our requirements are met except for the overshoot which is a bit larger than the

requirement of 10%. Iterating on the above design process, we arrive at the parameters K = 10, = 0.04,

and T = 0.55. The performance achieved with this controller can then be verified by modifying the code in

your m-file as follows.

K = 10;

alpha = 0.04;

T = 0.55;

C_lead = K*(T*s + 1) / (alpha*T*s + 1);

sys_cl = feedback(C_lead*P_pitch,1);

step(0.2*sys_cl), grid

title('Closed-loop Step Response with K = 10, \alpha = 0.04, and T =

0.55')

Examination of the above step response demonstrates that the requirements are now met. Using

the stepinfo command again more clearly demonstrates that the requirements are met.

stepinfo(0.2*sys_cl)

Page 257: Introduction to Control

ans =

RiseTime: 0.2202

SettlingTime: 9.0427

SettlingMin: 0.1828

SettlingMax: 0.2137

Overshoot: 6.8495

Undershoot: 0

Peak: 0.2137

PeakTime: 0.5344

Therefore, the following lead compensator is able to satisfy all of our design requirements.

(8)

Inverted Pendulum: Frequency Domain Methods for Controller Design

Key MATLAB commands used in this tutorial are: tf , zpkdata , sisotool , feedback , impulse

Contents

System structure

Closed-loop response without compensation

Closed-loop response with compensation

What happens to the cart's position?

In this page we will design a controller for the inverted pendulum system using a frequency response

design method. In the design process we will assume a single-input, single-output plant as described by the

following transfer function. Otherwise stated, we will attempt to control the pendulum's angle without

regard for the cart's position.

(1)

where,

(2)

The controller we are designing will specifically attempt to maintain the pendulum vertically upward when

the cart is subjected to a 1-Nsec impulse. Under these conditions, the design criteria are:

Settling time of less than 5 seconds

Page 258: Introduction to Control

Pendulum should not move more than 0.05 radians away from the vertical

For the original problem setup and the derivation of the above transfer function, please consult the Inverted

Pendulum: System Modeling page.

Note: Applying a frequency response design approach is relatively challenging in the case of this example

because the open-loop system is unstable. That is, the open-loop transfer function has a pole in the right-

half complex plane. For this reason, attempting this example is not recommended if you are just attempting

to learn the basics of applying frequency response techniques. This problem is better suited for more

advanced students who wish to learn about some nuances of the frequency response design approach.

System structure

The structure of the controller for this problem is a little different than the standard control problems you

may be used to. Since we are attempting to control the pendulum's position, which should return to the

vertical after the initial disturbance, the reference signal we are tracking should be zero. This type of

situation is often referred to as a regulator problem. The external force applied to the cart can be considered

as an impulsive disturbance. The schematic for this problem is depicted below.

You may find it easier to analyze and design for this system if we first rearrange the schematic as follows.

Page 259: Introduction to Control

The resulting transfer function for the closed-loop system from an input of force to an output of

pendulum angle is then determined to be the following.

(3)

Before we begin designing our controller, we first need to define our plant within MATLAB. Create a

new m-file and type in the following commands to create the plant model (refer to the main problem for

the details of getting these commands).

M = 0.5;

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

q = (M+m)*(I+m*l^2)-(m*l)^2;

s = tf('s');

P_pend = (m*l*s/q)/(s^3 + (b*(I + m*l^2))*s^2/q - ((M + m)*m*g*l)*s/q -

b*m*g*l/q);

As mentioned above, this system is unstable without control. We can prove this to ourselves by employing

the MATLAB command zpkdata. In this case,zpkdata returns the zeros and poles for the transfer

function. The added parameter 'v' returns the outputs in the form of vectors instead of cell arrays and can

only be employed with single-input, single-output models. Entering the following code in the MATLAB

command window generates the output shown below.

[zeros poles] = zpkdata(P_pend,'v')

zeros =

0

poles =

5.5651

-5.6041

-0.1428

Closed-loop response without compensation

We will now examine the response of the closed-loop system without compensation before we begin to

design our controller. In this example we will employ the SISO Design Tool for examining the various

analysis plots rather than employing individual commands such as bode, nyquist, andimpulse.

Page 260: Introduction to Control

The SISO Design Tool is an interactive tool with graphical user interface (GUI) which can be launched by

the MATLAB command sisotool as shown below.

sisotool('bode',P_pend)

The additional parameter 'bode' opens the SISO Design for SISO Design Task window with the bode

plot of the system (which was passed to the function) as shown below.

We can then modify the system architecture being employed to reflect the fact that our controller is in

the feedback path of our system as discussed above. This is accomplished from within the Control and

Estimation Tools Manager window by clicking on the tab labeled Architecture. Then click on the Control

Architecture button and modify the default configuration to match the form shown below.

Page 261: Introduction to Control

Next we will begin to examine some of the analysis plots for our system. Recall that we can assess the

closed-loop stability of our system based on the open-loop frequency response. In the case of this example,

the open-loop transfer function of our system is given by the following.

(4)

Note, this is true even though the controller is in the feedback path of the system.

In other examples we have specifically employed a Bode plot representation of the open-loop frequency

response. For our system without compensation, we could employ the MATLAB

code bode(P_Pend) to generate this Bode plot. Instead, we will use the SISO Design Tool that we are

employing currently. The open-loop Bode plot of our system is already open, but if it weren't, or if we

Page 262: Introduction to Control

wished to change the type of plot we are employing for design, we could open a new plot from under

the Graphical Tuning tab of the Control and Estimation Tools Manager window as shown below.

Examination of the above Bode plot shows that the magnitude is less than 0 dB and the phase is greater

than -180 degrees for all frequencies. For a minimum-phase system this would indicate that the closed-loop

system is stable with infinite gain margin and infinite phase margin. However, since our system has a pole

in the right-half complex plane, our system is nonminimum phase and the closed-loop system is actually

unstable. We will prove this to ourselves by examining a couple of other analysis plots.

In general, when dealing with nonminimum-phase systems it is preferrable to analyze relative stability

using the Nyquist plot of the open-loop transfer function. The Nyquist plot is also preferred when

analyzing higher-order systems. This is because the Bode plot shows frequencies that are 360 degrees apart

Page 263: Introduction to Control

as being different when in fact they are the same. Since the Nyquist plot is a polar-type plot, this ambiguity

is removed.

In order to generate additional plots to better understand the closed-loop performance of the system, click

on the Analysis Plots tab in the Control and Estimation Tools Manager window. The SISO Design

Tool allows the user to view up to six plots at the same time for analysis. These plots can be viewed for a

number of options, such as open-loop and closed-loop. We will view the Nyquist plot for the open-loop

system and the impulse response of the closed-loop system by following the steps given below.

1. Under the Analysis Plots tab, select a Plot Type of Nyquist for Plot 1. A plot window with a blank

Nyquist plot should appear. Make sure that theReal-Time Update box is checked in the bottom right corner

of the plot window.

2. Select a Plot Type of Impulse for Plot 2.

3. In the Contents of Plots section of the window, check the square for Open Loop L for plot 1 and the

square for Closed Loop r to y for plot 2.

Page 264: Introduction to Control

Then click the Show Analysis Plot button to generate the figure shown below.

Page 265: Introduction to Control

Examination of the above impulse response plot shows that the closed-loop system is unstable. This can

also be verified from the open-loop Nyquist plot by applying the Nyquist stability criterion which is stated

below.

(5)

Where is the number of closed-loop poles in the right-half plane, is the number of open-loop poles in

the right-half plane, and is the number of clockwise encirclements of the point -1 by the open-loop

Nyquist plot.

From our previous discussion we know that our system has one open-loop pole in the right-half plane ( =

1) and from examination of the open-loop Nyquist plot above we can see that there are no encirclements of

the point -1 ( = 0). Therefore, = 0 + 1 = 1 and the closed-loop system has 1 pole in the right-half plane

indicating that it is indeed unstable.

Closed-loop response with compensation

Since the closed-loop system is unstable without compensation, we need to use our controller to stabilize

the system and meet the given requirements. Our first step will be to add an integrator to cancel the zero at

Page 266: Introduction to Control

the origin. To add an integrator, you may right-click on the Bode plot that is already open and choose Add

Pole/Zero > Integrator from the resulting menu. The result is a figure like the one shown below.

Examination of the above shows that at small frequencies the phase plot goes to -270 degrees when in fact

it should remain at -180 degrees. This behavior arises because of numerical errors associated with the

pole/zero cancellation at the origin. To correct this error, exit out of the SISO Design Tool and re-open the

tool with the integrator already added to the plant as shown below.

sisotool('bode',P_pend*(1/s))

Since the integrator is bundled with the plant which is in the forward path, while our controller is actually

in the feedback path, we will not analyze the closed-loop response of this system from within the SISO

Page 267: Introduction to Control

Design Tool. However, the open-loop transfer function is unchanged by whether the controller is in the

forward or feedback path, therefore, we can still use the plots of the open-loop system for analysis and

design. The resulting bode plot that is generated is shown below and reflects the low frequency behavior

we would expect.

Even with the addition of this integrator, the closed-loop system is still unstable. We can attempt to better

understand the instability (and how to resolve it) by looking more closely at the Nyquist plot. We can

generate this analysis plot in the same manner we did previously. Instead, we can also generate this plot by

selecting Open-Loop Nyquist from the Analysis menu accessed from the top of the window containing our

Bode plot. Following these steps generates a figure like the one given below.

Page 268: Introduction to Control

Notice that the open-loop Nyquist plot now encircles the -1 point in the clockwise direction. This means

that the closed-loop system now has two poles in the right-half plane ( ). Hence, the

closed-loop system is still unstable. We need to add phase in order to get a counterclockwise encirclement.

We will do this by adding a zero to our controller. For starters, we will place this zero at -1 and view the

resulting plots. This action can be achieved graphically by right-clicking on the Bode plot as we did

previously. Instead, we will add the zero from the Compensator Editor tab of the Control and Estimation

Tools Manager window. Right-click in the Dynamics section of the window and select Add Pole/Zero >

Real Zero from the resulting menu. By default, the location of the resulting zero is -1. The resulting

window should appear as shown in the figure below.

Page 269: Introduction to Control

This additional zero will change the Bode plot and Nyquist plots that are open as long as the Real-time

Update box is checked. The resulting Nyquist plot should appear as shown below.

Page 270: Introduction to Control

As you can see, this change did not provide enough phase. The encirclement around -1 is still clockwise.

We will try adding a second zero at -1 in the same manner as was described above. The resulting Nyquist

diagram is shown below.

Page 271: Introduction to Control

We still have one clockwise encirclement of the -1 point. However, if we add some gain we can increase

the magnitude of each point of the Nyquist plot, thereby increasing the radius of the counterclockwise

circle such that it encircles the -1 point. This results in = -1 where is negative because the

encirclement is counterclockwise. To achieve this, you can manually enter a new gain value in

the Compensator Editor tab of the Control and Estimation Tools Manager window. Alternatively, you can

modify the gain graphically from the Bode plot. Specifically, go to the Bode plot window, click on the

magnitude plot, and drag the curve up until you have shifted the Nyquist plot far enough to the left that the

counterclockwise circle encompasses the point -1. Note that this is achieved for a gain value of

approximately 3.8. We will continue to increase the gain to a magnitude of approximately 10 as indicated

at the bottom of the Bode plot window. The resulting Bode plot should appear as in the figure below.

Page 272: Introduction to Control

The corresponding Nyquist plot should then appear as in the figure below.

Page 273: Introduction to Control

From our previous discussion we know that = 1, now that = -1, we have = -1 + 1 = 0 closed-loop

poles in the right-half plan indicating that our closed-loop system is stable. We can verify the stability of

our system and determine whether or not the other requirements are met by examining the system's

response to a unit impulse force disturbance. Since the integrator of our controller is currently bundled with

the plant, we will exit from the SISO Design Tool and generate the closed-loop impulse response form the

command line. So far, the controller we have designed has the form given below.

(6)

Adding the following code to your m-file will construct the closed-loop transfer function from an input

of to an output of . Running your m-file at the command line will then generate an impulse

response plot as shown below.

K = 10;

C = K*(s+1)^2/s;

T = feedback(P_pend,C);

Page 274: Introduction to Control

t = 0:0.01:10;

impulse(T,t), grid

title('Response of Pendulum Position to an Impulse Disturbance under

Closed-loop Control');

From examination of the figure above, it is apparent that the response of the system is now stable.

However, the pendulum position overshoots past the required limit of 0.05 radians and the settle time is on

the verge of being greater than the requirement of 5 seconds. Therefore, we will now concentrate on

improving the response. We can use the SISO Design Tool to see how changing the controller gain and the

location of the zeros affects the system's frequency response plots. In this case, increasing the controller

gain increases the system's phase margin which should help reduce the overshoot of the response.

Furthermore, trial and error shows that moving one of the zeros farther to the left in the complex plane

(more negative) makes the response faster. This change also increases the overshoot, but this is offset by

the increase in gain. Experimentation demonstrates that the following controller satisfies the given

requirements.

(7)

Modify your m-file as shown and re-run at the command line to generate the impulse response plot given

below.

Page 275: Introduction to Control

K = 35;

C = K*(s+1)*(s+2)/s;

T = feedback(P_pend,C);

t = 0:0.01:10;

impulse(T, t), grid

title('Response of Pendulum Position to an Impulse Disturbance under

Closed-loop Control');

Our response has met our design goals. Feel free to vary the parameters further to observe what happens.

Note that it also possible to generate the system's response to an impulse disturbance from within the SISO

Design Tool. Including the integrator with the controller, rather than with the plant, as is proper will result

in the numerical abberation observed above, but will not significantly affect the impulse response

generated by MATLAB.

What happens to the cart's position?

At the beginning of this page, a block diagram for the inverted pendulum system was given. The diagram

was not entirely complete. The block representing the response of the cart's position was not included

because that variable is not being controlled. It is interesting though, to see what is happening to the cart's

Page 276: Introduction to Control

position when the controller for the pendulum's angle is in place. To see this we need to consider the full

system block diagram as shown in the following figure.

Rearranging, we get the following block diagram.

In the above, the block is the controller designed for maintaining the pendulum vertical. The closed-

loop transfer function from an input force applied to the cart to an output of cart position is, therefore,

given by the following.

(8)

Referring to the Inverted Pendulum: System Modeling page, the transfer function for is defined as

follows.

Page 277: Introduction to Control

(9)

where,

(10)

Adding the following commands to your m-file (presuming and are still defined) will

generate the response of the cart's position to the same impulsive disturbance we have been considering.

P_cart = (((I+m*l^2)/q)*s^2 - (m*g*l/q))/(s^4 + (b*(I + m*l^2))*s^3/q -

((M + m)*m*g*l)*s^2/q - b*m*g*l*s/q);

T2 = feedback(1,P_pend*C)*P_cart;

T2 = minreal(T2);

t = 0:0.01:10;

impulse(T2, t), grid

title('Response of Cart Position to an Impulse Disturbance under

Closed-loop Control');

The command minreal effectively cancels out all common poles and zeros in the closed-loop transfer

function. This gives the impulse function better numerical properties. As you can see, the cart moves in

Page 278: Introduction to Control

the negative direction and stabilizes at about -0.14 meters. This design might work pretty well for the

actual controller, assuming that the cart had that much room to move. Keep in mind that this was pure luck.

We did not design our controller to stabilize the cart's position, the fact that we have is a fortunate side

effect.

Suspension: Frequency Response Controller Design

Key MATLAB commands used in this tutorial are: tf , conv , bode , margin , feedback , step

Contents

Plotting the frequency response in MATLAB

Adding lead control

Plotting the closed-loop response

From the main problem, the dynamic equations in transfer function form are the following:

(1)

(2)

where,

(3)

and the system schematic is the following where F(s)G1(s) = G2(s).

For the original problem and the derivation of the above equations and schematic, please refer to

the Suspension: System Modeling page.

We want to design a feedback controller so that when the road disturbance (W) is simulated by a unit step

input, the output (X1-X2) has a settling time less than 5 seconds and an overshoot less than 5%. For

Page 279: Introduction to Control

example, when the bus runs onto a 10 cm high step, the bus body will oscillate within a range of +/- 5 mm

and will stop oscillating within 5 seconds.

The system model can be represented in MATLAB by creating a new m-file and entering the following

commands (refer to the main problem for the details of getting those commands).

m1 = 2500;

m2 = 320;

k1 = 80000;

k2 = 500000;

b1 = 350;

b2 = 15020;

nump=[(m1+m2) b2 k2];

denp=[(m1*m2) (m1*(b1+b2))+(m2*b1) (m1*(k1+k2))+(m2*k1)+(b1*b2)

(b1*k2)+(b2*k1) k1*k2];

G1=tf(nump,denp);

num1=[-(m1*b2) -(m1*k2) 0 0];

den1=[(m1*m2) (m1*(b1+b2))+(m2*b1) (m1*(k1+k2))+(m2*k1)+(b1*b2)

(b1*k2)+(b2*k1) k1*k2];

G2=tf(num1,den1);

numf=num1;

denf=nump;

F=tf(numf,denf);

Plotting the frequency response in MATLAB

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 so

that the closed-loop response will also change. Let's first draw the Bode plot for the original open-loop

transfer function. Add the following line of code to your m-file and rerun. You should get the following

Bode plot:

w = logspace(-1,2);

bode(G1,w)

Page 280: Introduction to Control

For convenience in representing systems with different natural frequencies of the system, we normalize

and scale our findings before plotting the Bode plot, so that the low-frequency asymptote of each term is at

0 dB. This normalization by adjusting the gain, K, makes it easier to add the components of the Bode plot.

The effect of K is to move the magnitude curve up (increasing K) or down (decreasing K) by an amount

20*logK, but the gain, K, has no effect on the phase curve. Therefore from the previous plot, K must be

equal to 100 dB or 100,000 to move the magnitude curve up to 0 dB at 0.1 rad/s. Go back to your m-file

and add the following line of code to your m-file before the bode command and rerun. You should get the

following Bode plot:

K=100000;

bode(K*G1,w)

Page 281: Introduction to Control

Adding lead control

From the Bode plot above, we see that the phase curve is concave at about 5 rad/sec. First, we will try to

add positive phase around this region, so that the phase will remain above the -180 degree line. Since a

large phase margin leads to a small overshoot, we will want to add at least 140 degrees of positive phase at

the area near 5 rad/sec. Since one lead controller can add no more than +90 degrees, we will use a two-lead

controller.

To obtain T and a, the following steps can be used:

1. Determine the positive phase needed: Since we want 140 degrees total, we will need 70 degrees from

each controller.

2. Determine the frequency where the phase should be added: In our case this frequency should be 5.0

rad/sec.

3. Determine the constant a from the equation below: This determines the required space between the zero

and the pole for the desired maximum phase added.

(4)

4. Determine T and aT from the following equation: These determine the corner frequencies so that the

maximum phase will be added at the desired frequency.

Page 282: Introduction to Control

(5)

(6)

Now let's put our 2-lead controller into the system and see what the Bode plot looks like. Add the

following code to your m-file, and add a % in front of the previous bode command (if there is one). You

should get the following Bode plot:

a = (1-sin(70/180*pi))/(1+sin(70/180*pi));

w=5;

T=1/(w*sqrt(a));

aT=sqrt(a)/w;

numc = conv([T 1], [T 1]);

denc = conv([aT 1], [aT 1]);

C = tf(numc,denc);

margin(K*C*G1)

Page 283: Introduction to Control

From this plot we see that the concave portion of the phase plot is above -180 degrees now, and the phase

margin is large enough for the design criteria. Let's see how the output (the distance X1-X2) responds to a

bump on the road (W). Recall that the schematic of the system is:

and the closed-loop transfer function can be derived as follows:

sys_cl = F*feedback(G1,K*C);

Plotting the closed-loop response

Let's see what the step response looks like now. Keep in mind that we are using a 0.1 m high step as the

disturbance. To simulate this, simply multiply the system by 0.1. Add the following code into the m-file

and rerun it. Don't forget to put % mark in front of all bode and margin commands!

t=0:0.01:5;

step(0.1*sys_cl,t)

axis([0 5 -.01 .01])

Page 284: Introduction to Control

The amplitude of response is a lot smaller than the percent overshoot requirement and the settling time also

is less than 5 seconds. Since we can see that an amplitude of the output's response less than 0.0001 m or

1% of input magnitude after 4 seconds. Therefore we can say that the settling time is 4 seconds from the

above plot. From the Bode plot above, we see that increasing the gain will increase the crossover frequency

and thus make the response faster. We will increase the gain and see if we can get a better response. Go

back to your m-file and change numc as shown below to generate the following plot.

numc = 4*conv([T 1], [T 1]);

denc = conv([aT 1], [aT 1]);

C = tf(numc,denc);

sys_cl = F*feedback(G1,K*C);

t=0:0.01:5;

step(0.1*sys_cl,t)

axis([0 5 -.01 .01])

Page 285: Introduction to Control

From this plot we can see that the percent overshoot is about 0.15 mm less than the previous plot's and the

settling time also less than 5 seconds. This response is now satisfactory and no more design iteration is

needed.

DC Motor Position: Frequency Domain Methods for Controller Design

Key MATLAB commands used in this tutorial are: tf , sisotool

Contents

Drawing the uncompensated system's Bode plot

Adding an integrator

Gain and phase margin specifications and controller design

From the main problem, the open-loop transfer function of the DC Motor is given as follows.

(1)

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

Page 286: Introduction to Control

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

Position: System Modeling page.

With a 1-radian step reference, the design criteria are the following.

Settling time less than 0.040 seconds

Overshoot less than 16%

No steady-state error, even in the presence of a step disturbance input

First create a new m-file and type in the following commands (refer to main problem for the details of

getting these commands).

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

s = tf('s');

P_motor = K/(s*((J*s+b)*(L*s+R)+K^2));

Drawing the uncompensated system's Bode plot

The main idea of frequency-based design is to use the Bode plot of the open-loop transfer function to

estimate the system's closed-loop response. Adding a controller to the system changes the open-loop Bode

plot, thereby changing the closed-loop response. Let's first draw the Bode plot for the original open-loop

transfer function. Throughout this section, we will use the interactive SISO Design Tool to design our

controller. This tool can be opened for the uncompensated plant by adding the

command sisotool('bode',P_motor) to your m-file.

Two windows will open initially with the SISO Design for SISO Design Task window having the form

shown in the figure below. This figure shows the open-loop Bode plot of the transfer function passed via

Page 287: Introduction to Control

the sisotool function. This figure appears initially due to the addition of the string 'bode' to the

function call. If the string 'bode' is omitted, the default initial window includes the root locus plot in

addition to the open-loop Bode plot.

From previous pages we know that the open-loop plant in unity feedback does not satisfy the given system

requirements. We will, therefore, add different compensators to our system in order to reshape the open-

loop Bode plot to give the desired closed-loop performance.

Adding an integrator

Now let's add a pure integrator compensator to our system. The architecture of the feedback system can be

modified within the SISO Design Tool GUI, but the default compensator C is placed in series with the

plant G in the forward path of the block diagram. This corresponds to the architecture we are assuming, as

Page 288: Introduction to Control

shown in the schematic at the top of this page. Placing an integral compensator in this position will achieve

the goal of zero steady-state error in the presence of a step disturbance input.

The form of our controller is then modified under the Compensator Editor tab of the Control and

Estimation Tools Manager window. Specifically, an integrator is added to our controller by right-clicking

in the Dynamics section of the window and selecting Add Pole/Zero > Integrator from the resulting menu.

The figure below illustrates what the Control and Estimation Tools Manager window should look like.

The Bode plot that is already open should then change as shown below to reflect the addition of the

integrator.

Page 289: Introduction to Control

Gain and phase margin specifications and controller design

Recall that we additionally desire an overshoot of less than 16%. Overshoot of a step response correlates to

a system's phase margin. We will apply the relationship that phase margin approximately equals 100 times

the damping ratio (zeta) to estimate the desired phase margin of our system. We will additionally use our

0.040 second settling time requirement to estimate the desired bandwidth frequency (Wbw) of our closed-

loop system. Add the following code to your m-file to estimate the desired phase margin and bandwidth.

Note that these relationships are intended for a second-order canonical system, which we do not have, but

the results will serve as a good starting point for our design.

zeta = -log(.16) / sqrt( pi^2 + (log(.16))^2 );

PM = 100*zeta

Page 290: Introduction to Control

Wbw = (4/(0.04*zeta))*sqrt((1 - 2*zeta^2) + sqrt(4*zeta^4 -

4*zeta^2+2))

PM =

50.3868

Wbw =

251.5743

The above results demonstrate that we desire to have at least 50 degrees of phase margin in an attempt to

meet the overshoot requirement. Also, a closed-loop bandwidth of 250 rad/sec is desired to additionally

achieve the settle time requirement. We will estimate the closed-loop bandwidth as the point on the open-

loop Bode plot where the magnitude is between -6 and -7.5 dB. From the Bode plot we see that we must

add about 110 degrees of phase and 80 dB of gain at a frequency of 250 rad/sec in order to move the gain

crossover frequency to 250 rad/sec and provide 50 degrees of phase margin. The magnitude plot will then

also lie between -6 and -7.5 dB at a frequency greater than 250 rad/sec.

From the Bode phase plot we can see that there is a pole near -60 as indicated by the blue x on the Bode

plot near the frequency 60 rad/sec (as well as the change in the magnitude and phase plots). We will,

therefore, begin to modify our compensator by adding a zero at s = -60 in order to flatten out the phase

curve. A real zero can be added again by right-clicking in the Dynamics section of the Compensator

Editor tab of the Control and Estimation Tools Manager window. The location of the zero can then be set

by typing -60 into the Location cell of the Edit Selected Dynamics portion of the window and

pressing Enter. Your compensator now has the form of a PI controller and the compensated open-loop

Bode plot should have the modified form shown below where the red o shows the location of the new zero.

To achieve the limits on the axes shown below, right-click on the Bode plot and select Properties from the

resulting menu.

Page 291: Introduction to Control

From the Bode plot we can see that we need at least 50 additional degrees of phase if we move our

crossover frequency to 250 rad/sec. Let's then add a lead compensator to add exactly 50 degrees of phase at

this frequency. The following equations provide the pole and zero locations of the lead compensator.

a = (1 - sin(PM*pi/180))/(1 + sin(PM*pi/180));

T = 1/(Wbw*sqrt(a));

zero = -1/T

pole = -1/(a*T)

zero =

-90.6050

Page 292: Introduction to Control

pole =

-698.5222

The pole and zero of the lead compensator can then be added to our system in the same manner that the

integrator and real zero were added above. Alternatively, we can add a lead compensator by specifiying the

desired maximum phase and frequency location within the SISO Design Tool GUI. This is accomplished

also by right-clicking in the Dynamics section of the Compensator Editor tab of the Control and Estimation

Tools Manager window. Selecting the lead compensator in the Dynamics section of the window then opens

four cells in the Edit Selected Dynamics portion of the window. These four cells allow you to specify the

lead portion of the compensator either in terms of the pole and zero locations, or in terms of the phase and

frequency location. If we enter 50 into the Max Delta Phase (deg) cell and 250 into the at Frequency cell

and hit Enter, we will get a pole and zero location that closely (though not exactly) matches those we

calculated above. The modified Bode plot should then have a similar appearance to the one shown below.

Page 293: Introduction to Control

This new Bode plot now shows that the phase margin is about right at 250 rad/sec, but the gain is too small

by about 55 dB if we wish for the gain crossover to occur at 250 rad/sec. Note that each pole and zero we

have added to the compensator has the form

(2)

rather than (s+z) or (s+p). This default form has a DC gain of 1. Therefore, your magnitude plot will be

shifted up or down compared to the figure shown above if the terms of your compensator have the form

(s+z) and (s+p). Converting from decibels determines that a gain of 600 will shift the magnitude plot up

approximately 55 dBs. This change in gain can be accomplished by typing 600 into the cell multiplying the

compensator at the top of the Edit Compensator tab and pressing Enter. The resulting Bode plot is shown

Page 294: Introduction to Control

below. As indicated on the plot, the phase margin is 49.8 degrees and the gain crossover frequency is 236

rad/sec which are close to our goals of 50 degrees and 250 rad/sec.

Let's now check the resulting step response of the closed-loop system. This plot can be generated under

the Analysis Plots tab of the Control and Estimation Tools Manager window. Specifically, under this tab

choose Plot 1 to be a Step from the drop-down menu in the Analysis Plots section of the tab. Then

check Closed Loop r to y for Plot 1 in the Contents of Plots section of the window. See the figure below for

an illustration of this process.

Page 295: Introduction to Control

The resulting step response plot is shown below, where the details of the peak response and the settling

time are added from the right-click menu underCharacteristics.

Page 296: Introduction to Control

From the above figure, it can be seen that the overshoot is too large and the settling time is better than

expected. This is attributable to the fact that our system does not actually have the form of a canonical

second-order system and because we did not exactly achieve a phase margin of 50 degrees and a

bandwidth of 250 rad/sec.

In order to reduce the overshoot, we will adjust the lead portion of our compensator to provide more phase

margin. Specifically, within the Compensator Editor tab you can change the value of the Max Delta Phase

(deg). By increasing this value, you should see the bump in the phase plot increase and the overshoot in the

step response plot decrease (as long as the box for Real-Time Update is checked). This change will of

course also affect the gain crossover frequency. Therefore, we need to change the value of the compensator

gain to shift the magnitude plot such that the gain crossover frequency is still near 250 rad/sec. This can be

accomplished by manually typing in different values for the gain in the Edit Compensator tab as we have

done previously. Another option is to use the Bode plot since plots in the SISO Design for SISO Design

Task allow for graphical tuning. Specifically, if you place your cursor over the magnitude plot it will turn

into a hand and you can "grab" the plot and move it up or down. The gain in the compensator will

automatically change to reflect the movement of the plot. In the end a choice of 70 degrees of additional

Page 297: Introduction to Control

phase at 250 rad/sec and a gain of 315 give us a phase margin of 70 degrees and an overshoot less than

16% as shown below.

Page 298: Introduction to Control

From the above step response we see that even though the overshoot is fine, the settling time is too long.

We can speed up the system response by trying a slightly higher bandwidth. This can again be

accomplished from the Edit Compensator tab by increasing the frequency where the peak phase of the lead

compensator is positioned. Through trial and error we choose an at Frequency of 350 rad/sec. We then use

the graphical tuning technique to "grab" the magnitude plot of the Bode diagram to shift the crossover

frequency to a location that provides approximately 70 degrees of phase margin. A gain of 670 seems to

work well.

Throughout the tuning, the Bode diagram and step response plot changed according to the changes being

made to the compensator. Your final plots should be similar to the two shown below.

Page 299: Introduction to Control
Page 300: Introduction to Control

Now we have the performance we desire. We have less than 16% overshoot and a settling time less than 40

milliseconds. Furthermore, the integral action of the compensator provides zero steady-state error to a step

reference, even in the presence of a step disturbance input.

DC Motor Speed: Frequency Domain Methods for Controller Design

Key MATLAB commands used in this tutorial are: tf , bode , >margin , step , feedback

Contents

Drawing the original Bode plot

Adding proportional gain

Plotting the closed-loop response

Adding a lag compensator

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)

Page 301: Introduction to Control

(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: Frequency Domain

Methods for 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 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,

thereby changing the closed-loop response. It is our goal to design the controller to shape the open-loop

Page 302: Introduction to Control

Bode plot in such a way that the closed-loop system behaves in a desired manner. Let's first draw the Bode

plot for the original open-loop plant transfer function. Add the following code to the end of your m-file and

run it in the MATLAB command window. You should generate the Bode plot shown below.

bode(P_motor)

grid

title('Bode Plot of the Original Plant')

Adding proportional gain

From the Bode plot above, it appears that the gain margin and phase margin of this system are currently

infinite which indicates the system is robust and has minimal overshoot. The problem with this is that the

phase margin is infinite because the magnitude plot is below 0 dB at all frequencies. This indicates that the

system will have trouble tracking various reference signals without excessive error. Therefore, we would

like to increase the gain of the system while still achieving enough phase margin.

A phase margin of 60 degrees is generally sufficient for stability margin. From the above Bode plot, this

phase margin is achieved for a crossover frequency of approximately 10 rad/sec. The gain needed to raise

the magnitude plot so that the gain crossover frequency occurs at 10 rad/sec appears to be approximately

40 dB. The exact phase and gain of the Bode plot at a given frequency can be determined by clicking on

the graph at the corresponding frequency. The bode command, invoked with left-hand arguments, can

also be used to provide the exact phase and magnitude at 10 rad/sec as shown below.

Page 303: Introduction to Control

[mag,phase,w] = bode(P_motor,10)

mag =

0.0139

phase =

-123.6835

w =

10

Therefore, the exact phase margin for a gain crossover frequency of 10 rad/sec is 180 - 123.7 = 56.3

degrees. Since the exact magnitude at this frequency is 20 log 0.0139 = -37.1 dB, 37.1 dB of gain must be

added to the system. Otherwise stated, a proportional gain of 1/0.0139 = 72 will achieve an open-loop gain

of 1 at 10 rad/sec. Add the following commands to your m-file to observe the effect of this proportional

controller on the system. In this case, we use the margin command instead of the bode command in

order to explicitly see the new gain and phase margins and crossover frequencies.

C = 72;

margin(C*P_motor);

Plotting the closed-loop response

Page 304: Introduction to Control

From the plot above we see that the resulting phase margin and gain crossover frequency are as we

expected. Let's see what the closed-loop response look like. Add a % in front of

the bode and margin commands to comment them out, then add the following code to the end of your

m-file. Rerunning the m-file will produce the step response shown below where the annotations were

added by right-clicking on the plot and choosing Characteristics from the resulting menu.

sys_cl = feedback(C*P_motor,1);

t = 0:0.01:10;

step(sys_cl,t), grid

title('Step Response with Proportional Gain = 72')

Note that the settling time is fast enough, but the overshoot and the steady-state error are too high. The

overshoot can be reduced by decreasing the gain in order to achieve a larger phase margin, but this would

cause the steady-state error to become even larger. A lag compensator could be helpful here in that it can

decrease the gain crossover frequency in order to increase the phase margin without decreasing the

system's DC gain.

Adding a lag compensator

Consider the following lag compensator:

Page 305: Introduction to Control

(4)

This lag compensator has a DC gain of 1/0.01 = 100 which means it will increase the system's static

position error constant by a factor of 100 and will reduce the steady-state error associated with the system's

closed-loop step response. In fact, it allows us to reduce the proportional gain of 72 used earlier, while still

meeting the requirement on steady-state error. We will employ a gain of 45. Furthermore, since the corner

frequencies of the pole and zero are a decade or more below the current gain crossover frequency of 10

rad/sec, the phase lag contributed by the compensator shouldn't adversely affect performance much. A

Bode plot of the lag compensator can be generated employing the following commands.

C = 45*(s + 1)/(s + 0.01);

bode(C)

grid

title('Bode Plot of the Lag Compensator')

The resulting step response can then be observed by modifying the code in your m-file as follows.

sys_cl = feedback(C*P_motor,1);

t = 0:0.01:10;

step(sys_cl,t), grid

Page 307: Introduction to Control

The transfer function model for the cruise control problem is given below. Please see the Cruise Control:

System Modeling page for the derivation.

(1)

System parameters

For this example, let's assume that the parameters of the system are

(m) vehicle mass 1000 kg

(b) damping coefficient 50 N.s/m

(r) reference speed 10 m/s

(u) nominal control force 500 N

and the block diagram of an typical unity feedback system is shown below.

Performance specifications

Rise time < 5 sec

Overshoot < 10%

Steady-state error < 2%

Bode plot and open-loop response

The first step in solving this problem using frequency response is to determine what open-loop transfer

function to use. Just like for the Root-Locus design method, we will only use a proportional controller to

solve the problem. The block diagram and the open-loop transfer function are shown below.

(2)

In order to use a Bode plot, the open-loop response must be stable. Let Kp equal 1 for now and see how the

open-loop response looks like. Create a new m-file and enter the following commands.

m = 1000;

Page 308: Introduction to Control

b = 50;

u = 500;

Kp = 1;

s = tf('s');

P_cruise = 1/(m*s+b);

C = Kp;

step(u*C*P_cruise)

As you can see, the open-loop system is stable; thus, we can go ahead and generate the Bode plot. Change

the above m-file by deleting the stepcommand and adding in the following command.

bode(C*P_cruise);

Page 309: Introduction to Control

Proportional controller

Refer to the Introduction: Frequency Domain Methods for Controller Design page, and let's see what

system characteristics we can determine from the above Bode plot.

The steady-state error can be found from the following equation:

(3)

For this system, the low frequency gain is -34dB = 0.02; therefore, the steady-state error should be 98%.

We can confirm this by generating a closed-loop step response as follows.

r = 10;

sys_cl = feedback(C*P_cruise,1);

step(r*sys_cl);

Page 310: Introduction to Control

We need to increase the low frequency gain in order to improve the steady-state error. Specifically, the

error needs to be < 2%; therefore, 1/(1+M_{w=0}) < 0.02 -> M_{w=0} > 49 = 33.8 dB. So to reach the

desired steady-state error using proportional control only requires a Kp > 67.8 dB = 2455. Let's look at the

Bode diagram of the compensated open-loop system.

Kp = 2500;

C = Kp;

bode(C*P_cruise);

Page 311: Introduction to Control

As you can see from the Bode plot above, the low frequency magnitude is now, 34 dB. Now let's simulate

the step response of the closed loop system with this gain.

sys_cl = feedback(C*P_cruise,1);

step(r*sys_cl);

Page 312: Introduction to Control

The steady-state error meets the requirements; however, the rise time is much shorter than is needed and is

unreasonable in this case since the car can not accelerate to 10 m/s in 2 sec. Therefore, we will try using a

smaller proportional gain to reduce the control action required along with a lag compensator to reduce the

steady-state error.

Lag compensator

If you take a look at the "Lag or Phase-Lag Compensator using Frequency Response" section of the Lead

and Lag Compensator Design page, the lag compensator adds gain at the low frequencies while keeping

the bandwidth frequency at the same place. This is actually what we need: Larger low frequency gain to

reduce the steady-state error and keep the same bandwidth frequency to maintain the desired rise time. The

transfer function of the lag controller is:

(4)

If you read the "Lag or Phase-Lag Compensator using Root-Locus" section in Lead and Lag Compensator

Design page, the pole and the zero of a lag controller need to be placed close together. Also, it states that

the steady-state error will be reduce by a factor of zo/po. For these reasons, let zo equal 0.1 and po equal

0.02. The proportional gain, Kp = 1000 was chosen by trial-and-error.

Kp = 1000;

zo = 0.1;

Page 313: Introduction to Control

po = 0.02;

C_lag = (s+zo)/(s+po);

bode(Kp*C_lag*P_cruise);

Let's confirm the performance by generating a closed-loop step response.

sys_cl = feedback(Kp*C_lag*P_cruise,1);

t = 0:0.1:20;

step(r*sys_cl,t);

Page 314: Introduction to Control

As you can see, there is a very slight overshoot, the steady state error is close to zero, and the rise time is

under 5 seconds. The system has now met all of the design requirements. No more iteration is needed.

Cruise Control: State-Space Methods for Controller Design

In this tutorial we will design a controller and observer for the cruise control system using the state-space

model.

Key MATLAB commands used in this tutorial are: ss , feedback

Contents

State-space equations

Design requirements

Control design using pole placement

Reference input

State-space equations

The equations of motion in state-space form are as follows:

(1)

Page 315: Introduction to Control

(2)

where

(m) vehicle mass 1000 kg

(b) damping coefficient 50 N.s/m

(u) nominal control force 500 N

(v) vehicle velocity where y=v is the system output

Design requirements

Rise time < 5 s

Overshoot < 10%

Steady-state error < 2%

To see the original problem setup, see the Cruise Control: System Modeling page.

Control design using pole placement

The schematic of a full state-feedback system is shown below.

(3)

where

K = state-feedback gain matrix

u = r-K.v = control input

Recall from the State-Space Tutorial page, we can use a "pole placement" technique to obtain the desired

output. Poles of a closed-loop system can be found from the characteristic equation: the determinant of the

[sI-(A-B*K)] matrix. If the poles the system can be placed in the desired location by designing an

appropriate control matrix (K), then the desired output can be obtained. In this tutorial, poles will be

chosen first, then we will use MATLAB to find the corresponding control matrix (K).

Page 316: Introduction to Control

Now, we need to determine where to place poles for our system. Since our [sI-(A-B*K)] matrix is 1x1, we

have only one pole to place. Let the pole be at -1.5 (arbitrary). Just as in the State-Space Tutorial, the

MATLAB command place will be used to find the control matrix K. Create a new m-file and enter the

following commands. Running the m-file in the MATLAB command window should give you the control

matrix and step response shown below.

m = 1000;

b = 50;

t = 0:0.1:10;

u = 500*ones(size(t));

A = [-b/m];

B = [1/m];

C = [1];

D = [0];

sys = ss(A,B,C,D);

x0 = [0];

p1 = -1.5;

K = place(A,B,[p1])

sys_cl = ss(A-B*K,B,C,D);

lsim(sys_cl,u,t,x0);

axis([0 10 0 0.35])

K =

1450

Page 317: Introduction to Control

As you can see, the rise time is satisfactory, but the steady-state error is too large.

Reference input

Once again from the State-Space Tutorial page, a scaling factor called Nbar (the schematic is shown

below) can be used to eliminate the steady-state error. We can use the rscale function to compute the

scaling factor. Download it here, rscale.m. The input is already multiplied by 500, and we want the steady-

state speed to be 10 m/sec, so we need to account for these factors as well.

Copy the following commands to an m-file and run it in the MATLAB command window. You should get

the step response shown below.

Nbar = rscale(sys,K)*10/500;

Page 318: Introduction to Control

sys_cl = ss(A-B*K,B*Nbar,C,D);

lsim(sys_cl,u,t,x0);

axis([0 10 0 11])

As you can see, the steady-state error has been eliminated. The rise time is less than 5 seconds and the

overshoot is, in fact, zero. All the design requirements are satisfied.

DC Motor Speed: State-Space Methods for Controller Design

Key MATLAB commands used in this tutorial are: ss , >order , rank , ctrb , place , step

Contents

Designing the full-state feedback controller

Adding a precompensator

From the main problem, the dynamic equations in state-space form are given below.

(1)

Page 319: Introduction to Control

(2)

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

Speed: System Modeling page. These state-space equations have the standard form shown below where the

state vector x = [ theta_dot i ] and the input u = V.

(3)

(4)

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

Settling time less than 2 seconds

Overshoot less than 5%

Steady-stage error less than 1%

Now let's design a controller using the methods introduced in the Introduction: State-Space Methods for

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;

A = [-b/J K/J

-K/L -R/L];

B = [0

1/L];

C = [1 0];

D = 0;

sys = ss(A,B,C,D);

Designing the full-state feedback controller

Since both of the state variables in our problem are easy to measure (simply add an ammeter for current

and a tachometer for the speed), we can design a full-state feedback controller for the system without

worrying about having to add an observer. The control law for a full-state feedback system has the

form u = r - Kc x and the associated schematic is shown below.

Page 320: Introduction to Control

Recall that the characteristic polynomial for this closed-loop system is the determinant of sI - (A - B*Kc)

where s is the Laplace variable. Since the matrices A and B*Kc are both 2x2 matrices, there should be 2

poles for the system. This fact can be verified with the MATLAB command order. If the given system is

controllable, then by designing a full-state feedback controller we can move these two poles anywhere

we'd like. Whether the given system is controllable or not can be determined by checking the rank of the

controllability matrix [ B AB A^2B ...]. The MATLAB command ctrb constructs the controllability

matrix given matrices A and B. Additionally, the command rank determines the rank of a given matrix.

The following commands executed at the command line will verify the system's order and whether or not

the system is controllable.

sys_order = order(sys)

sys_rank = rank(ctrb(A,B))

sys_order =

2

sys_rank =

2

From the above, we know that our system is controllable since the controllability matrix is full rank. We

will first place the poles at -5+i and -5-i (note that this corresponds to a zeta = 0.98 which gives close to

0% overshoot and a sigma = 5 which provides a 0.8 second settling time). Once we have determined the

pole locations we desire, we can use the MATLAB commands place or acker to determine the

controller gain matrix, Kc, to achieve these poles. We will use the command place since it is numerically

better conditioned than acker. However, if we wished to place a pole with multiplicity greater than the

rank of the matrix B, then we would have to use the command acker. Add the following code to the end

of your m-file. Running in the command window will generate the feedback gain matrix output below.

p1 = -5 + 1i;

p2 = -5 - 1i;

Page 321: Introduction to Control

Kc = place(A,B,[p1 p2])

Kc =

12.9900 -1.0000

Referring back to the state-space equations at the top of the page, we see that substituting the state-

feedback law u = r - Kc x for u leads to the following expression.

(5)

(6)

We can then see the closed-loop response by simply adding the following lines to the end of your m-file.

Running your m-file in the command window will then give the plot shown below.

t = 0:0.01:3;

sys_cl = ss(A-B*Kc,B,C,D);

step(sys_cl,t)

grid

title('Step Response with State-Feedback Controller')

Adding a precompensator

Page 322: Introduction to Control

From this plot we see that the steady-state error is too large. One approach for eliminating the steady-state

error is to simply scale the input so that the output in turn is scaled to the desired level. This is a little

challenging in our example because we have two states to consider. Therefore, we need to compute what

the steady-state values of both states should be, multiply them by the chosen gain Kc, and use the result as

our "reference" for computing the input u. This can be done in one step by adding a constant gain

precompensator Nbar after the reference as shown in the following schematic.

We can find this Nbar factor by employing the used-defined function rscale.m as shown below.

Nbar = rscale(sys,Kc)

Nbar =

13.0000

Note that the function rscale.m is not a standard function in MATLAB. You will have to download it

and place it in your current directory. Click here for further information. Now you can plot the step

response by adding the above and following lines of code to your m-file and re-running at the command

line.

t = 0:0.01:10;

step(sys_cl*Nbar,t)

grid

title('Step Response with State-Feedback Controller and

Precompensator')

Page 323: Introduction to Control

This time, the steady-state error is much less than 1%, and all the other design criteria have been met as

well.

Note that the precompensator Nbar employed above is calculated based on the model of the plant and

further that the precompensator is located outside of the feedback loop. Therefore, if there are errors in the

model (or unknown disturbances) the precompensator will not correct for them and there will be steady-

state error. You may recall that the addition of integral control may also be used to eliminate steady-state

error, even in the presence of model uncertainty and step disturbances. For an example of how to

implement integral control in the state space setting, see the DC Motor Position: State-Space Methods for

Controller Design example. The tradeoff with using integral control is that the error must first develop

before it can be corrected for, therefore, the system may be slow to respond. The precompensator on the

other hand is able to anticipitate the steady-state offset using knowledge of the plant model. A useful

technique is to combine the precompensator with integral control to leverage the advantages of each

approach.

DC Motor Position: State-Space Methods for Controller Design

Key MATLAB commands used in this tutorial are: ss , order , det , ctrb , place , step

Contents

Designing the full state-feedback controller

Disturbance response

Page 324: Introduction to Control

Adding integral action

From the main problem, the dynamic equations in state-space form are given below.

(1)

(2)

The above has the form of a standard set of state-space equations as described below.

(3)

(4)

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

Position: System Modeling page

With a 1-radian step reference, the design criteria are the following.

Settling time less than 0.040 seconds

Overshoot less than 16%

No steady-state error, even in the presence of a step disturbance input

First create a new m-file and type in the following commands (refer to main problem for the details of

getting these commands).

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

A = [0 1 0

0 -b/J K/J

0 -K/L -R/L];

B = [0 ; 0 ; 1/L];

Page 325: Introduction to Control

C = [1 0 0];

D = 0;

motor_ss = ss(A,B,C,D);

Designing the full state-feedback controller

Since all of the state variables in our problem are very easy to measure (simply add an ammeter for current,

a tachometer for speed, and a potentiometer for position), we can design a full-state feedback controller for

the system without worrying about having to add an observer. The control law for a full-state feedback

system has the form u = r - Kc x. The associated block diagram is given below.

Recall that the characteristic polynomial for this closed-loop system is the determinant of sI-(A-B*Kc)

where s is the Laplace variable. Since the matrices Aand B*Kc are both 3x3 matrices, there should be 3

poles for the system. This fact can be verified with the MATLAB command order. If the given system is

controllable, then by designing a full state-feedback controller we can move these three poles anywhere

we'd like. Whether the given system is controllable or not can be determined by checking the rank of the

controllability matrix [ B AB A^2B ...]. The MATLAB command ctrb constructs the controllability

matrix given A and B. Additionally, the command rank determines the rank of a given matrix, though it

can be numerically unreliable. Therefore, we will use the command det to calculate the determinant of the

controllability matrix where a full rank matrix has a non-zero determinant. The following commands

executed at the command line will verify the system's order and whether or not it is controllable.

sys_order = order(motor_ss)

determinant = det(ctrb(A,B))

sys_order =

3

determinant =

-3.4636e+24

Page 326: Introduction to Control

From the above, we know that our system is controllable since the determinant of the controllability matrix

is not zero and hence we can place the system's closed-loop poles anywhere in the s-plane. We will first

place the poles at -200, -100+100i and -100-100i. By ignoring the effect of the first pole (since it is faster

than the other two poles), the dominant poles correspond to a second-order system with zeta = 0.5

corresponding to 0.16% overshoot and sigma = 100 which corresponding to a settling time of 0.040

seconds. Once we have determined the pole locations we desire, we can use the MATLAB

commands place or acker to determine the controller gain matrix, Kc, to achieve these poles. We will

use the command place since it is numerically better conditioned than acker. However, if we wished to

place a pole with multiplicity greater than the rank of the matrix B, then we would have to use the

command acker. Add the following code to the end of your m-file.

p1 = -100+100i;

p2 = -100-100i;

p3 = -200;

Kc = place(A,B,[p1, p2, p3])

Kc =

0.0013 -0.0274 -3.9989

Referring back to the equations and schematic at the top of the page, we see that employing a state-

feedback law u = r - Kc x, the state-space equations become the following.

(5)

(6)

We can generate the closed-loop response to a step reference by adding the following lines to the end of

your m-file. Run your m-file in the command window and you should generate a plot like the one shown

below.

t = 0:0.001:0.05;

sys_cl = ss(A-B*Kc,B,C,D);

step(sys_cl,t)

Page 327: Introduction to Control

Note that our given requirements are not met, specifically, the steady-state error is much too large. Before

we address this, let's first look at the system's disturbance response.

Disturbance response

In order to observe the system's disturbance response, we must provide the proper input to the system. In

this case, a disturbance is physically a load torque that acts on the inertia of the motor. This load torque

acts as an additive term in the second state equation (which gets divided by J, as do all the other terms in

this equation). We can simulate this simply by modifying our closed-loop input matrix, B, to have a 1 / J in

the second row assuming that our current input is only the disturbance.

Add the following lines to your m-file and re-run.

dist_cl = ss(A-B*Kc,[0; 1/J ; 0], C, D);

step(dist_cl,t)

Page 328: Introduction to Control

Notice that the error due to the step disturbance is non-zero. Therefore, this will also need to be

compensated for.

Adding integral action

From prior examples, we know that if we put an extra integrator in series with the plant it can remove the

steady-state error due to a step reference. If the integrator comes before the injection of the disturbance, it

will also cancel a step disturbance input in steady state. This changes our control structure so that it now

resembles the block diagram shown in the following figure.

Page 329: Introduction to Control

We can model the addition of this integrator by augmenting our state equations with an extra state for the

integral of the error which we will identify with the variable w. This adds an extra state equation, where the

derivative of this state is then just the error, e = y - r where y = theta. This equation will be placed at the

bottom of our matrices. The reference r, therefore, now appears as an additional input to our system. The

output of the system remains the same.

(7)

(8)

(9)

These equations represent the dynamics of the system before the loop is closed. We will refer to the system

matrices in this equation that are augmented with the additional integrator state as Aa, Ba, Ca, and Da. The

vector multiplying the reference input r will be referred to as Br. We will refer to the state vector of the

Page 330: Introduction to Control

augmented system as xa. Note that the reference, r, does not affect the states (except the integrator state) or

the output of the plant. This is expected since there is no path from the reference to the plant input, u,

without implementing the state-feedback gain matrix Kc.

In order to find the closed-loop equations, we have to look at how the input, u, affects the plant. In this

case, it affects the system in exactly the same manner as in the unaugmented equations except now u = -

Kc x - Ki w. We can also rewrite this in terms of our augmented state as u = -Ka xa where Ka = [ Kc Ki ].

Substituting this u into the equations above provides the following closed-loop equations.

(10)

(11)

In the above, the integral of the error will be fed back, and will result in the steady-state error being

reduced to zero. Now we must redesign our controller to account for the augmented state vector. Since we

need to place each pole of the system, we will place the pole associated with the additional integrator state

at -300, which will be faster than the other poles.

Add the following lines to your m-file which reflect the closed-loop equations presented above. Note that

since the closed-loop transition matrix Aa-Ba*Kadepends on Ba, it will be used in the place command

rather than Br. Running your m-file will then produce the plot shown below.

Aa = [0 1 0 0

0 -b/J K/J 0

0 -K/L -R/L 0

1 0 0 0];

Ba = [0 ; 0 ; 1/L ; 0 ];

Br = [0 ; 0 ; 0; -1];

Ca = [1 0 0 0];

Da = [0];

p4 = -300;

Ka = place(Aa,Ba,[p1,p2,p3,p4]);

t = 0:0.001:.05;

sys_cl = ss(Aa-Ba*Ka,Br,Ca,Da);

step(sys_cl,t)

Page 331: Introduction to Control

To observe the disturbance response, we use a similar approach to that used without the integral action.

dist_cl = ss(Aa-Ba*Ka,[0 ; 1/J ; 0; 0],Ca,Da);

step(dist_cl,t)

Page 332: Introduction to Control

We can see that all of the design specifications are close to being met by this controller. The settle time

may be a little large, but by placing the closed-loop poles a little farther to the left in the complex s-plane,

this requirement can also be met.

Suspension: State-Space Controller Design

Key MATLAB commands used in this tutorial are: ss , step

Contents

Designing the full state-feedback controller

Plotting the closed-loop response

From the main problem, the dynamic equations in state-space form are the following where Y1 = X1 - X2.

(1)

Page 333: Introduction to Control

(2)

(3)

For the original problem and the derivation of the above equations and schematic, please refer to

the Suspension: System Modeling page.

We want to design a feedback controller so that when the road disturbance (W) is simulated by a unit step

input, the output (X1-X2) has a settling time less than 5 seconds and an overshoot less than 5%. For

example, when the bus runs onto a 10 cm high step, the bus body will oscillate within a range of +/- 5 mm

and will stop oscillating within 5 seconds.

The system model can be represented in MATLAB by creating a new m-file and entering the following

commands (refer to main problem for the details of getting those commands). We need to define the A, B,

C, D matrices by entering the following into the m-file:

m1 = 2500;

m2 = 320;

k1 = 80000;

k2 = 500000;

b1 = 350;

b2 = 15020;

A=[0 1 0

0

-(b1*b2)/(m1*m2) 0 ((b1/m1)*((b1/m1)+(b1/m2)+(b2/m2)))-(k1/m1)

-(b1/m1)

b2/m2 0 -((b1/m1)+(b1/m2)+(b2/m2))

1

k2/m2 0 -((k1/m1)+(k1/m2)+(k2/m2))

0];

B=[0 0

1/m1 (b1*b2)/(m1*m2)

Page 334: Introduction to Control

0 -(b2/m2)

(1/m1)+(1/m2) -(k2/m2)];

C=[0 0 1 0];

D=[0 0];

sys=ss(A,B,C,D);

Designing the full state-feedback controller

First, let's design a full state-feedback controller for the system. Assuming for now that all the states can be

measured (this assumption is probably not true but is sufficient for this problem), the schematic of the

system is shown below.

The characteristic polynomial for this closed-loop system is the determinant of (sI-(A-B[1,0]'K)). Note that

it's not sI-(A-BK) because the controller K can only control the force input u but not the road disturbance

W. Recall that our B matrix is a 4 x 2 matrix, and we only need the first column of B to control U.

For this example, we have to use integral action to achieve zero steady-state error, so we add an extra state

which is int(X1-X2) = int(Y1). In reality the bus will eventually reach an equilibrium that yields a zero

steady-state error. The new states are X1, X1_dot, Y1, Y1_dot, and Y2. Also the state-space matrices, A,

B, and C, become the following after the addition of the new state.

Aa=[0 1 0

0 0

-(b1*b2)/(m1*m2) 0 ((b1/m1)*((b1/m1)+(b1/m2)+(b2/m2)))-(k1/m1)

-(b1/m1) 0

b2/m2 0 -((b1/m1)+(b1/m2)+(b2/m2))

1 0

k2/m2 0 -((k1/m1)+(k1/m2)+(k2/m2))

0 0

Page 335: Introduction to Control

0 0 1

0 0];

Ba=[0 0

1/m1 (b1*b2)/(m1*m2)

0 -(b2/m2)

(1/m1)+(1/m2) -(k2/m2)

0 0];

Ca=[0 0 1 0 0];

Da=[0 0];

sys=ss(Aa,Ba,Ca,Da);

Actually, there is a shortcut for MATLAB to achieve the same result.

Aa = [[A,[0 0 0 0]'];[C, 0]];

Ba = [B;[0 0]];

Ca = [C,0];

Da = D;

sys=ss(Aa,Ba,Ca,Da);

Add the above MATLAB code into the m-file. In this case, we treat the problem like a PID controller

design. The integral control is obtained from the new state. The proportional control is obtained from a

gain on Y1 or X1-X2. The direct derivative control of the output isn't possible, since derivative of Y1 or

X1-X2 isn't a state. Instead we use the derivative of X1, which is available for feedback. (While X1 maybe

hard to measure, X1_dot could be obtained by integrating the output of an accelerometer mounted on the

bus.) It is similar to adding more damping to the velocity of the oscillation of the bus suspension. Add the

following MATLAB code for controller K in the m-file:

K = [0 2.3e6 5e8 0 8e6]

K =

0 2300000 500000000 0 8000000

We arrived at this value of the K, matrix by trial and error, adjusting the gain for derivative of X1, Y1 and

integral of Y1, as previously mentioned.

Plotting the closed-loop response

Looking at the schematic above again, we see that after adding the K matrix into the system, the state-

space equations become:

Page 336: Introduction to Control

(4)

(5)

We can now obtain the closed-loop response by simply adding the following code into the m-file. Note that

we need to multiply B matrix by 0.1 to simulate the 0.1-m high step disturbance.

t = 0:0.01:2;

sys_cl = ss(Aa-Ba(:,1)*K,-0.1*Ba,Ca,Da);

step(sys_cl*[0;1],t)

title('Closed-Loop Response to a 0.1-m Step')

From the plot we see that the percent overshoot and settling time requirements are satisfied. Moreover the

steady-state error approaches zero as well. Therefore, we will determine that the response is satisfactory.

Feel free to play around with the gain for matrix K.

Inverted Pendulum: State-Space Methods for Controller Design

Key MATLAB commands used in this tutorial

are: ss , eig , lsim , lqr , ctrb , plotyy , obsv , place

Contents

Page 337: Introduction to Control

Open-loop poles

Linear Quadratic Regulation (LQR)

Adding precompensation

Observer-based control

From the main problem, the dynamic equations of the inverted pendulum system in state-space form are

the following:

(1)

(2)

To see how this problem was originally set up and the system equations were derived, consult the Inverted

Pendulum: System Modeling page. For this problem the outputs are the cart's displacement ( in meters)

and the pendulum angle ( in radians) where represents the deviation of the pedulum's position from

equilibrium, that is, .

The design criteria for this system for a 0.2-m step in desired cart position are as follows:

Settling time for and of less than 5 seconds

Rise time for of less than 0.5 seconds

Pendulum angle never more than 20 degrees (0.35 radians) from the vertical

Steady-state error of less than 2% for and

As you may have noticed if you went through some of the other inverted pendulum examples, the design

criteria for this example are different. In the other examples we were attemping to keep the pendulum

vertical in response to an impulsive disturbance force applied to the cart. We did not attempt to control the

cart's position. In this example, we are attempting to keep the pendulum vertical while controlling the cart's

position to move 0.2 meters to the right. A state-space design approach is well suited to the control of

multiple outputs as we have here.

This problem can be solved using full-state feedback. The schematic of this type of control system is

shown below where is a matrix of control gains. Note that here we feedback all of the system's states,

rather than using the system's outputs for feedback.

Page 338: Introduction to Control

Open-loop poles

In this problem, represents the step command of the cart's position. The 4 states represent the position and

velocity of the cart and the angle and angular velocity of the pendulum. The output contains both the

position of the cart and the angle of the pendulum. We want to design a controller so that when a step

reference is given to the system, the pendulum should be displaced, but eventually return to zero (i.e.

vertical) and the cart should move to its new commanded position. To view the system's open-loop

response please refer to the Inverted Pendulum: System Analysis page.

The first step in designing a full-state feedback controller is to determine the open-loop poles of the

system. Enter the following lines of code into an m-file. After execution in the MATLAB command

window, the output will list the open-loop poles (eigenvalues of ) as shown below.

M = 0.5;

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

p = I*(M+m)+M*m*l^2; %denominator for the A and B matrices

A = [0 1 0 0;

0 -(I+m*l^2)*b/p (m^2*g*l^2)/p 0;

0 0 0 1;

0 -(m*l*b)/p m*g*l*(M+m)/p 0];

Page 339: Introduction to Control

B = [ 0;

(I+m*l^2)/p;

0;

m*l/p];

C = [1 0 0 0;

0 0 1 0];

D = [0;

0];

states = {'x' 'x_dot' 'phi' 'phi_dot'};

inputs = {'u'};

outputs = {'x'; 'phi'};

sys_ss =

ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs);

poles = eig(A)

poles =

0

-5.6041

-0.1428

5.5651

As you can see, there is one right-half plane pole at 5.5651. This should confirm your intuition that the

system is unstable in open loop.

Linear Quadratic Regulation (LQR)

The next step in the design process is to find the vector of state-feedback control gains assuming that we

have access (i.e. can measure) all four of the state variables. This can be accomplished in a number of

ways. If you know the desired closed-loop pole locations, you can use the MATLAB

commands place or acker. Another option is to use the lqr command which returns the optimal

controller gain assuming a linear plant, quadratic cost function, and reference equal to zero (consult your

textbook for more details).

Page 340: Introduction to Control

Before we design our controller, we will first verify that the system is controllable. Satisfaction of this

property means that we can drive the state of the system anywhere we like in finite time (under the

physical constraints of the system). For the system to be completely state controllable, the controllability

matrix must have rank where the rank of a matrix is the number of independent rows (or columns). The

controllability matrix of the system takes the form shown below. The number corresponds to the number

of state variables of the system. Adding additional terms to the controllability matrix with higher powers of

the matrix will not increase the rank of the controllability matrix since these additional terms will just be

linear combinations of the earlier terms.

(3)

Since our controllability matrix is 4x4, the rank of the matrix must be 4. We will use the MATLAB

command ctrb to generate the controllability matrix and the MATLAB command rank to test the rank

of the matrix. Adding the following additional commands to your m-file and running in the MATLAB

command window will produce the following output.

co = ctrb(sys_ss);

controllability = rank(co)

controllability =

4

Therefore, we have verified that our system is controllable and thus we should be able to design a

controller that achieves the given requirements. Specifically, we will use the linear quadratic

regulation method for determining our state-feedback control gain matrix . The MATLAB

function lqrallows you to choose two parameters, and , which will balance the relative importance of

the control effort ( ) and error (deviation from 0), respectively, in the cost function that you are trying to

optimize. The simplest case is to assume , and . The cost function corresponding to

this and places equal importance on the control and the state variables which are outputs (the

pendulum's angle and the cart's position). Essentially, the lqr method allows for the control of both outputs.

In this case, it is pretty easy to do. The controller can be tuned by changing the nonzero elements in

the matrix to achieve a desirable response. To observe the structure of , enter the following into the

MATLAB command window to see the output given below.

Q = C'*C

Q =

1 0 0 0

0 0 0 0

0 0 1 0

0 0 0 0

Page 341: Introduction to Control

The element in the (1,1) position of represents the weight on the cart's position and the element in the

(3,3) position represents the weight on the pendulum's angle. The input weighting will remain at 1.

Ultimately what matters is the relative value of and , not their absolute values. Now that we know how

to interpret the matrix, we can experiment to find the matrix that will give us a "good" controller. We

will go ahead and find the matrix and plot the response all in one step so that changes can be made in the

control and seen automatically in the response. Add the following commands to the end of your m-file and

run in the MATLAB command window to get the following value for and the response plot shown

below.

Q = C'*C;

R = 1;

K = lqr(A,B,Q,R)

Ac = [(A-B*K)];

Bc = [B];

Cc = [C];

Dc = [D];

states = {'x' 'x_dot' 'phi' 'phi_dot'};

inputs = {'r'};

outputs = {'x'; 'phi'};

sys_cl =

ss(Ac,Bc,Cc,Dc,'statename',states,'inputname',inputs,'outputname',outpu

ts);

t = 0:0.01:5;

r =0.2*ones(size(t));

[y,t,x]=lsim(sys_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with LQR Control')

Page 342: Introduction to Control

K =

-1.0000 -1.6567 18.6854 3.4594

The curve in green represents the pendulum's angle in radians, and the curve in blue represents the cart's

position in meters. As you can see, this plot is not satisfactory. The pendulum and cart's overshoot appear

fine, but their settling times need improvement and the cart's rise time needs to be reduced. As I'm sure you

have noticed, the cart's final position is also not near the desired location but has in fact moved in the

opposite direction. This error will be dealt with in the next section and right now we will focus on the

settling and rise times. Go back to your m-file and change the matrix to see if you can get a better

response. You will find that increasing the (1,1) and (3,3) elements makes the settling and rise times go

down, and lowers the angle the pendulum moves. In other words, you are putting more weight on the errors

at the cost of increased control effort . Modifying your m-file so that the (1,1) element of is 5000 and

the (3,3) element is 100, will produce the following value of and the step response shown below.

Q = C'*C;

Q(1,1) = 5000;

Q(3,3) = 100

R = 1;

K = lqr(A,B,Q,R)

Page 343: Introduction to Control

Ac = [(A-B*K)];

Bc = [B];

Cc = [C];

Dc = [D];

states = {'x' 'x_dot' 'phi' 'phi_dot'};

inputs = {'r'};

outputs = {'x'; 'phi'};

sys_cl =

ss(Ac,Bc,Cc,Dc,'statename',states,'inputname',inputs,'outputname',outpu

ts);

t = 0:0.01:5;

r =0.2*ones(size(t));

[y,t,x]=lsim(sys_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with LQR Control')

Q =

5000 0 0 0

0 0 0 0

0 0 100 0

0 0 0 0

K =

-70.7107 -37.8345 105.5298 20.9238

Page 344: Introduction to Control

You may have noted that if you increased the values of the elements of even higher, you could improve

the response even more. The reason this weighting was chosen was because it just satisfies the transient

design requirements. Increasing the magnitude of more would make the tracking error smaller, but

would require greater control force . More control effort generally corresponds to greater cost (more

energy, larger actuator, etc.).

Adding precompensation

The controller we have designed so far meets our transient requirements, but now we must address the

steady-state error. In contrast to the other design methods, where we feedback the output and compare it to

the reference input to compute an error, with a full-state feedback controller we are feeding back all of the

states. We need to compute what the steady-state value of the states should be, multiply that by the chosen

gain , and use a new value as our "reference" for computing the input. This can be done by adding a

constant gain after the reference. The schematic below shows this relationship:

Page 345: Introduction to Control

We can find this factor by employing the used-defined function rscale.m as shown below. The matrix

is modified to reflect the fact that the reference is a command only on cart position.

Cn = [1 0 0 0];

sys_ss = ss(A,B,Cn,0);

Nbar = rscale(sys_ss,K)

Nbar =

-70.7107

Note that the function rscale.m is not a standard function in MATLAB. You will have to download

it here and place it in your current directory. More information can be found here, Extras: rscale.m. Now

you can plot the step response by adding the above and following lines of code to your m-file and re-

running at the command line.

sys_cl =

ss(Ac,Bc*Nbar,Cc,Dc,'statename',states,'inputname',inputs,'outputname',

outputs);

t = 0:0.01:5;

r =0.2*ones(size(t));

[y,t,x]=lsim(sys_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with Precompensation and LQR Control')

Page 346: Introduction to Control

Now, the steady-state error is within our limits, the rise and settle times are met, and the pendulum's

overshoot is within range of the design criteria.

Note that the precompensator employed above is calculated based on the model of the plant and further

that the precompensator is located outside of the feedback loop. Therefore, if there are errors in the model

(or unknown disturbances) the precompensator will not correct for them and there will be steady-state

error. You may recall that the addition of integral control may also be used to eliminate steady-state error,

even in the presence of model uncertainty and step disturbances. For an example of how to implement

integral control in the state space setting, see the Motor Position: State-Space Methods example. The

tradeoff with using integral control is that the error must first develop before it can be corrected for,

therefore, the system may be slow to respond. The precompensator on the other hand is able to anticipitate

the steady-state offset using knowledge of the plant model. A useful technique is to combine the

precompensator with integral control to leverage the advantages of each approach.

Observer-based control

The response achieved above is good, but was based on the assumption of full-state feedback, which is not

necessarily valid. To address the situation where not all state variables are measured, a state estimator must

be designed. A schematic of state-feedback control with a full-state estimator is shown below, without the

precompensator .

Page 347: Introduction to Control

Before we design our estimator, we will first verify that our system is observable. The property of

observability determines whether or not based on the measured outputs of the system we can estimate the

state of the system. Similar to the process for verifying controllability, a system is observable if its

observability matrix is full rank. The observability matrix is defined as follows.

(4)

We can employ the MATLAB command obsv to contruct the observability matrix and

the rank command to check its rank as shown below.

ob = obsv(sys_ss);

observability = rank(ob)

observability =

4

Page 348: Introduction to Control

Since the observability matrix is 8x4 and has rank 4, it is full rank and our system is observable. The

observability matrix in this case is not square since our system has two outputs. Note that if we could only

measure the pendulum angle output, we would not be able to estimate the full state of the system. This can

be verified by the fact that obsv(A,C(2,:)) produces an observability matrix that is not full rank.

Since we know that we can estimate our system state, we will now describe the process for designing a

state estimator. Based on the above diagram, the dynamics of the state estimate are described by the

following equation.

(5)

The spirit of this equation is similar to that of closed-loop control in that last term is a correction based on

feedback. Specifically, the last term corrects the state estimate based on the difference between the actual

output and the estimated output . Now let's look at the dynamics of the error in the state estimate.

(6)

Therefore, the state estimate error dynamics are described by

(7)

and the error will approach zero ( will approach ) if the matrix is stable (has negative

eigenvalues). As is with the case for control, the speed of convergence depends on the poles of the

estimator (eigenvalues of ). Since we plan to use the state estimate as the input to our controller,

we would like the state estimate to converge faster than is desired from our overall closed-loop system.

That is, we would like the observer poles to be faster than the controller poles. A common guideline is to

make the estimator poles 4-10 times faster than the slowest controller pole. Making the estimator poles too

fast can be problematic if the measurement is corrupted by noise or there are errors in the sensor

measurement in general.

Based on this logic, we must first find the controller poles. To do this, copy the following code to the end

of your m-file. If you employed the updated matrix, you should see the following poles in the MATLAB

command window.

poles = eig(Ac)

poles =

-8.4910 + 7.9283i

-8.4910 - 7.9283i

-4.7592 + 0.8309i

-4.7592 - 0.8309i

The slowest poles have real part equal to -4.7592, therefore, we will place our estimator poles at -40. Since

the closed-loop estimator dynamics are determined by a matrix ( ) that has a similar form to the

matrix that determines the dynamics of the state-feedback system ( ), we can use the same

Page 349: Introduction to Control

commands for finding the estimator gain as we can for finding the state-feedback gain . Specifically,

since taking the transpose of leaves the eigenvalues unchanged and produces a

result that exactly matches the form of , we can use the acker orplace commands.

Recalling that the place command cannot place poles of multiplicity greater than one, we will place the

observer poles as follows. Add the following commands to your m-file to calculate the matrix and

generate the output shown below.

P = [-40 -41 -42 -43];

L = place(A',C',P)'

L =

1.0e+03 *

0.0826 -0.0010

1.6992 -0.0402

-0.0014 0.0832

-0.0762 1.7604

We are using both outputs (the angle of the pendulum and the position of the cart) to design the observer.

Now we will combine our state-feedback controller from before with our state estimator to get the full

compensator. The resulting closed-loop system is described by the following matrix equations.

(8)

(9)

The closed-loop system described above can be implemented in MATLAB by adding the following

commands to the end of your m-file. After running the m-file the step response shown will be generated.

Ace = [(A-B*K) (B*K);

zeros(size(A)) (A-L*C)];

Bce = [B*Nbar;

zeros(size(B))];

Cce = [Cc zeros(size(Cc))];

Dce = [0;0];

states = {'x' 'x_dot' 'phi' 'phi_dot' 'e1' 'e2' 'e3' 'e4'};

inputs = {'r'};

Page 350: Introduction to Control

outputs = {'x'; 'phi'};

sys_est_cl =

ss(Ace,Bce,Cce,Dce,'statename',states,'inputname',inputs,'outputname',o

utputs);

t = 0:0.01:5;

r = 0.2*ones(size(t));

[y,t,x]=lsim(sys_est_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with Observer-Based State-Feedback Control')

This response is almost identical to the response achieved when it was assumed that we had full access to

the state variables. This is because the observer poles are fast, and because the model we assumed for the

observer is identical to the model of the actual plant (including the same initial conditions). Therefore, all

Page 351: Introduction to Control

of the design requirements have been met with the minimal control effort expended. No further iteration is

needed.

This example demonstrates that it is much easier to control multi-input, multi-output systems with the

state-space method than with the other methods we have presented.

Inverted Pendulum: Digital Controller Design

Key MATLAB commands used in this tutorial

are: ss , c2d , ctrb , obsv , dlqr , lsim , plotyy , eig , place

Contents

Discrete state-space

Controllability and observability

Control design via pole placement

Precompensator design

Observer design

In this digital control version of the inverted pendulum problem, we will use the state-space method to

design the digital controller. If you refer to theInverted Pendulum: System Modeling page, the linearized

state-space equations were derived as:

(1)

(2)

where:

(M) mass of the cart 0.5 kg

(m) mass of the pendulum 0.2 kg

(b) coefficient of friction for cart 0.1 N/m/sec

(l) length to pendulum center of mass 0.3 m

(I) mass moment of inertia of the pendulum 0.006 kg.m^2

(F) force applied to the cart

(x) cart position coordinate

(theta) pendulum angle from vertical (down)

Page 352: Introduction to Control

For this problem the outputs are the cart's displacement ( in meters) and the pendulum angle ( in radians)

where represents the deviation of the pedulum's position from equilibrium, that is, = + .

The design criteria for this system for a 0.2-m step in desired cart position are as follows:

Settling time for and theta of less than 5 seconds

Rise time for of less than 0.5 seconds

Pendulum angle never more than 20 degrees (0.35 radians) from the vertical

Steady-state error of less than 2% for and

Discrete state-space

Our first step in designing a digital controller is to convert the above continuous state-space equations to a

discrete form. We will accomplish this employing the MATLAB function c2d. This function requires that

we specify three arguments: a continuous system model, the sampling time (Ts in sec/sample), and

the 'method'. You should already be familiar with how to construct a state-space system from , , ,

and matrices.

In choosing a sample time, note that it is desired that the sampling frequency be fast compared to the

dynamics of the system. One measure of a system's "speed" is its closed-loop bandwidth. A good rule of

thumb is that the sampling time be smaller than 1/30th of the closed-loop bandwidth frequency which can

be determined from the closed-loop Bode plot.

Assuming that the closed-loop bandwidth frequencies are around 1 rad/sec for both the cart and the

pendulum, let the sampling time be 1/100 sec/sample. The discretization method we will use is the zero-

order hold ('zoh'). For further details, refer to the Introduction: Digital Controller Designpage. Now we

are ready to use c2d function. Enter the following commands into an m-file. Running this m-file in the

MATLAB command window gives you the following four matrices representing the discrete time state-

space model.

M = 0.5;

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

p = I*(M+m)+M*m*l^2; %denominator for the A and B matrices

A = [0 1 0 0;

Page 353: Introduction to Control

0 -(I+m*l^2)*b/p (m^2*g*l^2)/p 0;

0 0 0 1;

0 -(m*l*b)/p m*g*l*(M+m)/p 0];

B = [ 0;

(I+m*l^2)/p;

0;

m*l/p];

C = [1 0 0 0;

0 0 1 0];

D = [0;

0];

states = {'x' 'x_dot' 'phi' 'phi_dot'};

inputs = {'u'};

outputs = {'x'; 'phi'};

sys_ss =

ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs);

Ts = 1/100;

sys_d = c2d(sys_ss,Ts,'zoh')

sys_d =

a =

x x_dot phi phi_dot

x 1 0.009991 0.0001336 4.453e-07

x_dot 0 0.9982 0.02672 0.0001336

phi 0 -2.272e-05 1.002 0.01001

phi_dot 0 -0.004544 0.3119 1.002

Page 354: Introduction to Control

b =

u

x 9.086e-05

x_dot 0.01817

phi 0.0002272

phi_dot 0.04544

c =

x x_dot phi phi_dot

x 1 0 0 0

phi 0 0 1 0

d =

u

x 0

phi 0

Sample time: 0.01 seconds

Discrete-time state-space model.

Now we have obtained the discrete state-space model of the form:

(3)

(4)

Controllability and observability

Page 355: Introduction to Control

The next step is to check the controllability and the observability of the system. For the system to be

completely state controllable, the controllability matrix

(5)

must have the rank of n. The rank of the matrix is the number of independent rows (or columns). In the

same token, for the system to be completely state observable, the observability matrix

(6)

must also have the rank of n. These tests for controllability and observability are identical to the situation

of continuous control except that now the state space model is discrete.

Since the number of state variables in our system is 4, the rank of both matrices must be 4. The

function rank can give you the rank of each matrix. Adding the following commands to your m-file and

running in the MATLAB command window will generate the results shown below.

co = ctrb(sys_d);

ob = obsv(sys_d);

controllability = rank(co)

observability = rank(ob)

controllability =

4

observability =

4

This proves that our discrete system is both completely state controllable and completely state observable.

Control design via pole placement

The schematic of a full-state feedback control system is shown below.

Page 356: Introduction to Control

The next step is to assume that all four states are measurable and design the control gain matrix . If you

refer to the continuous Inverted Pendulum: State-Space Methods for Controller Design page the Linear

Quadratic Regulator (LQR) method was used to find the control gain matrix . In this digital version, we

will use the same LQR method. This method allows you to find the control gain that results in the optimal

balance between system errors and control effort. Please consult your control textbook for details. To use

this LQR method, we need to specify two parameters, the performance index matrix and the state-cost

matrix . For simplicity, we will initially choose the performance index matrix equal to 1, and the state-

cost matrix equal to . The relative weightings of these two matrices will then be tuned by trial and

error. The state-cost matrix has the following structure.

(7)

The element in the (1,1) position of represents the weight on the cart's position and the element in the

(3,3) position represents the weight on the pendulum's angle.

Now we are ready to find the control gain matrix and observe the resulting closed-loop response of the

system. Since we are designing a digital controller, we will specificially employ the MATLAB

function dlqr. Add the following commands to a your m-file and run it in the MATLAB command

window. Note that in the following we are overwriting the values of the state-space matrices , , ,

and with their discrete-time equivalents using the model derived with the c2d command above.

A = sys_d.a;

B = sys_d.b;

C = sys_d.c;

D = sys_d.d;

Q = C'*C

Page 357: Introduction to Control

R = 1;

[K] = dlqr(A,B,Q,R)

Ac = [(A-B*K)];

Bc = [B];

Cc = [C];

Dc = [D];

states = {'x' 'x_dot' 'phi' 'phi_dot'};

inputs = {'r'};

outputs = {'x'; 'phi'};

sys_cl =

ss(Ac,Bc,Cc,Dc,Ts,'statename',states,'inputname',inputs,'outputname',ou

tputs);

t = 0:0.01:5;

r =0.2*ones(size(t));

[y,t,x]=lsim(sys_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with Digital LQR Control')

Q =

1 0 0 0

0 0 0 0

0 0 1 0

0 0 0 0

K =

-0.9384 -1.5656 18.0351 3.3368

Page 358: Introduction to Control

The curve in green represents the pendulum's angle in radians, and the curve in blue represents the cart's

position in meters. As you can see, this plot is not satisfactory. The pendulum and cart's overshoot appear

fine, but their settling times need improvement and the cart's rise time needs to be reduced. As I'm sure you

have noticed, the cart's final position is also not near the desired location but has in fact moved in the

opposite direction. This error will be dealt with in the next section and right now we will focus on the

settling and rise times. Go back to your m-file and change the matrix to see if you can get a better

response. You will find that increasing the (1,1) and (3,3) elements makes the settling and rise times go

down, and lowers the angle the pendulum moves. In other words, you are putting more weight on the errors

at the cost of increased control effort . Modifying your m-file so that the (1,1) element of is 5000 and

the (3,3) element is 100, will produce the following value of and the step response shown below.

A = sys_d.a;

B = sys_d.b;

C = sys_d.c;

D = sys_d.d;

Q = C'*C;

Q(1,1) = 5000;

Q(3,3) = 100

Page 359: Introduction to Control

R = 1;

[K] = dlqr(A,B,Q,R)

Ac = [(A-B*K)];

Bc = [B];

Cc = [C];

Dc = [D];

states = {'x' 'x_dot' 'phi' 'phi_dot'};

inputs = {'r'};

outputs = {'x'; 'phi'};

sys_cl =

ss(Ac,Bc,Cc,Dc,Ts,'statename',states,'inputname',inputs,'outputname',ou

tputs);

t = 0:0.01:5;

r =0.2*ones(size(t));

[y,t,x]=lsim(sys_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with Digital LQR Control')

Q =

5000 0 0 0

0 0 0 0

0 0 100 0

0 0 0 0

K =

-61.9933 -33.5040 95.0597 18.8300

Page 360: Introduction to Control

From this plot, we see that all design requirements are satisfied except the steady-state error of the cart

position . We can easily correct this by introducing a feedforward scaling factor .

Precompensator design

Unlike other design methods, the full-state feedback system does not compare the output directly to the

reference, rather, it compares the state vector multiplied by the control matrix ( ) to the reference (see

the schematic shown above). Thus, we should not expect the output to converge to the commanded

reference. To obtain the desired output, we need to scale the reference input so that the output equals the

reference. This can be easily done by introducing a feedforward scaling factor . The basic full state-

feedback schematic with scaling factor is shown below.

Page 361: Introduction to Control

Unfortunately, we cannot use our user-defined function rscale to find because this function was

defined for continuous-time single-output systems. We can, however, find the scaling factor by trial and

error. After several trials, equal to -61.55 provided a satisfactory response. Adding the following

commands to your m-file and running in the command window will generate the response shown below.

Nbar = -61.55;

sys_cl =

ss(Ac,Bc*Nbar,Cc,Dc,Ts,'statename',states,'inputname',inputs,'outputnam

e',outputs);

t = 0:0.01:5;

r =0.2*ones(size(t));

[y,t,x]=lsim(sys_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with Digital LQR Control and Precompensation')

Page 362: Introduction to Control

Notice that the steady-state error of the cart's position has been eliminated. Now we have designed a

system that satisfies all of the design requirements. Note, however, that the scaling factor was designed

based on a model of the system. If our model is in error or there are unknown disturbances, then the

steady-state error will no longer be driven to zero.

Observer design

The above response satisfies all of the design requirements, however, it was found assuming all state

variables of the system are measurable. This assumption may not be valid for all systems. In this section,

we develop a technique for estimating the state of the system based on the measured outputs and a model

of the plant. The object that estimates the state of system is called an observer. Thus, in this section we will

design a full-order state observer to estimate all of the system's state variables, including those that are

measured. For further explanation on how an observer works, please consult your control textbook.

A basic schematic of the observer-based state-feedback system is shown below.

Page 363: Introduction to Control

Designing the observer equates to finding the observer gain matrix . To accomplish this, we need to first

determine the closed-loop poles of the system without the observer (the eigenvalues of ). This can

be achieved using the MATLAB command eig as shown below.

poles = eig(A-B*K)

poles =

0.9157 + 0.0728i

0.9157 - 0.0728i

0.9535 + 0.0079i

0.9535 - 0.0079i

Since the observer is attempting to estimate the values of state variables which are themselves changing, it

is desired that the dynamics of the observer be significantly faster than the dynamics of the closed-loop

system without the observer. A common guideline is to make the estimator poles (eigenvalues of )

4-10 times faster than the slowest controller pole (eigenvalue of ). Making the estimator poles too

fast can be problematic if the measurement is corrupted by noise or there are errors in the sensor

measurement in general. Based on the poles found above, we will place the observer poles at [-0.2 -0.21 -

Page 364: Introduction to Control

0.22 -0.23]. These poles can be modified later, if necessary. We will use the MATLAB function place to

find the matrix. Add the following code to your m-file and re-run in the command window to generate

the observer gain matrix shown below.

P = [-0.2 -0.21 -0.22 -0.23];

L = place(A',C',P)'

L =

2.4308 -0.0104

147.6324 -1.2418

-0.0131 2.4305

-1.8079 147.9057

Now we will obtain the overall system response including the observer. Add the following commands to

your m-file and run to generate the response shown below.

Ace = [(A-B*K) (B*K);

zeros(size(A)) (A-L*C)];

Bce = [B*Nbar;

zeros(size(B))];

Cce = [Cc zeros(size(Cc))];

Dce = [0;0];

states = {'x' 'x_dot' 'phi' 'phi_dot' 'e1' 'e2' 'e3' 'e4'};

inputs = {'r'};

outputs = {'x'; 'phi'};

sys_est_cl =

ss(Ace,Bce,Cce,Dce,Ts,'statename',states,'inputname',inputs,'outputname

',outputs);

t = 0:0.01:5;

r = 0.2*ones(size(t));

[y,t,x]=lsim(sys_est_cl,r,t);

[AX,H1,H2] = plotyy(t,y(:,1),t,y(:,2),'plot');

Page 365: Introduction to Control

set(get(AX(1),'Ylabel'),'String','cart position (m)')

set(get(AX(2),'Ylabel'),'String','pendulum angle (radians)')

title('Step Response with Digital Observer-Based State-Feedback

Control')

This response is almost identical to the response achieved when it was assumed that we had full access to

the state variables. This is because the observer poles are fast, and because the model we assumed for the

observer is identical to the model of the actual plant (including the same initial conditions). Therefore, all

of the design requirements have been met with the minimal control effort expended. No further iteration is

needed.

Suspension: Digital Controller Design

Key MATLAB commands used in this tutorial

are: ss , step , c2d , ssdata , tfdata , roots , place

Contents

Sampling time selection

Continuous to discrete conversion

Adding integral control

Page 366: Introduction to Control

Designing the controller

Simulating the closed-loop response

In this example, we will design a digital state-space controller for the bus suspension control example. First

we will convert the continuous-time model to a discrete-time model, and then use the pole placement

method to design the controller. From the Suspension: System Modeling page. the state space model of the

system is where Y1 = X1-X2.

(1)

(2)

(3)

Where:

(m1) 1/4 bus body mass 2500 kg

(m2) suspension mass 320 kg

(k1) spring constant of suspension system 80,000 N/m

(k2) spring constant of wheel and tire 500,000 N/m

(b1) damping constant of suspension system 350 N.s/m

(b2) damping constant of wheel and tire 15,020 N.s/m

(U) control force

The design requirements are:

Overshoot: Output (X1-X2) less than 5% of disturbance (W)

Settling time: Less than 5 seconds

Sampling time selection

The first step in the design of a discrete-time controller is to convert the continuous plant to its discrete

time equivalent. First, we need to pick an appropriate sampling time, T. In this example, selection of

sampling time is very important since a step in the road surface very quickly affects the output. Physically,

Page 367: Introduction to Control

what happens is the road surface suddenly lifts the wheel, compressing the spring, K2, and the damper, b2.

Since the suspension mass is relatively low, and the spring fairly stiff, the suspension mass rises quickly,

increasing X2 almost immediately. Since the controller can only see the effect of the disturbance after a

complete sampling period, we have to pick a sampling time, T, short enough so that the output (X1-X2)

does not exceed the 5% requirement in one sampling period. To pick the sampling period, we need to

closely examine the beginning of the step response. If you remember from the Suspension: System

Analysis page, the output quickly goes negative in response to a step disturbance, and then begins to

oscillate. We will simulate just the beginning of this response by setting the time vector input to the step

function to range from 0 to .005. The response to a .1m step input is simulated by multiplying the B matrix

by .1. Create a new m-file and enter the following code:

m1 = 2500;

m2 = 320;

k1 = 80000;

k2 = 500000;

b1 = 350;

b2 = 15020;

A = [0 1 0

0

-(b1*b2)/(m1*m2) 0 ((b1/m1)*((b1/m1)+(b1/m2)+(b2/m2)))-(k1/m1)

-(b1/m1)

b2/m2 0 -((b1/m1)+(b1/m2)+(b2/m2))

1

k2/m2 0 -((k1/m1)+(k1/m2)+(k2/m2))

0];

B = [0 0

1/m1 (b1*b2)/(m1*m2)

0 -(b2/m2)

(1/m1)+(1/m2) -(k2/m2)];

C = [0 0 1 0];

D = [0 0];

sys = ss(A,B,C,D);

Page 368: Introduction to Control

step(sys*[0;1]*.1,0:0.0001:.005);

This plot shows that the spring, K1 compresses very quickly, and exceeds our requirement of 5mm in

response to a 0.1-m step after only a little more than 0.001s. Therefore, we will set T=.0005s in order to

give the controller a chance to respond.

Continuous to discrete conversion

Now that we have selected a sampling time, we can convert the plant to discrete time. MATLAB can be

used to convert the above state space model, sus, to a discrete state space model, d_sys, by using

the c2d command. The c2d command takes three arguments: the continuous time system, the sampling

time, T, and the type of hold circuit. In this example we will use zero-order hold ('zoh'). Refer to

the Introduction: Digital Controller Design tutorial.

Add the following code to your m-file. Running in the command window, MATLAB should return the

following, which represents the new discrete-time state-space model.

T = .0005;

d_sys = c2d(sys,T,'zoh')

d_sys =

a =

Page 369: Introduction to Control

x1 x2 x3 x4

x1 1 0.0005 -3.126e-06 -1.802e-08

x2 -0.003461 1 -0.01244 -7.313e-05

x3 0.02338 5.852e-06 0.976 0.000494

x4 0.7705 0.0001935 -0.9112 0.9998

b =

u1 u2

x1 4.999e-11 8.506e-07

x2 1.999e-07 0.003461

x3 4.375e-10 -0.02338

x4 1.762e-06 -0.7705

c =

x1 x2 x3 x4

y1 0 0 1 0

d =

u1 u2

y1 0 0

Sample time: 0.0005 seconds

Discrete-time state-space model.

Adding integral control

In this example, we will need to add an integrator to the system in order to drive the steady-state response

to zero. We will add this integrator in series with the plant. This will have the effect of adding another state

to the plant. An integrator in discrete-time state space can be represented as a trapezoidal approximation of

integration over each sample period as follows:

(4)

Page 370: Introduction to Control

(5)

To add this, add the following commands in your m-file:

Ai = 1;

Bi = T;

Ci = 1;

Di = T/2;

[As,Bs,Cs,Ds]=ssdata(d_sys);

Aa = [As, zeros(4,1);

Bi*Cs, Ai];

Ba = [Bs;

0,0];

Ca = [Cs, 0];

Da = Ds;

d_sys_int = ss(Aa,Ba,Ca,Da,T);

[Ad,Bd,Cd,Dd] = ssdata(d_sys_int);

Designing the controller

The structure of the controller is similar to the structure of the continuous-time state-space controller. We

will now use the place command to compute the gain matrix, K, which will, in feedback, give us the

desired closed-loop poles.

We first need to decide where to place the closed-loop poles. Since we get to place all five of the closed-

loop poles, we can be very selective about where they go. In particular, we can place them to cancel all of

the plant zeros, as well as give us the desired response. First, we will find the plant zeros by converting the

plant's digital state equations to a transfer function, and then finding the roots of the numerator. We will

use the tfdata command which takes a system (d_sys) as its argument and outputs a transfer function

numerator and denominator. Since the suspension system (d_sys) has two inputs, only one input must be

selected. Notice how the first input is selected in the following code.

Add the following code to your m-file:

sys1 = d_sys_int*[1;0]; %select the first input

[num,den] = tfdata(sys1,'v');

z = roots(num)

Page 371: Introduction to Control

z =

-0.9929

0.9986 + 0.0065i

0.9986 - 0.0065i

We will select these three zeros as three of our desired closed-loop poles. One of the other two will be

selected at .9992 since a pole there settles in approximately 10000 samples (or 5 seconds). The last pole

will be selected at z=.5 since this is sufficiently fast to be insignificant. Add the following code to your m-

file:

p1 = z(1);

p2 = z(2);

p3 = z(3);

p4 = .9992;

p5 = .5;

K=place(Ad,Bd*[1;0],[p1 p2 p3 p4 p5])

K =

1.0e+09 *

0.0534 0.0000 1.0898 0.0011 1.8286

Simulating the closed-loop response

We can use the step command to simulate the closed-loop response. Since multiplying the state vector by

K in our controller only returns a single signal, U, we need to add a row of zeros to K by multiplying it by

[1 0]T. This is identical to what was done in the continuous design to compensate for the fact that there are

two inputs to the plant, but only one is a control input. We will simulate with a negative 0.1-m step

disturbance in the road to give us a positive deflection of the bus for aesthetic reasons. Enter the following

code into your m-file:

d_sys_cl = ss(Ad-Bd*[1;0]*K,Bd,Cd,Dd,T);

step(-.1*d_sys_cl*[0;1],5);

Page 372: Introduction to Control

We can see in this plot, that the overshoot is less than 5mm, and the response settles well within 5 seconds.

Changing the axes allows a better view of the suspension's initial response.

d_sys_cl = ss(Ad-Bd*[1;0]*K,Bd,Cd,Dd,T);

step(-.1*d_sys_cl*[0;1],5);

axis([0 0.1 -.01 .01])

Page 373: Introduction to Control

Published with MATLAB® 7.14

DC Motor Position: Digital Controller Design

Key MATLAB commands used in this tutorial

are: tf , c2d , minreal , zpk , feedback , stairs , step

Contents

Creating a sampled-date model of the plant

Root locus design

In this example, the controller will be designed applying a Root Locus method. A sample-data DC motor

model can be obtained from conversion of an analog DC motor model, as we will describe. According to

the DC Motor Position: System Modeling page, the continuos open-loop transfer function for DC motor's

position in the Laplace domain is the following.

(1)

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

Page 374: Introduction to Control

Also from the main page, the design requirements for a 1-radian step reference are the following.

Settling time less than 0.040 seconds

Overshoot less than 16%

No steady-state error, even in the presence of a step disturbance input

Creating a sampled-date model of the plant

The first step in the design of a digital control system is to generate a sampled-data model of the plant.

Therefore, it is necessary to choose a frequency with which the continuous-time plant is sampled. In

choosing a sampling period, it is desired that the sampling frequency be fast compared to the dynamics of

the system in order that the sampled output of the system captures the system's full behavior, that is, so that

significant inter-sample behavior isn't missed.

Let's create a continuous-time model of the plant. Create a new m-file and add the following MATLAB

code (refer to the main problem for the details of getting these commands). Running the m-file within the

MATLAB command window will generate the output shown below.

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

s = tf('s');

P_motor = K/(s*((J*s+b)*(L*s+R)+K^2));

zpk(P_motor)

ans =

Page 375: Introduction to Control

3086245930.9988

------------------------

s (s+1.454e06) (s+59.23)

Continuous-time zero/pole/gain model.

The use of the zpk command above transforms the transfer function into a form where the zeros, poles,

and gain can be seen explicitly. Examining the poles of the plant (or its frequency response), it is clear that

the pole at -1.45e06 contributes very little to the response of the plant. The gain crossover frequency of the

plant is approximately 5 Hz. Therefore, choosing a sampling period of 0.001 seconds (frequency of 1000

Hz) is significantly faster than the dynamics of the plant. This sampling period is also fast compared to the

speed that will be achieved by the resultant closed-loop system. A sample time of 0.001 seconds is

specifically 1/100 of the required time constant and 1/40 of the required settling time.

In this case, we will convert the given transfer function from the continuous Laplace domain to the discrete

z-domain. MATLAB can be used to achieve this conversion through the use of the c2d command.

The c2d command requires three arguments: a system model, the sampling time (Ts), and the type of hold

circuit. In this example, we will assume a zero-order hold (zoh) circuit. Refer to the Introduction: Digital

Controller Design page for further details. Adding the following commands to your m-file and running in

the MATLAB command window generates the sampled-data model shown below.

Ts = 0.001;

dP_motor = c2d(P_motor, Ts, 'zoh');

zpk(dP_motor)

ans =

0.0010389 (z+0.9831) (z+9.256e-07)

----------------------------------

z (z-1) (z-0.9425)

Sample time: 0.001 seconds

Discrete-time zero/pole/gain model.

From the above, notice that there is a pole and zero very near to z = 0 that effectively cancel. This

cancellation in the transfer function can be accomplished by applying the minreal command with a

Page 376: Introduction to Control

tolerance of 0.001. Cancellation of this pole and zero will reduce the order of our transfer function and will

help to avoid numerical difficulties in MATLAB. Applying the minreal command, therefore, produces

the following reduced order transfer function. Note the absence of the pole and zero near z = 0.

dP_motor = minreal(dP_motor,0.001);

zpk(dP_motor)

ans =

0.0010389 (z+0.9831)

--------------------

(z-1) (z-0.9425)

Sample time: 0.001 seconds

Discrete-time zero/pole/gain model.

We would now like to analyze the closed-loop response of the system without any additional

compensation. First, we have to close the loop of the transfer function by using the feedback command.

After closing the loop, let's inspect the closed-loop step response with the zero-order hold. This can be

accomplished by using the step and stairs commands. Since the step command is fed a discrete

model, it will output a vector of discrete samples at the sample time Ts associated with the model

(click here for further details). The syntax below specifies to simulate the step response for 0.5 seconds.

The stairs command draws these discrete data points as a stairstep, just like what would be produced by

a zero-order hold circuit. Add the following code at the end of your previous m-file and rerun it. You

should generate a plot like the one shown below.

sys_cl = feedback(dP_motor,1);

[x1,t] = step(sys_cl,.5);

stairs(t,x1)

xlabel('Time (seconds)')

ylabel('Position (radians)')

title('Stairstep Response: Original')

grid

Page 377: Introduction to Control

Root locus design

We will now employ a root locus design methodology to generate a digital controller for our system. The

main idea of a root locus approach to design is to modify the closed-loop response by placing the closed-

loop poles of the system at desired locations. Adding poles and zeros to the the original open-loop transfer

function via the controller allows us to reshape the root locus in order to place the closed-loop poles at the

desired locations. This approach can also be used for discrete-time models. We will use the SISO Design

Tool graphical user interface (GUI) for designing our controller. Adding the

command sisotool('rlocus',dP_motor) to your m-file will open the SISO Design Tool when

run at the command line.

Two windows will open initially with the SISO Design for SISO Design Task window having the form

shown in the figure below. This figure shows the root locus of the transfer function d_Pmotor passed

through the sisotool function. This figure appears initially due to the addition of the

string 'rlocus' to the function call. If the string 'rlocus' is omitted, the default initial window

includes the open-loop Bode plot in addition to the root locus plot.

Page 378: Introduction to Control

Recall from our previous controller designs that we have added an integrator to our compensator in order

to reject the effect of a constant disturbance in steady state. We can add integral control through the SISO

Design Tool interface under the Compensator Editor tab of the Control and Estimation Tools

Manager window. Specifically, an integrator is added to our controller by right-clicking on

the Dynamics section of the window and selecting Add Pole/Zero > Integrator from the resulting menu.

The figure below illustrates what the Control and Estimation Tools Manager window should look like.

Page 379: Introduction to Control

Integral control in the continuous-time domain is 1 / s. The SISO tool uses a forward difference

approximation for mapping from the s-plane to the z-plane as described by s = (z-1) / Ts, where Ts is the

sample time being employed. Therefore, the addition of the integrator will add an additional pole at 1 on

the root locus plot. See below for the resulting root locus plot where the red x denotes the location of the

compensator pole at z = 1.

Page 380: Introduction to Control

The default format for compensators in the SISO Design Tool is Time constant form. For the remainder of

this problem, we will design the compensator in Zero/pole/gain form. This change can be made by

choosing SISO Tool Preferences ... from the Edit menu of the Control and Estimation Tools

Manager window. The compensator parameterization can then be changed under the Options tab.

By default, the root locus plot includes the unit circle shown in the above figure by the dashed line. Recall

that for a discrete-time system, closed-loop poles located within the unit circle indicate a stable closed-loop

system. From the above, we can see that the after adding the extra pole at 1, the root locus had three poles

near 1. This caused the root locus to move to the right (outside of the unit circle) indicating that the closed-

loop response will be more unstable.

Therefore, we will add a zero near 1, inside the unit circle, to cancel one of the poles and pull the root locus

in. We will specifically add a zero at z = 0.95. In general, we must add at least as many poles as zeros for

Page 381: Introduction to Control

the controller to be causal. This zero can be added to our compensator in the same manner as the integrator

was added above. The only difference is that you will choose Real Zero from the right-click menu and then

must specify in theLocation cell that the zero is to be placed at 0.95. The root locus plot should now appear

as shown below.

The addition of the integrator has helped with the requirement on disturbance rejections, however, the

above root locus indicates that the closed-loop system cannot be made robustly stable through further

tuning of the loop gain. We also have not addressed our other design requirements. To help us in this

regard, let's identify the region of the complex plane where the closed-loop poles must be located.

These regions can be added to our root locus by choosing Design Requirements from the right-click menu.

Then choose new and set the overshoot to be less than 16%. This process can then be repeated to add the

settling time requirement of less than 0.04 seconds. The resulting figure is shown below where the

Page 382: Introduction to Control

unshaded region identifies where the closed-loop poles must be located to meet our given transient

requirements. These regions assume a canonical second-order system, which we do not have currently, but

the regions can still help guide our design.

From the above figure, we can see that the two dominant branches of our root locus do not pass through the

required region. Therefore, we need to add poles and/or zeros to our compensator to bend the root locus

into the desired region. Let's first try cancelling the zero at approximately -0.98 by adding a pole nearby.

This can be done in the same manner described above for the integrator and the real zero. It is desirable to

cancel this zero since it will add overshoot to the step response. The addition of this pole will result in two

of the branches of the root locus going off to the right and outside of the unit circle.

We will attempt to pull these branches in by placing two additional zeros near the desired closed-loop pole

locations. These zeros can be added via theCompensator Editor tab as done above. In this case, however,

Page 383: Introduction to Control

we will place the zeros using a graphical tuning approach. Specifically, select a single ofrom the tool bar at

the top of the SISO Design for SISO Design Task window. Then click the resulting "pointer" on the real

axis to place the zero. Repeat this process to add a second zero. The effect of moving these two zeros can

then be seen by moving the pointer over the corresponding o on the root locus and clicking on it. While

holding down the mouse button, you can then move the zero along the real axis to visualize the effect of

different locations. Through trial and error we arrive at a location of 0.8 for the two zeros. In order to make

the controller causal, we need to add an additional pole. Using a graphical approach again, we can add a

real pole by choosing an x from the tool bar at the top of the SISO Design for SISO Design Taskwindow.

Through trial and eror we arrive at a pole location of 0.6. The resulting root locus is shown below.

Next we must choose a loop gain in order to move the closed-loop pole locations along the root locus to

the desired location. Since our closed-loop system is not canonical second order, we will have to employ

Page 384: Introduction to Control

some trial and error to identify the exact pole locations. In order to assist us in this regard, we can open a

plot for the closed-loop step response so that we can observe the effect of the gain changes on the actual

step response, without having to rely on a second-order idealization.

The closed-loop step response plot is opened from the Control and Estimation Tools Manager window

under the Analysis Plots tab as shown below. In this tab, select Step from the drop-down window for Plot

1 under the Analysis Plots section of the window. Then under the Contents of Plotssection of the window

check the box for Plot 1 on the first row, which corresponds to a plot for the Closed Loop r to y. Finally,

click the Show Analysis Plots button to produce the closed-loop step response.

The resulting step response plot with loop gain of 1 appears to meet the settling time requirement, but not

the overshoot requirement. In order to be certain, we can define the allowed step response shape by

choosing Design Requirements from the right-click menu of the step response plot and choosing the

Page 385: Introduction to Control

overshoot to be 16% and the settling time to be 0.040 seconds. Note that you will need to choose a rise

time of less than 0.040 seconds, even though we have no such requirement.

We will now modify the loop gain to meet the overshoot requirement. Using a graphical tuning approach,

grab one of the pink boxes on the root locus plot by clicking on it, then drag the box along the locus. Each

box represents the location of a closed-loop pole and dragging the box along the locus changes the loop

gain to the value that places that closed-loop pole at that specified location. Through trial and error, a loop

gain of 800 reduces the overshoot of the associated step response to approxomately 10% while achieving a

settling time of approximately 0.02 seconds. Furthermore, the steady-state error goes to zero when there is

no disturbance present. The resulting step response plot is shown below.

The only thing now left to verify is the system's disturbance rejection properties. A plot of the system's

response to a step disturbance can be generated from the Analysis menu of the SISO Design for SISO

Design Task window. Instead, we will generate the disturbance response plot from the MATLAB

command line. Before we do that, however, we must first export the compensator we have designed in

the SISO Design Tool to the workspace. This is accomplished by selecting Export from the File menu of

the Control and Estimation Tools Manager window. You then select Compensator C and click on

Page 386: Introduction to Control

the Export to Workspace button. Once you have done this, then enter the following instructions in the

command window to produce the response plot shown below.

dist_cl = feedback(dP_motor,C);

[x2,t] = step(dist_cl,.25);

stairs(t,x2)

xlabel('Time (seconds)')

ylabel('Position (rad)')

title('Stairstep Disturbance Response with Compensation')

grid

Examination of the above shows that for a step disturbance, the steady-state error will still go to zero.

Employing the property of superposition, it is also apparent that the total response will have overshoot less

than 16% and will reach steady-state well within the 40 millisecond requirement.

DC Motor Speed: Digital Controller Design

Key MATLAB commands used in this tutorial are: tf , c2d , feedback , step , rlocus

Contents

Page 387: Introduction to Control

Creating a sampled-data model of the plant

PID Controller

In this page, we will consider the digital version of the DC motor speed control problem. A sampled-data

DC motor model can be obtained from conversion of the analog model, as we will describe. In this

example we will design a PID controller.

Thr continuous open-loop transfer function for an input of armature voltage and an output of angular speed

was derived previously as the following.

(1)

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%

Creating a sampled-data model of the plant

The first step in the design of a digital control system is to generate a sampled-data model of the plant.

Therefore, it is necessary to choose a frequency with which the continuous-time plant is sampled. In

choosing a sampling period, it is desired that the sampling frequency be fast compared to the dynamics of

the system in order that the sampled output of the system captures the system's full behavior, that is, so that

significant inter-sample behavior isn't missed.

Let's create a continuous-time model of the plant. Create a new m-file and add the following MATLAB

code (refer to the main problem for the details of getting these commands). Running the m-file within the

MATLAB command window will generate the output shown below.

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);

zpk(P_motor)

ans =

Page 388: Introduction to Control

2

-------------------

(s+9.997) (s+2.003)

Continuous-time zero/pole/gain model.

The use of the zpk command above transforms the transfer function into a form where the zeros, poles,

and gain can be seen explicitly. Examining the poles of the plant (or its frequency response), the dominant

pole of the plant (sigma approximately equal to 2) corresponds to a settle time of approximately 2 seconds

(4 / sigma). Therefore, choosing a sampling period of 0.05 seconds is significantly faster than the dynamics

of the plant. This sampling period is also fast compared to the speed that will be achieved by the resultant

closed-loop system.

In this case, we will convert the given transfer function from the continuous Laplace domain to the discrete

z-domain. MATLAB can be used to achieve this conversion through the use of the c2d command.

The c2d command requires three arguments: a system model, the sampling time (Ts), and the type of hold

circuit. In this example, we will assume a zero-order hold (zoh) circuit. Refer to the Introduction: Digital

Controller Design page for further details. Adding the following commands to your m-file and running in

the MATLAB command window generates the sampled-data model shown below.

Ts = 0.05;

dP_motor = c2d(P_motor,Ts,'zoh');

zpk(dP_motor)

ans =

0.0020586 (z+0.8189)

---------------------

(z-0.9047) (z-0.6066)

Sample time: 0.05 seconds

Discrete-time zero/pole/gain model.

Page 389: Introduction to Control

We would now like to analyze the closed-loop response of the system without any additional

compensation. First, we have to close the loop of the transfer function by using the feedback command.

After closing the loop, let's inspect the closed-loop step response with the zero-order hold. This can be

accomplished by using the step and stairs commands. Since the step command is fed a discrete

model, it will output a vector of discrete samples at the sample time Ts associated with the model

(click here for further details). The syntax below specifies to simulate the step response for 0.5 seconds.

The stairs command draws these discrete data points as a stairstep, just like what would be produced by

a zero-order hold circuit. Add the following MATLAB code at the end of your previous m-file and rerun it.

You should generate the plot shown below.

sys_cl = feedback(dP_motor,1);

[y,t] = step(sys_cl,12);

stairs(t,y);

xlabel('Time (s)')

ylabel('Velocity (rad/s)')

title('Stairstep Response: Original')

Examination of the above shows that the steady-state error is much too large and the settle time may be a

little slow.

Page 390: Introduction to Control

PID Controller

Recall that the continuous-time transfer function for a PID controller is:

(2)

There are several ways for mapping from the s-plane to z-plane. Above we used a zero-order hold

conversion for the plant model because that reflected the type of hold circuit that would be used in

sampling the signals from the plant in a physical implementation of the control system. For the controller,

we may prefer to use a conversion that more accurately approximates the behavior that would be achieved

with a continuous, rather than digital, controller. The exact conversion between the Laplace and z-domains

is given below.

(3)

This conversion, however, involves a trancendental function and the resulting transfer function cannot be

represented as a ratio of polynomials. This makes it difficult to implement such a control algorithm on a

digital computer. Therefore, we will use an approximate conversion. In particular, we are going to use the

bilinear transformation shown below.

(4)

Equivalently, we will again use the c2d command in MATLAB to convert the continuous-time PID

compensator to a discrete-time PID compensator by specifying 'tustin' as the conversion method.

Tustin's method uses the bilinear transformation to convert a continuous model to discrete time. According

to the DC Motor Speed: PID Controller Design page , Kp = 100, Ki = 200 and Kd = 10 were found to

satisfy all of the given design requirements. We will use these gains again for this example. Now add the

following MATLAB commands to your previous m-file and rerun it in the MATLAB command window.

Kp = 100;

Ki = 200;

Kd = 10;

C = Kp + Ki/s + Kd*s;

dC = c2d(C,Ts,'tustin')

dC =

505 z^2 - 790 z + 305

---------------------

z^2 - 1

Page 391: Introduction to Control

Sample time: 0.05 seconds

Discrete-time transfer function.

Let's see if the performance of the closed-loop response with PID compensator satisfies the given design

requirements. Add the following code to the end of your m-file and rerun it. You should get the following

closed-loop stairstep response.

sys_cl = feedback(dC*dP_motor,1);

[x2,t] = step(sys_cl,12);

stairs(t,x2)

xlabel('Time (seconds)')

ylabel('Velocity (rad/s)')

title('Stairstep Response: with PID controller')

As you can see from the above plot, the closed-loop response of the system is unstable. Therefore,

something must be wrong with the compensated system. We should take a look at the root locus of the

compensated system. Add the following MATLAB commands onto the end of your m-file and rerun it.

Page 392: Introduction to Control

rlocus(dC*dP_motor)

axis([-1.5 1.5 -1 1])

title('Root Locus of Compensated System')

From this root-locus plot, we see that the denominator of the PID controller has a pole at -1 in the z-plane.

We know that if a pole of a system is outside the unit circle, the system will be unstable. This compensated

system will always be unstable for any positive gain because there are an even number of poles and zeros

to the right of the pole at -1. Therefore, a closed-loop pole will always move to the left and outside the unit

circle as the loop gain is increased. The pole at -1 comes from the compensator, hence we can change its

location by changing the compensator design. In this case we choose to cancel the zero at -0.82, this will

make the system stable for at least some gains. Add the following code to your m-file and rerun it at the

command line to generate the root locus plot shown below.

z = tf('z',Ts);

dC = dC/(z+0.82);

rlocus(dC*dP_motor);

axis([-1.5 1.5 -1 1])

title('Root Locus of Compensated System');

Page 393: Introduction to Control

The new closed-loop system will have a pole near -0.82 instead of -1, which almost cancels the zero of the

uncompensated plant. Click on the root locus curve in several places to see the gain that places a closed-

loop pole at a particular location, along with the corresponding overshoot, damping, etc., as shown in the

figure below. Of course, the damping and overshoot numbers correspond to the actual response only if the

selected closed-loop pole is dominant.

Page 394: Introduction to Control

You can also determine the gain corresponding to a specfic closed-loop pole location using

the rlocfind command. Typing [K,poles] = rlocfind(dC*dP_motor) at the command line

will generate a cursor that you can then use to click on the point of interest on the root locus. MATLAB

will then return the appropriate gain K and all of the corresponding closed-loop poles. This is useful in that

it lists all of the closed-loop poles, not just the point you clicked on.

We will choose a gain of 0.8 and examine the resulting closed-loop step response by typing the following

commands at the MATLAB command window.

sys_cl = feedback(0.8*dC*dP_motor,1);

[x3,t] = step(sys_cl,8);

stairs(t,x3)

xlabel('Time (seconds)')

ylabel('Velocity (rad/s)')

title('Stairstep Response: with Modified PID controller')

Page 395: Introduction to Control

The plot above shows that the settling time is less than 2 seconds and the percent overshoot is around 2%.

Additionally, the steady-state error is zero. Therefore, this response satisfies all of the given design

requirements.

Cruise Control: Digital Controller Design

In this digital control version of the cruise control problem, we are going to use the root-locus design

method to design the digital controller.

Key MATLAB commands used in this tutorial are: tf , c2d , rlocus , zgrid , feedback , step

Contents

System model

System parameters

Performance specifications

Discrete-time transfer function

Root locus in the z-Plane

Compensation using a digital controller

System model

Page 396: Introduction to Control

The transfer function model for the cruise control problem is given below. Please see the Cruise Control:

System Modeling page for the derivation.

(1)

System parameters

For this example, let's assume that parameters of the system are

(m) vehicle mass 1000 kg

(b) damping coefficient 50 N.s/m

(r) reference speed 10 m/s

(u) nominal control force 500 N

Performance specifications

We need to design a controller to meet the following design criteria for this problem:

Rise time < 5 s

Overshoot < 10%

Steady-state error < 2%

Discrete-time transfer function

The first step in performing a discrete analysis of a system is to find the discrete-time equivalent transfer

function of the continuous portion. We will convert the above transfer function (Y(s)/U(s)) to a discrete-

time transfer function using the MATLAB function c2d. To use this function, you need to specify three

arguments: system, sampling time (Ts), and the 'method'. You should already be familiar with how to

enter num and den matrices. The sampling time (Ts), in the unit of sec/sample, should be smaller than

1/(30*BW), where BW is the closed-loop bandwidth frequency. For the method, we will use the zero-order

hold ('zoh').

Let the sampling time equal 1/50 sec; this is sufficiently fast assuming that the bandwidth frequency is 1

rad/sec. Now enter the following commands into an m-file and run it in the command window.

m = 1000;

b = 50;

u = 500;

s = tf('s');

P_cruise = 1/(m*s+b);

Page 397: Introduction to Control

Ts = 1/50;

dP_cruise = c2d(P_cruise,Ts,'zoh')

dP_cruise =

1.999e-05

---------

z - 0.999

Sample time: 0.02 seconds

Discrete-time transfer function.

Root locus in the z-Plane

Recall from the Digital Control Tutorial page, the MATLAB function zgrid can be used to find an

acceptable region of the discrete root-locus that gives the desired gain (K). The zgrid command requires

two arguments: Natural frequency (Wn) and damping ratio (zeta). These two arguments can be found from

the rise time and the overshoot requirements and the following two equations.

(2)

(3)

where,

zeta = Damping ratio

Wn = Natural frequency (rad/sec)

Tr = Rise time

%OS = Maximum overshoot

Since our rise time and overshoot requirements are 5 seconds and 10%, respectively, we can determine that

the natural frequency (Wn) must be greater than 0.36 rad/sec and the damping ratio (zeta) must be greater

than 0.6.

Let's generate the root-locus and use the zgrid command to find the acceptable region of the root-locus.

But before doing that, if you refer to the Digital Control Tutorial, the natural frequency argument

Page 398: Introduction to Control

for zgrid needs to be in units of rad/sample, so let Wn = 0.36*Ts = 0.0072 rad/sample. Now add the

following commands to the above m-file and rerun it. You should get the following plot.

Wn = 0.0072;

zeta = 0.6;

rlocus(dP_cruise)

zgrid(zeta, Wn)

axis ([-1 1 -1 1])

The region of the complex plane which interests us is that which is near the point (1,0), so you should

zoom in on this point. Rerun using the following axis command and your figure should now appear as

shown below.

axis ([0.95 1 -.1 .1])

Page 399: Introduction to Control

The dotted line on the right, indicates the locations of constant natural frequency (Wn), and the natural

frequency is greater than 0.0072 outside the line. The other dotted line indicates the locations of constant

damping ratio (zeta), and the damping ratio is greater than 0.6 inside the line. The jagged vertical line is a

portion of the unit circle which is calculated at low resolution (hence the jaggedness).

In the above plot, you can see that part of the root locus is inside the desired region. Let's find a specific

gain (K) using the MATLAB function rlocfindand then obtain the corresponding step response.

Running the command [K,poles] = rlocfind(dP_cruise) in the MATLAB command window

will generate a prompt directing you to select a point on the root locus. Remember that if you choose a pole

which is too far inside the unit circle, then the step response will be too fast indicating a physically

unreasonable acceleration. Therefore, you should choose the pole which is near the intersection of the

constant natural frequency and the real axis. Select the point near 0.99 as shown by the cross mark on the

following root locus graph.

Page 400: Introduction to Control

After selecting a point, you should see the following output in the MATLAB command window indicating

the point you chose, the point on the root locus closest to that point (the pole), and the gain K that places

the closed-loop pole at that location.

Select a point in the graphics window

selected_point =

0.9900 - 0.0003i

K =

Page 401: Introduction to Control

451.1104

poles =

0.9900

Then to see the closed-loop step response, add the following code to your m-file.

K = 451.1104;

sys_cl = feedback(K*dP_cruise,1);

r = 10;

figure

step(r*sys_cl,10);

Page 402: Introduction to Control

This response satisfies the rise time and overshoot requirements. But the steady-state error is about 11%.

To obtain the desired steady-state error, we will modify the digital controller.

Compensation using a digital controller

Recall from the continuous Cruise Control: Root Locus page, a lag compensator was added to the system

to obtain the desired response. In this digital control version of the cruise control problem, we will modify

the existing digital controller by adding additional lag compensation of the form shown below.

(4)

There is a guideline for the design digital lead and lag compensators and a guideline for the design

of continuous-time lead and lag compensators. The discrete design method described says that the zero of

the lag compensator should be chosen to (approximately) cancel one of the plant poles, as long as it is

stable. Thus, we choose the zero to be at zo = 0.999.

To reduce the steady-state error, we note that the low frequency gain of the discrete-time control system

with a lag compensator is increased by a factor of (1 - zo)/(1 - po). To reduce the steady-state error by a

factor of 5, we choose po = 0.9998. To have a gain of 1 at zero frequency, the numerator is multiplied by

Kd = (1 - zp)/(1 - zo) = 0.2 before using the root locus. Note that the whole compensator is multiplied by

the loop gain determined from the root locus.

Now we have the discrete-time compensator transfer function. Let's generate the root-locus and obtain the

step response. First create a new m-file and enter the following commands.

m = 1000;

b = 50;

u = 500;

s = tf('s');

P_cruise = 1/(m*s+b);

Ts = 1/50;

dP_cruise = c2d(P_cruise,Ts,'zoh');

z = tf('z',Ts);

C = 0.2*(z - 0.999)/(z - 0.9998);

Wn = 0.0072;

zeta = 0.6;

Page 403: Introduction to Control

rlocus(C*dP_cruise)

zgrid(zeta, Wn)

axis([0.98 1 -0.01 0.01])

Then enter the command [K,poles] = rlocfind(C*dP_cruise) at the command line and again

choose a pole location near 0.99 as indicated by the cross marks in the following figure.

Page 404: Introduction to Control

After selecting a point, you should see the following output in the MATLAB command window indicating

the point you chose, the point on the root locus closest to that point (the pole), and the gain K that places

the closed-loop pole at that location.

Select a point in the graphics window

selected_point =

0.9900 - 0.0000i

K =

Page 405: Introduction to Control

2.4454e+03

poles =

0.9900

0.9900

Finally, to see the closed-loop step response, add the following code to your m-file.

K = 2.4454e+03;

sys_cl = feedback(K*C*dP_cruise,1);

r = 10;

step(r*sys_cl,10);

Page 406: Introduction to Control

This response rises about as fast as before, but the steady-state error has been reduced to 2%. This system

satisfies all of the design requirements while requiring a reasonable amount of control effort.

Note: A design problem does not necessarily have a unique answer. For practice, you may try other

compensators to obtain a better response than the one shown above.

Cruise Control: Simulink Modeling

Contents

Physical setup and system equations

Building the model

Open-loop response

Physical setup and system equations

The model of the cruise control system is relatively simple. If it is assumed that rolling resistance and air

drag are proportional to the car's speed, then the problem is reduced to the simple mass and damper system

shown below.

Using Newton's 2nd law, the governing equation for this system becomes:

(1)

where u is the force generated between the road/tire interface and can be controlled directly. For this

example, let's assume that

m = 1000 kg

b = 50 N.sec/m

u = 500 N

Building the model

Page 407: Introduction to Control

This system will be modeled by summing the forces acting on the mass and integrating the acceleration to

give the velocity. Open Simulink and open a new model window. First, we will model the integral of

acceleration.

(2)

Insert an Integrator Block (from the Continuous library) and draw lines to and from its input and output

terminals.

Label the input line "vdot" and the output line "v" as shown below. To add such a label, double click in the

empty space just above the line.

Since the acceleration (dv/dt) is equal to the sum of the forces divided by mass, we will divide the

incoming signal by the mass.

Insert a Gain block (from the Math Operations library) connected to the Integrator block input line and

draw a line leading to the input of the Gain block.

Edit the Gain block by double-clicking on it and change its value to "1/m".

Change the label of the Gain block to "inertia" by clicking on the word "Gain" underneath the block.

Page 408: Introduction to Control

Now, we will add in the forces which are represented in Equation (1). First, we will add in the damping

force.

Attach a Sum block (from the Math Operations library) to the line leading to the inertia Gain block.

Change the signs of the Sum block to "+-".

Insert a Gain block below the Inertia block, select it by single-clicking on it, and select Flip from the

Format menu (or type Ctrl-F) to flip it left-to-right.

Set the block's value to "b" and rename this block to "damping".

Tap a line (hold Ctrl while drawing) off the Integrator block's output and connect it to the input of the

damping Gain block.

Draw a line from the damping Gain block output to the negative input of the Sum Block.

Page 409: Introduction to Control

The second force acting on the mass is the control input, u. We will apply a step input.

Insert a Step block (from the Sources library) and connect it with a line to the positive input of the Sum

Block.

To view the output velocity, insert a Scope block (from the Sinks library) connected to the output of the

Integrator.

Page 410: Introduction to Control

To provide an appropriate step input of 500 at time equal zero, double-click the Step block and set the Step

Time to "0" and the Final Value to "u".

Page 411: Introduction to Control

You can download a model file for the complete system here, ccmodel.mdl.

Open-loop response

To simulate this system, first, an appropriate simulation time must be set.

Select Parameters from the Simulation menu and enter "120" in the Stop Time field. 120 seconds is long

enough to view the open-loop response.

Page 412: Introduction to Control

The physical parameters must now be set. Run the following commands at the MATLAB prompt:

m = 1000;

b = 50;

u = 500;

Run the simulation (hit Ctrl-T or select Start from the Simulation menu). When the simulation is finished,

double-click on the Scope and hit its autoscale button. You should see the following output.

Page 413: Introduction to Control

Observing the above, we would like to improve the response of the cruise control system. The model

created here will be employed for controller design and analysis within Simulink in the Cruise Control:

Simulink Controller Design page.

DC Motor Speed: Simulink Modeling

Contents

Physical setup

Building the model with Simulink

Building the model with Simscape

Physical setup

A common actuator in control systems is the DC motor. It directly provides rotary motion and, coupled

with wheels or drums and cables, can provide translational motion. The electric circuit of the armature and

the free-body diagram of the rotor are shown in the following figure:

Page 414: Introduction to Control

For this example, we will assume that the input of the system is the voltage source (V) applied to the

motor's armature, while the output is the rotational speed of the shaft d(theta)/dt. The rotor and shaft are

assumed to be rigid. We further assume a viscous friction model, that is, the friction torque is proportional

to shaft angular velocity.

The physical parameters for our example are:

(J) moment of inertia of the rotor 0.01 kg.m^2

(b) motor viscous friction constant 0.1 N.m.s

(Ke) electromotive force constant 0.01 V/rad/sec

(Kt) motor torque constant 0.01 N.m/Amp

(R) electric resistance 1 Ohm

(L) electric inductance 0.5 H

In general, the torque generated by a DC motor is proportional to the armature current and the strength of

the magnetic field. In this example we will assume that the magnetic field is constant and, therefore, that

the motor torque is proportional to only the armature current i by a constant factor Kt as shown in the

equation below. This is referred to as an armature-controlled motor.

(1)

The back emf, e, is proportional to the angular velocity of the shaft by a constant factor Ke.

(2)

In SI units, the motor torque and back emf constants are equal, that is, Kt = Ke; therefore, we will use K to

represent both the motor torque constant and the back emf constant.

Building the model with Simulink

Page 415: Introduction to Control

This system will be modeled by summing the torques acting on the rotor inertia and integrating the

acceleration to give velocity. Also, Kirchoff's laws will be applied to the armature circuit. First, we will

model the integrals of the rotational acceleration and of the rate of change of the armature current.

(3)

(4)

To build the simulation model, open Simulink and open a new model window. Then follow the steps listed

below.

Insert an Integrator block from the Simulink/Continuous library and draw lines to and from its input and

output terminals.

Label the input line "d2/dt2(theta)" and the output line "d/dt(theta)" as shown below. To add such a label,

double-click in the empty space just below the line.

Insert another Integrator block above the previous one and draw lines to and from its input and output

terminals.

Label the input line "d/dt(i)" and the output line "i".

Next, we will apply Newton's law and Kirchoff's law to the motor system to generate the following

equations:

Page 416: Introduction to Control

(5)

(6)

The angular acceleration is equal to 1 / J multiplied by the sum of two terms (one positive, one negative).

Similarly, the derivative of current is equal to 1 /L multiplied by the sum of three terms (one positive, two

negative). Continuing to model these equations in Simulink, follow the steps given below.

Insert two Gain blocks from the Simulink/Math Operations library, one attached to each of the integrators.

Edit the Gain block corresponding to angular acceleration by double-clicking it and changing its value to

"1/J".

Change the label of this Gain block to "Inertia" by clicking on the word "Gain" underneath the block.

Similarly, edit the other Gain's value to "1/L" and its label to "Inductance".

Insert two Add blocks from the Simulink/Math Operations library, one attached by a line to each of the

Gain blocks.

Edit the signs of the Add block corresponding to rotation to "+-" since one term is positive and one is

negative.

Edit the signs of the other Add block to "-+-" to represent the signs of the terms in the electrical equation.

Now, we will add in the torques which are represented in the rotational equation. First, we will add in the

damping torque.

Page 417: Introduction to Control

Insert a Gain block below the "Inertia" block. Next right-click on the block and select Format > Flip

Block from the resulting menu to flip the block from left to right. You can also flip a selected block by

holding down Ctrl-I.

Set the Gain value to "b" and rename this block to "Damping".

Tap a line (hold Ctrl while drawing or right-click on the line) off the rotational Integrator's output and

connect it to the input of the "Damping" block.

Draw a line from the "Damping" block output to the negative input of the rotational Add block.

Next, we will add in the torque from the armature.

Insert a Gain block attached to the positive input of the rotational Add block with a line.

Edit its value to "K" to represent the motor constant and Label it "Kt".

Continue drawing the line leading from the current Integrator and connect it to the "Kt" block.

Now, we will add in the voltage terms which are represented in the electrical equation. First, we will add in

the voltage drop across the armature resistance.

Insert a Gain block above the "Inductance" block and flip it from left to right.

Set the Gain value to "R" and rename this block to "Resistance".

Tap a line off the current Integrator's output and connect it to the input of the "Resistance" block.

Page 418: Introduction to Control

Draw a line from the "Resistance" block's output to the upper negative input of the current equation Add

block.

Next, we will add in the back emf from the motor.

Insert a Gain block attached to the other negative input of the current Add block with a line.

Edit it's value to "K" to represent the motor back emf constant and Label it "Ke".

Tap a line off the rotational Integrator's output and connect it to the "Ke" block.

Add In1 and Out1 blocks from the Simulink/Ports & Subsystems library and respectively label them

"Voltage" and "Speed".

The final design should look like the example shown in the figure below.

In order to save all of these components as a single subsystem block, first select all of the blocks, then

select Create Subsystem from the Edit menu. Name the subsystem "DC Motor" and then save the model.

Your model should appear as follows. You can also download the file for this system

here,Motor_Model.mdl. We use this model in the DC Motor Speed: Simulink Controller Design section.

Page 419: Introduction to Control

Building the model with Simscape

In this section, we alternatively show how to build the DC Motor model using the physical modeling

blocks of the Simscape extension to Simulink. The blocks in the Simscape library represent actual physical

components; therefore, complex multi-domain models can be built without the need to build mathematical

equations from physical principles as was done above by applying Newton's laws and Kirchoff's laws.

Open a new Simulink model and insert the following blocks to represent the electrical and mechanical

elements of the DC motor.

Resistor, Inductor and Rotational Electromechanical Converter blocks from the Simscape/Foundation

Library/Electrical/Electrical Elements library

Rotational Damper and Inertia blocks from the Simscape/Foundation Library/Mechanical/Rotational

Elements library

Four Connection Port blocks from the Simscape/Utilities library

Double-click on the Connection Port blocks to make the location of ports 1 and 2 from the Left and the

location of ports 3 and 4 from the Right.

Connect and label the components as shown in the following figure. You can rotate a block in a similar

manner to the way you flipped blocks, that is, by right-clicking on the block then selecting Rotate

Block from the Format menu.

Page 420: Introduction to Control

Complete the design of the DC motor Simscape model by assigning values to the physical parameters of

each of the blocks to match our assumed values. To assign the necessary values, double-click on the

Resistor, Inductor, Inertia, Rotational Damper, and Rotational Electromechanical Converter blocks and

enter the following parameters and associated units:

Resistance = R [Ohm]

Inductance = L [H]

Inertia = J [kg*m^2]

Constant of Proportionality = K [V/(rad/s)]

Damping coefficient = b [N*m/(rad/s)]

The Rotational Damper block serves to model the viscous friction of the motor. This type of friction model

was chosen because it is linear. In most cases real friction is more complicated than this. If you wish to

employ a more complicated friction model, for instance to add Coulomb friction to the model, then you

may use the Rotational Friction block from the Simscape/Foundation Library/Mechanical/Rotational

Elements library.

Also note that in the above you generated a DC Motor model from the individual mechanical and electrical

aspects of the motor. The Simscape library also includes a DC Motor block under the

Simscape/SimElectronics/Actuators library. This block is used in the DC Motor Position: Simulink

Modelingsection.

Page 421: Introduction to Control

The physical parameters must now be set. Enter the following commands at the MATLAB prompt.

J = 0.01;

b = 0.1;

K = 0.01;

R = 1;

L = 0.5;

These values are the same ones listed in the physical setup section.

You can then save these components in a single subsystem. Select all of the blocks and then choose Create

Subsystem from the Edit menu. You can also change the subsystem block color by right-clicking on the

block and choosing Format > Background Color from the resulting menu. This subsystem block can then

be used to simulate the DC motor.

In order to simulate the response of this system it is further necessary to add sensor blocks to the model to

simulate the measurement of various physical parameters and a voltage source to provide excitation to the

motor. Furthermore, blocks are needed to interface Simscape blocks with tradtional Simulink blocks since

the Simscape signals represent physical quantities with units, while the Simulink signals are dimensionless

numbers. Add the following blocks to the model you just built to address these functions.

Current Sensor block from the Simscape/Foundation Library/Electrical/Electrical Sensors library

Page 422: Introduction to Control

Controlled Voltage Source block from the Simscape/Foundation Library/Electrical/Electrical Sources

library

Two PS-Simulink Converter blocks and a Solver Configuration block from the Simscape/Utilities library

Electrical Reference block from the Simscape/Foundation Library/Electrical/Electrical Elements library

Ideal Rotational Motion Sensor block from the Simscape/Foundation Library/Mechanical/Mechanical

Sensors library

Mechanical Rotational Reference block from the Simscape/Foundation Library/Mechanical/Rotational

Elements library

Three Out1 blocks and one In1 block from the Simulink/Ports & Subsystems library

The Ideal Rotational Motion Sensor block represents a device that measures the difference in angular

position and angular velocity between two nodes. In this case, we employ the block to measure the position

and velocity of the motor shaft as compared to a fixed reference represented by the Mechanical Rotational

Reference block. You can leave the Initial angle of the Rotational Motion Sensor block as the default 0

radians.

The Current Sensor block represents another sensor, specifically it measures the current drawn by the

motor. The ground for the electrical portion of our system is defined by the Electrical Reference block.

The Controlled Voltage Source block serves as the power source for the motor where you can externally

define the voltage signal by connecting an input to the block.

The PS-Simulink blocks convert physical signals to Simulink output signals, while the Simulink-PS block

conversely converts a Simulink input signal to a physical signal. These blocks can be employed to convert

the Simscape signals, which represent physical quantities with units, to Simulink signals, which don't

explicitly have units attached to them. These blocks, in essence, can perform a units conversion between

the physical signals and the Simulink signals. In our case, we can leave the units undefined since the input

and output of each of the conversion blocks have the same units. In general, the Simscape blockset is

employed to model the physical plant, while the Simulink blockset is employed to model the controller.

The Solver Configuration block is employed for defining the details of the numerical solver employed in

running the Simscape simulation. We will use the default settings for this block.

Next, connect and label the components so that they appear as in the figure below. Double-click on the

lines which are connected to the Out1 blocks and label them "Current", "Position", and "Speed". Also

double-click on the In1 block and label it "Voltage".

Page 423: Introduction to Control

You can save these components in a single subsystem with one input and three outputs. Select all of the

blocks and then choose Create Subsystemfrom the Edit menu. Also label the subsystem and signals as

shown in the following figure.

Page 424: Introduction to Control

You can download the complete model file here, Motor_Pos_Simscape.mdl, but note that you will need the

Simscape addition to Simulink in order to run the file.

Building the model through its LTI representation

You can also build the DC motor model in Simulink by importing one of the models we created in

MATLAB in the DC Motor Position: System Modelingpage. In this page we specifically created a transfer

function model and a state-space model, both of which may be imported. A zero-pole-gain format model

can also be imported. Recall the following commands used to build a state-space model of the DC motor in

MATLAB.

A = [0 1 0

0 -b/J K/J

0 -K/L -R/L];

B = [0 ; 0 ; 1/L];

C = [1 0 0];

D = 0;

This model can then be imported using the LTI System block from the Control System Toolbox library as

shown below. This figure demonstrates how the model is defined by entering "ss(A,B,C,D)" into the LTI

system variable cell, though the tf and zpk commands could also be employed.

Page 425: Introduction to Control

Adding In1 and Out1 ports from the Ports & Subsystems library then creates the model shown below.

Note that all three of the models generated above will behave equivalently as long as they are built using

the same parameter values. The difference between them is then only the ease with which they are built

and interfaced with, and how transparent they are in presenting information to the user.

uspension: Simulink Modeling

Page 426: Introduction to Control

Contents

Physical setup

Design requirements

Building the Model

Open-loop response

Physical setup

Designing an automotive suspension system is an interesting and challenging control problem. When the

suspension system is designed, a 1/4 model (one of the four wheels) is used to simplify the problem to a

1D multiple spring-damper system. A diagram of this system is shown below.

The system parameters are as follows.

(m1) body mass 2500 kg

(m2) suspension mass 320 kg

(k1) spring constant of suspension system 80,000 N/m

(k2) spring constant of wheel and tire 500,000 N/m

(b1) damping constant of suspension system 350 N.s/m

(b2) damping constant of wheel and tire 15,020 N.s/m

Page 427: Introduction to Control

(u) control force = force from the controller we are going to

design

Design requirements

A good automotive suspension system should have satisfactory road holding ability, while still providing

comfort when riding over bumps and holes in the road. When the vehicle is experiencing any road

disturbance (i.e. pot holes, cracks, and uneven pavement),the vehicle body should not have large

oscillations, and the oscillations should dissipate quickly. Since the distance X1-W is very difficult to

measure, and the deformation of the tire (X2-W) is negligible, we will use the distance X1-X2 instead of

X1-W as the output in our problem. Keep in mind that this is an estimation.

The road disturbance (W) in this problem will be simulated by a step input. This step could represent the

vehicle coming out of a pothole. We want to design a feedback controller so that the output (X1-X2) has an

overshoot less than 5% and a settling time shorter than 5 seconds. For example, when the vehicle runs onto

a 10 cm high step, the vehicle body will oscillate within a range of +/- 5 mm and return to a smooth ride

within 5 seconds.

Building the Model

This system will be modeled by summing the forces acting on both masses (body and suspension) and

integrating the accelerations of each mass twice to give velocities and positions. Newton's law will be

applied to each mass. Open Simulink and open a new model window. First, we will model the integrals of

the accelerations of the masses.

(1)

(2)

Insert an Integrator block (from the Continuous library) and draw lines to and from its input and output

terminals.

Label the input line "a1" (for acceleration) and the output line "v1" (for velocity) To add such a label,

double click in the empty space just above the line.

Insert another Integrator block and connect it to the output of the first.

Draw a line from its output and label it "x1" (for position).

Insert a second pair of Integrators below the first with lines labeled "a2", "v2", and "x2".

Page 428: Introduction to Control

Next, we will start to model Newton's law. Newton's law for each of these masses can be expressed as:

(3)

(4)

These equations can be represented with gain blocks (for 1/M1 and 1/M2) and two summation blocks.

Insert two Gain blocks, (from the Math Operations library) one attached to the inputs of each of the

integrator pairs.

Edit the gain block corresponding to M1 by double-clicking it and changing its value to "1/m1".

Change the label of this Gain block to "Mass 1" by clicking on the word "Gain" underneath the block.

Similarly, edit the other Gain's value to "1/m2" and it's label to "Mass 2". (You may want to resize the gain

blocks to view the contents. To do this, single click on the block to highlight it, and drag one of the corners

to the desired size.)

There are three forces acting on M1 (one spring, one damper, and the input, u) and five forces acting on

M2 (two springs, two dampers, and the input, u).

Page 429: Introduction to Control

Insert two Sum blocks (from the Math Operations library), one attached by a line to each of the Gain

blocks.

Edit the signs of the Sum block corresponding to M1 to "+--" to represent the three forces (two of which

will be negative).

Edit the signs of the other Sum block to "++-++" to represent the five forces, one of which will be

negative.

Now, we will add in the forces acting on each mass. First, we will add in the force from Spring 1. This

force is equal to a constant, k1 times the difference X1-X2.

Insert a Sum block after the upper pair of integrators.

Edit its signs to "+-" and connect the "x1" signal to the positive input and the "x2" signal to the negative

input.

Draw a line leading from the output of the Sum block.

Insert a Gain block above the "Mass 1" block.

Flip it left-to-right by single-clicking on it and selecting Flip Block from the Format menu (or hit Ctrl-F).

Edit the value of this gain to "k1" and label the block "Spring 1".

Page 430: Introduction to Control

Tap a line off the output of the last Sum block and connect it to the input of this Gain block.

Connect the output of this Gain block (the spring force) to the second input of the Mass 1 Sum block. This

input should be negative since the Spring 1 pulls down on Mass 1 when X1 > X2.

Tap a line off the spring force line and connect it to the second input of the Mass 2 Sum block. This input

is positive since Spring 1 pulls up on Mass 2.

Now, we will add in the force from Damper 1. This force is equal to b1 times V1-V2.

Insert a Sum block below the Mass 1's first integrator.

Flip it left-to-right, and edit its signs to "+-".

Tap a line off the "v1" line and connect it to the positive input of this Sum block.

Tap a line off the "v2" line and connect it to the negative input of this Sum block.

Insert a Gain block to the left of this Sum block and flip it left-to-right.

Edit its value to "b1" and label it "Damper 1".

Connect the output of the new Sum block to the input of this gain block.

Connect the output of this gain block (the damper force) to the third input of the Mass 1 Sum block. This

input is negative, similar to Spring 1's force on Mass 1.

Page 431: Introduction to Control

Tap a line off Damper 1's force line and connect it to the first input (which is positive) of Mass 2's Sum

block.

Now we will add in the force from Spring 2. This force acts only on Mass 2, but depends on the ground

profile, W. Spring 2's force is equal to X2-W.

Insert a Step block in the lower left area of your model window. Label it "W".

Edit it's Step Time to "0" and it's Final Value to "0". (We will assume a flat road surface for now).

Insert a Sum block to the right of the W Step block and edit its signs to "-+".

Connect the output of the Step block to the positive input of this Sum block.

Tap a line off the "x2" signal and connect it to the negative input of the new Sum block.

Insert a Gain block to the right of this Sum block and connect the Sum's output to the new Gain's input.

Change the value of the gain to "k2" and label it "Spring 2".

Connect the output of this block (Spring 2's force) to the fourth input of Mass 2's Sum block. This force

adds in in the positive sense.

Page 432: Introduction to Control

Next, we will add in the force from Damper 2. This force is equal to b2 times V2-d/dt(W). Since there is

no existing signal representing the derivative of W we will need to generate this signal.

Insert a Derivative block (from the Continuous library) to the right of the W step block.

Tap a line of the Step's output and connect it to the input of the Derivative block.

Insert a Sum block after the Derivative block and edit it's signs to "+-".

Connect the Derivative's output to the positive input of the new Sum block.

Tap a line off the "v2" line and connect it to the negative input of this Sum block.

Connect the output of this Sum block (Damper 2's force) to the fifth input of Mass 2's Sum block. This

force also adds in with positive sign.

Page 433: Introduction to Control

The last force is the input U acting between the two masses.

Insert a Step block (from the Sources library) in the upper left of the model window.

Connect its output to the remaining input of Mass 1's Sum block (with positive sign).

Tap a line off this signal and connect it to the remaining input of Mass 2's Sum block (with negative sign).

Edit this Step block's Step Time to "0" and leave its Final Value "1".

Label this Step block "U".

Finally, to view the output (X1-X2) insert a Scope block (from the Sinks library) and connect it to the

output of the rightmost Sum block.

Page 434: Introduction to Control

You can download a model file for the complete system here, suspmod.mdl.

Open-loop response

To simulate this system, first, an appropriate simulation time must be set. Select Parameters from the

Simulation menu and enter "50" in the Stop Time field. 50 seconds is long enough to view the open-loop

response. The physical parameters must now be set. Run the following commands at the MATLAB

prompt:

m1 = 2500;

m2 = 320;

k1 = 80000;

k2 = 500000;

b1 = 350;

b2 = 15020;

Run the simulation (Ctrl-T or Start on the Simulation menu). When the simulation is finished, double-click

on the scope and hit its autoscale button. You should see the following output.

Page 435: Introduction to Control

Observing the above, we would like to improve the response of the suspension through the control of the

suspension control force U. The model created here will be employed for controller design and analysis

within Simulink in the Suspension: Simulink Controller Design page.

Inverted Pendulum: Simulink Modeling

Contents

Physical setup and system equations

Building the nonlinear model with Simulink

Building the nonlinear model with Simscape

Generating the open-loop response

Extracting a linear model from the simulation

In this page we outline how to build a model of our inverted pendulum system for the purposes of

simulation using Simulink and its add-ons. A great advantage of simulation, as will be demonstrated in this

example, is that it can generate numerical solutions to nonlinear equations for which closed-form solutions

cannot be generated. The nonlinear simulation can then be employed to test the validity of a linearized

version of the model. The simulation model can also be used to evaluate the performance of the control

scheme designed based on the linearized model.

Physical setup and system equations

In this example we will consider a two-dimensional version of the inverted pendulum system with cart

where the pendulum is contrained to move in the vertical plane shown in the figure below. For this system,

the control input is the force that moves the cart horizontally and the outputs are the angular position of

the pendulum and the horizontal position of the cart .

Page 436: Introduction to Control

For this example, let's assume the following quantities:

(M) mass of the cart 0.5 kg

(m) mass of the pendulum 0.2 kg

(b) coefficient of friction for cart 0.1 N/m/sec

(l) length to pendulum center of mass 0.3 m

(I) mass moment of inertia of the pendulum 0.006 kg.m^2

(F) force applied to the cart

(x) cart position coordinate

(theta) pendulum angle from vertical (down)

Below are the two free-body diagrams of the system.

Page 437: Introduction to Control

This system is challenging to model in Simulink because of the physical constraint (the pin joint) between

the cart and pendulum which reduces the degrees of freedom in the system. Both the cart and the pendulum

have one degree of freedom ( and , respectively). We will generate the differential equations for these

degrees of freedom from first principles employing Newton's second law ( ) as shown below.

(1)

(2)

It is necessary, however, to include the interaction forces and between the cart and the pendulum in

order to fully model the system's dynamics. The inclusion of these forces requires modeling the - and -

components of the the translation of the pendulum's center of mass in addition to its rotational dynamics. In

the Inverted Pendulum: System Modeling tutorial, the interaction forces and were solved for

algebraically.

In general, we would like to exploit the modeling power of Simulink to take care of the algebra for us.

Therefore, we will model the additional - and -component equations for the pendulum as shown below.

(3)

(4)

(5)

(6)

Page 438: Introduction to Control

However, the position coordinates and are exact functions of . Therefore, we can represent their

derivatives in terms of the derivatives of . First addressing the -component equations we arrive at the

following.

(7)

(8)

(9)

Then addressing the -component equations gives us the following.

(10)

(11)

(12)

These expressions can then be substituted into the expressions for and from above as follows.

(13)

(14)

We can now represent these equations within Simulink. Simulink can work directly with nonlinear

equations, so it is unnecessary to linearize these equations as was done in the Inverted Pendulum: System

Modeling page.

Building the nonlinear model with Simulink

We can build the inverted pendulum model in Simulink employing the equations derived above by

following the steps given below.

Begin by typing simulink into the MATLAB command window to open the Simulink environment.

Then open a new model window in Simulink by choosing New > Model from the File menu at the top of

the open Simulink Library Browser window or by pressing Ctrl-N.

Insert four Fcn Blocks from the Simulink/User-Defined Functions library. We will build the equations

for , , , and employing these blocks.

Change the label of each Fcn block to match its associated function.

Insert four Integrator blocks from the Simulink/Continuous library. The output of each Integrator block is

going to be a state variable of the system: , , , and .

Double-click on each Integrator block to add the State Name: of the associated state variable. See the

following figure for an example. Also change the Initial condition: for (pendulum angle) to "pi" to

represent that the pendulum begins pointing straight up.

Page 439: Introduction to Control

Insert four Multiplexer (Mux) blocks from the Simulink/Signal Routing library, one for each Fcn block.

Insert two Out1 blocks and one In1 block from the Simulink/Sinks and Simulink/Sources libraries,

respectively. Then double-click on the labels for the blocks to change their names. The two outputs are for

the "Position" of the cart and the "Angle" of the pendulum, while the one input is for the "Force" applied to

the cart.

Connect each output of the Mux blocks to the input of the corresponding Fcn block.

Page 440: Introduction to Control

Connect the output of the and Fcn blocks to two consecutive integrators to generate the cart's position

and the pendulum's angle. Your current model should now appear as follows.

Now we will enter each of the four equations (1), (2), (13), and (14) into a Fcn block. Let's start with

equation (1) which is repeated below.

(15)

This equation requires three inputs: , , and . Double-click on the corresponding

Mux block and change the Number of inputs: to "3".

Connect these three inputs to this Mux block in the order prescribed in the previous step.

Double-click on the first Fcn block and enter the equation for xddot as shown below.

Page 441: Introduction to Control

Now, let's enter equation (2) which is repeated below.

(16)

This equation also requires three inputs: , , and .

Enter the above equation into the Fcn block, change the number of inputs of the Mux block, and connect

the correct signals to the Mux block in the correct order.

Repeat this process for equations (13) and (14) repeated below.

(17)

(18)

When all of these steps are completed, the resulting model should appear as follows.

Page 442: Introduction to Control

In order to save all of these components as a single subsystem block, first select all of the blocks, then

select Create Subsystem from the Edit menu. Your model should appear as follows. You can also

download the file for this system here, Pend_Model.mdl.

Page 443: Introduction to Control

Building the nonlinear model with Simscape

In this section, we alternatively show how to build the inverted pendulum model using the physical

modeling blocks of the Simscape extension to Simulink. The blocks in the Simscape library represent

actual physical components; therefore, complex multi-body dynamic models can be built without the need

to build mathematical equations from physical principles as was done above by applying Newton's laws.

Open a new Simulink model and follow the steps below to create the inverted pendulum model in

Simscape. In order to orient oneself, we will assume a coordinate system where the cart moves in the -

direction (positive to the right) and the positive -direction is directed up. Following standard convention,

the positive -direction is then pointed out of the plane of motion.

Insert a Body block from the Simscape/SimMechanics/Mechanical/Bodies library to represent the cart.

Following the system parameters given at the top of this page, double-click on the block and set

the Mass: to "0.5" with units of kg. The Body block by default includes two ports. Since we need ports to

define where the pendulum is connected to the cart and where the external force and the frictional force are

applied, a third port must be added. This can be accomplished from the button on the right-side of

the Position tab. Since the cart will only move in one dimension, the two forces must be co-located along

Page 444: Introduction to Control

that dimension (the -direction). Since we are in essence modeling the cart as a point mass that can only

translate, you do not have to change any of the other default parameters. However, we plan to use

Simscape to animate the motion of the system and hence will create additional ports to define the four

corners of the cart (2-dimensional only) with respect to its center of gravity (CG). The following figure

shows a possible definition of the cart body.

Insert a second Body block to represent the pendulum. Double-click on the block and set the Mass: to "0.2"

with units of kg. Since the pendulum can only rotate about the -axis, the inertia associated with that

principle direction is the only one that needs to be defined. For simplicity, define theInertia: equal to

"0.006*eye(3)" with units of kg*m^2. Since we are modeling the pendulum as a rigid body that has size as

well as mass, the body can rotate and it is important to define the location of the pendulum's attachment to

the cart and its CG correctly. Specifically, define the point of attachment CS1 to have a position "[0 0 0]"

and an origin that is Adjoining and define the CG to be 0.3 meters away from the attachment CS1 (as

defined above). Also define the four corners of the pendulum. Make sure to show the port defining the

Page 445: Introduction to Control

attachment point. Under the Visualizationtab, you can also change the pendulum's color to make it stand

out from the cart.

Next add a Revolute block from the Simscape/SimMechanics/Joints library to define the joint connecting

the pendulum to the cart. By default, the joint will be defined to rotate about the -axis which matches the

situation we are modeling. Connect the Body block corresponding to the cart to the base port (B) of the

joint and the Body block corresponding to the pendulum to the follower port (F) of the joint. Double-click

on the Revolute block and set the Number of sensor / actuator ports: to "2".

Then add a Joint Initial Condition block and a Joint Sensor block from the

Simscape/SimMechanics/Sensors & Actuators library and connect these blocks to the Revolute block.

Double-click on the Joint Initial Condition block and check the Enable box. We can use the default values

for initial position and velocity of the joint. Employing an initial position of 0 degrees corresponds to the

pendulum being pointed vertically upward based on the definition of the pendulum body above. This isn't

consistent with the original definition of , but it will make the response results consistent with those

generated from the linearized model in the other pages of this example. Next double-click on the Joint

Page 446: Introduction to Control

Sensor block and change the units on the Angle measurement to rad. Angular position is the only

measurement that is needed for this joint, the other boxes may remain unchecked.

Add two Prismatic blocks from the Simscape/SimMechanics/Joints library to define the translational

degree of freedom of the cart and the application of the forces to the cart. Since the cart is technically a

point mass we need only one Prismatic block, but by employing two we can apply the forces at different

locations. Double-click on each Prismatic block and change the Axis of Action to "[1 0 0]" to reflect the

fact that the two forces act in the -direction. Then connect the follower port (F) of each block to the ports

for the applied force (CS1) and frictional force (CS2) on the Body block representing the cart.

Next add two Ground blocks from the Simscape/SimMechanics/Bodies library to define the base for the

motion of the cart. Specifically, connect the output of each ground block to the base port (B) of each

Prismatic block.

For one of the Ground blocks you just created, double-click on the block and check the Show Machine

Environment port box. Then add a Machine Environment block from the Simscape/SimMechanics/Bodies

library and connect it to the Ground block for which you just added the port. The Machine Environment

block allows us to define the gravitational force in the simulation. In this case the default direction

(negative -direction) and magnitude ("9.81") for units of m/s^2 are correct. This block also allows us to

define the parameters for visualization and the numerical solver. The default parameters are fine for this

example.

Next add two Joint Actuator blocks and one Joint Sensor block from Simscape/SimMechanics/Sensors &

Actuators library. The Joint Actuator blocks will be employed for generating the external applied force and

the frictional force, while the Joint Sensor block will sense the motion of the cart. Note, there is also a

Translational Friction block that is available, but we will calculate the frictional force ourselves since we

are employing only a simple viscous model. Double-click on one of the Prismatic blocks and set

the Number of sensor / actuator ports: to "1" (for the force actuator). For the other Prismatic block, set

the Number of sensor / actuator ports: to "2" (one for the force actuator and one for the cart sensor). Then

connect the Joint Actuator and Joint Sensor blocks as described. The default values for the Joint Actuator

blocks are sufficient for this case, but we must change the Joint Sensor block to output position and

velocity since the velocity is needed for calculating the frictional force. Double-click on the Joint Sensor

block and check the box for Velocity while leaving the box for Position checked. The default metric units

do not need to be changed. Also uncheck the box for Output selected parameters as one signal.

Add a Gain block from the Simulink/Math Operations library to represent the viscous friction coefficient .

Set the Gain to "0.1" as defined at the top of this page and connect the input to the velocity output of the

Joint Sensor block for the cart and connect the output of the gain to the Joint Actuator for the frictional

force.

Next, add two Out1 blocks and one In1 block from the Simulink/Ports & Subsystems library. Connect the

Out1 blocks to the remaining Joint Sensor block outputs and the In1 block to the remaining Joint Actuator

input.

Page 447: Introduction to Control

Finally, connect and label the components as shown in the following figure. You can rotate a block in a

similar manner to the way you flipped blocks, that is, by right-clicking on the block then selecting Rotate

Block from the Format menu.

You can also save this model as a single subsystem block as described in the previous section. You can

change the color of the subsystem by right-clicking on the block and choosing Background Color from the

resulting menu. You can download the complete model file here,Pend_Model_Simscape.mdl, but note that

you will need the Simscape addition to Simulink in order to run the file. We use this model in the Inverted

Pendulum: Simulink Controller Design page.

Page 448: Introduction to Control

Generating the open-loop response

We will now simulate the response of the inverted pendulum system to an impulsive force applied to the

cart. This simulation requires an impulse input. Since there is no such block in the Simulink library, we

will use the Pulse Generator block to approximate a unit impulse input. We could use either of the models

we generated above, however, we will use the Simscape model in this case because it will allow us to

visualize the motion of the inverted pendulum system. Follow the steps given below.

Open the inverted pendulum simscape model generated above.

Add a Pulse Generator block from the Simulink/Sources library. Double-click on the block and change the

parameters as shown below. In particular, change the Period: to "10". Since we will run our simulation for

10 seconds, this will ensure that only a single "pulse" is generated. Also change theAmplitude to "1000"

and the Pulse Width (% of period): to "0.01". Together, these settings generate a pulse that approximates a

unit impulse in that the magnitude of the input is very large for a very short period of time and the area of

the pulse equals 1.

Page 449: Introduction to Control

Add a Scope block from the Simulink/Sinks library.

In order display two inputs on the scope, double-click on the Scope block, choose the Parameters icon, and

change the Number of axes: to "2".

Connect the blocks and label the signals connected to the Scope block as shown.

Page 450: Introduction to Control

Save this system as Pend_Openloop.mdl, or download it here

Before we start the simulation, we would like to enable the visualization of the inverted pendulum system.

From the menus at the top of the model window choose Simulation > Configuration Parameters. Then

from the from the directory on the left-side of the window choose Simscape > SimMechanics. Then check

the box for Show animation during simulation as shown in the figure below.

Page 451: Introduction to Control

Now, start the simulation (select Start from the Simulation menu or enter Ctrl-T). As the simulation runs,

an animation of the inverted pendulum like the one shown below will visualize the system's resulting

motion.

Page 452: Introduction to Control

Then open the Scope and click the Autoscale button. You will see the following output for the pendulum

angle and the cart position.

Page 453: Introduction to Control

Notice that the pendulum repeatedly swings through full revolutions where the angle rolls over /$-\pi$

radians. Furthermore, the cart's position grows unbounded, but oscillates under the influence of the

swinging pendulum. These results differ quite a bit from the results of the open-loop simulation shown in

the Inverted Pendulum: System Analysis page. This is due of course to the fact that this simulation

employed a fully nonlinear model, while the previous analysis had relied on a linear approximation of the

inverted pendulum model. In order to compare the results of the simulation model more directly to the

prior results, we will extract a linear model from our simulation model.

Extracting a linear model from the simulation

Aside from comparing our simulation model to our prior results, it may also be desirable to extract a linear

model for the purposes of analysis and design. Much of the analytical techniques that are commonly

applied to the analysis of dynamic systems and the design of their associated control can only be applied to

linear models. Therefore, it may be desirable to extract an approximate linear model from the nonlinear

simulation model. We will accomplish this from within Simulink.

To begin, open either of the Simulink models generated above, Pend_Model.mdl or

Pend_Model_Simscape.mdl.

If you generated your simulation model using variables, it is necessary to define the physical constants in

the MATLAB workspace before performing the linearization. This can be accomplished by entering the

following commands in the MATLAB command window.

M = 0.5;

Page 454: Introduction to Control

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

Next choose from the menus at the top of the model window Tools > Control Design > Linear Analysis.

This will cause the Linear Analysis Toolwindow to open.

In order to perform our linearization, we need to first identify the inputs and outputs for the model and the

operating point that we wish to perform the linearization about. First right-click on the signal representing

the Force input in the Simulink/Simscape model. Then choose Linearization Points > Input Point from the

resulting menu. Similarly, right-click on each of the two output signals of the model (pendulum angle and

cart position) and select Linearization Points > Output Point from the resulting menu in each case. The

resulting inputs and outputs should now be identified on your model by arrow symbols as shown in the

figure below.

Next we need to identify the operating point to be linearized about. From the Operating Point: menu

choose Linearize At... > Trim model... as shown in the figure below. This will open the TRIM

Page 455: Introduction to Control

MODEL tab. Within this tab, select the Trim button indicated by the green triangle. This will create the

operating point op_trim1.

Since we wish to examine the impulse response of this system, return to the EXACT

LINEARIZATION tab and choose New Impulse from the Plot Result: drop-down menu near the top

window as shown in the figure below.

Finally, choose op_trim1 from the Operating Point: drop-down menu and click the Linearize button

indicated by the green triangle. This automatically generates an impulse response plot and the linearized

model linsys1.

In order to compare the results to those plots generated in the Inverted Pendulum: System Analysis page, it

is necessary to change the -axis scaling. This can be achieved from by choosing Properties from the right-

click menu. The resulting window should then appear as follows, where the top plot is response of the

pendulum angle and the bottom plot is the response of the cart position.

Page 456: Introduction to Control

These plots are very similar, though not exactly the same, as those generated in the Inverted Pendulum:

System Analysis page.

We can also export the resulting linearized model into the MATLAB workspace for further analysis and

design. This can be accomplished by simply right-clicking on the linsys1 object in the Linear Analysis

Workspace to copy the object. Then right-click within the MATLAB Workspace to paste the object.

Inverted Pendulum: Simulink Controller Design

From the Inverted Pendulum: Simulink Modeling page we generated two different simulation models. We

will now employ these models within Simulink to design different approaches to control and simulate the

resulting closed-loop behavior.

Page 457: Introduction to Control

Contents

Problem setup and design requirements

Implementing PID control for the nonlinear model

Nonlinear closed-loop response

Problem setup and design requirements

In this problem, the cart with an inverted pendulum, shown below, is "bumped" with an impulse force, .

For this example, let's assume that

(M) mass of the cart 0.5 kg

(m) mass of the pendulum 0.2 kg

(b) friction of the cart 0.1 N/m/sec

(l) length to pendulum center of mass 0.3 m

(I) inertia of the pendulum 0.006 kg*m^2

(F) force applied to the cart N

(x) cart position coordinate m

(theta) pendulum angle from vertical radians

In the design process we will develop a PID controller and apply it to a single-input, single-output plant.

More specifically, the controller will attempt to maintain the pendulum vertically upward when the cart is

subjected to a 1-Nsec impulse. The cart's position will be ignored. Under these conditions, the design

criteria are:

Page 458: Introduction to Control

Settling time of less than 5 seconds

Pendulum should not move more than 0.05 radians away from the vertical

Implementing PID control for the nonlinear model

In the Inverted Pendulum: PID Controller Design page a PID controller was designed with proportional,

integral, and derivative gains equal to 100, 1, and 20, respectively. To implement this closed-loop system,

we will start with one of our plant models from the Inverted Pendulum: Simulink Modeling page.

Following the steps below, we will build a closed-loop model with reference input of pendulum position

and a disturbance force applied to the cart.

To begin, open either of the Simulink models generated

previously, Pend_Model.mdl or Pend_Model_Simscape.mdl. We will use the Simscape model to leverage

the animation capabilities it offers.

Insert two Add blocks from Simulink/Math Operations library.

Change the List of signs: of one of the Add blocks to "+-".

Insert a Constant block from Simulink/Sources library. Change its value to 0. This is the reference input

that corresponds to the pendulum vertically upward. Note, the non-Simscape model (and the rest of the

pages in this example) define the pendulum angle to equal pi when pointing straight up.

Insert a PID Controller block from the Simulink/Continuous library.

Edit the PID block by doubleclicking on it. Change the Proportional (P): gain to "100", leave the Integral

(I): gain as "1", and change theDerivative (D): gain to "20".

Now connect the blocks as they appear in the following figure:

Page 459: Introduction to Control

You can download our version here.

Nonlinear closed-loop response

We can now simulate the closed-loop system. Be sure that the physical parameters are set as follows.

M = 0.5;

m = 0.2;

b = 0.1;

I = 0.006;

g = 9.8;

l = 0.3;

Now, start the simulation (select Start from the Simulation menu or enter Ctrl-T). As the simulation runs,

an animation of the inverted pendulum will visualize the system's resulting motion. Recall that the Show

animation during simulation option must be checked under the Simulation > Configuration

Parameters menu. After the simulation has run, double-click on the scope and hit the Autoscale button.

You should see the following response.

Page 460: Introduction to Control

This response is almost identical to the closed-loop response obtained in the MATLAB tutorials (for

example, in the Inverted Pendulum: PID Controller Design page). Note that the PID controller handles the

nonlinear system very well because the deviation of the angle from the operating point is very small

(approximately .05 radians).

Suspension: Simulink Controller Design

Contents

Simulink Model

Extracting a linear model into MATLAB

Implementing full state-feedback control

Closed-loop response

Simulink Model

The Simulink model for the suspension system was developed in the Suspension: Simulink

Modeling section, and can be downloaded here: suspmod.mdl.

Extracting a linear model into MATLAB

A linear model of the system (in state space or transfer function form) can be extracted from a Simulink

model into MATLAB. This is done through the use of In1 and Out1 blocks and the MATLAB

function linmod. We will extract only the model from the input U to the output X1-X2.

First, replace the U Step block with an In1 block.

Also, replace the Scope block with an Out1 block. (These blocks can be found in the Ports & Subsystems

library). This defines the input and output of the system for the extraction process.

Page 461: Introduction to Control

Save your file as "suspmod.mdl" (select Save As from the File menu). MATLAB will extract the linear

model from the saved model file, not from the open model window. At the MATLAB prompt, enter the

following commands. You should see the following output, providing both state-space and transfer

function models of the system.

[A,B,C,D]=linmod('suspmod')

[num,den]=ss2tf(A,B,C,D)

A =

1.0e+03 *

0 0 0.0010 0

0 0 0 0.0010

-0.0320 0.0320 -0.0001 0.0001

0.2500 -1.8125 0.0011 -0.0480

B =

0

0

Page 462: Introduction to Control

0.0004

-0.0031

C =

1 -1 0 0

D =

0

num =

0 0 0.0035 0.0188 0.6250

den =

1.0e+04 *

0.0001 0.0048 0.1851 0.1721 5.0000

To verify the model extraction, we will generate an open-loop step response of the extracted transfer

function in MATLAB. Enter the following command in MATLAB. You should see the following plot

which is equivalent to the Scope's output.

step(num,den);

Page 463: Introduction to Control

Implementing full state-feedback control

In the Suspension: State-Space Controller Design page a full state-feedback controller was designed

feeding back the following five states:

(1)

The controller used the following feedback gain matrix:

K = [ 0 2.3E6 5E8 0 8E6 ]

To implement this in Simulink, we will contain the open-loop system from earlier in this page in a

Subsystem block.

Create a new model window.

Drag a Subsystem block from the Subsystems & Ports library into your new model window.

Double-click on this block. You will see a blank window representing the contents of the subsystem

(which is currently empty).

Open your previously saved model of the vehicle suspension system, suspmod.mdl.

Select Select All from the Edit menu (or Ctrl-A), and select Copy from the Edit menu (or Ctrl-C).

Page 464: Introduction to Control

Select the blank subsystem window from your new model and select Paste from the Edit menu (or Ctrl-V).

You should see your original system in this new subsystem window (you may need to use the scroll bars to

center on it).

Label the In1 block "U", and the Out1 block "y1".

Replace the W Step block with an In1 block and label this block "W".

Now we will generate the other state outputs from the subsystem.

Insert an Out1 block below the "y1" block and label it "d/dt(y1)", Tap a line off the line leading into the

Damper 1 gain block (V1-V2) and connect it to the d/dt(y1) Out block.

Insert another Out1 block below the "d/dt(y1)" Out1 block and label it "x1".

Tap a line off the "x1" line and connect it to this Out1 block.

Insert another Out1 block below the "x1" Out1 block and label it "d/dt(x1)".

Tap a line off the "v1" line and connect it to this Out1 block.

Page 465: Introduction to Control

The final, extra, state needs to be generated, which is the integral of Y1.

Insert an Integrator block above the "y1" Out block and connect its input with a line tapped of the input to

the "y1" Out1 block.

Insert an Out1 block, label it "int(y1)", and connect it to the output of the new Integrator block.

Page 466: Introduction to Control

Since the state outputs will be used to form a vector, it is important that they be numbered in the right

order.

Edit the "x1" Out1 block and change its Port Number to "1".

Similarly, change the "d/dt(x1)" Out1 block's port number to "2", "y1" Out1 block's port number to "3",

"d/dt(y1)" Out1 block's port number to "4", and "int(y1)" Out1 block's port number to "5".

The In1 blocks should be numbered such that "U" is "1" and "W" is "2". Some of these numbers may

already be correct.

Page 467: Introduction to Control

Close the Subsystem window. You should now see input and output terminals on the Subsystem block.

Name this block "Suspension Model".

You should resize this block so that you can read all of the labels. To do this, highlight it by single-clicking

on it and drag one of the highlighted corners to the right size. Notice that the model has two inputs and five

outputs. Each input and output is a scalar signal in this model.

Page 468: Introduction to Control

Now, we will build a full state-feedback controller around the plant model. First, we need to create a vector

signal out of the five scalar outputs in order to multiply by the feedback gain matrix K.

Insert a Mux block (from the Signal Rounting library) to the right of the Suspension Model block. The

Mux takes multiple inputs and combines them into a vector signal. By default, the Mux has two inputs.

Edit the Mux block and change the Number of Inputs to "5".

Resize the Mux so that it is the same height as the Suspension Model block.

Page 469: Introduction to Control

Now, we will close the loop.

Insert a Matrix Gain block (from the Math Operations library) below the Suspension Model block.

Flip the Matrix Gain left-to-right and edit its value to "K".

Insert a Sum block to the left of the Suspension Model block.

Edit its signs to "+-".

Connect the output of the Matrix Gain to the negative input of the Sum block.

Connect the output of the Sum block to the "U" input of the Suspension Model.

Page 470: Introduction to Control

Insert a Step block and connect it to the positive input of the Sum block.

Label the step block "r" and edit its Step Time to "0" and its Final Value to "0" (we are commanding the

vehicle to stay level).

Insert a Step block and connect it to the "W" input of the Suspension Model.

Edit its Step Time to "0" and its Final Value to "-.1" (we are now assuming a 10cm deep pothole).

Insert a Scope block and tap a line off the "y1" output of the Suspension Model and connect it to the

Scope.

Page 471: Introduction to Control

Closed-loop response

To simulate this system, first, an appropriate simulation time must be set. Select Parameters from the

Simulation menu and enter "2" in the Stop Time field. The design requirements included a settling time of

less than 5 sec, and the system actually settles in 2 sec. The physical parameters must now be set. Run the

following commands at the MATLAB prompt:

m1 = 2500;

m2 = 320;

k1 = 80000;

k2 = 500000;

b1 = 350;

b2 = 15020;

The last step is to assign values to the feedback gain matrix K. Execute the following command at the

MATLAB prompt.

K = [ 0 2.3e6 5e8 0 8e6 ];

Run the simulation (Ctrl-T or Start on the Simulation menu). When the simulation is finished, double-click

on the scope and hit its autoscale button. You should see the following output.

Page 472: Introduction to Control

This response agrees with the one found in the Suspension: State-Space Controller Design page.

DC Motor Position: Simulink Controller Design

Contents

Open-loop response

Extracting a linear sampled model into MATLAB

Implementing digital control in Simulink

Converting a continuous-time model to discrete-time within Simulink

In the DC Motor Position: Simulink Modeling section, we developed a Simulink model of the DC motor

system using three different methods. You can download one of these models here, Motor_Pos.mdl. In this

section, we will employ this model within Simulink to simulate and design different approaches to control.

Specifically, we will explore the design of a digital control system.

Open-loop response

Page 473: Introduction to Control

Begin with the above model saved as a subsystem and follow the steps given below.

Remove the In and Out ports.

Insert a Step block from the Simulink/Sources library and connect it with a line to the Voltage input.

To view the output position, insert a Scope from the Simulink/Sinks library and connect it to the Position

output.

To provide an appropriate unit step input at t=0, double-click the Step block and set the Step time to "0".

The system should now appear as in the following figure.

Page 474: Introduction to Control

In order to simulate this system, the details of the simulation must first be set. This can be accomplished by

selecting Configuration Parameters from the Simulation menu. Within the resulting menu, define the

length for which the simulation is to run in the Stop time field. We will enter "0.2" since 0.2 seconds will

be long enough for the step response to reach steady state. Also in the Configuration Parameters dialog

box, the numerical solver employed in the simulation can be specified. Go ahead and change

the Solver field from the default ode45 (Dormand-Prince) to the ode15s (stiff/NDF) solver.

Since the time scales in this example are very small, this stiff system integration method is more efficient

than the default integration method.

Page 475: Introduction to Control

The physical parameters must now be set. Enter the following commands at in the MATLAB command

window.

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

Page 476: Introduction to Control

Then run the simulation (press Ctrl-T or select Start from the Simulation menu). When the simulation is

finished, double-click on the scope and hit its autoscale button. You should see the following output which

goes unstable and obviously does not meet our design requirements. Note that this response is consistent

with the results we achieved from the MATLAB command line in the DC Motor Position: System

Analysis page.

Extracting a linear sampled model into MATLAB

We will now extract a linear sampled version of this continuous-time model into the MATLAB workspace.

The extraction of a sampled model can be performed from the MATLAB command line using the

command dlinmod, though it is preferrable to perform the extraction from directly within Simulink as we

will demonstrate here. We will use the model from above.

The first thing that we need to do is to identify the inputs and outputs of the model we wish to extract. First

right-click on the signal representing the Voltage input in the Simulink model. Then choose Linearization

> Input Point from the resulting menu. Similarly, right-click on the signal representing the Position output

and select Linearization > Output Point from the resulting menu. The input and output signals should now

be identified on your model by arrow symbols as shown in the figure below.

Page 477: Introduction to Control

In order to perform the extraction, select from the menus at the top of the model window Tools > Control

Design > Linear Analysis. This will cause theLinear Analysis Tool to open. Next follow the steps given

below.

From the Linear Analysis Tool window, click the Options button. From the resulting window, change

the sample time to "0.001" as shown in the figure below. The rate conversion method can remain the

default Zero-Order Hold.

Page 478: Introduction to Control

Within the Linear Analysis Tool window, the Operating Point to be linearized about can remain the

default, Model Initial Condition. In order to perform the linearization/discretization, next click

the Linearize button identified by the green triangle.

The result of this linearization/discretization is the linsys1 object which now appears in the Linear

Analysis Workspace. This model can be exported by simply dragging the object into the MATLAB

Workspace.

Page 479: Introduction to Control

This object can then be used within MATLAB in the same manner as an object created directly from the

MATLAB command line. Specifically, entering the command zpk(linsys1) in the MATLAB

command window demonstrates that the resulting model has the following form.

(1)

Note that this model is identical to the model generated from the conversion performed in DC Motor

Position: Digital Controller Design page. This makes sense since the same sample time and discretization

method were used, and because the original model was already linear.

To further verify the validity of the model extraction, we will generate an open-loop step response of the

discrete-time transfer function in MATLAB. Enter the following commands at the prompt of the

MATLAB command window. You should see the following plot which is in agreement with the output

from the continous Simulink model evaluated above.

t = 0:0.001:0.2;

step(linsys1,t);

grid

Page 480: Introduction to Control

The extracted discrete models can then be used within MATLAB for various analysis and controller design

tasks. In the following, we directly employ the Simulink model from above to simulate the implementation

of a digital controller without explicitly discretizing the continuous-time plant model.

Implementing digital control in Simulink

In the DC Motor Position: Digital Controller Design page a digital controller was designed with the

following transfer function.

(2)

We can use this compensator to simulate the associated closed-loop digital control system in Simulink.

Starting from the Simulink model we used above for extraction, delete the Input and Output ports and add

the following:

Two Zero Order Hold blocks from the Simulink/Discrete library

Discrete Zero Pole block from the Simulink/Discrete library

Sum block from Simulink/Math Operations library

Page 481: Introduction to Control

Place one Zero Order Hold block on the input of the Motor_pos subsystem which is a continuous model of

the plant. This Zero Order Hold blocks converts a discrete-time signal to a stepwise-constant continuous

signal. The other Zero Order Hold block is placed on the output of the Motor_pos subsystem and serves to

take discrete samples of the output signal of the plant. Edit the Zero Order Hold blocks such that

the Sample time fields are set to "0.001" (this is fast compared to the desired step response in the

MATLAB tutorial).

Next edit the Discrete Zero Pole block to model the discrete controller transfer function described above.

Specifically, edit the Zeros field to "[0.95 0.80 0.80]", the Poles field to "[-0.98 0.6 1]", the Gain field to

"800", and the Sample time field to "0.001". Then label the block "Controller" and resize it to view its

entire contents.

Next, enter "|+-" to the List of signs field of the Sum block. The character "|" serves as a spacer between

input ports. Now we need to set up the simulation to observe the motor's position for a step input.

Attach a Step block to the positve input of the Sum block and attach a Scope block to the plant output.

Double-click the Step block and set the Step time to "0".

Finally, connect the blocks as shown below.

Before we can simulate the closed-loop system, we again need to set an appropriate simulation time.

Select Configuration Parameters... from theSimulation menu and enter "0.08" in the Stop time field. We

choose this stop time in order to observe the system long enough to see if it satisfies the 0.04 seconds

settling time requirement. If you have started a new session of MATLAB or skipped the open-loop

response part of this example, then the physical parameters for the simulation must be set again. Run the

following commands at the MATLAB prompt if necessary.

Page 482: Introduction to Control

J = 3.2284E-6;

b = 3.5077E-6;

K = 0.0274;

R = 4;

L = 2.75E-6;

Now the simulation can finally be run. Recall that this can be accomplished by pressing Ctrl-T or

selecting Start from the Simulation menu. When the simulation is finished, double-click on the scope and

hit its autoscale button. You should see the following output.

From the above figure, it appears that the overshoot is less than 16% and the settling time is less than 0.04

seconds as required. This is consistent with the analysis employed in designing the digital controller. We

have not, however, assessed the response of the system with a disturbance present. A step disturbance can

be added in a similar manner to the way that the step reference was added as shown in the following figure.

Sum the disturbance between the controller and plant following the Zero Order Hold block since the

disturbance signal is continous.

Page 483: Introduction to Control

Within the model, set the disturbance Step time to occur at "0.03" seconds. Then re-run the simulation and

observe the scope output as described above. The resulting position graph should appear as shown below.

Page 484: Introduction to Control

From inspection of the above, you can see that there is a slight bump beginning at 0.03 seconds due to the

disturbance, but the system is able to reject its effect and the steady-state error still goes to zero as required.

If you have not done so already, save your Simulink model. You can also download our version of this

model here, Motor_Pos_cl.mdl.

Converting a continuous-time model to discrete-time within Simulink

In the above, we extracted a linear sampled model of our plant from our Simulink model into the

MATLAB workspace using the Linear Analysis Tool. We also, in effect, discretized the plant for the

purposes of simulation using Zero Order Hold blocks within Simulink. In this section, we will generate a

discrete-time model of our plant without the use of the Zero Order Hold blocks. This approach offers a

wider array of discretization techniques than can be achieved through Simulink blocks, which are limited

to Zero Order and First Order Hold. This is especially useful in generating a digital controller from a

continous design.

So far we have chosen to employ the first principles simulink model but we could have just as easily used

the Simscape model or the LTI System model. One thing to be careful of, however, is that if you were to

use the Simscape model of the plant in the above, the physical Simscape signals would need to be

converted to dimensionless Simulink signals in order to interface with the Simulink blocks we employed.

This process is described in the DC Motor Position: Simulink Modeling page.

In the following, we will discretize the LTI System model which can be downloaded

here, Motor_Pos_LTI.mdl, or you can create it yourself as DC Motor Position: Simulink Modeling page.

Recall that the LTI System block imports a model from the MATLAB workspace. Therefore, you need to

enter the following commands at the command line where it is presumed that values have already been

entered for the various physical parameters.

A = [0 1 0

0 -b/J K/J

0 -K/L -R/L];

B = [0 ; 0 ; 1/L];

C = [1 0 0];

D = 0;

Your model should appear as follows.

Page 485: Introduction to Control

To discretize this model:

Remove the In1 and Out1 ports.

Click on Tools > Control Design > Model Discretizer and the LTI System block will turn red.

Enter a Sample time of 0.001 and leave the Transform method as Zero-order hold.

Then choose Discretize selected blocks from the Discretize menu.

Page 486: Introduction to Control

The LTI model now is converted to discrete. Let's add a digital controller and simulate the closed-loop

response of this model. Employ the same controller we used above. The final model should appear as

follows.

Page 487: Introduction to Control

Simulate the model as we have done previously. The resulting position response should appear as follows.

Note the agreement with the closed-loop simulation results we found previously. This makes sense since

the first principles model and the LTI System block model are equivalent and both Simulink models used a

zero-order hold type sampling to discretize the plant.

You can download our version of this model here, Motor_Pos_LTI_cl.mdl.

DC Motor Speed: Simulink Controller Design

Contents

Page 488: Introduction to Control

Extracting a linear model into MATLAB

Open-loop response

Closed-loop response with lag compensator

Closed-loop response with lead compensator

From the DC Motor Speed: Simulink Modeling page we generated two different DC motor models in

Simulink. We will now employ these models within Simulink to simulate the system response and design

different approaches to control.

Extracting a linear model into MATLAB

A linear model of the system can be extracted from the Simulink model into the MATLAB workspace.

This can accomplished employing the MATLAB command linmod or from directly within Simulink as

we will do here. We will specifically use the base Simulink model developed from first principles shown

below. You can download this model here, or you can refer to the DC Motor Speed: Simulink

Modeling page to recreate the model yourself.

Recall that the physical parameters have to be set if they have not previously been defined in the

workspace.

J = 0.01;

b = 0.1;

K = 0.01;

Page 489: Introduction to Control

R = 1;

L = 0.5;

We then need to identify the inputs and outputs of the model we wish to extract. First right-click on the

signal representing the Voltage input in the Simulink model. Then choose Linearization > Input Point from

the resulting menu. Similarly, right-click on the signal representing the Speed output and

select Linearization > Output Point from the resulting menu. The input and output signals should now be

identified on your model by arrow symbols as shown in the figure below.

In order to perform the extraction, select from the menus at the top of the model window Tools > Control

Design > Linear Analysis. This will cause theLinear Analysis Tool to open. Within the Linear Analysis

Tool window, the Operating Point to be linearized about can remain the default, Model Initial

Condition. In order to perform the linearization, next click the Linearize button identified by the green

triangle. The result of this linearization is the linsys1 object which now appears in the Linear Analysis

Workspace as shown below. Furthermore, the open-loop step response of the linearized system was also

generated automatically.

Page 490: Introduction to Control

The open-loop step response above is consistent with the response generated in the DC Motor Speed:

System Analysis page The reason the responses match so closely is because this Simulink model uses only

linear components. Note that this process can be used extract linear approximations of models with

nonlinear elements too.

We will further verify the model extraction by looking at the model itself. The linearized model can be

exported by simply dragging the object into theMATLAB Workspace. This object can then be used within

Page 491: Introduction to Control

MATLAB in the same manner as an object created directly from the MATLAB command line.

Specifically, entering the command zpk(linsys1) in the MATLAB command window demonstrates

that the resulting model has the following form.

(1)

This model matches the one generated in the DC Motor Speed: System Modeling page. This can be seen

by repeating the MATLAB commands given below.

s = tf('s');

P_motor = K/((J*s+b)*(L*s+R)+K^2);

zpk(P_motor)

ans =

2

-------------------

(s+9.997) (s+2.003)

Continuous-time zero/pole/gain model.

Open-loop response

The open-loop step response can also be generated directly within Simulink, without extracting any models

to the MATLAB workspace. In order to simulate the step response, the details of the simulation must first

be set. This can be accomplished by selecting Configuration Parameters from theSimulation menu. Within

the resulting menu, define the length for which the simulation is to run in the Stop time field. We will enter

"3" since 3 seconds will be long enough for the step response to reach steady state. Within this window

you can also specify various aspects of the numerical solver, but we will just use the default values for this

example.

Next we need to add an input signal and a means for displaying the output of our simulation. This is done

by doing the following:

Remove the In1 and Out1 blocks.

Insert a Step block from the Simulink/Sources library and connect it with a line to the Voltage input of the

motor subsystem.

To view the Speed output, insert a Scope from the Simulink/Sinks library and connect it to the Speed

output of the motor subsystem.

Page 492: Introduction to Control

To provide a appropriate unit step input at t=0, double-click the Step block and set the Step time to "0".

The final model should appear as shown in the following figure.

Then run the simulation (press Ctrl-T or select Start from the Simulation menu). When the simulation is

finished, double-click on the scope and hit its autoscale button. You should see the following output.

This response is identical to that obtained by MATLAB above using the extracted model. This is again to

be expected because this Simulink model includes only linear blocks.

Page 493: Introduction to Control

Closed-loop response with lag compensator

In the DC Motor Speed: Root Locus Controller Design page a lag compensator was designed with the

following transfer function.

(2)

To generate the closed-loop step response with this compensator in Simulink, we will begin with the

"Motor_Model.mdl" file described above. We will then put the lag compensator in series with the motor

subsystem and will feed back the motor's speed for comparison to a desired reference.

More specifically, follow the steps given below:

Remove the Input and Output ports of the model.

Insert a Sum block from the Simulink/Math Operations library. Then double-click on the block and enter

"|+-" for its List of signs where the symbol "|" serves as a spacer between ports of the block.

Insert a Transfer Function block from the Simulink/Continuous library. Then double-click on the block and

edit the Numerator coefficients field to "[44 44]" and the Denominator coefficients field to "[1 0.01]".

Insert a Step block from the Simulink/Sources library. Then double-click on the block and set the Step

time to "0".

Insert a Scope block from the Simulink/Sinks library.

Then connect and label the components as shown in the following figure

You can download our version of the closed-loop system model here, Motor_Model_lag.mdl.

Page 494: Introduction to Control

Then run the simulation (press Ctrl-T or select Start from the Simulation menu). When the simulation is

finished, double-click on the scope and hit its autoscale button. You should see the following output.

This step response matches exactly the closed-loop performance observed in the DC Motor Speed: Root

Locus Controller Design page where the lag compensator was originally designed. Note that while we used

the physics-based Simulink model developed in the DC Motor Speed: Simulink Modelingpage for

simulating the closed-loop system, we could have equivalently used the Simscape version of the DC motor

model.

Closed-loop response with lead compensator

We have shown in the above and in other pages of this example that the lag compensator we have designed

meets all of the given design requirements. Instead of a lag compensator, we could have also designed a

lead compensator to meet the given requirements. More specifically, we could have designed a lead

compensator to achieve a similar DC gain and phase margin to that achieved by the lag compensator, but

with a larger gain crossover frequency. You can refer back to the DC Motor Speed: Frequency Domain

Methods for Controller Design page for more details on the design of the lag compensator, but the fact that

the DC gains and phase margins are similar indicate that the responses under lag and lead control would

have similar amounts of error in steady state and similar amounts of overshoot. The difference in response

would come in that the larger gain crossover frequency provided by the lead compensator would make the

system response faster than with the lag compensator. We will specifically use the following lead

compensator.

(3)

To see the precise effect of the lead compensator as compared to our lag compensator, let's modify our

Simulink model from above as follows:

Disconnect the Step block and Scope block from the rest of the model.

Page 495: Introduction to Control

Copy the blocks forming the closed-loop of the model: the Sum block, the Transfer Function block, and the

DC Motor subsystem. Then paste a copy of this loop below the original blocks.

Double-click on the Transfer Function block and edit the Numerator coefficients field to "[160000 5.6e6]"

and the Denominator coefficientsfield to "[1 1035]".

Insert a Mux block from the Simulink\Signal Routing library and connect the outputs of the two Motor

subsystem blocks to the inputs of the Mux and connect the output of the Mux to the Scope.

Connect the Step block to the Sum block of the original feedback system. Then branch off from this line

and connect it to the Sum block of the lead compensated system as well.

The Mux block serves to bundle the two signals into a single line, this way the Scope will plot both speed

signals on the same set of axes. When you are done, your model should appear as follows.

Running the simulation and observing the output produced by the scope, you will see that both responses

have a steady-state error that approaches zero. Zooming in on the graphs you can generate a figure like the

one shown below. Comparing the two graphs, the purple response belonging to the lead compensated

system has a much smaller settle time and slightly larger, but similar, overshoot as compared to the yellow

response produced by the lag compensated system.

Page 496: Introduction to Control

It is generally preferred that a system respond to a command quickly. Why then might we prefer to use the

lag compensator even though it is slower than the lead compensator? The advantage of the lag

compensator in this case is that by responding more slowly it requires less control effort than the lead

compensator. Less control effort means that less power is consumed and that the various components can

be sized smaller since they do not have to supply as much energy or withstand the higher voltages and

current required of the lead compensator.

We will now modify our simulation to explicitly observe the control effort requirements of our two

feedback systems. We will do this by sending our various signals to the workspace for plotting and further

manipulation if desired. Specifically, delete the Scope and Mux blocks from your Simulink model. Then

insert four To Workspace blocks from the Simulink\Sinks library. Double-click on each of the blocks and

change their Save format from Structure toArray. Also provide a Variable name within each block

that will make sense to you. You can then connect the blocks to the existing model and label them as

shown below. You can download our version of this Simulink model here, Motor_Model_leadlag.mdl.

Page 497: Introduction to Control

Then change the simulation stop time to 1 second and run the model. The act of running the simulation will

send to the MATLAB workspace a series of arrays corresponding to the variables set-up in your model

with the To Workspace blocks. Furthermore, the time vector used by that run of the simulation is stored in

the default variable tout. You can now plot the results of your simulation from the workspace. Enter the

following code to see how to specifically plot the control effort variables.

subplot(2,1,1)

plot(tout,ulag);

xlabel('time (seconds)')

ylabel('control effort (volts)')

title('Control Effort Under Lag Compensation')

subplot(2,1,2)

Page 498: Introduction to Control

plot(tout,ulead);

xlabel('time (seconds)')

ylabel('control effort (volts)')

title('Control Effort Under Lead Compensation')

Examination of the above shows that the control effort required by the lead compensator is above 150,000

Volts, which is well above anything that could be supplied or withstood by a typical DC motor. This

exemplifies the tradeoff inherent between achieving small tracking error and keeping the amount of control

effort required small. Optimal control techniques have been developed to achieve an optimal balance

between competing goals. One such technique is explored in the Aircraft Pitch: State Space Methods for

Controller Design page.

Cruise Control: Simulink Controller Design

Contents

Extracting a linear model into MATLAB

Implementing PI control

Closed-loop response

Page 499: Introduction to Control

In the Cruise Control: Simulink Modeling page we created a Simulink model of the cruise control system.

You can recreate the model or download it here. In this section, we will show how to implement a

feedback controller in Simulink to meet the performance specifications for the system.

Extracting a linear model into MATLAB

A linear model of the system (in state space or transfer function form) can be extracted from a Simulink

model into MATLAB. This is done through the use of In1 and Out1 blocks and the MATLAB

function linmod.

Replace the Step Block and Scope Block with an In1 and an Out1 block, respectively (these blocks can be

found in the Ports & Subsystems library). This defines the input and output of the system for the extraction

process.

Save your file as "ccmodel.mdl" (select Save As from the File menu). MATLAB will extract the linear

model from the saved model file, not from the open model window. At the MATLAB prompt, enter the

following commands:

m = 1000;

b = 50;

u = 500;

[A,B,C,D] = linmod('ccmodel')

cruise_ss = ss(A,B,C,D);

Page 500: Introduction to Control

A =

-0.0500

B =

1.0000e-03

C =

1

D =

0

To verify the model extraction, we will generate an open-loop step response of the extracted transfer

function in MATLAB. We will multiply the numerator by 500 to simulate a step input of 500 N. Enter the

following command in MATLAB.

step(u*cruise_ss)

Implementing PI control

In the Cruise Control: PID Control page a PI controller was designed with Kp = 800 and Ki = 40 to give

the desired response. We will implement this in Simulink by first containing the open-loop system from

earlier in this page in a Subsystem block.

Page 501: Introduction to Control

Create a new model window.

Drag a Subsystem block from the Ports & Subsystems library into your new model window.

Double-click on this block. You will see a blank window representing the contents of the subsystem

(which is currently empty).

Open your previously saved model of the cruise control system, ccmodel.mdl.

Select Select All from the Edit menu (or Ctrl-A), and select Copy from the Edit menu (or Ctrl-C).

Select the blank subsystem window from your new model and select Paste from the Edit menu (or Ctrl-V).

You should see your original system in this new subsystem window. Close this window.

You should now see input and output terminals on the Subsystem block. Name this block "plant model".

Page 502: Introduction to Control

Now, we will build a PI controller around the plant model. First, we will feed back the plant output.

Draw a line extending from the plant output.

Insert a Sum block and assign "+-" to it's inputs.

Tap a line of the output line and draw it to the negative input of the Sum block.

Page 503: Introduction to Control

The output of the Sum block will provide the error signal. From this, we will generate proportional and

integral components.

Insert an Integrator block after the Sum block and connect them with a line.

Insert and connect a Gain block after the Integrator block to provide the integral gain.

Label this Integrator "Ki" and assign it a value of "Ki".

Insert a new Gain block and connect it with a line tapped off the output of the Sum block.

Label this gain "Kp" and assign it a value of "Kp".

Page 504: Introduction to Control

Now we will add the proportional and integral components and apply the sum to the plant.

Insert a Sum block between the Ki block and the plant model and connect the outputs of the two Gain

blocks to the Sum block inputs.

Connect the Sum block output to the input of the plant block.

Page 505: Introduction to Control

Finally, we will apply a step input and view the output with a Scope block.

Attach a Step block to the free input of the feedback Sum block.

Attach a Scope block to the plant output.

Double-click the Step block and set the Step Time to "0" and the Final Value to "u". This allows the input

magnitude to be changed outside of Simulink.

Page 506: Introduction to Control

You can download our version of the closed-loop system model here.

In this example, we constructed a PI controller from fundamental blocks. As an alternative, we could have

used a Transfer Function block (from the Continuous library) to implement this in one step, as shown

below.

Page 507: Introduction to Control

You can download this model here.

Closed-loop response

To simulate this system, first, an appropriate simulation time must be set. Select Parameters from the

Simulation menu and enter "10" in the Stop Time field. The design requirements included a rise time of

less than 5 sec, so we simulate for 10 seconds to view the output. The physical parameters must now be set.

Run the following commands at the MATLAB prompt:

m = 1000;

b = 50;

u = 10;

Kp = 800;

Ki = 40;

Run the simulation (hit Ctrl-T or select Start from the Simulation menu). When the simulation is finished,

double-click on the scope and hit its autoscale button. You should see the following output.