Closed Loop Control Getting Started
Last updated
Was this helpful?
Last updated
Was this helpful?
Closed-loop control in REVLib is accessed through the SPARK's closed loop controller object. This object is specific to each motor and contains all the methods needed to control your motor with closed-loop control. It can be accessed as shown below:
API Docs: ,
To drive your motor in a closed-loop control mode, address the closed loop controller object and give it a set point (a target in whatever units are required by your control mode: , , or ) and a control mode as shown below:
API Docs: ,
The provided example above runs the motor in position control mode, which is just a conventional PID loop reading the motor's current position from the configured encoder and taking a setpoint in rotations.
Use caution when running motors in closed-loop modes, as they may move very quickly and unexpectedly if improperly tuned.
To run a PID loop, several constants are required. For a more advanced controller, even more parameters need to be set and tuned.
These gains can be configured on the with the closedLoop
member of a SparkFlexConfig
or SparkMaxConfig
object as seen below:
The SPARK family of motor controllers also offer an F term, which is a velocity feed-forward. This is unique to each type of motor, and can be calculated by taking the reciprocal of the motor's velocity constant (Kv), in other words 1/Kv.
For a NEO Vortex, this value is 1/565. This is only needed when running a velocity-based control loop (velocity mode, Smart Motion, and Smart Velocity). The F parameter can be set as seen below:
The F parameter should only be set when using a velocity-based PID controller, and should be set to zero otherwise to avoid unwanted behavior.
MAXMotion has parameters that allow you to configure and tune the motion profiles generated by MAXMotion. The parameters can be set through the maxMotion
member of the closedLoop
config.
The MAXMotion Max Velocity parameter only applies to MAXMotion Position Control Mode, while MAXMotion Velocity Control Mode does not honor it in order to ensure any setpoint is reachable. This means any top-speed clamping you want to do must be done before you send the setpoint to the Motor Controller.
Smart Motion is deprecated and marked for removal. It is recommended to use MAXMotion instead.
The SPARK MAX and SPARK Flex each have 4 closed-loop slots, each with their own set of constants. These slots are numbered 0-3. You can pass the desired as an argument to each of the applicable configurations.
When applying the setpoint, pass the slot number and the motor controller will switch to the appropriate config.
This section uses concepts about configuration which is discussed . For more information about SPARK specific configuration, see .
A PID controller has 3 core parameters or gains. For more information on these gains and how to tune them, see .
API Docs:
API Docs:
Note that this is not the same as an arbitrary feed forward. The F parameter is multiplied by the velocity setpoint to achieve more consistent velocity control, while an arbFF value that is passed in with the setpoint can be used to apply kS, kV, kA, and kG gains. For more info on arbFF, see .
The Kv values for the NEO family of Brushless Motors are documented within each motor's specifications table: , ,
API Docs:
API Docs:
API Docs:
API Docs:
and have parameters that allow you to configure and tune the motion profiles that they generate. The parameters can be set through the smartMotion
member of the closedLoop
config.
API Docs:
API Docs:
API Docs:
API Docs:
API Docs: ,
API Docs: ,