Velocity setpoint with CST

Close the velocity loop in Motorcortex and let the drive follow a target torque.

Motorcortex closes the velocity loop and sends the drive a target torque every cycle. The drive only closes the torque loop. Use it when the application must shape the torque of a velocity-controlled axis itself.

Motorcortex Drive Velocity setpoint Velocity loop Torque loop Motor Target torque · 6071 Velocity actual 606C

Paths are under root/AxesControl/actuatorControlLoops/actuatorControlLoopNN/, where NN is the axis number.

Set the drive mode

In Desk, write 10 to root/DriveLogic/driveMode for each axis that uses this mode, and save with Save parameter tree to server. See Drive logic for details.

The standard configuration has these already. Otherwise, map the entries in the drive (CiA402 drives) and link them with channel 0 (EtherCAT configuration). Paths starting with …/ are under the axis’s control loop:

See the links in the ECAT tool

Each entry shows its production link to the control loop and, below it, its simulation link to the Simulator. The blue marks the simulation link.

ECAT tool: the target torque entry of axis 1 with its production link to the control loop and its simulation link to the Simulator
ECAT tool: the velocity actual value entry of axis 1 with its production link to the control loop and its simulation link to the Simulator
ECAT tool: the position actual value entry of axis 1 with its production link to the control loop and its simulation link to the Simulator

Set the transformations

The transformations turn drive units into rad, rad/s and Nm at the load. This is what happens to a position reading; velocity and torque work the same way, with their own transducer:

Reading one motor revolution: 20-bit encoder, 100:1 gearbox Drive 1310720 ticks 1048576 ticks Motor 6.283 rad Load 0.0628 rad = application 1 − offset 2 ÷ gain 3 ÷ 100 1 offset In drive units: 262144 ticks here. Homing sets it, so the axis reads its reference position there. 2 gain ticksPerRevolution × gainNum / gainDen = 1048576 × 1 / 2π = 166886 ticks per rad 3 gearbox gearboxLoadSide / gearboxMotorSide = 100 / 1 motor turns per load turn Targets go the other way: drive value = value × gain + offset. For an encoder that restarts at 0 every turn, enableSingleTurnCounter first adds the whole turns it counts, times ticksPerRevolution.
Set Parameter Example
Gearbox gearboxLoadSide, gearboxMotorSide 100, 1 for 100:1
Velocity units velocityTransformation/transducer/ticksPerRevolution 1 if the drive reports rev/s
Torque units torqueTransformation/transducer/gainNum, gainDen 500, 1 for 2 Nm rated, drive in ‰
Encoder, for the position read-back positionTransformation/transducer/ticksPerRevolution 1048576 for 20 bits

Set the controllers

  1. Leave positionController/parameter/enable at 0.
  2. On the velocity controller (velocityController/…), set controlOutputMin and controlOutputMax to the torque the motor may deliver.
  3. Set velocityController/parameter/enable to 1 and raise proportionalGain in small steps until actuatorVelocityError stays small. If a steady error remains, widen controlIntegrationMin and controlIntegrationMax, then add integratorGain. Save the parameter tree.

The velocity controller is a PID controller. Double-click actuatorVelocityError in the Desk Parameters panel to plot it while you tune.

Send the setpoint

The setpoint goes into root/AxesControl/axesVelocitiesInput, one value per axis in rad/s, at the load. Channel 0 is the first axis.

Set the limiter of each such axis to take the velocity as its command, under root/AxesControl/axesLimiters/LimitsNN/: enableInput to 0, enableInputDot to 1, and enablePositionLimit to 0 for a wheel or 1 to keep the position limits. See Limiter.

To take the setpoint from another part of the application, link it in a link file. The standard AGV configuration sends its wheel velocities from element 7 on, to axes 7 and 8:

{
  "Source": { "Path": "root/AGVControl/jointVelocitySetpoints" },
  "Destination": { "Path": "root/AxesControl/axesVelocitiesInput", "Index": 6 }
}

To test by hand, write a small value to that channel of axesVelocitiesInput in Desk while the axis is engaged. A linked input is overwritten every cycle, so test on a channel that is not linked. See position window detector to guard the position.

Check the result

Plot root/AxesControl/axesVelocitiesInput and the measured axesVelocitiesActual in Desk: the measured value should follow the setpoint.