Files
film-scanner/firmware/docs/implementation-notes.adoc
2022-04-15 13:08:56 +02:00

1.9 KiB
Raw Blame History

Motion control in an interrupt.

Parts

This consists of two parts, the planner and the executor.

The planner receives target positions. Each time it receives a target position, it replans so as to reach that position as soon as possible; the output of a plan consists of a set of motion segments, each following a 3rd order polynomial.

The executor processes the current state and decides whether to toggle the step lines of the MCU.

These two processes communicate by means of a command queue.

Executor

  1. Update a cycle counter

  2. Evaluates the next output of the position polynomial (3 adds)

  3. determine whether to toggle a stepper, and do so.

  4. Determine whether to start the next segment; if so, advance in the command queue.

Command queue

The command queue takes the form of a ring buffer, with each item containing a motion segment. The ring buffer must be large enough to contain a complete motion profile plus a terminating "stop" segment.

A motion profile segment consists of the following values:

  • For step computation

    • Δx1..Δx3 (initial values)

    • start time (in ticks)

  • For use by the planner

    • v₀: Initial velocity

    • a₀: Initial acceleration

    • The actual position at the start time (written by executor)

The following invariants hold for the command queue:

Planner

Aborting

In case of an abort, the fastest stop profile will consist of at most 3 segments: const -jerk to max -a, const -a to to lead-out, const +j to a=v=0.

If were already in the last three segments, were already in a race to a stop, so theres no need to handle an abort specially.

In the cv segment, we can simply advance the start times of each leadout segment. In the lead-in, we need to replan; this is, however, easy enough:

  1. Predict state in $t_plan$ cycles

  2. Identify how to reach a=0; prepare a segment accordingly

  3. Feed the end values from said segment to the leadout calculator

  4. replace the next N commands with this leadout.