# ControlSystems.jl

A control systems design toolbox for Julia.

## Installation

To install, in the Julia REPL:

using Pkg; Pkg.add("ControlSystems")

## Documentation

All functions have docstrings, which can be viewed from the REPL, using for example `?tf `

.

A documentation website is available at http://juliacontrol.github.io/ControlSystems.jl/dev/ and an introductory video series is available here.

Some of the available commands are:

##### Constructing systems

`ss, tf, zpk, delay`

##### Analysis

`poles, tzeros, norm, hinfnorm, linfnorm, ctrb, obsv, gangoffour, margin, markovparam, damp, dampreport, zpkdata, dcgain, covar, gram, sigma, sisomargin`

##### Synthesis

`are, lyap, lqr, place, leadlink, laglink, leadlinkat, rstd, rstc, dab, balreal, baltrunc`

###### PID design

`pid, stabregionPID, loopshapingPI, pidplots, placePI`

##### Time and Frequency response

`step, impulse, lsim, freqresp, evalfr, bode, nyquist`

##### Plotting

`bodeplot, nyquistplot, sigmaplot, plot(lsim(...)), plot(step(...)), plot(impulse(...)), marginplot, gangoffourplot, pzmap, nicholsplot, pidplots, rlocus, leadlinkcurve`

##### Other

`minreal, sminreal, c2d`

## Usage

This toolbox works similar to that of other major computer-aided control systems design (CACSD) toolboxes. Systems can be created in either a transfer function or a state space representation. These systems can then be combined into larger architectures, simulated in both time and frequency domain, and analyzed for stability/performance properties.

### Example

Here we create a simple position controller for an electric motor with an inertial load.

using ControlSystems
# Motor parameters
J = 2.0
b = 0.04
K = 1.0
R = 0.08
L = 1e-4
# Create the model transfer function
s = tf("s")
P = K/(s*((J*s + b)*(L*s + R) + K^2))
# This generates the system
# TransferFunction:
# 1.0
# ---------------------------------
# 0.0002s^3 + 0.160004s^2 + 1.0032s
#
#Continuous-time transfer function model
# Create an array of closed loop systems for different values of Kp
CLs = TransferFunction[kp*P/(1 + kp*P) for kp = [1, 5, 15]];
# Plot the step response of the controllers
# Any keyword arguments supported in Plots.jl can be supplied
using Plots
plot(step.(CLs, 5), label=["Kp = 1" "Kp = 5" "Kp = 15"])

### Additional examples

See the examples folder and ControlExamples.jl and several examples in the documentation.