# Sliding Mode Control Design for Mass-Spring-Damper System

*Since R2024a*

This example describes the fundamentals of sliding mode control (SMC) and uses SMC to control a mass-spring-damper system.

### Sliding Mode Control

In SMC, you define a *sliding surface* that the system state trajectory converges to and remains on. This sliding surface is designed such that it is insensitive to disturbances and uncertainties in the system. Once the system state trajectory is on the sliding surface, the controller uses a feedback control law to drive the system state trajectory to the desired state along the sliding surface. [1]

Consider a dynamic system characterized by the following differential equation.

$$\dot{\mathit{x}}\left(\mathit{t}\right)=\mathit{f}\left(\mathit{x},\mathit{t}\right)+\mathit{g}\left(\mathit{x},\mathit{t}\right)\text{\hspace{0.17em}}\mathit{u}\left(\mathit{x},\mathit{t}\right)+\mathit{d}\left(\mathit{t}\right)$$

Here:

$f(x,t)$ represents the inherent system dynamics.

$g(x,t)$ is an input function that modulates the effect of the control input $u(x,t)$ on the system.

$d\left(t\right)$ denotes an external disturbance influencing the system behavior over time.

This formulation captures the interplay between the system natural evolution, control efforts, and unpredictable external factors, providing a comprehensive model for analysis and design in control engineering.

SMC uses discontinuous control to switch between two distinct system structures, which can be mathematically described as:

$${\mathit{u}}_{\mathit{k}}\left(\mathit{t}\right)=\{\begin{array}{ll}{\mathit{u}}_{\mathit{k}}^{+}\left(\mathit{t}\right)& \mathrm{if}\text{\hspace{0.17em}}{\mathit{S}}_{\mathit{k}}\left(\mathit{x}\right)>0\\ {\mathit{u}}_{\mathit{k}}^{-}\left(\mathit{t}\right)& \mathrm{if}\text{\hspace{0.17em}}{\mathit{S}}_{\mathit{k}}\left(\mathit{x}\right)<0\end{array}\text{\hspace{0.17em}\hspace{0.17em}},\mathrm{for}\text{\hspace{0.17em}}\mathit{k}=1,2,\cdots ,{\mathit{n}}_{\mathit{u}}$$

Here, ${\mathit{u}}_{\mathit{k}}^{+}\left(\mathit{t}\right)$ and ${\mathit{u}}_{\mathit{k}}^{-}\left(\mathit{t}\right)$ denote two separate control inputs, ${\mathit{n}}_{\mathit{u}}$ is the number of inputs, and ${\mathit{S}}_{\mathit{k}}\left(\mathit{x}\right)$ is the *k*th component of the following sliding mode function.

$$S(x)={\left[\begin{array}{cccc}{S}_{1}(x)& {S}_{2}(x)& \dots & {S}_{{n}_{u}}(x)\end{array}\right]}^{T}$$

Proper design of the control input ${\mathit{u}}_{\mathit{k}}\left(\mathit{t}\right)$ is crucial for ensuring that the state variables converge to the sliding surface, travel along it, and maintain their trajectory along the surface. Upon reaching the sliding surface, the sliding surface function should satisfy $S\left(x\right)=0$, indicating the existence of a sliding mode. A necessary and sufficient criterion for guaranteeing this condition is that the product of the sliding surface and its time derivative should be negative, that is, $\mathit{S}\left(\mathit{x}\right)\dot{\mathit{S}}\left(\mathit{x}\right)<0$. This condition ensures that the system, as described by the initial differential equation, remains in the sliding mode once it has been attained.

As a side effect of the discontinuous control in SMC, the control input can exhibit *chattering*, which creates rapid oscillations in control input from persistent switching at the sliding surface boundary. Chattering can cause actuator damage and unwanted system dynamics. Therefore, mitigating chattering is essential in SMC design.

In summary, the SMC design includes the following stages:

Sliding surface function design

Sliding coefficient selection

Control input selection

Chattering reduction

### Mass-Spring-Damper System

Consider a mass-spring-damper system with mass, $\mathit{M}$, attached to a spring with stiffness coefficient, $\mathit{K}$, and a damper with damping coefficient, $\mathit{D}$. The dynamics of the system are also subject to an external control force, $\mathit{F}$, exerted on the mass. This force serves as a mechanism to influence the system dynamic response.

The differential equation for the system is:

$$\mathit{M}\ddot{\mathit{x}}+\mathit{D}\dot{\mathit{x}}+\mathit{Kx}=\mathit{F}$$

Define the state variables ${x}_{1}=x$ and ${x}_{2}=\underset{}{\overset{\dot{}}{x}}$, which produces the following set of first-order differential equations describing the system.

$$\{\begin{array}{l}{\underset{}{\overset{\dot{}}{x}}}_{1}={x}_{2}\\ {\underset{}{\overset{\dot{}}{x}}}_{2}=f(x)+g(x)\cdot u(t)\end{array}$$

Here, $f(x)=-\frac{D\underset{}{\overset{\dot{}}{x}}+Kx}{M}$ represents the inherent forces of the damper and spring acting on the mass, and $g(x)=\frac{1}{M}$ signifies the influence of the control force $\mathit{F}$ on the mass, normalized by its magnitude.

Define the mass-spring-damper system parameters, where the mass $\mathit{M}$ is $1\text{\hspace{0.17em}}\mathit{kg}$, the damping coefficient $\mathit{D}$ is $0.1\text{\hspace{0.17em}}\mathrm{Ns}/m$, and the spring constant $\mathit{K}$ is $1\text{\hspace{0.17em}}N/m$.

param.Mass = 1; % Mass (kg) param.Damping = 0.1; % Damping coefficient (Ns/m) param.Stiffness = 1; % Spring constant (N/m)

For this example, the state-space function of the mass-spring-damper system is implemented in the `msdStateDer`

supporting function.

### Sliding Mode Control Design

For this example, define the sliding mode function as $\mathit{s}\left(\mathit{t}\right)=\mathit{ce}\left(\mathit{t}\right)+\dot{\text{\hspace{0.17em}}\mathit{e}}\left(\mathit{t}\right)$, where ${\mathit{x}}_{\mathit{d}}$ is the desired position and $\mathit{e}={\mathit{x}}_{\mathit{d}}-\mathit{x}$ is the tracking error.

Define the SMC control law as follows.

$$\mathit{u}=\text{\hspace{0.17em}}\frac{1}{\mathit{g}}(\eta \text{\hspace{0.17em}}\mathrm{sign}\left(\mathit{s}\right)+\mathit{ks}+c\dot{\mathit{e}}+{\ddot{\mathit{x}}}_{\mathit{d}}-f)$$

Here:

$\mathit{u}\left(\mathit{t}\right)$ uses the sign of $\mathit{s}\left(\mathit{t}\right)$ to produce the discontinuous control structures (${\mathit{u}}_{\mathit{k}}^{+}\left(\mathit{t}\right)$ and ${\mathit{u}}_{\mathit{k}}^{-}\left(\mathit{t}\right)$).

$\eta $ is the amplitude of the discontinuous control action, which enhances robustness against disturbances.

$\mathit{k}$ is the proportional gain in the continuous part of the control law, which reduces steady-state error and improves response time.

$\mathit{c}$ is the same coefficient used in the sliding surface, which affects the rate of convergence to the sliding surface.

This choice of control input is based on the Exponential Reaching Law, where you set $\dot{\mathit{s}}=-\eta \text{\hspace{0.17em}}\mathrm{sign}\left(\mathit{s}\right)-\mathit{ks}$. You then solve for a control input that satisfies this condition [2]. For positive values for $\eta \text{\hspace{0.17em}}$and $\mathit{k}$, the necessary and sufficient criterion $\mathit{s}\left(\mathit{t}\right)\text{\hspace{0.17em}}\dot{\mathit{s}\text{\hspace{0.17em}}}\left(\mathit{t}\right)<0$ is satisfied.

Set the SMC parameters, specifying the amplitude of the control action $\eta $, the proportional gain $\mathit{k}$, and the sliding surface coefficient $\mathit{c}$ for the controller design. For the initial controller design, the SMC controller assumes that there is no disturbance in the system (`param.smc.d = 0`

).

param.smc.c = 1; param.smc.k = 1.1; param.smc.eta = 0.1; param.smc.d = 0;

For this example, the SMC control input is computed using the `smc`

supporting function.

### Simulate Controller without Disturbances

To view the controller performance, first simulate the system without disturbances.

Set the initial conditions and define the time span for the simulation.

y0 = [1 0]; tspan = 0:1e-3:10;

Create a handle to the control input function.

u = @(x,param) smc(x,param);

Simulate the system response using `ode45`

.

[T,Y] = ode45(@(t,x) msdStateDer(t,x,u,param),tspan,y0);

Calculate the sliding surface and control input values over the simulation time.

S = param.smc.c*Y(:,1) + Y(:,2); U = smc(Y.',param);

Visualize the system response, phase plane, control input, and sliding surface over time using the `plotResponse`

helper function.

`plotResponse(T,U,Y,S,"System Response without Disturbances")`

#### Phase Plane

The phase plane provides a visual representation of the system dynamics by plotting position versus velocity. In this plane, the system trajectory converges to the sliding surface, defined by the sliding function $s\left(t\right)=ce\left(t\right)+\dot{\text{\hspace{0.17em}}\mathit{e}}\left(t\right)$, which represents the desired system behavior. When the trajectory reaches the sliding surface, the system is in sliding mode and the conroller guides it towards the target state.

Plot the phase plane, system trajectory, and sliding surface.

N = 20; x1_values = linspace(-0.5,1.5, N); x2_values = linspace(-1.0,1.0, N); [X1,X2] = meshgrid(x1_values,x2_values); XDOT = msdStateDer([],[X1(:), X2(:)].',u,param); figure hold on quiver(X1(:),X2(:),XDOT(1,:).',XDOT(2,:).', ... MaxHeadSize=0.1, ... AutoScaleFactor=0.9); plot(Y(:,1),Y(:,2)) plot([-0.5 1.5],-param.smc.c*[-0.5 1.5], ":") xlim([min(X1(:)) max(X1(:))]) ylim([min(X2(:)) max(X2(:))]) xlabel("x1 (position)") ylabel("x2 (velocity)") title("Phase-Plane") legend("df/dt","States","Slide Surface")

This plot shows a visual depiction of the mass-spring-damper system response and the influence of the sliding mode control.

### Simulate System with Disturbances

In real-world scenarios, systems are often influenced by external disturbances that can affect their performance. To test the robustness of the SMC strategy, you can introduce a disturbance into the mass-spring-damper system simulation. The bounded disturbance is modeled as a time-varying function $\mathit{d}\left(\mathit{t}\right)$ that directly affects the dynamics of the system, where $|\mathit{d}\left(\mathit{t}\right)|\le \mathit{D}$.

For this example, consider a sinusoidal disturbance $\mathit{d}\left(\mathit{t}\right)$ given by:

$$d\left(t\right)=0.5\cdot \mathrm{sin}\left(t\right)$$

The SMC control law is designed to counteract the effects of disturbances and drive the system state towards the desired sliding surface. The control law is defined as:

$$\mathit{u}=\text{\hspace{0.17em}}\frac{1}{\mathit{g}}(\eta \text{\hspace{0.17em}}\mathrm{sign}\left(\mathit{s}\right)+\mathit{ks}+c\dot{\mathit{e}}+{\ddot{\mathit{x}}}_{\mathit{d}}-f+\mathit{D}\text{\hspace{0.17em}}\mathrm{sign}\left(\mathit{s}\right))$$

where the term $\mathit{D}\text{\hspace{0.17em}}\mathrm{sign}\left(\mathit{s}\right)$ is an additional term that accounts for the upper bound of the disturbance. Define a handle to the disturbance function.

d = @(t) 0.5*sin(t);

Update the SMC controller parameters.

param.smc.c = 5; param.smc.k = 3; param.smc.eta = 0.1; param.smc.d = 0.6;

Create a handle for the control input function and simulate the system response using `ode45`

.

u = @(x,param) smc(x,param); [T,Y] = ode45(@(t,x) msdStateDer(t,x,u,param,d),tspan,y0);

Calculate sliding surface, `S`

, and control input values, `U`

, over the simulation time.

S = param.smc.c*Y(:,1) + Y(:,2); U = smc(Y.',param);

Generate the plots to visualize the system response, phase plane, control input, and sliding surface over time.

`plotResponse(T,U,Y,S,"System Response with Disturbances")`

### Reduce Chattering Using Quasi-Sliding Mode Control

A common issue in SMC is *chattering*, which is the high-frequency switching of the control input when the system state is close to the sliding surface. To mitigate chattering, you can use a quasi-sliding mode control (QSMC). In QSMC, you replace the discontinuous sign function in the control law with a continuous approximation, such as a saturation function. [3]

For this example, use the following saturation function.

$$\text{sat}(s,\varphi )=\{\begin{array}{ll}1& \text{if}\text{}s\varphi \\ s/\varphi & \text{if}\text{}-\varphi \le s\le \varphi \\ -1& \text{if}\text{}s-\varphi \end{array}$$

Here, $\varphi $ is the boundary layer thickness. This saturation function smoothly interpolates between $-1$ and $1$ when the sliding variable $\mathit{s}$ is within the boundary layer $\left[\begin{array}{cc}-\varphi & \varphi \end{array}\right]$, which reduces the high-frequency switching.

The modified control law with the saturation function is given by:

$$u=\phantom{\rule{0.2777777777777778em}{0ex}}\frac{1}{g}(\eta \phantom{\rule{0.2777777777777778em}{0ex}}\text{sat}(s,\varphi )+\text{ks}+c\underset{}{\overset{\dot{}}{e}}+{\underset{}{\overset{\xa8}{x}}}_{d}-f+D\phantom{\rule{0.2777777777777778em}{0ex}}\text{sat}(s,\varphi ))$$

The choice of $\varphi $ is critical as it defines the thickness of the boundary layer around the sliding surface. A larger $\varphi $results in less chattering but can increase the steady-state error. Conversely, a smaller $\varphi $ can reduce steady-state error but increase chattering.

To implement the QSMC, define the saturation function using function handle `sat`

and set the boundary layer thickness, $\varphi $, to 1e-2.

phi = 1e-2; sat = @(s) min(max(s/phi,-1),1);

Update the control input function to include the saturation function.

u = @(x,param) smc(x,param,sat);

Simulate the system response using the updated control law.

[T,Y] = ode45(@(t,x) msdStateDer(t,x,u,param,d),tspan,y0);

Calculate the sliding surface and control input values over the simulation time.

S = param.smc.c*Y(:,1) + Y(:,2); U = smc(Y.',param,sat);

Visualize the system response, phase plane, control input, and sliding surface over time using QSMC.

`plotResponse(T,U,Y,S,"System Response Using QSMC")`

The QSMC system achieves similar performance with no chattering in the control input.

### References

[1] Derbel, Nabil, Jawhar Ghommam, and Quanmin Zhu, eds. *Applications of Sliding Mode Control*. Vol. 79. Springer Singapore, 2017.

[2] Weibing Gao, and J.C. Hung. “Variable Structure Control of Nonlinear Systems: A New Approach.” *IEEE Transactions on Industrial Electronics* 40, no. 1 (February 1993): 45–55. https://doi.org/10.1109/41.184820.

[3] Richter, Hanz. *Advanced control of turbofan engines*. Springer Science & Business Media, 2011.

### Visualization Function

function plotResponse(T,U,Y,S,plotTitle) figure t = tiledlayout(2,2); title(t,plotTitle) % Plot position and velocity over time. nexttile plot(T,Y(:,1),T,Y(:,2)) legend("x_1 (pos)","x_2 (vel)") title("State Response") xlabel("Time (s)") % Plot phase plane (velocity versus position). nexttile plot(Y(:,1),Y(:,2)) title("Phase Plane") xlabel("x_1 (position)") ylabel("x_2 (velocity)") % Plot control input over time. nexttile plot(T,U) title("Control Input") xlabel("Time (s)") ylabel("u(t)") % Plot sliding surface over time. nexttile plot(T,S) title("Slide Mode Function") xlabel("Time (s)") ylabel("s(t)") end