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 RasmahThe 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 lifth = 10 mm - rise over
90°(cam angle 90–180°), fall over90°(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
endlift (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 displayprofile 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
- Sketches, Extrusion, and Revolution — the drawing features behind the profile and its extrusion.
- Drawing a Spur Gear from Scratch — the same point-by-point profile logic applied to involute teeth.
- Feature Operations: Shell, Mirror, Patterns, and Loft — circular patterns and the rest of the modeling toolkit.
