RasmahRasmah

Plate Cam Design: From Follower Lift Table to Profile

Overview

A plate cam is the oldest machine element there is: a rotating disc whose perimeter is a specially shaped profile, driving a follower (a roller or knife edge riding the rim) up and down. Cams run valve trains, packaging machines, and indexers, and their design is a pure exercise in drawing a profile from a table of numbers: the engineer specifies how the follower must move — a displacement law — and the cam profile falls out of that law.

This tutorial does the classic plate-cam design task end to end: a lift table (cycloidal rise–fall with dwells), the profile built point by point from the law, the sketch extruded into a part, and the design checks a cam designer runs — follower velocity, acceleration, and pressure angle.

using Rasmah

The design data

The follower motion is specified as a displacement law s(θ): the lift as a function of cam angle. The classic choice is cycloidal motion, because its velocity and acceleration are zero at both ends of the motion — the follower starts and stops without a jerk, which is why real cams hum instead of hammer:

s(\theta) = h\left[\frac{\theta}{\beta} - \frac{1}{2\pi}\sin\!\left(2\pi\frac{\theta}{\beta}\right)\right],
\qquad
s(\theta) = h\left[1 - \frac{\theta}{\beta} + \frac{1}{2\pi}\sin\!\left(2\pi\frac{\theta}{\beta}\right)\right]

for the rise and the fall respectively (θ measured from the start of each motion, β the rise/fall angle). The design data for this cam:

  • base-circle radius r_b = 25 mm, follower lift h = 10 mm
  • rise over 90° (cam angle 90–180°), fall over 90° (270–360°), dwells elsewhere
  • knife-edge radial follower (the profile is the pitch curve)
rb = 25e-3                    # base circle radius, m
h  = 10e-3                    # follower lift, m
β  = pi / 2                   # rise and fall angle (90°), rad

rise(θ) = h * (θ / β - sin(2 * pi * θ / β) / (2 * pi))
fall(θ) = h * (1 - θ / β + sin(2 * pi * θ / β) / (2 * pi))

# follower displacement s at a cam angle (degrees)
function lift(deg)
    if deg < 90.0
        0.0                        # dwell
    elseif deg < 180.0
        rise(deg2rad(deg - 90.0))  # rise
    elseif deg < 270.0
        h                           # dwell at full lift
    else
        fall(deg2rad(deg - 270.0))  # fall
    end
end
lift (generic function with 1 method)

Before drawing anything, check the law at its cardinal angles — the radius at any cam angle is r(θ) = r_b + s(θ):

println("r(0°)   = ", round((rb + lift(0.0)) * 1e3; digits = 2), " mm   (dwell)")
println("r(90°)  = ", round((rb + lift(90.0)) * 1e3; digits = 2), " mm   (rise starts)")
println("r(180°) = ", round((rb + lift(180.0)) * 1e3; digits = 2), " mm   (peak lift)")
println("r(360°) = ", round((rb + lift(360.0)) * 1e3; digits = 2), " mm   (back to dwell)")
r(0°)   = 25.0 mm   (dwell)
r(90°)  = 25.0 mm   (rise starts)
r(180°) = 35.0 mm   (peak lift)
r(360°) = 25.0 mm   (back to dwell)

25 → 25 → 35 → 25 mm: the follower dwells on the base circle, rises 10 mm to the nose, and returns — the lift table in numbers.

From the law to profile points

The cam profile is not typed — it is generated. Sample the law every degree and place a point at (r cos θ, r sin θ); a polygon through those points is the sketch:

pts = [[(rb + lift(d)) * cosd(d), (rb + lift(d)) * sind(d)] for d in 0.0:1.0:360.0]
println("profile points: ", length(pts))

cam = polygon_2d(pts)
vtk(extrude(cam, 1e-3))    # the 2D profile, shown 1 mm thick for display
profile points: 361

The sketch is the profile. Its exact area must agree with the drawing-office check — the polar area integral, A = ½ ∫ r² dθ — which for a 1° sampling is just a sum over the radii:

A = ustrip(area(cam)) * 1e6
Asum = sum(((rb + lift(d))^2 for d in 0.0:1.0:359.0)) * 0.5 * deg2rad(1.0) * 1e6
println("area(profile) = ", round(A; digits = 2), " mm²")
println("½ ∫ r² dθ     = ", round(Asum; digits = 2), " mm²")
area(profile) = 2889.58 mm²
½ ∫ r² dθ     = 2889.74 mm²

The two agree to a fraction of a square millimetre: the polygon carries the exact area of the sampled profile, and the sum confirms the sampling is fine. The radius of the circle with the same area — the cam’s root-mean-square radius, useful for rough torque estimates — is sqrt(A/π) ≈ 30.3 mm.

Extrusion and mass

A plate cam is the profile pushed to its thickness — 10 mm here:

cam3d = extrude(cam, 10e-3)
vtk(cam3d)
V = ustrip(volume(cam3d)) * 1e9
println("volume = ", round(V; digits = 1), " mm³   (A · t = ", round(A * 10; digits = 1), ")")
println("steel mass = ", round(ustrip(volume(cam3d)) * density(material("steel")) * 1000; digits = 0), " g")
volume = 28895.8 mm³   (A · t = 28895.8)
steel mass = 227.0 g

Extrusion turns the exact area into an exact volume — 28895.8 mm³ — and a 227 g steel disc to draw in the BOM.

Design checks: velocity, acceleration, pressure angle

The profile satisfies the geometry; now check it satisfies the dynamics. Differentiating the cycloidal law gives the follower velocity and acceleration — the peaks are v_max = 2h/β · ω (at the motion’s mid-point) and a_max = 2πh/β² · ω² (at its quarter points). At a 300 RPM cam speed:

ω = 300 * 2 * pi / 60                     # cam angular speed, rad/s
vmax = 2 * h / β * ω
amax = 2 * pi * h / β^2 * ω^2
println("peak follower velocity = ", round(vmax; digits = 1), " m/s")
println("peak follower acceleration = ", round(amax / 9.81; digits = 2), " g")
peak follower velocity = 0.4 m/s
peak follower acceleration = 2.56 g

0.4 m/s and 2.6 g — mild, because cycloidal motion spreads the rise over a quarter turn with no jerk spikes.

The last check is the pressure angle α = atan((dr/dθ)/r): the angle between the cam’s surface normal and the follower’s line of motion. Above about 30° the follower jams against its guide; measure the worst case straight off the sampled profile:

αmax = maximum(
    abs(atan((lift(i + 1.0) - lift(i - 1.0)) / (2 * deg2rad(1.0)) / (rb + lift(i * 1.0))))
    for i in 2:(length(pts) - 1)
)
println("max pressure angle = ", round(rad2deg(αmax); digits = 1), "°")
max pressure angle = 23.2°

23.2° — under the 30° limit with margin. If it were not, the fix is design data, not geometry: a larger base circle, a smaller lift, or a longer rise.

Next steps