I have been using Acroloop 9000 controllers to control a number of machines where one axis is a high-speed rotary motor that drives a mechanical cam-driven process. During operation of the machine, the motor accelerates from a stop to a constant high speed, and then back to a stop. The mechanical cam performs dozens of cycles during the process while the motor is at a constant speed.
The difficulty in tuning this process is that the motor experiences changing loads and inertias as the mechanical cam goes through its cycles. When the mechanical cam is in a dwell, only the cam itself and the coupling to the motor are felt by the motor as the system inertia. When the cam follower is at a constant velocity, the load attached to the follower is felt as inertia proportional to the square of the cam follower velocity. When the cam follower is accelerating, the inertia of the follower and the load attached to it act as a force on the motor causing it to decelerate. When the cam follower is decelerating, the follower and its load act as a force in the direction of travel of the motor causing it to accelerate.
The challenge is to tune the motor in this environment such that the motor can move the process as fast as possible while maintaining close position control.
I have tried tuning the system with the amplifier set to both Torque Mode and Velocity Mode. I have had better luck in Torque Mode.
Naturally, I started with traditional PID control. Setting IGAIN to zero, I tuned PGAIN and DGAIN as stiff as possible. I experimented with the DWIDTH parameter and didn't get much benefit from it. As I run the system at high speed, I see significant slow-down and over-speed when the mechanical cam accelerates and decelerates. Adding IGAIN to smooth the velocity wasn't very effective. The IGAIN at reasonable levels didn't react fast enough to affect the disturbances.
I added a rarely-used gain in Acroloop called FBVEL, or Feed Back Velocity gain. This gain subtracts from the output signal proportionally to the actual velocity of the motor. Now when the system encounters the acceleration area of the mechanical cam and the actual velocity begins to slow, the VBVEL gain subtracts less torque, allowing the motor to immediately counteract the disturbance.
This is much faster than PGAIN can respond to the same disturbance. PGAIN works proportionally to following error which is the integral of error in velocity. In my fast system, PGAIN doesn't maximize its response until the disturbance is almost over. The response of the VBVEL gain to the disturbance is near the start of the disturbance, and it effectively allows the motor to power through the cam acceleration and rapidly decreases torque in response to the cam deceleration. Also, systems with just the right FBVEL gain stop on a dime without overshoot and without being over-damped.
The negative impact of using the FBVEL gain is that I picked up a following error proportional to velocity. My FBVEL term was -25V at high speed, so I was running at a following error sufficient to bring the proportional term to25V!. I don't want to set my Integral Limit to 25, and IGAIN doesn't act very fast anyway. So, I counteracted the following error proportional to velocity with FFVEL (Feed Forward Velocity) gain. In Acroloop, FFVEL and FBVEL have opposite reactions, so I set the FFVEL gain to exactly the same number as my FBVEL gain. And it worked! Now my following error is small through my entire velocity range, and my system responds well to the accelerating and decelerating mechanical cam load, and the whole thing accelerates rapidly and stops on a dime.
The only thing that bothers me, is that this solution seems mathematically equivalent to using DGAIN. Derivative Gain is a signal proportional to the derivative of position following error. In other words, it is proportional to velocity error.
In my FFVEL and FBVEL solution, I am adding a term proportional to commanded velocity and subtracting a term proportional to actual velocity. So the net differential is proportional to Velocity Error. However, using this method, I achieve results I cannot using DGAIN. Why?