Cyphal / TelegaV1 Servo Motor Control

Hey community,

we are switching from Telega V0 / Drone Can to Telega V1 / Cyphal in order to make use of the servo operation mode. During bench testing I run into the following questions with our setup:

  • AmpDrive AD0505A/B “Myxa” ESC running Telega V1

  • Zubax Babel CAN Adapter

  • BLDC motor with propeller attached (not relevant to the question)

We are quite pleased to be able to switch between the rpm-control mode and servo control by publishing to different cyphal topics/channels. However, as of now the servo mode appears to drive the motor coils at a fixed current to achieve a constant moment, which leaves us with a few questions:

  • By varying the maximum allowed phase current register, the servo current changed likewise. Is there another way to change to the servo current without altering the max phase current? I found a kinematics.force value that can be published, without much sucess at the moment.
  • Which other parameters influence the servo operation (beyond the jerk, acceleration, and velocity named here Servo - Telega v1.0 Reference Manual )
  • Are there any plans to incorporate feedback and or control? I know that Myxa is a sensorless drive, however methods like high frequency injection might enable absolute positioning in the absence of back emf (low rpm), which appears to be very promising.

I am looking forward to your thoughts.

Kind regards from Munich,
PBerthold

The target.force field sets the torque limit, which informs the phase current using a simplified PMSM model:

    [[nodiscard]] dyshlo::task::stepper::Command convertCommand(const motor::ServoCommand::Setpoint& in) const
    {
        dyshlo::task::stepper::Command out{
            .mechanical        = in.target,
            .constraint        = {.velocity     = par_.default_motion_profile.velocity,
                                  .acceleration = par_.default_motion_profile.acceleration,
                                  .jerk         = par_.default_motion_profile.jerk},
            .current_amplitude = par_.current_max,
        };
        <...snip...>
        if (in.force_limit) {
            // Using a simplified torque model that is good enough for the servo mode.
            const auto mr = static_cast<F32>(par_.mechanical_ratio);
            out.current_amplitude =
                std::min(par_.current_max,
                         ((2.0F / 3.0F) * std::abs(in.force_limit.value())) / (mr * par_.flux_linkage));
        }
        return out;
    }

The maximum phase current also.

Yes! Yes this is in the pipeline.

1 Like