PID tuning by trial-and-error is slow and inconsistent. I now tune from measured step responses and keep every run logged.
First, I characterize the motor and load using open-loop PWM sweeps. That tells me dead zones and saturation points, so I can clamp controller output intelligently.
Then I tune in order: proportional for responsiveness, derivative for damping, and integral last for steady-state error. Integral windup is controlled with output limits and reset conditions when target changes sharply.
The key is plotting target, measured speed, and controller output together. Once you can see overshoot, settling time, and noise sensitivity on one graph, parameter changes become deliberate instead of random.