Map Output

Applies to: IOcan · Standalone controller. What this means

Overview

A Map Output passes a value through a 1D lookup table and forwards the result to another target output. It owns no pin of its own — the target does.

Use it to linearise or reshape a command on its way out: a proportional valve whose flow is not proportional to duty, a gauge with a non-linear scale, an actuator whose useful range is only part of the command range. The strategy driving it keeps commanding in sensible units and the map absorbs the physical non-linearity.

It is the mirror of the Map Input, with the same interpolation, the same clamping at the ends, and the same unenforced ordering rule.

Linearising a proportional valve is the usual case, and the valve is driven from a pin — see the IOcan pinout or the standalone controller pinout.

Prerequisites

  • The target output already created — a PWM, Analog, CAN bus or any other output.
  • A source to drive the Map Output.

Add it in the app

  1. Create the target output first.
  2. Add a new output and choose Map Output as the type.
  3. Give it a clear name (e.g. Valve Linearise).
  4. Select the target output.
  5. Enter the input values (X) and output values (Y), and a default value.
  6. Point your strategy at the Map Output, not at the target.

Settings reference

Setting Meaning Unit Range / values Notes
Target output The output this drives an existing output Must already exist when this one is created.
Default value Sent to the target before a source value arrives target's unit sint32 Set it to a safe state, not just to zero — zero is safe for a valve and not for an inverted one.
Input values (X) Breakpoints on the command axis source's unit list of sint32 Must be strictly increasing. Not enforced — see below.
Output values (Y) Value sent at each breakpoint target's unit list of sint32 One per X.

Leaving the X list empty is legal and means "index". With no X values the breakpoints become 0, 1, 2, … matching the Y list, so a Y list alone gives you a plain lookup table indexed by the command. That is useful for a discrete command such as a gear or mode number, and surprising if you left X out by accident.

Outside the table the result is clamped to the first or last Y, exactly as on the Map Input. X values must increase and nothing checks that they do — an out-of-order table returns confident nonsense rather than faulting.

Common settings

Map Output also uses the shared Name setting. It has no pin of its own. See Common IO settings.

Example — linearise a proportional valve

  1. Create the valve's PWM Output, name Valve Drive.
  2. Add a Map Output, name Valve Linearise, target output Valve Drive.
  3. X — the flow you want, 0, 256, 512, 768, 1024.
  4. Y — the duty that actually produces it, measured on the bench: 0, 154, 410, 717, 1024.
  5. Default value 0.
  6. Drive Valve Linearise from the flow request. Nothing should command Valve Drive directly any more.

Example — a lookup indexed by gear

Leave the X list empty and give Y one entry per gear. The command is used as the index, so gear 3 sends the fourth Y value.

Troubleshooting

  • The target does not move: something is still driving the target output directly, or the source is driving the target instead of the map. Only one thing should command the target.
  • Output is right in the middle and wrong at the ends: the source is outside the table and is being clamped to the end Y.
  • Output plausible but wrong in places: the X column is not strictly increasing. It will not fault.
  • The map behaves as though indexed: the X list is empty, so the breakpoints defaulted to 0, 1, 2, ….
  • Wrong value at startup: set the default value.