Skip to content

# Motors

## Motor Types by Interface

| Speed | Position
--- | --- | ---
signed (-1000..1000) | DirectionalMotor | SteeringActuator
unsigned (0..1000) | ForwardMotor | LinearActuator

- DirectionalMotor – Bidirectional speed control. Used for DC motors in cars, boats, robots where forward/reverse and variable speed are needed.

- ForwardMotor – Unidirectional speed control. Used for aircraft ESCs, pumps, fans, and any application requiring only forward direction with variable speed.

- SteeringActuator – Bidirectional position control. Used for steering servos, pan/tilt mechanisms, and any application requiring centered positioning with left/right movement.

- LinearActuator – Unidirectional position control. Used for linear actuators, position servos, and applications requiring absolute position control from minimum to maximum.

## Hardware Compatibility Matrix

Driver | DirectionalMotor | ForwardMotor | SteeringActuator | LinearActuator
--- | --- | --- | --- | ---
PwmDriver | — | ✅ | — | ✅
ServoDriver | ✅ | ✅ | ✅ | ✅
TA6586Driver | ✅ | — | ✅ | —
TB6612Driver | ✅ | — | ✅ | —

## DirectionalMotor

Bidirectional motor controller for DC motors with H-bridge drivers.

    template <class Driver, signed short kMaxBackward = -1000,
              signed short kMinBackward = 0, signed short kMinForward = 0,
              signed short kMaxForward = 1000>
    class DirectionalMotor : public Driver

Methods:

- `SetupRange(maxBack, minBack, minForw, maxForw)` – Configure all limits

- `SetMaxBackward(value)` – Max reverse power (-1000..1000)

- `SetMinBackward(value)` – Min reverse power (start threshold)

- `SetMinForward(value)` – Min forward power (start threshold)

- `SetMaxForward(value)` – Max forward power

- `Go(level)` – Set motor power (-1000..1000)

Example:

    using Motor = evam::DirectionalMotor<evam::TA6586Driver<9, 10>>;
    Motor motor;
    motor.SetupRange(-1000, -200, 200, 1000);  // 20% dead zone
    motor.Go(750);  // 75% forward

## ForwardMotor

Unidirectional motor controller for ESCs and forward-only applications.

    template <class Driver, int kMinValue = 0, int kMaxValue = 1000>
    class ForwardMotor : public Driver

Methods:

- `SetupRange(minVal, maxVal)` – Configure output range

- `SetMinValue(value)` – Minimum output (idle/stop)

- `SetMaxValue(value)` – Maximum output (full power)

- `Go(level)` – Set motor power (0..1000, negative treated as 0)

Example:

    using ESC = evam::ForwardMotor<evam::PwmDriver<9>>;
    ESC throttle;
    throttle.SetupRange(100, 1000);  // ESC calibration
    throttle.Go(500);  // 50% throttle

## SteeringActuator

Centered servo controller for steering and positioning.

    template <class Driver, signed short kLeftPos = -1000,
              signed short kCenterPos = 0, signed short kRightPos = 1000>
    class SteeringActuator : public Driver

Methods:

- `SetupRange(leftPos, centerPos, rightPos)` – Configure endpoints

- `SetLeftPos(value)` – Leftmost position

- `SetCenterPos(value)` – Center position

- `SetRightPos(value)` – Rightmost position

- `Go(level)` – Set position (-1000..1000)

Example:

    using Steering = evam::SteeringActuator<evam::ServoDriver<9>>;
    Steering steering;
    steering.SetupRange(-800, 0, 800);  // Calibrate endpoints
    steering.Go(500);  // Turn right

## LinearActuator

Position controller for linear actuators and position servos.

    template <class Driver, int kMinValue = 0, int kMaxValue = 1000>
    class LinearActuator : public Driver

Methods:

- `SetupRange(minVal, maxVal)` – Configure position range

- `SetMinValue(value)` – Position at input 0

- `SetMaxValue(value)` – Position at input 1000

- `Go(position)` – Set position (0..1000)

Example:

    using Actuator = evam::LinearActuator<evam::PwmDriver<10>>;
    Actuator actuator;
    actuator.SetupRange(0, 1000);
    actuator.Go(750);  // 75% extended