PID Discretization → C Code
Continuous Kp/Ki/Kd and a sample time into discrete coefficients and ready-to-paste C.
From the s-domain to your ISR
A continuous parallel PID U(s) = Kp + Ki/s + Kd·s can't run on an MCU as-is — you
need a difference equation sampled every Ts. Replacing the integrator and
differentiator with their discrete equivalents and collecting terms gives the compact
velocity (incremental) form:
For backward Euler the coefficients are q0 = Kp + Ki·Ts + Kd/Ts,
q1 = −Kp − 2Kd/Ts, q2 = Kd/Ts (Tustin and forward Euler shift the
integral term). The velocity form has two big practical wins: it only needs the last two errors
and the previous output (no separate integrator state to maintain), and anti-windup is
trivial — just clamp u[k] to the actuator limits and the integral can't
run away, because the "integral" is implicit in u[k−1]. Pick a sample time fast
enough that Ts ≪ your loop time constants (10–20× the bandwidth is a common rule). Tune the
gains first in the PID simulator, then drop them in here to
get the code.