There are many things I would change about this build in retrospect but at least it was cheap and for the moment it meets my needs. I plan to revisit this at some point and start from scratch with a STM32 based controller.
Proper PID would be better, the control code just computes set points and brute forces a target velocity to match a given profile.