Since I cannot seem to turn my brain off on this topic I have been semi-immersed in for a number of weeks, I wanted to jot down a few thoughts on the topic of PID controllers.
My goals in using a PID controller with a mechanical fader that is driven by DC motor are simple, to wit:
- Instantaneous snapping to a new position once loaded into the controller.
- Positional accuracy and repeatability when the same position is loaded.
- Smooth movement of the fader control under PID control when set point changes are small and frequent.
- Tolerant of "stair-stepped" set point changes arriving at non-regular or varying intervals while still maintaining smooth movement.
So far, I have achieved the first two goals. To date, I have been using a positional PID in an attempt to meet all these requirements. A positional PID is one that takes a positional set point and a current position as input and produces the necessary output to drive the fader to its new position. It takes care of acceleration and deceleration as necessary to arrive quickly at the new position.
However, when trying to achieve smooth movement that is quite slow, I find that a positional PID is insufficient for the task for the following reasons:
- A PID tuned to aggressively snap to a new position is a poor experience when trying to achieve slow but smooth changes to the position. The fader tends to be very jerky and/or noisy. The effect looks like a long-term crack user trying to be cool when the authorities arrive. I have attempted to use multiple tuning settings where I reduce the gains of the P, I and D terms, but while it improves things, it is still unacceptable.
- I find that it takes approximately 30% of the motor speed range just to get the fader to move if it is already stopped. Once it overcomes inertia and friction it will suddenly lunge forward and likely overshoot the desired set point if it is close at hand.
- Once the fader is in motion, it takes a lot less energy from the motor to keep it in motion, but there is still a fairly significant dead band in the motor speed range where the fader will stop again if the PID output drops too low. Anytime the PID calculation must reverse direction in order to slow motion, it must necessarily pass through this dead band on both sides of zero.
What is needed for smooth motion out of a PID is to have the PID control the velocity of the motor, not just to move it to a new position. I have attempted to simulate this using a positional PID by limiting the range of the output of the PID to something lower than the maximum speed of the motor when it is desired to be non-aggressive about positioning. However, what I find to be true is that while it helps the overall effect, the results are not sufficiently predictable or repeatable from one fader to the next. They all have their own friction profiles and while they are carefully manufactured, the motor movement transfer function from one fader to the next varies considerably.
So, to provide smooth movement for non-aggressive position changes, what is needed is a velocity PID that will control the speed of the motor according to a motion profile. I will be implementing a trapezoidal motion profile where the motor will accelerate to a maximum speed, hold that speed and then decelerate to a stop at the desired position.
So, I think I need the following:
- Desired velocity - I will calculate desired velocity based off the current positional error. When the desired position changes, we start moving in that direction according to a motion profile.
- Current velocity - I currently calculate this as the derivative term of positional PID. The first derivative of position is velocity.
- A second PID to control motor velocity when being non-aggressive about positioning that will control motor speed according to a motion profile in a tight control loop.
We can visualize position, acceleration and motion profiles as follows:
To determine the desired velocity, I will calculate the positional PID error. This is simply the difference between the current position and the desired position. The further I have to go, the faster I will go up to a maximum limit. As the fader moves, the error changes (approaches zero) as the fader approaches its target. The fader loop will calculate the desired velocity as the current position changes towards the target. As friction changes, voltage changes and other external disturbances affect the actual velocity, the PID will calculate the necessary correction in velocity to stay on the motion profile.
More to come...