PaceDynamics Documentation Open the app
Contents

Foundations

Sprung and unsprung mass

The body on its springs and the wheels under them, and what the two masses do to the ride.

Model as of 0.338Figures from the Formula Student single-car templateOctave check Exact

A car's mass comes in two kinds. The sprung mass is everything the springs carry: the chassis, the driver, the battery, the motor if it sits on the chassis. The unsprung mass is everything between the springs and the road: the wheel and tyre, the upright and hub, the brake if it sits at the wheel, and a share of the links, driveshafts and springs. The two move differently, and the ride of a car is mostly the story of how.

Two kinds of mass

The template’s mass, split into sprung front, sprung rear and unsprung126 kgsprung, on the front axle142 kgsprung, on the rear axle32 kgunsprung, four corners300 kg with the driver
Fig. 1
Where the template’s 300 kg is: 268 kg on the springs, 32 kg under them.
Measured

The app takes the unsprung mass per corner as you enter it, 8 kg on the template, and the sprung mass as what is left. It splits the sprung mass between the axles in the same proportion as the car's weight:

Show the equations with
ms=m−4mu(1)
ms=300−4⋅8=268 kg(1)
ms,f=mswf,ms,r=ms(1−wf)(2)
ms,f=268⋅0.47=126 kg,ms,r=142 kg(2)
m
the car's mass with the driver
mu
the unsprung mass of one corner
wf
the share of the weight on the front axle

Equation (2) assumes the unsprung masses split between the axles like the whole car does. On the template the four corners weigh the same, so the front axle's true share of them is a half, not 0.47: the split is out by about a kilogram.

The quarter car

To see how the two masses move, take one corner of the car: its share of the sprung mass on the suspension, and the unsprung mass on the tyre.

The quarter car: the sprung mass on the suspension spring and damper, the unsprung mass on the tyre, the road under itktmukscsmszszuzrbodywheel, upright, brakeroadOne corner: a quarter of the car, with the front or rear axle’s share of the body.
Fig. 2
The quarter car: two masses, the suspension between them and the tyre under them.
Schematic

The suspension is a spring ks and a damper cs in parallel; the tyre is a stiffer spring kt. Measuring each mass's height z from where it stands, the road zr moves the tyre and the two masses answer:

msz¨s=−ks(zs−zu)−cs(z˙s−z˙u)(3)
muz¨u=ks(zs−zu)+cs(z˙s−z˙u)−kt(zu−zr)−ct(z˙u−z˙r)(4)
ks,cs
the suspension's rate and damping at the wheel in heave: corner spring and heave element, corner damper and heave damper
kt,ct
the tyre's vertical rate and damping

Ride and wheel hop

Two masses on two springs have two ways to vibrate. In the ride mode the body bounces and the wheel follows: the body sits on the suspension and the tyre in series, which is softer than either. In the wheel-hop mode the wheel bounces between the road and a body too heavy to follow: the wheel sits on both springs at once.

Show the equations with
fride=12πkridems′,kride=ksktks+kt(5)
fride,f=12π26.51⋅1000126/2=3.27 Hz(5)
fhop=12πks+ktmu(6)
fhop,f=12π(34.93+110)⋅10008=21.4 Hz(6)
ms′
one corner's sprung mass, half the axle's

The two are far apart, 3.3 Hz and 21 Hz at the front of the template, so each can be read as if the other were not there. The ride frequency is the one engineers set: soft enough to keep the tyre on a bumpy road, stiff enough to hold the aerodynamic platform. More on the springs that set it on Ride and roll rates.

Damping

The damping ratio ζ says how quickly the ride mode dies away: 1 is critical, the fastest return without overshoot, and a race car runs about 0.3 to 0.7. The textbook writes it ζ=c/(2kridems′), as if the damper compressed by everything the body moves. It does not: the tyre is under the damper, and the damper compresses only by the suspension's share of the motion. On a stiff suspension over a soft tyre that share is small, and the formula overstates the damping several times over.

So the app reads the damping ratio off the ride mode itself. Equations (3) and (4) written as x˙=Ax for the state x=(zs,z˙s,zu,z˙u) have two pairs of eigenvalues λ; the ride mode is the pair in which the body carries most of the kinetic energy, and

Show the equations with
ζ=−Re⁡λ|λ|(7)
ζf=0.488,ζr=0.447(7)

What the road does to the body

Drive over a road that rises and falls at frequency f, and the body rises and falls by some multiple of it. That multiple is the transmissibility, from equations (3) and (4) with z=Zeiωt:

|ZsZr|=|(ks+iωcs)(kt+iωct)(ks+iωcs−ms′ω2)(ks+kt+iω(cs+ct)−muω2)−(ks+iωcs)2|(8)
How far the body moves for each millimetre of road, against frequency, front and rear0.00.51.01.52.00510152025Road frequency (Hz)Body / road (–)wheel hop 21.4 Hzwheel hop 21.7 Hzbody moves as much as the road
Front corner: ride 3.27 Hz, ζ 0.49Rear corner: ride 3.20 Hz, ζ 0.45
Fig. 3
The body follows the road below about 3.3 Hz, magnifies it near there, and is isolated above.
Measured

Below the ride frequency the body follows the road. Around it the body moves more than the road, by a factor the damping sets: 1.75 at the front of the template. Above it the body is isolated, and near the wheel-hop frequency the wheel itself shakes while the body barely notices. A lighter unsprung mass moves wheel hop higher and keeps the tyre's load steadier over bumps, which is why it is worth paying for.

What the model assumes

  • The car is four independent quarter cars: no pitch or roll coupling between corners.
  • Everything is linear: the springs, the dampers (one rate in bump and rebound) and the tyre, which never leaves the road.
  • The sprung mass splits between the axles like the whole car's weight.
  • A roll element or anti-roll bar does nothing in this model, because both wheels of an axle rise together.

In the app

Vehicle Dynamics › Ride over road draws "Body-to-road transmissibility" for the front and rear corner, as in Fig. 3, and states the wheel-hop frequency above it.

Vehicle Dynamics › Balance & loads, under "Ride & roll (steady state)", lists the sprung mass, the ride frequencies and the damping ratios ζ F/R.

The unsprung mass per corner is a car parameter, "unsprung mass/corner".

Check it yourself

The script builds each axle's quarter car from example_car.m, finds its two modes with eig, and evaluates equation (8) at five of the chart's frequencies.

quarter_car.mwith example_car.m, pd_compare.mExact: agrees to machine precision
>> quarter_car

  Quantity                                This script   PaceDynamics       Diff
  -----------------------------------------------------------------------------
  Sprung mass [kg]                                268            268         0% 
  Sprung mass, front axle [kg]                 125.96         125.96         0% 
  Sprung mass, rear axle [kg]                  142.04         142.04         0% 
  One front wheel, standing [N]               691.605        691.605         0% 
  One rear wheel, standing [N]                779.895        779.895         0% 
  Ride frequency, front [Hz]                  3.26536        3.26536         0% 
  Wheel-hop frequency, front [Hz]             21.4216        21.4216         0% 
  Ride damping ratio, front [-]              0.487629       0.487629   2.6e-13% 
    |z_s/z_r| at  1.4 Hz, front               1.17896        1.17896   3.8e-14% 
    |z_s/z_r| at  2.5 Hz, front               1.46462        1.46462   9.1e-14% 
    |z_s/z_r| at  5.0 Hz, front               1.61126        1.61126   2.8e-14% 
    |z_s/z_r| at 10.0 Hz, front              0.479167       0.479167   3.5e-14% 
    |z_s/z_r| at 20.0 Hz, front              0.109293       0.109293   2.5e-14% 
  Ride frequency, rear [Hz]                   3.19647        3.19647   1.4e-14% 
  Wheel-hop frequency, rear [Hz]              21.7011        21.7011         0% 
  Ride damping ratio, rear [-]                 0.4467         0.4467   1.2e-13% 
    |z_s/z_r| at  1.4 Hz, rear                1.20079        1.20079   5.5e-14% 
    |z_s/z_r| at  2.5 Hz, rear                1.57103        1.57103   2.8e-14% 
    |z_s/z_r| at  5.0 Hz, rear                1.46737        1.46737   1.5e-13% 
    |z_s/z_r| at 10.0 Hz, rear               0.403365       0.403365   1.4e-14% 
    |z_s/z_r| at 20.0 Hz, rear              0.0971867      0.0971867         0% 

  All 21 quantities agree with PaceDynamics (largest difference 2.6e-13 %).
The script
%% Sprung and unsprung mass: the quarter car
%
% Companion to the documentation page "Sprung and unsprung mass". Runs unchanged in GNU
% Octave (7 or later) and MATLAB. Edit the car in example_car.m and run:
%
%   >> quarter_car
%
% One corner of the car as two masses: the sprung mass m_s (its share of the body) on the
% suspension spring k_s and damper c_s, and the unsprung mass m_u (wheel, upright, brake)
% on the tyre k_t. The road z_r moves the tyre; z_u and z_s are the wheel and the body.
%
%   m_s z_s'' = -k_s (z_s - z_u) - c_s (z_s' - z_u')
%   m_u z_u'' =  k_s (z_s - z_u) + c_s (z_s' - z_u') - k_t (z_u - z_r) - c_t (z_u' - z_r')
%
% Two modes: the body bouncing on the spring and tyre in series (ride), and the wheel
% bouncing between the two (wheel hop). The ride frequency is the textbook one; the
% damping ratio is read off the ride mode itself, because the damper compresses by the
% spring's share of the body's motion, not all of it.
%
% Reference: T. D. Gillespie, Fundamentals of Vehicle Dynamics (SAE, 1992), ch. 5.
%
% Part of the PaceDynamics documentation, https://pacedyn.dev/docs
% SPDX-License-Identifier: MIT

[car, app] = example_car();
app = app.mass;

g = 9.81;                                           % m/s^2
series = @(a, b) a .* b ./ (a + b);

%% Masses
m_u  = 4 * car.unsprungPerCorner;                   % kg, the four corners
m_s  = car.massTotal - m_u;                         % kg, sprung
m_sf = m_s * car.frontMassFrac;                     % kg, sprung, on the front axle
m_sr = m_s * (1 - car.frontMassFrac);
W    = car.massTotal * g;                           % N
static = W * [car.frontMassFrac, 1 - car.frontMassFrac] / 2;   % N, one wheel, front and rear

pd_compare('Sprung mass [kg]',              m_s,       app.sprungMass);
pd_compare('Sprung mass, front axle [kg]',  m_sf,      app.sprungFront);
pd_compare('Sprung mass, rear axle [kg]',   m_sr,      app.sprungRear);
pd_compare('One front wheel, standing [N]', static(1), app.staticFront);
pd_compare('One rear wheel, standing [N]',  static(2), app.staticRear);

%% A quarter car per axle
% The suspension at the wheel in heave: corner spring and heave element, corner damper
% and heave damper (a roll element does not move when both wheels rise together).
axle = {'front', 'rear'};
ms = [m_sf, m_sr] / 2;                                                   % kg, one corner
ks = [car.wheelRateFront + car.heaveSpringFront, car.wheelRateRear + car.heaveSpringRear] * 1e3;   % N/m
cs = [car.damperFront + car.heaveDamperFront, car.damperRear + car.heaveDamperRear] * 1e3;         % N*s/m
kt = [car.tireRateFront, car.tireRateRear] * 1e3;                        % N/m
ct = car.tireDamping * 1e3;                                              % N*s/m
mu = max(0.1, car.unsprungCornerMass);                                   % kg

for i = 1:2
  a = app.(axle{i});
  % Ride: the body on the spring and the tyre in series. Wheel hop: the wheel on both at once.
  f_ride = sqrt(series(ks(i), kt(i)) / ms(i)) / (2 * pi);
  f_hop  = sqrt((ks(i) + kt(i)) / mu) / (2 * pi);

  % The two modes of the state matrix, state [z_s, z_s', z_u, z_u'].
  A = [0, 1, 0, 0;
       -ks(i) / ms(i), -cs(i) / ms(i),  ks(i) / ms(i),            cs(i) / ms(i);
       0, 0, 0, 1;
        ks(i) / mu,     cs(i) / mu,    -(ks(i) + kt(i)) / mu,   -(cs(i) + ct) / mu];
  [V, D] = eig(A);
  lambda = diag(D);
  % The ride mode: the oscillating one whose motion is mostly the body's (by kinetic energy).
  best = 0;  zeta = NaN;
  for j = 1:4
    if imag(lambda(j)) <= 0, continue; end
    es = ms(i) * abs(V(1, j))^2;  eu = mu * abs(V(3, j))^2;
    share = es / (es + eu);
    if share >= 0.5 && share > best
      best = share;  zeta = -real(lambda(j)) / abs(lambda(j));
    end
  end

  % Transmissibility: how far the body moves for each millimetre of road, at frequency f.
  w = 2 * pi * a.gainFreq;
  spring = ks(i) + 1i * cs(i) * w;                  % the suspension's complex stiffness
  tyre   = kt(i) + 1i * ct * w;
  H = spring .* tyre ./ ((spring - ms(i) * w.^2) .* (spring + tyre - mu * w.^2) - spring.^2);

  pd_compare(sprintf('Ride frequency, %s [Hz]', axle{i}),      f_ride, a.rideFreq);
  pd_compare(sprintf('Wheel-hop frequency, %s [Hz]', axle{i}), f_hop,  a.wheelHopFreq);
  pd_compare(sprintf('Ride damping ratio, %s [-]', axle{i}),   zeta,   a.dampingRatio);
  for j = 1:numel(w)
    pd_compare(sprintf('  |z_s/z_r| at %4.1f Hz, %s', a.gainFreq(j), axle{i}), abs(H(j)), a.gain(j));
  end
end
pd_compare();

Download: quarter_car.m · example_car.m · pd_compare.m. The scripts are MIT licensed.

Further reading

  • T. D. Gillespie, Fundamentals of Vehicle Dynamics (SAE, 1992), ch. 5, on ride.
  • W. F. Milliken and D. L. Milliken, Race Car Vehicle Dynamics (SAE, 1995), ch. 16.
  • J. C. Dixon, The Shock Absorber Handbook, 2nd ed. (Wiley, 2007), on damping a quarter car.
ChapterSprung and unsprung mass
PartFoundations
Model as of0.338
Example carthe Formula Student single-car template