The dynamics of the suspension of a vehicle can be analysed by running simulations through a mathematical model. The simplest model of a vehicle’s suspension is called quarter-car suspension model.
The model consists of two mass bodies, quarter vehicle and wheel, and lumped parameters for stiffness and damping, for both suspension and tyre.
In the article Quarter-car suspension modeling and simulation in Xcos we have determined the system of differential equations for the quarter-car suspension model as:
\[ \left\{\begin{matrix}m_1 \ddot{z_1} &=& k_1 (z_2 – z_1) &+& c_1 \left ( \dot{z_2} – \dot{z_1} \right )& \tag{1}\\
m_2 \ddot{z_2} &=& k_2 (u – z_2) &+& c_2 \left ( \dot{u} -\dot{z_2} \right )& – k_1 (z_2 – z_1) – c_1 \left ( \dot{z_2} – \dot{z_1} \right )
\end{matrix}\right. \]
where:
m1 [kg] – the mass of a quarter of the vehicle body
m2 [kg] – the mass of the wheel and suspension
k1 [N/m] – spring constant (stiffness) of the suspension system
c1 [N·s/m] – damping constant of the suspension system
k2 [N/m] – spring constant (stiffness) of the wheel and tire
c2 [N·s/m] – damping constant of the wheel and tire
z1 [m] – displacement of the vehicle body (output)
z2 [m] – displacement of the wheel (output)
u [m] – road profile change (input)
Considering all initial conditions being zero and applying Lapace’s transform to equations (1) gives:
\[Z_{1}(s) \left ( m_{1}s^{2} + c_{1}s + k_{1} \right ) = Z_{2}(s) \left ( c_{1}s + k_{1} \right ) \tag{2}\] \[Z_{2}(s) = \left ( m_{2}s^{2} + k_{2} + c_{2}s + k_{1} + c_{1}s \right ) = U(s) \left ( c_{2}s + k_{2} \right ) + Z_{1}(s) \left ( k_{1} + c_{1}s \right ) \tag{3}\]For more details about how Laplace transform is applied to a differential equation, read the article How to find the transfer function of a system.
From the system of equations (1) we can determine two transfer functions, depending on which displacement (z1 or z2) we consider as the output of the system.
Let’s consider the displacement of the quarter vehicle mass z1 as the output of the system. From equation (2) we extract Z2(s) as:
\[Z_{2}(s) = Z_{1}(s) \frac{m_{1}s^{2} + c_{1}s + k_{1}}{c_{1}s + k_{1}} \tag{4}\]Replacing (4) in (3) and after doing the necessary simplification gives the first transfer function:
\[ \begin{split}&H_{1}(s) = \frac{Z_{1}(s)}{U(s)} = \\
&= \frac{c_{1}c_{2}s^{2} + (k_{1}c_{2}+k_{2}c_{1})s + k_{1}k_{2}}{m_{1}m_{2}s^{4} + (m_{1}c_{1}+m_{1}c_{2}+m_{2}c_{1})s^{3} + (m_{1}k_{1}+m_{1}k_{2}+k_{1}m_{2}+c_{1}c_{2})s^{2} + (c_{1}k_{2}+k_{1}c_{2})s + k_{1}k_{2}}
\end{split} \]
where displacement of the quarter vehicle body mass z1(t) is considered the output and the road irregularities u(t) the input.
Let’s consider the displacement of the wheel mass z2 as the output of the system. From equation (2) we extract Z1(s) as:
\[Z_{1}(s) = Z_{2}(s) \frac{c_{1}s+k_{1}}{m_{1}s^{2}+c_{1}s+k_{1}} \tag{5}\]Replacing (5) in (3) and after doing the necessary simplification gives the first transfer function:
\[ \begin{split}&H_{2}(s) = \frac{Z_{2}(s)}{U(s)} = \\
&= \frac{m_{1}c_{2}s^{3} + (c_{1}c_{2}+m_{1}k_{2})s^{2} + (k_{1}c_{2}+c_{1}k_{2})s + k_{1}k_{2}}{m_{1}m_{2}s^{4} + (m_{1}c_{1}+m_{1}c_{2}+m_{2}c_{1})s^{3} + (m_{1}k_{1}+m_{1}k_{2}+k_{1}m_{2})s^{2} + (c_{1}c_{2}+c_{1}k_{2}+k_{1}c_{2})s + k_{1}k_{2}}
\end{split} \]
where displacement of the quarter vehicle body mass z2(t) is considered the output and the road irregularities u(t) the input.
One way of testing our transfer functions for the quarter-car suspension model is to define them in Scilab.
clc() // Define parameters m1 = 290; // [kg] m2 = 15; // [kg] k1 = 16200; // [N/m] k2 = 191000; // [N/m] c1 = 1000; // [Ns/m] c2 = 2500; // [Ns/m] t=0:0.001:7; // [s] u=0.1; // [m] // Define transfer function s=poly(0,'s'); // Transfer function for z1 as output num1=c1*c2*s^2+(k1*c2+k2*c1)*s+k1*k2; den1=m1*m2*s^4+(m1*c1+m1*c2+m2*c1)*s^3+(m1*k1+m1*k2+k1*m2+c1*c2)*s^2+(c1*k2+k1*c2)*s+k1*k2; Hs1=[num1/den1]; sys1=syslin('c',Hs1); // Transfer function for z2 as output num2=m1*c2*s^3+(c1*c2+m1*k2)*s^2+(k1*c2+c1*k2)*s+k1*k2; den2=m1*m2*s^4+(m1*c1+m1*c2+m2*c1)*s^3+(m1*k1+m1*k2+k1*m2)*s^2+(c1*c2+c1*k2+k1*c2)*s+k1*k2; Hs2=[num2/den2]; sys2=syslin('c',Hs2); // Run step response z1 = u*csim('step',t,sys1); z2 = u*csim('step',t,sys2); figure(1) plot(t,z1,'b'), xgrid() plot(t,z2,'r') hf=gcf(); hf.background = -2; title("x-engineer.org","Color",'b') ylabel('Displacement [m]') xlabel('Time [s]') legend('$\Large{z_{1}(t)}$','$\Large{z_{2}(t)}$',1)
Running the above Scilab instructions outputs the following plot:
The plot represents the system’s response, displacement of the body masses z1(t) and z2(t), for a step input of u = 0.1 m. The step input is performed at t = 0.
The same result should be obtained by modelling and simulation of the quarter-car suspension model transfer function in Xcos.
Running the simulation for 7 s
will save the input u(t) and both outputs z1(t) and z2(t) in the Scilab workspace as structure variable simOut
.
To plot the results, we’ll use the Scilab instructions below:
clc() // Read simulation outputs t = simOut.time; u = simOut.values(:,1); z1 = simOut.values(:,2); z2 = simOut.values(:,3); // Plot results figure(0) hf=gcf(); hf.background = -2; plot(t,u,'g') plot(t,z1,'b') plot(t,z2,'r') xgrid() ylabel('Displacement [m]') legend('$\Large{u(t)}$','$\Large{z_{1}(t)}$','$\Large{z_{2}(t)}$',1) xlabel('Time [s]') title("x-engineer.org","Color","b")
Running the instructions above will output the following plot:
The system’s response is equivalent with the wheel going across a sharp road obstacle of 10 cm height. You can clearly see the oscillation of the body mass having higher amplitude than the wheel oscillation.
For further analysis, we can adjust the mass, stiffness or damping parameters, and understand their impact on the overall dynamic response of the suspension.
Jackson Huff
I echo the other comments, the Z2 transfer function should have c1c2 enclosed under s^2.
See matlab code, I used b instead of c when deriving the equations
Matlab:
syms k1 b1 k2 b2 s m1 m2 x2
x2 = (k2+b2*s)/((m2*s*s+(b1+b2)*s+(k1+k2))-(k1+b1*s)*((k1+b1*s)/(m1*s*s+k1+b1*s)));
X2nice=collect(simplify(x2));
pretty(X2nice)
gab
for the Z2 transfer function shouldnt c1c2 be enclosed under s^2 instead of s
Tamim
hi this was very helpful however shouldnt equation 3 be z2(s)*(m2S…) instead of Z2(S)=(m2S…)