X Engineering
Sailboat
Connecting to regulator
-A -°F -% duty -V -% -A -rpm — ⌄
X Engineering
?
—
Batt - V SOC - %
Alt - A Batt - A
Alt - °F Batt - °F
RPM - IGN ?
Health - %
Alternator Enable
⚠ Avoid parameter changes during rapid RPM or load swings — controls may briefly lag.
minimize ⌃
Vessel Information
Regulator Name: ℹ️ A name for THIS regulator, so a boat carrying more than one can tell them apart — "Port engine", "Starboard engine". It is what the app shows when it asks which regulator to connect to, and what this unit broadcasts on the network. Leave it blank and the unit names itself after its own hardware ID.

Length (feet):

Displacement (lbs):

Type:

Make/Model:

Year:

Engine Make:

Horsepower:

Home Port:
Charging Equipment
Nominal Battery Voltage:

Battery Capacity (Ah):

Battery Type:

Battery Make/Model:

Alternator Brand/Model:

Nominal Solar Panel Wattage:
Physical Regulator Installation

Alignment Selection

Select how the regulator is mounted. Mount the device squarely with wires pointing downward — the built-in accelerometer uses this orientation as its reference so it can report accurate heel, pitch, and passage comfort metrics. (Small residual tilt is corrected by the Zero Now button below.)


Level offsets (none stored): ℹ️ Press Zero Now with the boat at rest in calm water. It stores the attitude the regulator is sitting at right now as the level reference — the heel and pitch offsets shown here, plus what the gyros read while still — so heel and pitch then read zero at that attitude. Whatever tilt the device is in at that moment is baked in permanently, so re-do it after any remount. Reading now underneath is the live heel and pitch with those offsets already applied — with the boat level and still, a good capture leaves it sitting near zero.
Reading now: —

Location in Vessel

Approximate positions are acceptable. These measurements help improve motion analysis accuracy.

Distance from Bow (feet):

Distance from Centerline (feet):
Positive = starboard, Negative = port, 0 = centerline

Height Above Waterline (feet)
Positive = above waterline, Negative = below, 0 = at waterline

A wizard to pre-tune the current and voltage control loops (and some additional parameters) for this alternator.

Status:
…

Steps

Progress is saved on the regulator, so it survives a page reload and shows the same on any device. The badge on the right of each step shows its state: ✓ DONE = finished, ▶ = the step you're on (RUNNING while the wizard is open, RESUME when paused), ○ = not yet run. Tick the steps to run, then press the button below — coupled steps are selected automatically.

Only the ticked steps will run.

Charge Rate:

Physical Panel Override is on, so the charge rate is set by the switch on data Cable 3 pin 5 — switch on is High, switch off is Low — and these buttons only show which mode that switch has chosen. Turn the override off under Setup → System → Security & Maintenance to set the rate from here.

Limit by:
RPM ℹ️Engine RPM breakpoint for this bucket. Row 0 covers all RPM below its value; row 9 covers all RPM above its value. Limit
(A) ℹ️Hard current ceiling (A) for this RPM range. In Amps mode, enter your limit here — the kW column is calculated from this value and the present battery voltage. In kW mode, this is derived from your kW limit and live battery voltage each control tick.
Limit
(kW) ℹ️Power limit for this RPM range. This is electrical power, assuming 100% alternator efficiency. If you want to convert to engine power, you can mentally multiply table values by 2 to account for mechanical and electrical losses. In kW mode, enter your limit here — the firmware divides by live battery voltage each control tick to derive the amp ceiling, so the load stays constant regardless of voltage sag or rise. In Amps mode, this is calculated for reference only.
Keep-Alive
(%) ℹ️Tachometer keep-alive floor: the lowest field duty cycle (%) the regulator will hold at this engine speed, even when the controls otherwise want less. Holding a little field keeps the alternator's stator lightly energized, which keeps the RPM signal alive. Edit these cells by hand only while Automatic Learning (card below) is off.
<
0Overheats
0Safe hours
0Overheats
0Safe hours
0Overheats
0Safe hours
0Overheats
0Safe hours
0Overheats
0Safe hours
0Overheats
0Safe hours
0Overheats
0Safe hours
0Overheats
0Safe hours
0Overheats
0Safe hours
+
0Overheats
0Safe hours
Tachometer Keep-Alive — Automatic Learning ℹ️When on, the regulator learns the field level at each speed where the alternator just begins to make output current (the onset), and automatically keeps the Keep-Alive (%) column a small margin below it. The Keep-Alive (%) cells above update on their own by default, or, you can still turn this off and edit by hand.

Automatic Learning (?): ℹ️Master switch. On = the regulator owns and auto-fills the Keep-Alive (%) column. Off = the column is yours to edit and is left alone.
Off On

Margin Below Onset (%) (?): ℹ️How far below the current-onset point to park the floor. Larger = safer (never forces unwanted current), smaller = field stays more primed. 5 is a good start.

Onset Delta (A) (?): ℹ️How far output current must rise above the freshly measured zero, while probing, to count as "the alternator just started making current" (the onset). Keep it a few times the current sensor noise — under one amp is typical.

Re-arm Current (A) (?): ℹ️Once a range is locked, if this much current ever appears at its floor the onset has dropped, so the floor is lowered one margin step. Set above the worst current-sensor zero drift (a couple of amps) so noise never re-triggers it.

Step Dwell (s) (?): ℹ️Settle and hold time at each probe step: RPM, temperature and field must stay steady this long before the floor is stepped again. A few seconds is plenty; longer = stricter.

Probe Step (%) (?): ℹ️How many field-duty points the floor climbs at each step while hunting the onset. Smaller = finer knee resolution but slower; this is the staircase increment, taken once per Step Dwell.

Temperature Compensation (?): ℹ️When on, the applied floor is corrected for alternator case temperature — the field-onset point rises with winding resistance, so a colder alternator gets a lower floor. Turn off to apply the learned floors as-is (useful for bench comparison).
Off On

Reference Temperature (°F) (?): ℹ️The alternator case temperature the learned floors are referenced to (learning happens hot, so ~180 °F / ~82 °C is typical). The temperature correction lowers the floor below this and raises it above.

Maximum Floor (%) (?): ℹ️Safety cap — no learned floor will ever exceed this, even while probing. Bounds how much field can be held during light load.

Steady Band — RPM (%) (?): ℹ️How much RPM may wander and still count as steady. Tighter = stricter.

Steady Band — Temperature (°F) (?): ℹ️How much temperature may wander and still count as steady.

Steady Band — Field (%) (?): ℹ️How much the applied field may wander and still count as steady.

Per-RPM Learning Status ℹ️Live view per RPM range: the floor in use, the learned current-onset point, how confident the learning is (0–100%), and how long since that range was last confirmed. "Active" marks the range being observed right now.
RPM Floor (%) Onset (%) Locked Learn °F Last seen
Status: —

Current RPM Index: ℹ️Which RPM table bucket (0–9) the controller is currently operating in, based on measured engine RPM. −1 means no valid RPM reading yet. 0
PID Initialized: ℹ️Whether the output current PID has been initialized for the current operating point. Briefly false on startup or after mode transitions; the PID performs a bumpless transfer before resuming AUTO control. No
Output Control
Field Control (?): ℹ️ PID runs the charge stages and every protection. Manual drives the field straight from the Manual Field PWM box below and turns the protections off: no temperature cut-back or over-temperature shutdown, no Min Field or per-speed tachometer keep-alive floor (a PWM of 0 really means zero field), no engine-speed or tachometer-plausibility cut, no battery temperature or voltage checks, and no current control at all. The master On/Off switch, the hardware over-voltage shutdown and the field ceiling (Max Field % and Max Field Volts, whichever is lower) still apply. Switching to Manual asks for confirmation and lists the full set.

Manual Field PWM (%) (?): ℹ️Direct PWM duty cycle applied to the field winding when Manual mode is active, 0–100% in steps of 0.01, delivered as typed — Min Field and the per-speed keep-alive floor do not raise it, so 0 is a genuinely dead field. Only the field ceiling, Max Field % or Max Field Volts, whichever is lower, still caps it. Has no effect in PID mode. Use with caution — Manual mode bypasses the thermal, engine-speed, battery and current protections.

Min Field (%) (?): ℹ️Global tachometer keep-alive floor: the minimum field held anywhere the alternator is charging under PID control. A little field keeps the stator energized, which is what a stator-driven tachometer reads. It is also the lowest duty the current control loop can command, so raising it narrows the loop's working range — prefer setting the floor per engine speed in the RPM table's Keep-Alive (%) column and leaving this at or near zero. It raises that column, never lowers it, and it has no effect at an engine speed whose Keep-Alive cell is 0 — commissioning sets 0 above the highest speed it measured, where the field must be able to shut fully off. Manual field mode ignores both floors, as do shutdown ramps and an active protection clamp. When the floor is what is setting output — the loop wanting less than the floor delivers — the banner reads MIN FIELD.

Max Field (%) (?):limiting ℹ️Hard cap on commanded field duty, enforced in every mode, Manual included. Set no higher than 99%: at 100% duty the gate driver's bootstrap capacitor cannot refresh, so the high-side MOSFET may not fully turn on and runs hot. This is a duty ratio, so the field current it allows rises with system voltage. Max Field Volts below caps the same drive in volts, and is what protects a 12 V winding on a 24 V or 48 V bank. Whichever of the two works out lower is enforced, and that one is marked "limiting".

Max Field Volts (V) (?, ?% now):limiting ℹ️Caps the average voltage applied to the field winding, calculated from commanded duty and the measured system voltage. Alternator makers often reuse one 12 V field winding across their 24 V and 48 V models, so the winding inside a high-voltage alternator may still be a 12 V part — enter the field voltage from the alternator's datasheet, and a higher rating raises the ceiling. The duty this works out to at the present system voltage is shown beside its value; whichever of this and Max Field (%) is lower is what the loop enforces, in every mode, and that one is marked "limiting". Because this solves against the measured bus every control tick, it hands duty back as the bank sags, which a fixed duty percentage cannot. This is a heating limit, not an insulation limit: field drive is switched, so the winding still sees full system voltage on each pulse whatever the cap. And it is derived from duty and battery voltage rather than sensed at the field, so actual field volts run above it by the cable drop between battery and alternator.

Min RPM For Field (RPM) (?): ℹ️ Field is cut immediately when RPM falls below this threshold. Set to 0 to disable — not recommended; to run without a tach use Ignore RPM under Setup → System → Emergency Overrides.

Field Resistance (Ω) (?): ℹ️Only affects Field Amps calc, not important.

Field Switching Freq (Hz) (?): ℹ️100 to 2000 Hz is a good range — may want to avoid human hearing frequencies depending on installation location and noise.

Warmup Ramp Rate (A/s) (?): ℹ️ Rate at which the output current ceiling rises from 0A each time the alternator enables. Set to 0 to disable (immediate full output). Example: 2 A/s reaches 120A cap in 60 seconds.
Rate Limiting
Setpoint Rise Rate (A/s) (?): ℹ️Maximum rate the current target can increase during AUTO operation. Does not apply during on/off transitions — only Duty Ramp Rate applies then. Use a slower rate (e.g. 5 A/s) to prevent sudden demand spikes.

Setpoint slew limiter (?): ℹ️ Master switch for the current-setpoint slew in normal operation. On (default): the commanded current target ramps at the Setpoint Rise / Fall rates above instead of stepping, and the turn-on startup ramp and large-step gentling are active. Off: the target steps instantly (also drops the startup ramp and big-step gentling). Leave On for normal use. The manual square-wave test ignores this — its slew is set by the slew mode in the Current Target Generator; commissioning / automated tests ignore it too.
Off On

Big-Step Threshold (A) (?): ℹ️When a rising current target jumps more than this many amps above the present slew-limited setpoint, the climb is gentled to Big-Step Rise Rate instead of Setpoint Rise Rate, until the remaining gap closes to within this threshold. Smaller up-corrections (within the threshold) keep full Setpoint Rise Rate responsiveness. Avoids overshoot-driven protection trips on large jumps. Set high to disable.

Big-Step Rise Rate (A/s) (?): ℹ️Gentled rise rate applied to the large-step portion of a rising current target (see Big-Step Threshold). Keep below Setpoint Rise Rate. Only affects up-moves; the down direction always uses Setpoint Fall Rate, so protection response is unchanged.

Setpoint Fall Rate (A/s) (?): ℹ️Maximum rate the current target can decrease during AUTO operation. No effect during on/off transitions — only Duty Ramp Rate applies then.

D-term brake fall rate (A/s) (?): ℹ️Faster down-slew used only while the constant-voltage damper (D term) is actively pulling current out on a fast rise, so its commanded cut lands in time. Sits between the normal Setpoint Fall Rate and the instantaneous overvoltage clamp — a controlled brake, not a protection slam. A value below the Setpoint Fall Rate is ignored (raised to it).

Startup Rise Rate (A/s) (?): ℹ️Setpoint slew rate applied only when the field is first turned on (OFF to AUTO). A slow value (e.g. 3 A/s) lets the alternator build field current gradually, preventing integrator windup and the FastOV crash-to-zero that can follow. Has no effect on tuning steps, CV load-connect recovery, or RPM step-ups — those use Setpoint Rise Rate.

Duty Ramp Rate (%/s) (?): ℹ️Maximum rate of duty cycle change in ALL cases including on/off transitions. Lower values prevent rapid field changes that can disturb the tachometer signal.

Shutdown Slow Ramp Rate (%/s) (?): ℹ️Rate at which field duty ramps from minimum to 0% during Phase 3 shutdown. Lower = slower, gentler on LM2907 tach signal.

Shutdown Phase 2 Hold Time (ms) (?): ℹ️How long to hold at minimum field duty before beginning slow ramp to 0. Set to 0 to skip Phase 2 entirely.
Temperature Settings
Alternator Temp Limit (°F) (?): ℹ️ Maximum safe temperature at the sensor location. The temperature PID begins reducing current as temperature approaches this value — intervention starts at (Limit − Temp PID Margin). Hard warning and critical shutdowns trigger above it. Sensors often read 20–30°F cooler than true winding temperature; account for this offset when setting this value.

Temp Warning Excess (°F) (?): ℹ️️Degrees above the alternator temperature limit (entered in your display unit) that triggers a WARNING. Field output ramps to zero and a lockout starts. If temperature stays above the warning level for the Temp Sustained Timeout, it escalates to a sustained-temperature shutdown and the field is cut once the output settles. Compares the raw sensor temperature, not the projected value.

Temp Critical Excess (°F) (?): ℹ️️Degrees above the alternator temperature limit (entered in your display unit) that triggers an immediate field cut (no ramp, no settle wait). Compares the raw sensor temperature, not the projected value. Highest-priority thermal protection event.

Temp Sustained Timeout (s) (?): ℹ️️Seconds of continuous WARNING temperature before escalating to a sustained-temperature shutdown, which ramps field output to zero then cuts the field. Timer resets if temperature drops below the warning threshold. Enter in seconds.

Temp Source (?): ℹ️Select the temperature sensor used for thermal protection. Digital uses an onboard digital sensor (e.g. DS18B20). Thermistor uses an analog NTC thermistor configured by R_fixed, Beta, and T0 below.

Internal Temp Offset (°F) (?): ℹ️ONLY used for alternator component life physics models. How much hotter windings, bearings, brushes are than physically measured alternator case temperature. Typical: 40–60°F (22–33°C).

Thermistor Series Resistor R_fixed (Ω) (?): ℹ️Value (Ω) of the fixed series resistor in the thermistor voltage divider circuit. Must match the resistor physically installed on the board.

Thermistor Beta (?): ℹ️Beta coefficient from the thermistor datasheet — characterizes how its resistance changes with temperature. Typical NTC thermistors: 3000–4000. Find the exact value in your thermistor's datasheet.

Thermistor Reference Temp T0 (°C) (?): ℹ️Reference temperature (°C) at which the thermistor's nominal resistance is specified. Almost always 25°C per datasheet.
Current Sensing
Hall Effect Sensor Range (?): ℹ️Select the rated current range of your QNHCK1-21 clamp-on hall effect sensor. Choosing the wrong range will scale all alternator current readings incorrectly.

Invert Alternator Amps (?): ℹ️Reverses the sign of the raw alternator current reading. Enable if your hall-effect sensor is mounted with reversed polarity and reports negative amps during normal charging.
No Yes

Alternator Current Offset (A) (?): ℹ️Fixed offset (A) added to the raw alternator current reading to correct for sensor zero error. Use the Auto-Zero Reset button to calibrate automatically, or enter a known offset manually.

Current Threshold (A) (?): ℹ️Below this, the Alternator is assumed OFF. Affects many alternator calcs.

Alternator Zero Correction (?): ℹ️The current sensor never reads exactly zero when no current is flowing, and how far off it is shifts as things warm up. Switch this on and the regulator works out that error at each temperature from its own readings taken while the alternator is idle, then subtracts it from every live current reading. It updates once a day, moves gradually over about a week rather than jumping, and can never shift a reading by more than 3 amps. It stays on "learning" until it has watched the alternator go through a wide temperature swing, which normally means a real run followed by a cooldown. Reset Zero throws away what it has learned and starts again.
Off On
Fit: —

Measured Zero (Engine Running): ℹ️With the engine running and the field at 0%, the current sensor should read exactly zero. Whatever it reads instead is its zero error at operating temperature, on this installation. Zero Now turns the field off by itself, waits for the rotor to drain, averages the reading for ten seconds, turns the field back on and reports what it found; Apply folds that number into the Alternator Current Offset above, where it is stored permanently. The commissioning wizard offers the same measurement at the finish, when the alternator is warmest. The engine must be running above 400 RPM; charging pauses for under a minute. A reading that is too large or too noisy is refused rather than applied.
—

Zero-Drift Log (?): ℹ️The raw measurements the correction above learns from. Any time the alternator isn't charging, the regulator writes down what the current sensor is reading — it should be zero — alongside how warm the unit and the alternator are. Once a second while the engine is turning, once every ten minutes while it's stopped. With this off the correction has nothing to learn from. Download CSV gives you the raw numbers; Reset Log wipes them and starts collecting fresh.
Off On
Records: —
Alternator Health
Set Alternator Life Manually (%) (?): ℹ️This will adjust life for brushes, bearings, insulation all together, meant for zeroing all together.
CV Mode holds the alternator output to a fixed user-specified voltage target, bypassing the normal Bulk / Absorption / Float charge algorithm. The voltage loop adjusts the current setpoint every 100 ms (set by Voltage Loop Interval) using Voltage Loop Kp and Ki to eliminate steady-state voltage error. All current limits remain fully active — RPM Cap Table, thermal penalty, Fast OV, Load Dump, the Group 3 iExcess detectors, the Group 4 battery charge limit, and any user overrides — so the only thing this mode changes is the voltage target. Use this tab to tune voltage loop parameters or simulate a fixed-voltage regulator. ⚠️ Not intended for lithium batteries.
CV Mode On/Off (?): ℹ️ ⚠️ Not safe for Lithium batteries. This mode bypasses the normal charge algorithm — use only with flooded or AGM batteries, or in consultation with your battery manufacturer.

Overrides normal charging with fixed voltage control — mainly useful for tuning voltage loop parameters or simulating an old-school automotive alternator voltage regulator.
Off On

Target Voltage Setpoint (V) (?): ℹ️ Voltage target when mode is enabled.

Pick a pill to focus on one protection. Tune the control loops first (in the Tuning tab, protections off), then adjust these after.

View:

Group 4 (Battery Limit) and Group 5 (Load Dump) both act on measured battery current, and no battery shunt is installed — so their pills and parameters are greyed. They arm themselves the moment a shunt is fitted under Setup → Battery → Measurement Sources.

Enable
G0 Group 0 Enable (?) ℹ️Master switch for the last-resort over-current trip (Group 0), which switches the field off when measured alternator current exceeds the Command Limit plus 10 A for the debounce time. This trip stays armed even when the global Protections toggle is off — it is the final backstop against a runaway field. Leave it on except during bench diagnostics.
Off On
G1 Group 1 Enable (?) ℹ️Master switch for the predictive overvoltage layer (Group 1). When off, the prediction-based cap never engages; the measured-voltage layer (Group 2) and all other protections are unaffected. On installs with heavy belt ripple the predictive lead can amplify ripple into false trips — that is the usual reason to run with this off.
Off On
G2 Group 2 Enable (?) ℹ️Master switch for the measured overvoltage layer (Group 2) — the primary voltage backstop, clamping the field when battery voltage exceeds the charge target by the Group 2 margin. Overvoltage damages every battery chemistry: leave this on unless a bench test specifically requires it off.
Off On
G3 Group 3 Enable (?) ℹ️Master switch for both alternator over-current detectors (Group 3) — the near-target (CV) detector and the bulk (CC) detector. Turning it off silences only these detectors; the voltage layers, Load Dump, and the hard over-current trip stay armed. Useful when a mis-fitted trip line false-fires during tuning.
Off On
G4 Group 4 Enable (?) ℹ️Master switch for the Battery Charge Current Limit ceiling (Group 4) — the cap on how much charging current the battery is allowed to receive. Turning it off removes only that ceiling; Load Dump (Group 5) has its own switch and stays armed.
Off On
G5 Group 5 Enable (?) ℹ️Master switch for the Load Dump rate-of-change trip (Group 5). Load Dump stays armed even when the global Protections toggle is off — this switch is the only thing that disarms it. A load dump (battery disconnect under charge) is the most violent overvoltage event there is: leave this on unless bench work requires otherwise.
Off On
RPM Tach Plausibility Cut (?) ℹ️Cuts the field when the tach claims the engine is turning, the control loop is commanding current, the field is driven well above the learned zero-output floor, and the alternator still delivers nothing for several seconds. That combination means a false RPM reading (field switching noise on the tach line), a dead alternator, or an open field circuit — a false reading left running energizes the field indefinitely and drains the battery through it with the engine stopped. This cut stays armed even when the global Protections toggle is off; this switch is the only thing that disarms it. Leave it on unless bench work with a simulated tach signal requires otherwise.
Off On
Detection

When measured alternator current exceeds the safe limit for the debounce duration, the trip fires. Set Command Limit to the lowest safe maximum on the alternator side of the system — alternator continuous rating, mechanical belt drive capacity, fuse ratings, and wiring limits. Whichever is lowest. Battery acceptance is handled separately by the Group 4 Battery Charge Current Limit. The trip threshold is automatically 10 A above Command Limit.

Predicts where battery voltage will be a fraction of a second from now: predicted = measured + Prediction Horizon × voltage rise rate. Engages when the prediction exceeds the active charge target by more than the Group 1 Trigger Margin. dvdt EMA TC sets how much the rise rate is smoothed before prediction — larger TC means smoother but laggier. Group 1 Enable (in the Enable section above) turns the whole layer off.

Engages when measured battery voltage exceeds the active charge target by more than the Group 2 Trigger Margin. Group 2 Enable (in the Enable section above) turns the whole layer off. Above this proportional shed sits the Over-Voltage Ladder card: two timed cut tiers that fire only when the filtered voltage stays over their trip lines continuously for their set time to act, then the absolute software and hardware instant cuts.

Watches alternator output current. Two regimes, split at the Strict Over-Current Band below the active voltage target. Near the target — the voltage-limited (CV) phase: engages when the time-averaged current rises above the moving current setpoint by more than the Detection Threshold — the sloped trip line set by Slope and CV base below. Below the band — the current-limited (bulk / CC) phase: the looser Detection Threshold (Bulk) takes over — the same line raised by CC offset and judged against the commanded ceiling instead of the moving setpoint, so normal speed-up ramps toward the ceiling don't false-trip. Both thresholds are bounded by the Threshold Floor / Ceiling (amps); Averaging Time Constant sets how heavily the current is smoothed before each comparison, and Release Hysteresis sets the re-arm point.

Battery Charge Current Limit is a ceiling, not a trip: the commanded alternator current is capped at the limit plus the measured house-load draw, so the battery never sees more than the set amps no matter what the loads are doing. It needs the INA228 battery shunt and is off when set to 0.

Load Dump catches a battery disconnect under charge (a load dump) — FET-disconnect or load-drop events: three tiered thresholds on the rate-of-change of battery current, each firing when its set number of consecutive samples all exceed its threshold. Fewer samples act faster on a single spike; more samples reject noise but wait longer — each tier's effective time to act (samples × the ~5 ms battery-current sampling interval) is shown under its sample count. Unlike the over-current detectors, Load Dump stays armed even when test protections are disabled — only the Group 5 Enable toggle in the Enable section disarms it.

Alternator
G0 Command Limit (A) (?) — OC trips at ?A
A
G0 Overcurrent Trip Debounce (ms) (?)
ms
G3 Alternator-current detector — live
peak excess — A · threshold — A ℹ️Per ~0.1 s frame the chart plots the peak current excess above command (teal) against the minimum trip threshold (amber). The threshold rides the live current command and clamps onto this detector's Floor (grey dotted) / Ceiling (purple dashed). A vertical red line marks a frame where the detector actually fired — drawn from the real event, not from where the plotted lines cross.
G3 Strict Over-Current Band — V below target (?) ℹ️How far below the active voltage target the strict near-target regime (voltage-limited / CV) reaches. Inside the band the detector measures the excess against the moving current setpoint, so a smaller overshoot crosses the Detection Threshold and trips. Below the band the looser bulk regime (current-limited / CC) takes over, measuring against the commanded ceiling — the most current allowed right now — so a normal speed-up ramp toward that ceiling doesn't trip. This is a voltage boundary that only picks which regime is armed; it does not move the trip-threshold plot below.
V
G3 Safety Margin — amps above ripple (?) ℹ️How many amps the over-current trip lines sit above the measured alternator ripple. Larger means fewer nuisance trips but less sensitivity to a genuine over-current. Applying it sets both trip lines parallel to the ripple this alternator produces (Slope and CV base below are set for you). Requires a ripple measurement from Commissioning ▸ Step 5.
A
G3 Slope — % of command (?%) ℹ️How fast the trip lines rise with the commanded current, as a percent of that command. Commissioning sets it to the measured ripple slope so the lines stay parallel to the ripple. Both charge phases (voltage control and current control) share this slope; setting it here moves both lines.
%
G3 CV base — amps at zero command (?) ℹ️Where the voltage-control (CV) trip line starts at zero command, in amps — its intercept. The current-control (CC) line rides CC offset above it, so editing this shifts BOTH lines up or down. The Safety Margin sets this to ripple-at-idle plus the margin. Zero puts the line through the origin (the legacy behaviour).
A
G3 CC offset — amps above CV (?) ℹ️How many amps the current-control (CC) trip line runs above the voltage-control (CV) line. The two lines stay parallel; the current-limited phase tolerates this much more current excess before tripping. The only setting that moves ONE line — everything else moves both.
A
G3 Threshold Floor (alternator) — minimum amps (?) ℹ️The smallest either trip line (CV or CC) is ever allowed to become, in amps — one shared floor clamps both. At small commands the sloped lines could sink so low that normal current variation trips them — this floor prevents that. The ripple-vs-threshold plot shows whether your value clears the measured ripple.
A
G3 Threshold Ceiling (alternator) — maximum amps (?) ℹ️The largest either trip line (CV or CC) is ever allowed to become, in amps — one shared ceiling clamps both. The CC line rides higher, so it reaches the ceiling first and flattens sooner on the plot; raise the ceiling to un-cap it. On a very large commanded current an unbounded line could grow so wide that a real overshoot slips under it — this ceiling caps that.
A
G3 Ripple vs. trip threshold (alternator) ℹ️The trip threshold your settings above produce (both regimes: near-target % and bulk %, floor→ramp→ceiling) drawn against the measured alternator ripple. Any current where the ripple crosses above the threshold is shaded red — the detector would false-trip there. The threshold lines redraw as you edit the fields above; the ripple line is fixed measured data. Nothing here changes automatically — you decide whether to raise the floor, raise the ceiling, or accept it.
X-axis max A
measured datapoints measured ripple (Linear Fit) Threshold in Current Control mode (CC) Threshold in Voltage Control mode (CV)
Ripple projection is from Commissioning ▸ Step 5 (Disturbances) ▸ current check. Re-run that step to update it.
G3 Averaging Time Constant (? ms) ℹ️Larger = smooths brief fluctuations more, so momentary spikes won't trip the detector, but reacts a little slower to a real, sustained overshoot. The default suits most installations across the full speed range. Governs both Group 3 regimes (near-target and bulk).
ms
G3 Release Hysteresis — % of threshold (?%) ℹ️After the iExcess detector fires it stays engaged until the averaged excess falls back below this percentage of the threshold, then it re-arms. Prevents the detector from rapidly switching on and off as the current settles. Lower = holds longer before releasing; higher = re-arms sooner.
%
Battery / Bus
G1 OvPredMargin — Group 1 Trigger Margin (V) (?)
V
G1 TdPred — Prediction Horizon (s) (?) ℹ️Larger horizon = engages earlier on a fast rise, but more sensitive to rate-of-rise noise. Used only by Group 1.
s
G1 dvdt EMA TC (ms) (?) ℹ️Larger = smoother but slower to react; smaller = faster but noisier. Too low lets measurement noise cause false trips, so reduce it gradually.
ms
G2 Trip Margin Above Target (OvMeasMargin) (V) (?) ℹ️Group 2 trips when the filtered battery voltage exceeds the charge target by this margin, then drops the field to its floor until the voltage falls back to target — self-releasing, no lockout. Lower = engages sooner. Set it above the worst filtered-signal ripple you see while holding target, so ordinary fluctuation can't trip it. On lead-acid and AGM it can sit wider, since brief voltage excursions don't harm those chemistries; lithium is kept tight because it tolerates overvoltage poorly. Rescales automatically with the system voltage set in Vessel Info. Does not affect the iExcess detectors (Group 3) — see their own Strict Over-Current Band. The low timed cut tier in the Over-Voltage Ladder card rides this same line: the proportional shed gets the whole low-tier time to act to resolve the excursion before the field is cut.
V
Over-Voltage Ladder ℹ️The battery-voltage cut rungs, in the order they engage. Below them sits the Group 2 proportional shed (its Trip Margin card is above), which caps current without cutting the field. The two timed cut tiers ride above it: an excursion that stays over a tier's trip line continuously for that tier's time to act cuts the field, with the same escalating re-enable lockout as the instant cut. Brief transients get time to be resolved by the shed — no cut, nothing felt at the engine — while anything sustained is cut well before a battery protection circuit (BMS) could open its charge path. Above the timed tiers sit two absolute instant rungs: the software hard shutdown, then the hardware shutdown (a comparator inside the shunt monitor chip that cuts the field electrically, with no processor involvement — the backstop if software hangs). Keep the order: low tier at or above the shed margin, mid tier above it, software shutdown above both, hardware shutdown on top.
Timed Cut LOW — Margin Above Target (V) (?)
V

Timed Cut LOW — Time to Act (ms) (?) ℹ️How long the filtered battery voltage must stay continuously above the low-tier trip line before the field is cut. Any dip back under the line restarts the clock. 0 disables this tier.
ms

Timed Cut MID — Margin Above Target (V) (?)
V

Timed Cut MID — Time to Act (ms) (?) ℹ️How long the filtered battery voltage must stay continuously above the mid-tier trip line before the field is cut — a faster response to a larger excursion than the low tier. Any dip back under the line restarts the clock. 0 disables this tier.
ms

Alternator Hard Shutdown Voltage (V) (?) ℹ️Absolute battery voltage at which the field is cut instantly — armed in every mode, including manual, comparing the raw per-tick sample so it catches fast excursions the filtered tiers ride through. The re-enable lockout is adaptive: short for an isolated event, escalating if the cut keeps re-firing, resetting after a minute without one. Set it 0.1 V (times the system-voltage class over 12) below the Hardware Shutdown Voltage, so software always acts before the hardware backstop.
V

Hardware Shutdown Voltage (V) (?) ℹ️The top rung: a voltage comparator inside the battery shunt monitor chip (INA228) whose alert pin cuts the field electrically, with no processor involvement — the backstop if software ever hangs. It should never be the rung that fires; a nonzero hardware-trip count on the Diagnostics panel is worth reporting. Set it 0.2 V (times the system-voltage class over 12) below your battery's BMS charge-disconnect voltage (the highest-cell trip voltage times the cell count) so a hung regulator is still disconnected before the BMS opens the charge path under load. For lead-acid and AGM there is no BMS in the picture — place it where connected DC equipment becomes the limiting factor.
V
G4 Battery Charge Current Limit (A) (?) ℹ️The most charging current the battery is allowed to receive, in amps — set it to the battery bank's maximum acceptance (for lithium, the C-rate limit). This is a ceiling on the command, not a trip: the alternator command is capped at this limit plus the measured house-load draw, so loads are always covered and only the battery's share is limited. Requires the INA228 battery shunt as the Battery Current Source. 0 disables the limit.

If you have other charging sources on the bus (solar, shore power, a DC-DC charger), the shunt sees everything going into the battery, so the alternator is backed off to make room for them. When those sources are putting in more than the boat is using, the alternator gets a lower ceiling — and if they can cover the whole limit on their own, the alternator is commanded down to nothing until they ease off.
A
G5 Tier 1 — Single-Sample Threshold (A/s) (?) 10s peak slew: —
A/s

Tier 1 — Consecutive Samples (?) time to act: —
samples
G5 Tier 2 — Two-Consecutive Threshold (A/s) (?) 10s peak slew: —
A/s

Tier 2 — Consecutive Samples (?) time to act: —
samples
G5 Tier 3 — Three-Consecutive Threshold (A/s) (?) 10s peak slew: —
A/s

Tier 3 — Consecutive Samples (?) ℹ️At the shipped thresholds tier 3 shares tier 2's threshold while requiring more samples, so tier 2 always fires first and tier 3 is a spare. It becomes meaningful when its threshold is set lower than tier 2's — a slower but larger cumulative event. time to act: —
samples
Response

The field drive FET is switched off and the field collapses through the coil's natural time constant. The only knob is the trip debounce above; none of the integrator-bleed actions used by the other protections apply here.

KHard — Response Slope sets how aggressively the current cap is trimmed per volt of overshoot — recomputed from the live overshoot every tick. Shared with Measured OV. AW Bleed Rate continuously drains the voltage integrator while any of the other protections is clamping.

Same KHard — Response Slope cap-trim mechanism as Predictive OV (shared parameter). AW Bleed Rate continuously drains the voltage integrator while the clamp is active.

Trims the current cap by the measured amount of excess each tick — the same cap-trim action the OV groups apply, but driven by alternator-current overshoot rather than voltage. K_bleed — Integrator Bleed Mode additionally drains the voltage integrator when the event fires — 0 means snap to zero (maximum response); > 0 takes a single bite proportional to the amount of excess. AW Bleed Rate also drains continuously while active.

Battery Charge Current Limit has no trip response — it is a ceiling the command simply never exceeds.

Load Dump snaps the voltage integrator to 0 instantly on the rising edge of the trip — hardcoded, no adjustable parameter for the snap itself. AW Bleed Rate drains the integrator continuously while it is active.

G1G2 KHard — Response Slope (A/V) (?)
A/V
G3 K_bleed — Integrator Bleed Mode (?) ℹ️How the voltage loop integrator is driven down when an iExcess event (Group 3) fires, on top of the AW Bleed:

• 0 = snap it to zero (maximum response).
• > 0 = take a single bite proportional to how far the current is over the limit — gentler, lowers undershoot risk after the event clears.

Try 2–5 if the snap-to-zero causes an unacceptable voltage dip below target. Recovery is always handled by the Shared Recovery block regardless of mode.
A
G1G2G3G5 AW Bleed Rate (×Table/s) (?) ℹ️Rate at which the voltage loop integrator is bled toward zero while any protection group is active, expressed as a fraction of the Alternator Current Limit per second. The s-badge shows the resulting amps-per-second live.
×Table/s
Recovery

After the trip, the regulator enters a ramp-and-lockout — the field stays at 0 until the over-current condition has cleared. The recovery path used by the other protections (Recovery Seed Fraction, Seed Protect Window) is not used here.

When all protections have released, the controller's stored current memory (the voltage-loop integrator) is restored to pre-event value × Recovery Seed Fraction. Seed Protect Window protects the fresh seed from being immediately drained by a brief subsequent event. Fast Setpoint Rise Rate then accelerates the slewed current setpoint back up while battery voltage is comfortably below target, so the alternator crosses its deadband and starts producing current again quickly. Two independent helpers speed the rest of the return — Recovery Refill rebuilds the stored current memory faster in proportion to what is missing, while Recovery Boost is an instant proportional bridge (P-boost) that scales up the loop's immediate corrective push while the bus is below target. Both pace themselves off live voltage error and taper away as the battery reaches target (Load Dump excepted; it re-asserts on its own). Smart Reseed corrects the restored current when the event was caused by a load switching off, and Load Pickup Boost applies the refill's fast rebuild to ordinary load steps outside protection events — both use the battery shunt's measurement.

G1G2G3 Recovery Refill — rebuild the stored current memory (?) ℹ️After a protection event ends, the controller's stored current memory (the voltage-loop integrator) restarts at the Reseed fraction of its pre-event value. On: the memory rebuilds faster in proportion to what is missing, pacing itself by live voltage error — it never pushes when the battery says full, and it pauses while the derivative brake is acting. Off: the plain voltage loop walks itself back, so recovery pace scales with how far the voltage fell. Trip points themselves are not affected. Load Dump is excluded — it manages its own re-assertion.
Off On
G1G2G3 Max Refill Speed (×) (?) ℹ️How fast the stored current memory rebuilds right after a protection event ends, when Recovery Refill is On: a multiplier on the integrator's normal rebuild rate at the moment of release, tapering back to normal as the memory refills. Higher = charging current is restored sooner after an event; lower = a gentler, more conservative return.
×
G1G2G3 Load Pickup Boost — serve new loads at the refill rate (?) ℹ️When a load switches on while holding a voltage target, the voltage barely moves on a stiff battery, so the controller normally raises alternator current slowly and the battery carries the load for many seconds. On: while the battery shunt shows the battery discharging, the controller rebuilds current at the Max Refill Speed toward the measured load, easing off as the alternator takes it over — it cannot push the voltage past the target, because the boost stops the moment the battery stops discharging or the target is reached. Off: load pickup pace scales with voltage error only. Requires a battery shunt; does nothing without one.
Off On
G1G2G3G5 Recovery Seed Fraction (?) ℹ️After a protection trip clears, charging current restarts at this fraction of what was flowing before the trip. Used when a battery shunt is present: the Smart Reseed load measurement has already corrected the restart point, so most of the current can return at once. Without a shunt the No-Shunt fraction below is used instead.
×
G1G2G3G5 Recovery Seed Fraction, No Shunt (?) ℹ️Restart fraction used when no battery shunt is fitted. Without a shunt the controller cannot measure how much load left the bus when a trip was caused by a load switching off, so it restarts deliberately low and climbs back at the Recovery Climb Rate while watching the bus voltage — the climb stops itself where the bus reaches the target, which rediscovers the true demand. A low value costs a few seconds of climbing; a high value risks a repeat trip after a load dump.
×
G1G2G3G5 Recovery Climb Rate (?) ℹ️How fast charging current climbs back after a protection trip, as a fraction of the alternator's maximum per second — 0.20 on a 100 A alternator is 20 A per second. The climb watches the measured bus voltage and pauses whenever the bus is about to arrive at the target, so a fast rate does not overshoot; it only shortens the time spent below target after a trip. Applies to every recovery, with or without a shunt.
×max/s
G1G2G3G5 Smart Reseed — subtract loads that switched off (?) ℹ️A protection event caused by a big load switching OFF leaves the stored current memory holding current the boat no longer wants — restoring almost all of it pushes the voltage right back over the trip line, and the event repeats in a rapid cycle. On: at the moment of the trip the controller measures how much load left the bus (battery shunt) and subtracts it from the restored current; a repeat trip within a couple of seconds restarts 30% below the previous restart — cutting from a value already proven too high — until the cycle breaks. Off: every release restores the plain seed fraction of the pre-event current. The load measurement needs a battery shunt; the repeat-trip cut works without one.
Off On
G1G2G3 Recovery Boost — faster climb out of the hole (?) ℹ️Whenever battery voltage sits below the charge target during voltage control — most visibly after a protection cut has knocked it well below — the regulator normally walks charging current back up only as fast as its stored memory can rebuild, so the return crawls even while the battery sits far below target. On: while the voltage is below target the loop's immediate corrective push (its proportional term) is scaled up (see the two settings below) so the alternator drives extra current and lifts the voltage faster, then eases back to normal as it nears target so it cannot overshoot into a second over-voltage trip. Off: the plain loop paces the return. Trip points themselves are not affected. This is an instant proportional bridge (P-boost), independent of the Recovery Refill memory rebuild above — both can be on.
Off On
G1G2G3 Recovery Boost — Max Strength (×) (?) ℹ️How hard the recovery boost pushes when the bus is deep below target. The loop's corrective push (its proportional term) is multiplied by up to this factor at the shortfall set below, tapering back to 1× (no boost) as the voltage reaches target — the slow integrator part is left alone, so the extra current is strongest right after a deep dip and fades on its own. Higher gives a faster climb out of a deep dip; too high can drive the voltage up fast enough to re-trigger over-voltage on the way back. 1× disables the boost. Lower it if recovery ever re-trips protection.
×
G1G2G3 Recovery Boost — Full-Strength Shortfall (V) (?) ℹ️How far below target the voltage must be for the recovery boost to reach its full strength. The boost ramps from none at target up to full strength (the multiplier above) at this shortfall, so shallow dips get a gentle nudge and deep dips get the full push. Entered per 12 V; scales automatically on 24 V, 36 V, and 48 V systems. Lower for a more aggressive boost that reaches full strength sooner.
V
G1G2G3 Recovery Boost — Dead Area Below Target (V) (?) ℹ️A no-boost zone just below target. While the voltage shortfall is inside this zone the boost stays fully off (1×), so ordinary ripple and small wobbles never see boosted gain — at low engine speed that extra gain can otherwise sustain a slow see-saw wander around the target. Past the zone the boost ramps up smoothly from nothing, reaching full strength at the shortfall set above. Entered per 12 V; scales automatically on 24 V, 36 V, and 48 V systems. Larger keeps the boost out of more of the normal regulation band, but shallow dips inside the zone recover at normal, unboosted speed; 0 boosts from the first hint of shortfall.
V
G1G2G3G5 Deep Recovery Band (V) (?) ℹ️How far below target the voltage must sit for a post-trip recovery to count as deep. Near target, recovery is deliberately cautious — the current climb crawls and pauses at any sign of the bus rising, because close to target a repeat trip is one overshoot away. Deeper than this band that caution is pure delay: nothing but missing current can hold the bus that far down, so the climb speeds up (by the multiplier below), stops pausing for slow creep, and the recovery boost stays available during the quiet window after a trip instead of switching off. Entered per 12 V; scales automatically on 24 V, 36 V, and 48 V systems. Smaller brings the fast behavior closer to target, which shortens deep recoveries but risks a repeat trip on the approach; very large means no recovery ever counts as deep and everything runs at the cautious near-target pace.
V
G1G2G3G5 Deep Recovery — Climb Speed Multiplier (×) (?) ℹ️How much faster the post-trip current climb runs when the voltage is deep below target (past the Deep Recovery Band). The speed-up ramps in smoothly — none at the band edge, full multiplier at twice the band — and unwinds itself as the voltage closes in, so arrival at target always happens at the normal cautious pace. Higher shortens the time spent far below target after a repeat trip; too high can overshoot the true demand while the bus is still answering slowly, banking surplus current that has to be shed on arrival. 1 disables the speed-up entirely.
×
G1G2G3G5 Recovery Arrival Flare — Band (V) (?) ℹ️The final approach zone of a post-trip recovery. A recovery climbs back toward the current that held the bus before the trip — but right after a trip the battery is often surface-charged and briefly needs less, so arriving at target still carrying the full pre-trip current can push the voltage over the trip line again. Within this many volts of target the restored-current ceiling tapers down (to the floor set below), like flaring a landing, so the bus arrives with roughly zero surplus and the normal loop re-adds the last few amps only if the load really wants them. Entered per 12 V; scales automatically on 24 V, 36 V, and 48 V systems. Wider starts the easing earlier, gentler but slower on the last stretch; 0 disables the flare and recovery arrives at full restored current.
V
G1G2G3G5 Recovery Arrival Flare — Floor (×) (?) ℹ️How much of the restored current is still allowed at the moment the voltage reaches target, as a fraction of the recovery goal. The ceiling tapers from the full goal at the edge of the flare band down to this floor at target; the held-back remainder is not lost — the loop rebuilds it within a few seconds if the load genuinely draws it. Lower lands softer (more protection against a repeat trip on arrival) but leaves more current to rebuild afterward, so the voltage can dip briefly if a large load is still on; 1 disables the flare.
×
G1G2G3G5 Seed Protect Window (ms) (?) ℹ️Milliseconds after either of these two events during which the AW Bleed Rate is suppressed:

• A CV-entry bumpless seed fires (when CV mode first activates),
• A protection-release reseed fires (when every protection clears).

Prevents the just-seeded integrator from being immediately bled back to zero if a brief new protection event fires right after the seed. 0 = disabled.
ms
G1G2G3G5 Fast Setpoint Rise Rate (×) (?) ℹ️Multiplier on the normal Setpoint Rise Rate during the recovery window after any protection releases, while battery voltage is still comfortably under the active charge target. Lets the slewed current setpoint cross the alternator's deadband and start producing current again quickly. Window length and the headroom gate are the two knobs below.
×
G1G2G3G5 Fast Rise Window (ms) (?) ℹ️Hard upper bound on how long the fast-rise window stays open after any protection releases. The window normally closes earlier — as soon as battery voltage climbs into the headroom band below target — but this cap stops fast-rise from running indefinitely if the battery never catches up (very heavy load). Range 500–30000.
ms
G1G2G3G5 Fast Rise Headroom (V) (?) ℹ️Volts below the active charge target at which fast-rise is allowed to fire. The fast-rise gate stays open while battV < target − Headroom; the moment battV climbs back into the target band, the gate closes and the slew falls back to the normal Setpoint Rise Rate. Keep it inside the iExcess Strict Over-Current Band so the iExcess detectors (Group 3) can still arm during fast-rise. Range 0.05–2.0 V.
V
G1G2 Field Drain Time (ms) (?) ℹ️How long the alternator field coil takes to drain once the field is cut, measured from the moment the field is commanded off until output falls to 10% of its pre-cut level, in milliseconds. The drain time depends on engine speed, so the Keep-Alive Floor & Field Decay commissioning step measures it at three held speeds and stores a speed line the over-voltage response reads at your live RPM; the number here is the worst-case (longest) end of that line, used when engine speed is unknown. The over-voltage response holds a field cut at least the looked-up time before treating the coil as drained. Editing this value overrides the whole line with one flat number at every speed.
ms

Test Parameters

Test Type (?): ℹ️ Sine Sweep (recommended) drives a swept sine on the field with the control loop off (PID off) and measures the plant's gain and phase lag at each frequency — an open-loop Bode plot. It characterizes the plant across the whole frequency range, so you can see how much of the plant delay is true dead-time versus field L/R lag, and where the plant rolls off. Step (legacy) is the original rise/fall delay test: with the PID off, duty steps up and down and you read the response time at a single step. Kept for reference — prefer Sine Sweep, which gives the full frequency picture instead of one point.
⚠️ Protections: ℹ️Toggle right = Enabled (default). The regulator runs Group 1 (predictive OV), Group 2 (measured OV), the Group 3 iExcess over-current detectors (near-target + bulk), and the Alternator Hard Shutdown Voltage normally.

Toggle left = Disabled. Those layers are bypassed so a step-test can characterise the plant without them fighting the test input. Load Dump (the Group 5 battery rate-of-change tiers), the INA228 hardware ALERT pin, and the hardware overcurrent trip (Alternator Current Limit + 10 A) stay active regardless — though Load Dump and the overcurrent trip still obey their own Group Enable toggles on the Protections tab.

Does not auto-revert — re-enable before normal use. A red banner at the top of every page is shown whenever protections are disabled. Resets to Enabled on every reboot.
Disabled Enabled
Wave Floor (A) (?): ℹ️ Alternator output the test stabilizes to before the sweep, and the trough the sine sits on (the sine swings upward from here). Raise it if the bottom of the current wave clips toward zero at low RPM; keep it well within what the alternator can produce at your test RPM.
Wave Amplitude (% duty) (?): ℹ️ Duty cycle step size used during the plant delay measurement test. Larger steps produce a cleaner current signal above noise but disturb the system more. Must be large enough that the current response is clearly visible above the baseline noise floor.


Test Results

Rise/fall delays from the most recent Step run. Sine Sweep (Bode) results appear in the test window while that test runs.

Rise Delays (ms)

Rise 1 ℹ️Time from first UP duty step to first confirmed current rise above threshold. ? ms
Rise 2 ? ms
Rise 3 ? ms
Rise Average ? ms

Fall Delays (ms)

Fall 1 ℹ️Time from first DOWN duty step to first confirmed current drop below threshold. ? ms
Fall 2 ? ms
Fall 3 ? ms
Fall Average ? ms

Step History
# Rise Avg (ms) Fall Avg (ms) Rise Trials (ms) Fall Trials (ms) Step Amp (A) Quiet PP (A) Setup (%) RPM Alt Temp (°F) Bus V Stage Abort Date/Time
No records — open section to load.

Sorted by Rise Average (lower = faster plant = better). Aborted runs sink to end and are dimmed. Abort column shows Rreason/Pphase — reason 254 = stabilize-phase timeout; others map to the firmware's FieldEventReason enum.


Sweep History
# Roll-off (Hz) ↑ DC gain (A/%) Worst lag (°) Wave Amp (%) Wave Floor (A) Sweep (Hz) RPM Alt Temp (°F) Bus V Stage Date/Time
No records — open section to load.

Open-loop plant frequency response, one row per completed Sine Sweep. Sorted by −3 dB roll-off (higher = faster plant = better). Click a row to show that run's full gain/phase curve.


Apply Results

The test measures the field coil's electrical lag (plant delay). The "Set All Filters" button inside the modal writes plant/3 to the alternator-current PID feedback filter and the full plant delay to the voltage filter — see each tooltip below for the reasoning. You can also override any value individually.

Output current PID feedback filter (ms) (?): ℹ️ EMA time constant for the alternator current signal fed back into the output current PID. Set All Filters writes plant/3 here. The plant (field coil L/R) is already a first-order low-pass inside the loop; setting the sensor filter equal to it stacks two equal lags in series, which costs ~45° of phase margin at crossover and forces lower Kp than you'd otherwise get away with. A filter at roughly plant/3 lets the controller see current dynamics in close to real time without feeding raw sensor noise into Kp/Kd. Separate from the alternator current display filter and from the iExcess detector's own averaging (Group 3). Mostly inert when the Output PID signal source is MA(N) or Raw, but the same EMA is also used unconditionally to seed the CV integrator on the AUTO→CV handoff. Echoed read-only in Current tab → Output Current Controller.

Voltage sensor smoothing filter (ms) (?): ℹ️ EMA time constant applied to the measured battery voltage. Set All Filters writes the full plant delay here (not plant/3). Its main consumer is the slope-bleed dV/dt — the voltage rise rate, computed as a backward difference of the filtered voltage over the voltage-loop tick — so filtering at roughly half that differencing interval is the standard balance: slower and the slope reacts too late, faster and the slope gets noisy. The slope bleed does feed back into the voltage loop's integrator, but not as a tight loop where extra lag would erode phase margin the way the output-current PID filter does, so it tolerates the heavier smoothing. Also used by the charging stage machine (Bulk → Absorption hold timer), where the timescale is seconds and the filter TC barely matters. Voltage Loop Kp/Ki and the Group 1/2 voltage comparisons all use raw battery voltage instead — this setting doesn't affect them. Group 1's voltage rate-of-change uses its own separate EMA (dvdt EMA TC).

Plant Delay — the measured electrical lag between a field duty command and the resulting current response. Run the test at a steady speed within your normal operating range. Both alternator-current filters take roughly 1/3 of the plant delay: the PID feedback filter needs that to stay inside its control loop without stacking two equal lags and eroding phase margin, and the on-screen current display gets the same value to stay responsive. The voltage filter isn't in a tight control loop, so it takes the full plant delay. See each filter's tooltip above for the full reasoning.
Telemetry

Control Loop

PID Input ℹ️ Measured alternator current (A) from the selected amp source. This is the process variable fed to the output current PID on every fresh current sample (~200 Hz, ~5 ms). ? A
PID Setpoint ℹ️ The slew-limited current target (A) the output current PID is chasing. ? A
PID Output ℹ️ Raw duty cycle (%) computed by the output current PID before clamping. ? %
PID Error ℹ️ Difference between setpoint and input. ? A

Term Contributions

Current P Term ℹ️ Proportional contribution. ? %
Current I Term ℹ️ Integral contribution. ? %
Current D Term ℹ️ Derivative contribution. ? %

Field Output

Field Voltage ℹ️ Estimated, not measured — commanded duty cycle × battery voltage. It tracks the command, so it will not show a fault in the field wiring or the drive stage. ? V
Field Curr ℹ️ Estimated, not measured — field voltage divided by the entered field resistance of ? Ω, adjustable in Settings → Alternator → Basic → Output Control → Field Resistance. Real field resistance drifts 10–20% with rotor temperature, so treat this as an estimate. ? A
Duty ℹ️ Actual PWM duty cycle. ? %
Live Plot View
Plot axes: X (s):
Current Target Generator
Waveform Type (?): ℹ️Square = the classic toggle test with the ISE tuning score below. Sine (manual) = drive one sine frequency you set and watch how well the current PID tracks it on the plot. Sine (auto-sweep) = step through a frequency range and measure closed-loop gain & phase at each — a Bode plot of how fast your tuned loop can follow a moving setpoint. Tune with Square first, then sweep to see your tracking bandwidth.
⚠️ Protections: ℹ️Toggle right = Enabled (default). The regulator runs Group 1 (predictive OV), Group 2 (measured OV), the Group 3 iExcess over-current detectors (near-target + bulk), and the Alternator Hard Shutdown Voltage normally.

Toggle left = Disabled. Those layers are bypassed so a step-test can characterise the plant without them fighting the test input. Load Dump (the Group 5 battery rate-of-change tiers), the INA228 hardware ALERT pin, and the hardware overcurrent trip (Alternator Current Limit + 10 A) stay active regardless — though Load Dump and the overcurrent trip still obey their own Group Enable toggles on the Protections tab.

Does not auto-revert — re-enable before normal use. A red banner at the top of every page is shown whenever protections are disabled. Resets to Enabled on every reboot.
Disabled Enabled

Wave Floor (A) (?): ℹ️The bottom of the wave — both waveforms sit on this floor and swing upward from it. Square toggles between the floor and (floor + amplitude); sine is centered on (floor + amplitude/2) and never dips below the floor. Raise it to keep the trough clear of zero at low RPM. Separate from the Plant Delay tab's Wave Floor.

Wave Amplitude (A) (?): ℹ️Size of the wave above the Wave Floor. Square toggles between the floor (low) and (floor + amplitude) (high); sine swings the same amplitude, centered on (floor + amplitude/2). E.g. floor 5A + amplitude 20A → square cycles 5A↔25A, sine centers on 15A.

Wave Period (s) (?): ℹ️Duration (s) of one complete test square wave cycle. The wave spends half the period at the low setpoint and half at the high setpoint.

Test Note (max 50 chars): ℹ️Free-text label saved with the next committed record in the Square Wave Score Log. Set it before running the test; it is captured when the record commits.

Test (?): ℹ️Begins the waveform selected in Waveform Type. Square and Sine manual run continuously for live PID tuning on the plot — press Stop Test to end. Sine sweep runs ~30–60 s then stops itself (keep engine RPM steady); its gain & phase results appear above.

Slew during this test (?): ℹ️ Off: setpoint and field step instantly — the sharpest edges for A/B study; over-voltage protections stay live. Default: factory-safe setpoint slew (30 A/s rise / 50 A/s fall), field left at its normal duty-ramp coupling-cap protection — a clean, repeatable test without touching your saved rates. Custom: your saved Setpoint Rise / Fall rates (Controller Parameters). Only the manual square test honors this; sine runs and commissioning / automated tests are unaffected.
Setpoint and field step instantly — sharpest edges. Over-voltage protections stay live. Factory-safe 30 A/s setpoint slew; field keeps its normal ramp protection. Saved rates untouched. Your saved Setpoint Rise / Fall rates. Field keeps its normal ramp protection.
Square Wave Score Log
Live accuracy — RMS error / worst overshoot (A, since reset): — —
# Score ↑ Kp Ki Kd SDiv Track DRamp Amp Per Floor RPM Temp°F Worst t(s) BusV Stage Date/Time Notes

Score = ISE/s (lower is better). Scored within 5s of each setpoint step, after 2 ring-in cycles. ■ <5   ■ <10   ■ ≥10. Highlighted rows match current PID + wave settings.

Sine Sweep Score Log
# Bandwidth (Hz) ↑ Peak gain Worst lag (°) Kp Ki Kd Sweep (Hz) Amp (A) Base (A) Bus V RPM RPM min–max Temp°F Coh Clip Stage Date/Time
No records — open section to load.

Sorted by −3 dB closed-loop bandwidth (higher = the loop follows faster setpoint motion = better). Click a row to show that run's full gain/phase curve. Highlighted row matches current Kp/Ki/Kd.

Controller Parameters
ℹ️Zeros the output current PID integrator. Duty will ramp back up from 0 via the slew limiter. Use if the integrator has accumulated badly during manual tuning.

PID Kp (Proportional) (?): ℹ️Immediate response to current error. Higher = faster correction but more overshoot. Start with 0.3, increase if too slow, decrease if oscillating. Voltage-normalized: the value you enter produces the same field-current response on a 12, 24, 36, or 48 V system, so you never re-tune it when you change system voltage (it is scaled to the bus behind the scenes).

PID Ki (Integral) (?): ℹ️Eliminates steady-state error over time. Higher = faster elimination of offset but may cause instability. Start with 0.5, increase slowly if needed. Voltage-normalized: the value you enter produces the same field-current response on a 12, 24, 36, or 48 V system, so you never re-tune it when you change system voltage (it is scaled to the bus behind the scenes).

PID Kd (Derivative) (?): ℹ️Dampens rapid changes to reduce overshoot. Usually kept at or near zero (default 0.01). Voltage-normalized: the value you enter produces the same field-current response on a 12, 24, 36, or 48 V system, so you never re-tune it when you change system voltage (it is scaled to the bus behind the scenes).

Oscillation Damper (?): ℹ️Watches field drive for a slow wobble — 0.3 to 2 Hz — while engine speed is steady, then tests one lever at a time: a single cut in the current loop's integral gain, or pausing the voltage damper (D-term). A change that measurably shrinks the wobble is kept and mapped to that engine speed. Off: full strength always; the learned map is kept but not applied.
Off On

Shortcut to the damper's status, speed map and episode record →


Damped Gain (% of PID Ki) (?): ℹ️The strength the damper cuts to during a test, and holds across a mapped trouble spot, as a percentage of the PID Ki you set. Lower holds the response softer inside trouble spots; higher gives up less response but makes a real improvement harder to tell from luck. Repeat episodes widen a trouble spot across speed; they never cut deeper than this.

Required Improvement (%) (?): ℹ️How much the wobble must shrink, before versus after the test cut, for the cut to be kept and mapped. Higher demands stronger proof — fewer false trouble spots, but a real one may take more episodes to confirm.

Pocket Edge Taper (% of speed) (?): ℹ️How far beyond each end of a mapped trouble spot the reduced strength tapers back to full, as a percentage of engine speed. Wider covers more of the neighborhood either side of proven wobble speeds; narrower confines it to where wobbles were verified.

Retest Cooldown (min) (?): ℹ️How long the damper waits after a failed test before testing again. A wobble that did not respond to the gain cut is probably external, so retesting immediately would only repeat the disturbance.

Speed Steadiness (%) (?): ℹ️How steady engine speed must hold, as a percentage of the speed where the wobble was first seen, through detection and the whole test. Drift beyond this abandons the test with nothing kept — a moving throttle is not hunting. The wobble's own speed ripple rides on a steady average and does not count against it.

Detection Confirm Scans (?): ℹ️How many consecutive detector scans — one every 1.6 seconds — must agree a wobble is present, at steady engine speed, before a test opens. Their average becomes the before-measurement the verdict is judged against. More scans is slower but surer; fewer risks testing a passing disturbance.

Detection Amplitude (?%): ℹ️How big the rhythmic swing in field drive must be before a scan counts it as a wobble, as the percent of field duty moving at the wobble's own frequency. Lower it if the regulator is visibly surging but the damper never reacts; raise it if tests keep opening on disturbances that are not hunting. The same physical wobble moves roughly a quarter as much duty on a 48 V bank as on a 12 V one, so the useful value belongs to the installation.

PID Sample Divisor (?): ℹ️The output current PID normally updates on every fresh current sample (~200 Hz). A 2 makes it update every other sample (~100 Hz), etc. Don't adjust.

PID Tracking Gain (1/s) (?): ℹ️Anti-windup tracking gain for PID. Keeps the integrator aligned with actual duty when governor limits output. Higher = faster correction. Typical: 2.0. Set to 0 to disable. Only active when Ki > 0.

Signal Source (?) — alternator current (ADS1115): ℹ️Selects how the alternator output current is filtered before entering the PID as its process variable. EMA(TC): exponential moving average — default, smooth. The EMA's time constant is adjusted on the Plant Delay sub-tab ("Output current PID feedback filter") — commissioning's Set All Filters writes plant/3 there — and is echoed read-only below when EMA is selected. MA(N): moving average of N samples. Raw: instantaneous ADC reading, no filtering. N and TC here apply only to this PID; the iExcess over-current detector (Group 3) averages the current on its own (its Averaging Time Constant), unaffected by this choice.
Telemetry

Voltage Control Loop

Voltage Target ℹ️ The voltage the CV loop is holding the battery to right now. Bulk voltage in bulk, absorption voltage in absorption, float voltage in float, or the Target Voltage Setpoint when Target Voltage mode is active. ? V
Voltage Error ℹ️ Active charging target minus measured battery voltage. Positive = battery below target (loop allows more current). Negative = battery above target (loop reduces current cap). ? V
Icv ℹ️ CV voltage loop output (Icv) — the current setpoint the voltage loop wants to deliver. Used as the actual setpoint whenever voltage control is active: bulk, absorption, float, Target Voltage mode, and Maintain Mode. Seeded on CV entry for bumpless transfer; clamped to [0, current ceiling]. Pulled down by Groups 1/2 when measured battery voltage is approaching or above target. In bulk the voltage error is large, so this value simply sits at the current ceiling — the loop behaves current-limited until voltage approaches target. ? A
CV Integrator ℹ️ Voltage loop integrator (cv_I). Units are amps. Seeded on CV entry so the CV loop output starts at the live current setpoint with no step. Above target it unwinds 7× faster than it builds (hard-coded asymmetry on Voltage Loop Ki). During a protection event it is actively drained (anti-windup bleed) and blocked from building back up while the protection is capping current; on release it restarts at a fraction of its pre-event value (Recovery Seed Fraction). Should drift slowly toward the value that holds voltage at target. Large sustained values mean Voltage Loop Kp alone cannot reach target — Voltage Loop Ki is carrying the load. ? A
Voltage Ctrl Active ℹ️ Whether the CV loop is running this tick. True in bulk, absorption, float, Target Voltage mode, and Maintain Mode. False in idle (UseFloat=0 post-absorption rest) and in Manual field mode. ?
Live Plot View
Plot axes: X (s):
Current setpoint (Icv) — P / I / D contributions
Shares the time window above. D removes current on a fast rise and (two-sided) adds it on a fast fall below target, so P + I − D clamps to [0, ceiling] — the three need not sum exactly to Icv.
Voltage Step Generator
⚠️ Protections: ℹ️Toggle right = Enabled (default). The regulator runs Group 1 (predictive OV), Group 2 (measured OV), the Group 3 iExcess over-current detectors (near-target + bulk), and the Alternator Hard Shutdown Voltage normally.

Toggle left = Disabled. Those layers are bypassed so a step-test can characterise the plant without them fighting the test input. Load Dump (the Group 5 battery rate-of-change tiers), the INA228 hardware ALERT pin, and the hardware overcurrent trip (Alternator Current Limit + 10 A) stay active regardless — though Load Dump and the overcurrent trip still obey their own Group Enable toggles on the Protections tab.

Does not auto-revert — re-enable before normal use. A red banner at the top of every page is shown whenever protections are disabled. Resets to Enabled on every reboot.
Disabled Enabled
Waveform Generator (?): ℹ️ Enables the square-wave voltage dithering test. The regulator briefly raises the target by the wave amplitude for half a period (HIGH phase), then drops back to the real target (LOW phase), repeating to score step-up settling time and overshoot. At least 1 scored HIGH-phase cycle is required before a log entry can be committed. Disable to commit the current run.
Off On

Wave Amplitude (V) (?): ℹ️ How far above the real charging target the high phase steps. Larger = bigger step disturbance = more aggressive test. Recommend 0.20–0.50V. The low phase always rests at the real charging target.

Wave Period (sec) (?): ℹ️ Total period of one low+high cycle in seconds. Each half-period is this value ÷ 2. Use longer periods (60–120s) at higher time constants; shorter (30–45s) for faster loops. Minimum is 8s. Must be long enough for the voltage to fully settle in the high phase; below about 14s the steady-state peak-to-peak reading may show n/a because the high phase can't fit settling plus the 4s measurement window.

Test Note (max 50 chars): ℹ️ Free-text label saved with the next committed record in the CV Tuning Score Log. Set it before running the test; it is captured when the record commits.

Overshoot Penalty (K) (?): ℹ️ Multiplier applied to overshoot (battery voltage above target) in the HIGH-phase ISE scoring formula used by both the live spans at the top of the CV Tuning Score Log and each committed log entry. Approach below target is weighted ×1. Higher values penalize overshoot more harshly relative to undershoot — useful for batteries that are very sensitive to overvoltage. Each committed record stores the K it was scored with, so comparing entries across different K values requires reading that column.

Settling Consecutive Reads (?): ℹ️ How many readings in a row the battery voltage must stay within ±0.10V of the test target before the system calls it "settled" and stops the settling-time timer. Each reading happens about every 100ms (the voltage loop rate), so 10 readings ≈ 1 second of being on-target. Higher = stricter, more honest settling-time numbers, but tests take longer. Lower = looser, could be fooled by a brief lucky moment. 8–12 is a reasonable starting range.

Target-voltage slew during this test (?): ℹ️ Off: the charge target steps instantly — the sharpest voltage step to study the CV loop. Over-voltage protections stay live, and the field duty keeps its normal ramp (unlike the CC test, this does not strip the field-duty slew). Default: factory-safe target ramp (0.05 V/s, class-scaled) — a clean, repeatable test without touching your saved rates. Custom: your saved Target-voltage ramp up / down rates (Controller Parameters). Only the manual CV square test honors this; commissioning / automated tests are unaffected.
Charge target steps instantly — sharpest voltage step. Over-voltage protections stay live; field keeps its duty ramp. Factory-safe 0.05 V/s target ramp (class-scaled). Saved rates untouched. Your saved Target-voltage ramp up / down rates. Field keeps its normal duty ramp.
CV Tuning Score Log
Live accuracy — RMS error / worst overshoot (mV, since reset): — —
# Score ↑Settle ↑OvV ↑ISE ↓Score ↓Settle ↓OvV ↓ISE ↓US VKp VKi SRR SFR AwBl AwRec AwSP RsF KD KH IEx% IEτ IKB LDT2 LDT1 LDT3 WA WP KO CR OVf IEf LDf HOCf RPM Temp BattV SOC% CVT Stage Date/Time P2P (V) Notes
No records yet — open section to fetch.

Score = (HIGH ISE + LOW re-overshoot ISE + LOW undershoot ISE) ÷ total active time, ×1000. HIGH phase: squared error; overshoot above 25mV dead-band weighted by Overshoot Penalty (K), approach weighted ×1. LOW phase overshoot: squared ISE, only after voltage crosses below target (no descent-from-HIGH penalty). LOW phase undershoot (↓US): squared ISE ×0.15, 1s grace from phase start then ramps to full weight over 10s. Both lower is better. ■ <10   ■ <20   ■ ≥20. Highlighted rows match current VKp/VKi + wave settings. OVf/IEf/LDf/HOCf = protection fire counts during scored phases.

Controller Parameters
Gain selection

CV Gain Source (?): ℹ️How Voltage Loop Kp/Ki are set. Auto computes them from the battery stiffness measured by the Voltage Control Autotuning step — the ~0.6 s voltage-per-amp response, measured at the timescale the voltage loop actually reacts on — via Kp = α ÷ stiffness, Ki = ρ × Kp, where α (Aggressiveness) and ρ (Ki/Kp ratio) are the two knobs below. Manual uses the Kp/Ki you type below. The two paths are independent: switching does not change the other's stored values. Both are normalized to 12V-equivalent, so the same numbers work on 12 / 24 / 36 / 48 V systems.
Manual Auto
Active gains: — ℹ️The Kp/Ki the voltage loop is running right now, in 12V-equivalent units. It is the commissioning gain after the battery-temperature correction (Temperature compensation, below), so it drifts with battery temperature even though you never re-tune. In Auto the base comes from Voltage Control Autotuning; in Manual it is your typed Kp/Ki — either way, temperature-corrected. This is the number that actually shapes the response.

No fit yet — run the Voltage Control Autotuning step in commissioning. Auto uses safe defaults until then. ℹ️What the Voltage Control Autotuning step measured at commissioning: the battery's ~0.6 s voltage-per-amp stiffness, from which Auto derives Kp = α ÷ stiffness, Ki = ρ × Kp. These are the base design gains at the commissioning temperature — before any temperature correction. Auto runs these (temperature-corrected) as the Active gains above. Re-run the Voltage Control Autotuning step to update the stiffness.

CV Aggressiveness (α) (?):  ℹ️With CV Gain Source = Auto, how strongly the voltage loop corrects, as a fraction of the theoretical one-shot ("deadbeat") correction: Kp = α ÷ measured battery stiffness, with the stiffness measured at the loop's own (~0.6 s) reaction timescale by Voltage Control Autotuning. Measuring at that timescale keeps the loop's stability margin battery-independent, so the same α gives every bank the same character — lower is gentler and more damped, higher corrects harder at the cost of overshoot risk. Response time is an outcome of this setting (typically a few seconds), not a separate input. Calculated from the stored measurement, so no re-commission is needed after adjustment.

CV auto-tune Ki/Kp ratio ρ (?): ℹ️With CV Gain Source = Auto, the integral gain is tied to the proportional gain by this ratio: Ki = ρ × Kp. Sets where the integrator's corner sits — the point at which it takes over from proportional action to pull out steady-state error — relative to the proportional strength, which the Aggressiveness (α) knob above sets separately. Lower ρ = lazier integral: gentler and more damped. Higher ρ = more aggressive integral, at the cost of more overshoot. Calculated from the stored measurement, so no re-commission is needed after adjustment.

Voltage Loop Kp (A/V) (?): ℹ️Voltage loop proportional gain. Active in bulk, absorption, float, Target Voltage mode, and Maintain Mode. Sets the fast-response term of the CV PI: CV loop output = Voltage Loop Kp × voltage error + voltage loop integrator. That output becomes the current setpoint sent to the output current loop, then clamped to the RPM/thermal current ceiling. Voltage-normalized: the value you enter behaves the same on a 12, 24, 36, or 48 V bank, so you never re-tune it when you change system voltage (it is scaled to the bus behind the scenes).

Voltage Loop Ki (?): ℹ️Integral gain for the voltage loop — the slow-correction term that pulls battery voltage exactly to target over time. Active in bulk, absorption, float, Target Voltage mode, and Maintain Mode. Asymmetric: when battery voltage is below target the integrator builds up at this rate (gentle, patient approach), but when it goes above target the integrator unwinds 7× faster (aggressive recovery from overshoot). The 7× faster unwind is gated by the CV Tuning Helpers toggle below — turn that OFF and the loop becomes a symmetric PI (unwinds at this same rate). The 7× multiplier itself is hard-coded; only the build-up rate (this setting) is user-tunable. On CV entry the integrator is seeded so the current setpoint matches the output PID's current value — no step in setpoint. Set to 0 to disable integral action. Higher values reach target faster after a target change or disturbance; too high causes overshoot at the target crossing. The default suits a typical AGM bank — large lithium banks (stiffer voltage) may need more. Voltage-normalized: the value you enter behaves the same on a 12, 24, 36, or 48 V bank, so you never re-tune it when you change system voltage (it is scaled to the bus behind the scenes).

Voltage D term (rate-of-rise damping)
Voltage Loop Kd (?) ℹ️Derivative gain for the voltage loop — how many amps to trim off the current setpoint per V/s that the smoothed battery voltage rises beyond the deadband. Recomputed every tick from the present rise rate and subtracted at the loop output, so it releases the instant the rise falls back and never accumulates in the integrator (no dumped charge on release). Damps the rate of rise on the approach to target, keeping the bus from overshooting into the hard protections — but unlike a protection it never cuts the field, so there is no torque step at the engine and no visible light dip. Higher damps a fast approach harder; too high slightly slows the final approach. Gated by the CV Tuning Helpers switch (Overshoot & OV-recovery shaping, below). Voltage-normalized — the same value works on 12 / 24 / 36 / 48 V banks.

Voltage for D term filter (ms) (?) ℹ️Smoothing applied to the battery voltage before the D term measures its rate of rise — a dedicated filter, separate from the shared voltage smoothing filter, so tuning the D term’s noise floor never disturbs the charge-stage machine. Longer rejects belt ripple and sensor noise harder but adds lag to the rate signal (a fast rise is seen later); shorter reacts sooner at the cost of a noisier slope. This filters voltage; the deadband below rejects ripple on the resulting slope — independent tools. Set to 0 to feed the raw INA228 voltage. The “Voltage for D term” trace on the tuning plot is this filtered signal.

Voltage-Rise Tolerance base — V/s at zero amps (?) 10s peak rise rate: — ℹ️Where the D term's on/off gate starts at zero amps — its intercept. The gate is a line that rises with the commanded current (Slope below), bounded by the Floor and Ceiling: ripple shakes the voltage faster at higher output, exactly like the over-current trip line. The damper ignores any rise — or, below target, any fall — slower than the line's value at the present command; once the rate clearly passes it, the D term acts on the full rate, and stays engaged until the rate falls back below half, so ripple flickering across the edge cannot rapidly toggle it. Lower catches gentler approaches but eats into ripple margin; higher hands more of the events to the hard protections. Commissioning measures this installation's own ripple rise rate (Step 5 current check) and sets base and slope in the Thresholds step; the Safety Margin below re-applies them from that measurement. Only valid for the D-term voltage filter above — change that filter and re-measure. The live readout below is the worst rise rate seen in the last 10 seconds.

Voltage-Rise Tolerance slope — V/s per amp (?) ℹ️How fast the deadband line rises with the commanded current. Commissioning sets it to the measured rise-rate slope so the gate stays parallel to the ripple this alternator actually produces — full sensitivity at low current without nuisance engagements at high current. Zero makes the deadband flat (the plain single-number behaviour). Evaluated against the slew-limited current command, so a sudden transient cannot drag the gate up while the damper should be firing.

Voltage-Rise Tolerance floor — minimum V/s (?) ℹ️The smallest the evaluated deadband may ever be, in volts per second. Below the three tested currents the line is a projection, not data, and ripple measurements scatter run to run — a gate that dips too low would let belt ripple engage the damper as a steady field trim, the exact failure the deadband exists to prevent. This floor keeps the low-current end honest.

Voltage-Rise Tolerance ceiling — maximum V/s (?) ℹ️The largest the evaluated deadband may ever be, in volts per second. On a very large command the sloped line could grow until a genuine fast rise slips under the gate and the damper never acts — this ceiling caps it. The setting itself is not hard-limited — raise it as high as you want; once it reaches the Slope Ceiling (the fastest rise the damper is allowed to react to) the damper is effectively off and going higher does nothing more.

Safety Margin — V/s above measured ripple slope (?) ℹ️How far the deadband line sits above the measured ripple rise line, in volts per second. Larger means fewer nuisance engagements of the damper (D term) but a later reaction to a genuine fast rise — the over-voltage protections remain the fast defense. Applying it sets the line parallel to the ripple this installation produces (the base and slope above are set for you). Requires the voltage-slope measurement from Commissioning ▸ Step 5.

Ripple slope vs. Voltage-Rise Tolerance ℹ️The deadband line your settings above produce (base + slope·current, floored and capped) drawn against the ripple-driven voltage rise rate measured at three currents during commissioning. Any current where the measured rise crosses above the deadband is shaded red — the damper (D term) would engage on ordinary ripple there. The deadband line redraws as you edit the fields above; the measured line is fixed commissioning data. Nothing here changes automatically.
X-axis max A
Slope measurement is from Commissioning ▸ Step 5 (Disturbances) ▸ current check and is only valid for the D-term voltage filter it was measured with — change that filter and re-run the step.

Arm Window Below Target (V) (?) ℹ️How far below the active charge target the D term is allowed to act. Farther below than this, a fast rise is normal charging or a recovery climb and the loop needs every amp — the D term stays out of the way. Inside the window a fast rise means imminent overshoot and it acts. Set to 0 to arm it always (whenever CV is active), like a textbook D term. Compares the smoothed voltage against the live stage target.

One-Sided (?) ℹ️On (one-sided): the D term can only remove current — it brakes a fast rise (above or below target), silent on any fall. Off (two-sided): it can also add current on a fast fall — but only below target. Even here it isn't symmetric: the remove side works everywhere, the add side only below target — so a bus decaying down from an overshoot is left alone (adding there would re-lift it and stretch the overshoot).
Off On

Gradual Response (?) ℹ️On (gradual): the damper responds only to the part of the voltage-rise rate beyond the tolerance line, starting from zero — no step at the threshold. Off (stepped): the older behavior — the damper switches in at full strength the moment the rise rate crosses the line. The stepped form injects a sudden current change right at the threshold, which can rock the system into a steady voltage see-saw during a quiet hold (each correction creates the next error). Off exists for A/B comparison; expect the see-saw to return with it.
Off On

Max Back-Off (A) (?) ℹ️Hard ceiling on how many amps the D term may remove. The back-off ramps up with rise rate but never exceeds this, so a genuinely fast rise is softened rather than cut to the field-off torque step this softener exists to avoid. The back-off reaches this cap at a rise rate of (this ÷ Kd) and holds flat above it. If a rise is fast enough to need more than this, that is the overvoltage protections' job, by design. Flat amps — voltage-independent, like every other current setting: the back-off needed to arrest an equivalent overshoot is the same amps on any bank, so a flat cap keeps the damper behaving the same on 12/24/36/48 V. It is a total-depth limit, not a rate limit — how fast the field is pulled back is bounded separately by the setpoint slew rate.

Slope Ceiling (V/s) (?) ℹ️The fastest voltage rise the back-off reacts to — anything faster is treated as this rate, so together with Kd this sets the deepest back-off a rise can command. Raising it lets the D term pull more current on very fast rises before the overvoltage protections take over; too high makes it twitchy. Entered directly in volts per second for the current battery bank.

ℹ️Zeroes the voltage loop integrator. Use if it's stuck at zero or wound up to a bad value — the PI will rebuild from scratch on the next tick. Useful after changing Voltage Loop Kp/Ki during a tuning session.
Temperature compensation

Battery-Temp Gain Derate (?): ℹ️Voltage Control Autotuning measures the battery's internal resistance (the plant gain K_dc) at one temperature — the battery temperature at commissioning. A battery's resistance rises as it gets colder, which would make those gains run too aggressively in the cold (more overshoot, exactly when over-voltage matters most) and too sluggishly when warmer. With this On, the loop scales Kp and Ki by the estimated resistance ratio between the commissioning temperature and the present battery temperature, keeping the loop's speed and damping roughly constant across temperature. This is a gain scale, not a change to the response-time target or Ki/Kp ratio. The battery temperature comes from the source selected under Setup → Battery → Battery Temperature: a battery probe, NMEA 2000, VE.Direct or RV-C measurement. With no measured battery temperature the scale stays at 1.00. If the plant fit was anchored before a measured source was fitted, the derate stays inert until Voltage Control Autotuning is re-run. The absolute over-voltage protections are independent and always live. Set the strength with the coefficient below. Off = use the commissioned gains unchanged at all temperatures.
Off On

The battery-temperature gain derate is Off, so the commissioned gains run unchanged at every temperature and the coefficient below has no effect. Turn the derate on above to use it.

Not yet commissioned — run the Voltage Control Autotuning step.

Battery-Temp Resistance Coefficient (?): ℹ️How strongly the gain derate reacts to temperature: the battery's fractional internal-resistance change per °C below 25 °C, entered as a fraction (0.024 = 2.4 %/°C). Higher = stronger correction. Above 25 °C the regulator automatically applies half this slope, because a battery's resistance flattens once it is warm — one slope across the whole range is wrong by up to 30 %. The same value suits every chemistry: measured lithium and lead-acid resistance track each other to within about 12 % from −20 to 55 °C. The derate scales the gains by the estimated resistance ratio between the commissioning temperature and now, so a battery colder than at commissioning gets lower gains. Temperatures are modelled over −40 to 70 °C, and the gains are held within 0.10× and 2.5× of the commissioned value as a backstop against a mistyped coefficient. The upward limit is the tighter one, because raising gains is the direction that makes the loop overshoot. Set to 0 to make the derate inert without turning it off.
Target voltage ramp

Target voltage ramp — up rate (V/s) (?): ℹ️Limits how fast the active charge target voltage is allowed to RISE when it changes (a stage transition like Bulk→Absorption, or a new manual setpoint). The voltage loop and the over-voltage protections both follow this smoothed target instead of a sudden step. Rising steps are already paced by the current loop, so this rate is mostly a gentle smoother. 0 = instant (no up-ramp). Default 0.025 V/s.

Target voltage ramp — down rate (V/s) (?): ℹ️Limits how fast the active charge target voltage is allowed to FALL when it changes (e.g. Absorption→Float, or a lower manual setpoint). This is the important one: an instant target DROP leaves the battery momentarily far above the new target, which correctly fires the over-voltage protection and hard-cuts the field — causing a voltage undershoot and a messy recovery. Ramping the target down at this rate lets the loop simply ease the current off, so the protections never trip. The absolute hard-shutdown (a genuine over-voltage emergency) stays instant and is NOT affected by this. 0 = instant (old behaviour). Default 0.025 V/s (~12 s for a 0.3 V drop).

Target voltage slew limiter (?): ℹ️ Master switch for the voltage-target slew in normal operation. On (default): the active charge target moves at the up / down rates above instead of stepping, so a stage transition or new setpoint glides. Off: the target changes instantly (old behaviour). The important one is the down rate — an instant target drop trips over-voltage and hard-cuts the field. Leave On for normal use. The manual CV test ignores this — its slew is set by the slew mode in the Voltage Step Generator; commissioning / automated tests ignore it too. Protections and absolute backstops are independent of this and act on their own timing: instant for the absolute cuts, a held dwell for the timed tiers.
Off On
Setpoint drop wind-down

Enable wind-down (?): ℹ️ Handles a lowered voltage target (a smaller manual setpoint, or the Absorption→Float hand-off). On: instead of waiting for the voltage loop to ease current off — which is slow enough that the over-voltage protection often fires and knocks the voltage below the new target — the regulator walks the current command down at the rate below, watches the measured voltage, and hands control back to the loop the moment the voltage lands at the new target. Typical result: a large setpoint drop completes in a few seconds with no protection events. Off: the loop and the target ramp handle drops alone (old behaviour). Protections are never disabled by this — they stay armed the whole time as the backstop.
Off On

Wind-down rate (fraction of max amps/s) (?): ℹ️How fast the wind-down walks the current command toward zero after a lowered setpoint, as a fraction of your alternator's maximum table amps per second — so the same setting behaves the same on a small or large alternator. Larger = the voltage reaches the new setpoint sooner, but stopping exactly on target gets harder (the field lags the command slightly), so a very fast rate can dip the voltage under the new setpoint before settling. Smaller = gentler and more precise, but the drop takes longer.

Wind-down stop margin (V) (?): ℹ️The wind-down stops walking current down once the measured (smoothed) voltage is within this many volts above the new setpoint, leaving the last little bit to the voltage loop. A larger margin hands back earlier — safer against dipping under the new setpoint, but the final approach is slower. A smaller margin rides the wind-down closer to the target — quicker finish, but the field's slight lag can carry the voltage a touch below the setpoint before the loop catches it.
Governors & loop timing

Rise governor / anti-windup limiter (?): ℹ️ Master switch for the inner anti-windup clamp on the voltage target (rise governor), active in normal operation. On (default): on a target step UP, the value the voltage loop sees is held to what the current loop can actually support, so the integrator can't run ahead and overshoot into an over-voltage trip. Off: the loop sees the full up-step at once — the un-clamped step response, but the integrator can wind up and trip over-voltage on a rising step. Falling steps are instant either way. The fast over-voltage backstop still fires and cuts the field regardless. Leave On for normal use; commissioning and automated tests force the governor on regardless of this switch.
Off On

Field smoothing limiter (duty slew) (?): ℹ️ Master switch for the rate limit on the field PWM output (duty slew, DutyRampRate) — the actuator-side limiter, not the setpoint. On (default): field demand can only change at DutyRampRate, which protects the coupling capacitor from harsh transitions. Off: duty steps instantly. This is a shared setting with the Current tab — changing it in either place changes both. It applies in normal operation and in the two square-wave tests; sine runs bypass duty slew automatically once their entry ramp settles, and commissioning / automated tests ignore it. Leave it On except during a deliberate test.
Off On

Voltage sensor smoothing filter (ms) (?): ℹ️EMA filter applied to the slope bleed signal and the charging stage machine (Bulk → Absorption transitions). PI error terms and Group 1/2 voltage comparisons use raw battery voltage — this setting does not affect them. Group 1's voltage rate-of-change uses its own separate EMA, controlled by dvdt EMA TC. Set in Tuning → Plant Delay.
Read-only — set in Tuning → Plant Delay

Voltage Loop Interval (ms) (?): ℹ️How often the voltage loop's integrator (the slow-correction term) updates. Active in bulk, absorption, float, Target Voltage mode, and Maintain Mode. The proportional response (the fast-correction term — Voltage Loop Kp × voltage error) runs every output PID tick (~5ms) regardless of this setting, so the loop reacts to voltage changes immediately; only the integral build-up cadence is controlled here. Shorter values make the integrator more responsive but can amplify noise; longer values make it smoother but slower to correct steady-state error.
Overshoot & OV-recovery shaping

CV Tuning Helpers (?): ℹ️ Master switch for two non-linear "helpers" that sit on top of the plain voltage PI: (1) asymmetric integrator unwind — when battery voltage goes above target the integrator drains 7× faster than it builds, and (2) the voltage D term — trims the current setpoint when the smoothed voltage is rising fast toward target, damping the rate of rise (its knobs are the Voltage D term rows under Gain selection above). Both exist for one purpose only: they REDUCE OVERSHOOT and HELP SPEED OVERVOLTAGE RECOVERY. They never make the loop more aggressive, so leaving them ON is always at least as safe.

Turn them OFF while tuning Voltage Loop Kp/Ki: the loop becomes a clean symmetric PI, so its overshoot and settling behaviour reflect Kp/Ki directly and are far easier to understand. Once Kp/Ki are dialled in, turn them back ON to add the overshoot/OV-recovery polish. This does NOT touch the real overvoltage protections (hardware OV, fast OV, hard clamp) — those stay live regardless.
Off On
Telemetry

Thermal Loop Status

Temperature PID Active ℹ️ Whether the temperature PID is currently running in AUTO. Goes MANUAL when temp data is stale; resumes with bumpless transfer on recovery. ?
Temp Loop Input ℹ️ Temperature the PID actually sees: the higher of the projected temperature (present temperature + rate of rise × Thermal Lookahead) and the present temperature, so a hot alternator is never forgiven just because the trend is flat or falling. Can exceed any temperature the sensor has ever measured when temp is rising. Zero slope is used during the ~65s slope buffer warmup after startup or reset, so the value equals the present temperature until then. ? °F
PID Setpoint ℹ️ Active temperature setpoint the PID controls against. When the 60-second slope buffer is full (~65s after startup or reset), this is TemperatureLimit − 7°F (3.9°C). During warmup it is TemperatureLimit − 20°F (11°C), giving a wider margin while slope prediction is unavailable. ? °F
Thermal Penalty ℹ️ Amps subtracted from the RPM cap table ceiling (uTarget = I_cap − thermalPenalty). Positive = PID is derating current due to heat. Floored at 0 — the penalty cannot go negative; cold boost is not implemented. ? A

Term Contributions

Temperature P Term ℹ️ Proportional contribution to thermal penalty (A). = Kp × (projectedTemp − setpoint). PID runs in REVERSE mode: positive error (projectedTemp above setpoint) drives positive penalty (reduces current). Total penalty is floored at 0. ? A
Temperature I Term ℹ️ Integral accumulator (A). Builds positive while the controlled temperature (higher of projected and present) stays above setpoint. Bounded by the PID output limits (0 to MaxTableValue) — cannot go negative to boost current above the cap table. ? A
Look-Ahead Term ℹ️ Look-ahead share of the temperature response (A). The controller acts on a projected temperature (present + slope × look-ahead time) rather than the present temperature; this is the extra current reduction that projection causes. Zero when temperature is steady or falling. Shown as a contribution to the current target: negative means amps are being removed preemptively. ? A
Temp Slope (°F/s) ℹ️ Temperature rate of change (shown in your display unit per second), computed as a backward difference over the Thermal Slope Window. Zero while the buffer fills after startup or reset. Readings implying more than ±0.5 °F/s (±0.28 °C/s) are rejected as sensor noise and the previous rate is held. Used to compute: projected temperature = current temperature + rate × Thermal Lookahead. ? °F/s
Live Plot View
Window:
Temperature Control & Penalty
Mode / Anti-Windup
Temperature PID Term Decomposition
Controller Parameters
ℹ️Zeros the penalty output, integrator, IIR filter, and 60-second slope buffer; sets PID to MANUAL (inactive). The slope buffer takes ~65s to refill before full lookahead prediction resumes, and the integral term stays paused until the measured temperature next reaches the control target. Use if the integrator has wound up or the filter is stuck on a bad reading.

Temp PID Kp (A/°F) (?): ℹ️Proportional gain (A per °F of temperature error). The error is the controlled temperature — the higher of projected and present — minus the control target (7 °F / 3.9 °C below the temperature limit). Higher values derate current more aggressively as the controlled temperature approaches the limit.

Temp PID Ki (?): ℹ️Integral gain (A per °F·s of accumulated error). Carries nearly all of the steady-state penalty — it sets how fast the loop converges to its holding level and how well it tracks slow engine-compartment heat buildup. To prevent overshoot it stays paused until the measured temperature first reaches the control target (the initial approach is handled by the proportional and lookahead action), and pauses again whenever the penalty already exceeds what the RPM cap table can deliver at the current speed. Unwinding is never paused. Bounded by the penalty output limits (0 up to the cap-table maximum).

Below-Setpoint Bleed (× Ki) (?): ℹ️Asymmetric integral release. When the temperature is BELOW the control target, the penalty unwinds at this fraction of the integral gain instead of the full rate. Lower values make the loop "remember" its holding penalty through a brief dip below target, so the next heat-soak climb starts near the level needed to hold setpoint instead of rebuilding from near zero — this is what stops the slow temperature oscillation from growing into an over-temperature trip on a hard/hot installation. A genuinely cold alternator still releases derate, just more slowly. 1.00 = symmetric (releases as fast as it builds); 0.33 default. Above target, the full integral gain always applies. Clamped 0–1.

Thermal Lookahead (s) (?): ℹ️Lookahead horizon in seconds. Projected temperature = current temperature + rate of rise × this lookahead, where the current temperature is the raw sensor reading (DS18B20) or the smoothed reading (thermistor). Larger = earlier derating before the limit is reached; smaller = tighter control near the limit. Works best when sized to the sensor's heat-conduction delay plus the rate-measurement window; oversizing causes a slow temperature oscillation around the target. Clamped to 0–300s.

Thermal Slope Window (s) (?): ℹ️Time window over which the temperature rate-of-rise (slope) is measured, which in turn drives the projected temperature. A SHORTER window makes the loop react faster to rate changes — less control lag, so the slow temperature oscillation around the target gets smaller — but the slope reads noisier. A LONGER window is smoother but laggier. Independent of Thermal Lookahead. Does not affect the cold-start warmup. Clamped 10–60s.

Temp PID Interval (ms) (?): ℹ️How often the temperature PID runs and the slope buffer is updated. Also sets the slope window: 12 intervals × this value. Independent of the output current loop rate.

Temp PID Filter Alpha (?): ℹ️Smoothing strength for the filtered temperature value. For DS18B20 sensors, the filtered value is computed but the lookahead and rate-of-rise both use the raw sensor reading directly — so this only affects the logged and plotted filtered value, not the control input. For thermistors, the smoothing is fixed regardless of this setting.

Provokes the over-voltage protection safely at any state of charge: it charges at idle until the battery voltage settles and stops creeping upward (typically 10–45 s), parks the bus at a constant-voltage target it can actually reach (a set headroom below the settled idle voltage, close enough that real charging current keeps flowing), and you snap the throttle to about half max RPM. The response is scored — protection-event count, any hard current-sensor cut, recovery time, and post-recovery stability; overshoot and the recovery dip are reported for context. All protections stay fully active; the firmware ends the run itself. Also the final commissioning wizard step — run it here any time after a tuning change.


Test Parameters

Target Headroom Below Idle (V) (?) ℹ️How far below the settled idle voltage the test parks its constant-voltage target (the target headroom). Smaller = the bus parks closer to the battery's settled level, so more charging current keeps flowing through the snap — a harsher, more realistic test. Bigger = less standing current and a gentler test, with more margin that the voltage loop (not the current limit) is what is holding the bus. Entered as a 12 V value — scaled automatically with system voltage class on 24 V, 36 V, and 48 V banks.

Stability Limit (V) (?) ℹ️How much the battery voltage may swing during the setup phases before the test refuses to run (the stability fail band). A swing at or under this limit lets the test proceed, with the wobble reported and stability graded marginal; beyond it the run is recorded as a basic-stability fail. Loosen it on a boat whose cycling loads (fridge, autopilot) keep the idle bus moving — the measured swing is always reported either way. Entered as a 12 V value — scaled automatically with system voltage class on 24 V, 36 V, and 48 V banks.

PID Control Architecture

Three-Loop Cascaded Control: Three independent controllers run at different rates and stack on top of each other. The output current loop runs 10 times per second and drives the alternator field duty cycle to chase a current target. The voltage loop also runs 10 times per second during the voltage-hold phases (Absorption and Float) — it computes the current target that holds the battery at the configured voltage. In the current-limited phase (Bulk) the voltage loop stands aside and the system charges at the ceiling. The temperature loop runs once every 5 seconds, and outputs a single thermal penalty in amps that gets subtracted from the RPM Cap Table ceiling before the inner loops see it. The cascade is strict: temperature constrains what current the voltage loop is allowed to ask for; the voltage loop constrains what the output current loop is allowed to chase; the output current loop is the only thing that touches the field. Each layer never reaches past the one below it.

RPM Cap Table: For each engine RPM range, you configure a hard ceiling based on your installation's physical limits — belt load, shaft stress, alternator and battery bank ratings. This ceiling is enforced after the thermal penalty is applied and is never exceeded regardless of thermal state. The ceiling can be entered as either a current limit (Amps mode) or a power limit (kW mode) using the toggle above the table. In Amps mode the configured value is a fixed current ceiling. In kW mode the regulator divides your power limit by live battery voltage on every control tick to derive the amp ceiling — so the mechanical load on the belt and shaft stays constant regardless of voltage sag or rise during charging.

Forecasted Thermal Penalty: The temperature controller acts on the higher of two temperatures: the present filtered reading, and a projected temperature — present temperature plus the measured rate of rise multiplied by the Thermal Lookahead horizon. Projection is what lets the loop pull current down before the alternator actually reaches the limit, while taking the higher of the two means a hot alternator is never given current back just because the temperature trend has flattened. The setpoint is the real damage limit (Alternator Temp Limit) and the output is a penalty in amps: zero means no restriction, higher numbers mean more current pulled away from what the RPM Cap Table would otherwise allow. Because the penalty is relative rather than absolute, it transfers cleanly across RPM and stage changes. The penalty itself is slew-limited so brief temperature noise doesn't cause harsh current swings.

Voltage Loop: A proportional-integral controller (Voltage Loop Kp and Ki) holds battery voltage at target during the voltage-hold phases (Absorption and Float). Its output is an alternator-current target, capped at the RPM Cap Table ceiling (with thermal derating) and, when the Group 4 Battery Charge Current Limit is set, at that limit plus the measured house-load draw — so the battery's share of the output is bounded regardless of what the loads are doing. The current-limited phase (Bulk) commands alternator current the same way. The integrator uses asymmetric gain — it bleeds down fast when voltage runs above target and rises slowly when below, biasing toward safety. A deadbanded derivative term (Voltage Kd) trims current straight out of the command when voltage is climbing quickly, which checks overshoot during the approach to target. Anti-windup freezes upward integration whenever the current ceiling — not voltage — is the binding constraint, so the integrator does not load up while unable to act. The loop gains are set by the commissioning wizard's autotuning rather than tuned by hand (see below), and can be automatically re-scaled with the measured battery temperature to hold the loop's speed and damping constant as the battery's internal resistance changes with temperature.

Three-Stage Charging: The regulator implements a constant-current / constant-voltage / float charging cycle (CC/CV/Float), with an optional Idle mode after Absorption for lithium longevity.

In Bulk, the voltage loop is off and the system charges at the maximum thermally allowed current from the RPM Cap Table. This continues until battery voltage has been held at the Bulk Voltage target continuously for the Bulk Voltage Debounce Time — a debounce that prevents transient voltage spikes from triggering a premature transition.

In Absorption, the voltage loop engages and holds the battery at the Absorption Voltage. The battery itself now dictates how much current it accepts — current tapers naturally as the battery fills. The system exits Absorption when charge current has dropped to or below the Tail Current for the Absorption Completion Time, confirming the battery is genuinely full. If the system is thermally constrained — meaning the thermal penalty is meaningfully active AND current is already near the Tail Current — tail detection is suspended until thermal headroom recovers, preventing a false exit before the battery is truly full. A safety timeout (Absorption Timeout) forces a transition to Float (or Idle, if Use Float is Off) if Tail Current is never reached.

In Float, the voltage loop holds the battery at the lower Float Voltage. After the Minimum Float Time has elapsed, the system monitors for voltage sag or sustained discharge current. If either condition persists for the Rebulk Debounce Time, or if Float Duration expires, Bulk charging restarts — subject to SoC blocking if SoC data is available. If Use Float is Off, the system skips Float entirely and enters Idle after Absorption, charging again only when rebulk criteria are met.

Independent Protection Layers: Several fast-response protections sit outside the three-loop cascade and act on raw sensor readings without filter lag. Fast OV (Groups 1 and 2) caps current immediately when raw battery voltage runs above a margin below the charging target. Load Dump protection (Group 5) caps current when a sustained battery-current rise rate is detected, catching FET disconnect or load drop events. The over-current detector (iExcess, Group 3) caps the current ceiling when measured alternator current overshoots the commanded setpoint — with a strict regime near the voltage target and a looser one in bulk — and collapses the voltage-loop integrator at the same time so it can't immediately re-demand the excess. Its trip threshold is not a single fixed number: it is max(floor, percent·commanded current, ceiling), so the percentage term rides up with the commanded current — tight at low current (catches real over-current sooner) and looser under heavy output (tolerates the larger legitimate ripple that comes with load) — while the floor guards the low-command case and the ceiling caps it. You set those in Protections; the commissioning wizard measures the ripple and plots it against your thresholds so you can check them, but never sets them for you. None of these depend on the control loops being active — they are always armed.

Stability and Recovery: All mode transitions are bumpless — both the output current loop integrator and the voltage loop integrator are seeded to the operating point before the new mode takes over, so transitions never produce a setpoint step. If the temperature sensor goes stale, the temperature loop holds its last penalty value and re-enters smoothly when fresh data returns rather than snapping back. Anti-windup keeps the temperature integrator parked near any tighter non-thermal constraint when thermals are not the binding limit, so the penalty can climb the instant temperature demands it. A hardware-level shutdown path (GPIO4) provides two independent escape hatches: immediate cut for critical conditions (temperature critically over limit, hard fault) and a controlled ramp-then-cut for sustained warning-level conditions. GPIO4 protection remains active regardless of loop state. Any fault that interrupts charging restarts from Bulk when charging resumes, never mid-cycle.

How the Control Loops Are Tuned

Start with commissioning — it does nearly all of this for you. The Commissioning tab runs a guided wizard that measures your specific alternator and battery bank and sets almost every loop and protection parameter automatically. You creep the throttle when it asks and confirm each step; it does the math. On most installs this is the only tuning you ever do — the manual procedure below is for hand-verifying or fine-tuning after the wizard, or for the rare case where you want to override what it found.

The wizard walks nine steps, each writing real settings on Apply:

• Prep — snapshots your current settings and checks preconditions (engine running, headroom, a valid battery shunt) so a run can be reviewed or reverted.
• Field curve — ramps field duty open-loop and maps duty→output current, finding the saturation knee.
• Current Control Autotuning — a sine sweep on field duty measures the inner current loop's plant (time constant and gain) and proposes its PID gains and filter constants (also on the Plant Delay tab).
• Verify Current Control — a closed-loop sweep with the new inner-loop gains, confirming the loop is stable before anything downstream trusts it.
• Disturbances — you creep idle→cruise while it records the worst ripple per RPM range (belt resonance) on both the alternator and battery signals, building the Resonance & Ripple Map.
• Fault Threshold Autotuning — sets the over-current detector's trip line from the ripple just measured: the line runs a Safety Margin above the ripple and is drawn against the measured points so you can confirm it clears them. It writes straight to the Protections settings — adjust the margin or the individual values by hand if you like.
• Voltage Control Autotuning — commands one bounded current pulse through the tuned inner loop and measures how battery voltage responds to the current step (the finite-horizon gain K20), then computes the voltage-loop gains from your chosen response time.
• Keep-Alive Floor & Field Decay — at each of three held speeds (max working → mid → idle) it finds the field onset point, filling the per-RPM Keep-Alive (%) column, then cuts the field once and times the alternator-current drain at that speed; the three drain points fit the speed-dependent line the over-voltage response's field-drain timing reads.
• Stress Test — charges at idle until the battery voltage settles, parks the bus at a constant-voltage target it can actually reach, then you snap the throttle to about half max RPM so the over-voltage protection fires on a reachable setpoint; the protection response and recovery are graded, with corrective actions offered on a poor result. Writes nothing — a pure acceptance check.

Every step is advisory — it proposes, and nothing changes until you press Apply. You can re-run a single step, or clear and start over. Progress is stored on the regulator, so it survives a reload and looks the same from any device.

Manual tuning (optional). The output current loop and the voltage loop each also have their own live tuning mode you can drive by hand — Tuning Mode for the inner current loop (Current tab), and the Auto-or-Manual gain selector on the Voltage tab for the voltage loop. Tune them in that order — inner loop first, then voltage — because each layer depends on the one beneath it being stable. The rest of this section covers hand-tuning the inner current loop; the voltage loop has its own dedicated tab with a built-in step test, an Auto mode that reuses the commissioned fit, and live scoring. The temperature loop is tuned offline from logged data (no live step test) — its tab shows the live control plot and the controller parameters.

Three-Phase Process: The goal is to tune the core PID first, then verify it handles the rate limiters gracefully with anti-windup tracking. Tune in bulk stage — absorption and float share the same output current loop, so a well-tuned bulk response carries through automatically.

Phase 1 — Core Loop (Unrestricted):
Set both slew limiters to very high values to effectively disable them:
• Setpoint Rise Rate: 1000 A/s
• Setpoint Fall Rate: 1000 A/s
• Duty Ramp Rate: 1000 %/s
Enable Tuning Mode and watch the step response on the plots. Tune Kp, Ki, and Kd until you get well-damped step responses with minimal overshoot (10–20%) and fast settling time (2–4 seconds).

Phase 2 — Actuator Slew + Anti-Windup:
Re-enable the actuator slew limiter by setting Duty Ramp Rate to a realistic value (typically 10–30 %/s). Keep setpoint slew limiters high (1000 A/s). Run tuning mode again and watch for overshoot after transitions. If you see overshoot once the duty ramp catches up, increase PID Tracking Gain until the overshoot disappears. This is the back-calculation gain that bleeds the integrator down whenever the duty output is rate-limited.

Phase 3 — Production Verification:
Set Setpoint Rise Rate and Setpoint Fall Rate to your desired production values (typically 5–20 A/s rise, 20–50 A/s fall). Run tuning mode one final time to verify the loop remains stable and well-behaved with both rate limiters active.

Tuning Philosophy for Cruising:
Run tests at moderate RPM within your typical cruising range. A slower, well-damped loop (4–6 second settling time) is preferable to a fast loop that causes harsh load transitions. The independent protection layers (Fast OV, Load Dump, the Group 3 iExcess detectors, GPIO4 hard cut) handle the unsafe edges — you don't need the loop itself to react instantly. Smooth and stable beats fast and harsh.

Every installation is different — always verify with a step test in your own setup.

Four independent checkpoints decide what data gets recorded on the Live Data → Diag tab. These are their gates & tuning knobs — pick a pill to see only that checkpoint's settings; a setting shared by two checkpoints shows under both of them.

View:

C1 — Anomaly Detection watches the fast current sensor for rectifier/stator fault signatures. It shares the fast channel and its steady-state admission gates (current drift floor/slope, input-range switching) with C2 — those live in the shared Fast Current Channel section. Its own pieces: the fault alarm, the fault-class and lifetime-anomaly readouts, and the anomaly snapshots in the Waveforms flipbook. Arming ignores engine speed entirely, so it keeps working with a dead tach.

C2 — Resonance & Ripple Map learns the strongest current-ripple tones at every engine speed and load, from the same fast channel as C1. It uses the shared current-drift gates plus two gates of its own: the steady-state RPM margin (a window is discarded when the engine sits on a speed-bin edge) and the minimum tone amplitude. Its results: the map itself, the worst ripple & tone table, and the biggest actionable disturbance.

C3 — Charging System Health grades output amps against the best this machine has ever done at the same operating point. A point is admitted only after every signal — RPM, field duty, voltage, temperature, amps — holds steady. Those admission gates and the curve-fit tuning are the knobs under Gates & Tuning in this section; the resulting health gauge, session plot, and engine-hours trend appear on Live Data → Diag → Alternator.

C4 — Ripple Measurements is one measurement engine with two collectors: the RPM ripple table is filled only by the commissioning game, and the ripple-vs-current line on the Protections plots is filled only by Commissioning Step 6. These gates define what counts as a valid measurement for both. They are deliberately separate from C1/C2’s gates, so tuning them can never loosen fault-detector arming.

C1 C2
Fast Current Channel (?): ℹ️Master on/off for this whole diagnostic channel. Off stops sampling entirely — no map learning, no fault detection, no oscilloscope.
C1 C2
Steady-State Gates & Input Range — feed both C1 and C2
A capture window counts only while output current holds steady, judged on a smoothed signal so the ripple being measured is not what is judged. These knobs and the input-range switching govern both consumers of the fast channel: the anomaly detector (C1) and the Resonance & Ripple Map (C2). The map applies two further gates of its own — RPM margin and minimum tone amplitude, in the C2 section. The measured-ripple capture (C4) has fully separate gates.
Steady-State Current Drift Floor (A) (?): ℹ️A window is discarded unless the smoothed output current drifts less than the larger of this floor or the slope % (below) across the window. The smoothing removes the ripple being measured, so the gate sees only slow drift, not the tones. 10s peak drift: —

Steady-State Current Drift Slope (%) (?): ℹ️The proportional companion to the floor above, as a percent of the window's mean current. Same smoothed current; the gate allows whichever is larger — this percentage or the fixed floor. 10s peak drift: —

Range Switch-Up Current (A) (?): ℹ️Above this the channel drops to its less-sensitive 12 dB input range so high-current ripple doesn't clip; below the Switch-Down value it returns to the sensitive 6 dB range. The gap between the two prevents chattering at the threshold.

Range Switch-Down Current (A) (?): ℹ️Below this the channel returns to its sensitive 6 dB input range. The gap between Up and Down prevents chattering near the threshold.
C1
Sound Alarm on Fault (?): ℹ️Recommend leaving this off — the fault alarm is still unproven and in development.
C2
Map-Only Gates
Steady-State RPM Margin (RPM) (?): ℹ️A 0.5-second window is discarded unless the smoothed RPM stays at least this many RPM inside one internal 50-RPM speed bin (not the wide flipbook bands) for the whole window. Unlike the drift readouts, here bigger is stricter: the "10s worst margin" line must be at or above this value to pass, so a small number (engine sitting right on a bin edge) is a fail. Governs the Resonance & Ripple Map ONLY — the anomaly detector's arming ignores RPM entirely. 10s worst margin: —

Minimum Tone Amplitude (A) (?): ℹ️Applies to each detected tone's amplitude. Tones quieter than this never enter the Resonance & Ripple Map. Raise to log only strong tones; lower to capture faint ones. 10s peak tone: —
C3 Charging System Health — Gates & Tuning
All steady-state definitions are tunable (build it, then tune live). Values echo live.

Shortcut to the health gauge, session plot and trend →

Reference & Learning Mode
Reference source (?): ℹ️Which reference surface grades the live % and the trend. "My History" is what this device learned. "Uploaded File" is a borrowed surface from Load CSV — selecting it defaults Pause ON, but you can Continue to keep learning My History while graded against the uploaded one. Learning never modifies an uploaded surface.

Learning ℹ️Pause / Continue learning into My History. Independent of the reference source — you can pause learning and still grade against either surface. Live display and the trend keep updating either way.

Simulator ℹ️Injects synthetic operating points for bench testing without a running engine, so the curve fills and the health trend visibly declines. Leave off for real use; simulated data is not saved.
Steady-State Detection
Signal smoothing filter (s) (?):ℹ️Strips control-loop dither and sensor jitter so the limits below can stay tight enough to reject real roughness. 0 = off. Heavier than about 1 second starts hiding real movement.

Output lead (s) (?):ℹ️The alternator answers where the engine is heading, not where it has been, so its output and the bus voltage are held back by this much before being paired with engine speed. Without it a speeding-up engine appears to make more current than it really can at the speed shown. Rounded to tenths of a second; 0 turns the pairing off.

Minimum steady-run length (s) (?):ℹ️How long the alternator must have been running above the admission floors (output and field) before a point can be banked. Dropping below the floors, or a gap in the feed, restarts the clock; a momentary wobble in one signal does not. Below the longest window in the table this has no effect.

Per-signal steadiness

Signal Wobble ℹ️How far the reading may stray from the straight line drawn through the window. The line itself is free to climb or fall, so a smooth acceleration passes and only genuine roughness fails. Bus voltage and temperature have no line: for those two this is the plain highest-minus-lowest spread. Judged on the smoothed signal, so size it for real operating-point movement, not sensor noise. Rate limit ℹ️The steepest that straight line may be. Engine speed is allowed to sweep; the field is held nearly fixed, because a moving field means the regulator is chasing something and the stretch is not one operating point. The output gets its own limit, in percent of the reading per second, and that is the one that decides how far a record taken on the move can drift — how much output moves while it is being averaged is what a wrongly paired reading turns into. 0 means no limit on the slope. Floor ℹ️Output amps only: both of its limits are percentages of the reading, so at low output they would collapse to nothing. These are the smallest each may shrink to — wobble in amps, rate in amps per second. Window (s) ℹ️How much of the recent past each signal is judged over. All five must pass at the same moment.
Engine speed
RPM
—
Field duty
%
—
Bus voltage
V
——
Temperature ℹ️How much alternator temperature may drift, and over how long a look-back, before a run counts as a full steady run — the points that get the orange ring and that update the reference surface and the engine-hours trend. It is a plain look-back over the last stretch of running, so a dip in output no longer restarts the clock. The This Session plot automatically uses half this window for its lighter "brief point" gate, so there is only one number to set.
°F
——
Output amps ℹ️The alternator output must itself follow a straight line before a point is recorded, and that line may have a slope: while engine speed sweeps smoothly the output rides its own smooth ramp, and that pair is exactly the measurement worth keeping. What the rate limit bounds is how steep that ramp may be, and it is the setting that decides how far a record taken on the move can drift — the output pairing is never perfect, and the error it leaves is the ramp rate multiplied by how far out the pairing is. Both limits scale with the reading so one setting works at low float current and full bulk current; the floors take over at low output.
% of reading
A/s
Engine-Hours Trend
Trend bucket length (s) (?):ℹ️Nothing in this group changes whether a point is recorded — only how the trend buckets the points that were. Engine-seconds per point on the % vs Engine-Hours trend. 3600 = one point per engine-hour (production). Set 600 to see points fill in every 10 minutes for testing.

Trend sample spacing (s) (?):ℹ️Minimum spacing between full steady-run samples that feed a trend bucket. Throttles a long steady run so it contributes several spread-out samples rather than a flood.

Trend min samples per bucket (?):ℹ️A trend bucket needs at least this many full steady-run samples before it commits a point. A sparser bucket shows a gap instead of a single-reading artifact.
Point Admission
Admission: min amps (A) (?):

Admission: min duty (%) (?):
Curve Fitting
Safety margin (A) (?):

Interpolation power (IDW) (?):

Reference validity radius (?):ℹ️How close (in normalized axis units) the nearest recorded point must be for the health % to be trusted. Operating farther than this from all recorded points shows "no reference" instead of comparing against a guess, and the trend skips those readings. Larger = more coverage from sparse data, less honest far from support.

Prune neighbors (k, cloud) (?):

Local fit stiffness (?):ℹ️How strongly the local trend fit (the one-per-second health comparison) is held flat when the recorded points around the live point line up poorly. Higher = steadier but less responsive to real local slope; lower = follows the records more exactly but can wobble where data is thin. Default 0.10.

Learning-state risk threshold (?):ℹ️How much could-be-wrong (as a fraction of the predicted output) is tolerated before the panel says "Learning this operating region" instead of showing a %. Raise to show numbers in more places at the cost of less trustworthy ones; lower to be stricter. Default 0.15 — values 0.10–0.20 classified the validation data identically.
High-Field Alert
Alert: field drive at least (% of Max Field) (?):ℹ️An independent safety net: it flags low output despite high field drive even where the health gauge is still learning and has no % to show.

Alert: output at or below (A) (?):

Alert: must persist (s) (?):
Gate Tuning Capture

Go to Plots →

Recorder (idle): ℹ️This only watches and records — the regulator runs as it always does. 192 KB of memory is claimed when you press Record and released when you transfer or discard, so it costs nothing the rest of the time. The buffer holds 18.2 minutes and never wraps: at capacity it stops and keeps every row, rather than eating the beginning of a deliberate capture. A warning lands in the console with one minute left. A recording is fluid: press Record, then do whatever you like — a sweep, your own throttle, or just driving. The rows carry flag columns for all of it, so the file splits offline on what actually happened rather than on anything you had to press. —

Field sweeper (idle): ℹ️Takes the field away from the regulator and drives it directly: ramps up and back down at a fixed rate, holding nothing else, so field moves independently of engine speed. Up and back down is what cancels the field's lag and separates the two things that drift one way through a sweep — engine speed sagging under load, and the case warming — from the field itself. It stands on its own: run it whenever you want to see what the machine does against field, with or without a recording running. AUTO mode only. What’s Activeℹ️Still active while a sweep runs: hardware over-voltage — the INA228 alert pin cuts the field in hardware, with no software in the path; Alternator Hard Shutdown Voltage, and the lockout that follows; the timed over-voltage cut tiers — a hold over a tier's trip line for its time to act still cuts the field and ends the sweep; Group 0, the hardware overcurrent trip; critical alternator temperature; engine speed; current sensor freshness; Max Field %; the On/Off switch.

Switched off while a sweep runs: the Group 1 and Group 2 over-voltage current clamps; current-overshoot trim and load-dump detection; the temperature loop; every current and voltage limit — they only say when to turn around, nothing holds output to them; Min Field % and the learned tachometer keep-alive floors; the field slew-rate limiter; the charge-stage machine.
Ways to stop itℹ️Stop sweep ends the run and eases the field back out. Reverse now sends the up leg back down immediately, at the same rate. The On/Off switch, or anything that turns charging off, ends the run too.

Sweep rate (% field per second): ℹ️Slower is more accurate and takes longer: the output lags the command by roughly the rate times the field time constant, and averaging the up and down legs cancels that lag only to the extent it is symmetric. 1 %/s over a 60-point span is about two minutes for the pair.

Sweep up from (% field): ℹ️Where the up leg starts, and where the down leg ends. Set it below the onset knee so the sweep captures the region where output begins to build.

Sweep up to (% field): ℹ️Where the up leg stops climbing and turns around. Capped at Max Field %, and it starts there. In practice the sweep usually turns around well before it, short of whichever current or voltage limit the machine approaches first.

Turn around this far below a current limit (A): ℹ️Applies to the current cap for your engine speed, the battery current limit and an external charge-current limit. The sweeper needs room because the layers that normally hold output off a limit are switched off while it runs, and the field is still building behind the ramp when it gets there. Never takes more than a quarter of the limit it is guarding, so a small cap at idle still leaves a usable sweep. 0 turns around on the limit itself.

Turn around this far below a voltage limit (V): ℹ️Applies to the charge-voltage target and an external charge-voltage limit. Same reason as the current margin: nothing is holding the bus off the target during a sweep, so arriving exactly on it is how a run ends in an over-voltage cut — which throws away the down leg the measurement depends on. 0 turns around on the limit itself.

Min Field (%) (?): ℹ️A duplicate of Min Field (%) in Setup → Alternator → Field Control — one setting, reachable from both places, because a capture session spends its time moving this floor. It is the minimum field held anywhere while the alternator is enabled, which is what keeps a stator-driven tachometer alive. A sweep ignores it; everything else, including a recording of ordinary driving, obeys it.

Manual Field PWM (%) (?): ℹ️A duplicate of Manual Field PWM (%) in Setup → Alternator → Field Control — one setting, reachable from both places, because a capture session spends its time parking the field by hand. It is the duty applied straight to the field winding while Manual mode is on, delivered as typed (Min Field does not raise it), and has no effect while it is off. Manual mode bypasses the thermal, engine-speed, battery and current protections, and the sweeper needs AUTO — a sweep and a held manual field are alternatives, never both at once.

Captured session ℹ️Transfer converts the recording to a CSV file with a header naming every gate setting that shaped it, hands it to you, and then frees the buffer. Do it after each run and press Record again — the campaign never has to fit in memory.

Reset / Start Over ℹ️Clears the learned reference surface (My History), the entire % vs Engine-Hours trend (committed buckets AND the current partial hour), and the session stats, then restarts the engine-hour axis at zero and reverts the reference source to My History. Your tuning settings are kept. Do this after replacing the alternator, regulator, or drive belt. Cannot be undone.
C4
Ripple Measurements
One measurement engine, two collectors: the RPM ripple table is filled only by the commissioning game, and the ripple-vs-current line on the Protections plots only by Commissioning Step 6. These gates define what counts as a valid measurement for both. A measurement counts only if conditions were stationary: the window's two halves must have (nearly) the same average — a throttle or load transient walks the average in one direction and is rejected, while a rough-but-repeating condition (a hunting idle, cycling loads) swings hard yet averages the same in both halves and is admitted. This is deliberate: a "dirty speed" is exactly what the over-current protections experience, so it must make it into the table. Each gate shows its worst value over the last 10 s (green = passing). Never relaxed during commissioning: a stationary number cannot be measured while ramping — the wizard's instructed pauses are when measurements admit.
Capture Window (ms) (?): ℹ️How long each ripple measurement lasts. Each HALF of the window must hold at least one full cycle of the slowest disturbance you care about — a hunting idle wanders with a ~1–2 second period, hence the 2000 ms default; shorter windows see slow hunt as drift and reject or under-read it. Changing this changes the measured quantity itself — map cells and the current-check fit captured under a different window length are not comparable. After changing it: clear the map and re-run the commissioning current check.

Current Drift Floor (A) (?): ℹ️The shared tolerance floor, used two ways. (1) Command gate: the current command must not travel more than the larger of this floor or the slope % below (rejects deliberate ramps — test steps, warm-up, mode glides). (2) Stationarity gates: each sensor's two half-window averages must agree within the larger of this floor or a quarter of that window's own full swing — self-scaling, so a rough-but-repeating signal gets proportionally more tolerance while a one-way ramp is still rejected. Each line shows (worst value − its limit) over the last 10 s: at or below zero (green) = passing. Separate from the C1/C2 drift knobs above, so tuning capture admission never loosens fault-detector arming. alt mean-shift beyond limit (larger of Floor / ¼ window swing), 10s worst, ≤0 passes: — batt mean-shift beyond limit (larger of Floor / ¼ window swing), 10s worst, ≤0 passes: —

Current Drift Slope (%) (?): ℹ️The proportional companion to the floor above, for the command gate only: the command may travel up to this percent of the window's mean alternator current (or the fixed floor, whichever is larger). The sensor gates don't use it — their tolerance self-scales on each window's own measured swing (see the floor's tooltip). command travel beyond limit (larger of Floor / Slope % × mean), 10s worst, ≤0 passes: —

Steady-State RPM: ℹ️The engine speed must also be stationary across the window — same two-half test as the currents. Its limit is automatic — the larger of 10 RPM or a quarter of the window's own RPM swing — so there is nothing to set. The readout shows (shift − limit): a negative number means that many RPM inside the limit. RPM mean-shift beyond limit (larger of 10 RPM / ¼ window swing), 10s worst, ≤0 passes: —
Engine & Alternator Parameters
RPM Scaling Factor (?): ℹ️ Scales the tachometer signal into engine RPM. Adjust until the RPM shown here matches your engine's tachometer. Changing it erases every table and record measured against the old RPM axis, on the device and in the cloud, and requires re-commissioning. The alternator must be off.

Pulley Ratio, Alt to Engine (?): ℹ️ *** Only used for Alternator Lifetime Calcs *** Alternator RPM = Engine RPM × this ratio. Common: 2.0-3.0

Fuel Consumption ℹ️Fuel burn rate at each engine speed. The regulator reads straight between the points you enter, and holds the first and last value flat beyond the ends of the table. Ten points maximum; leave trailing rows at zero to use fewer.

Engine SpeedRPM ℹ️Engine speed breakpoint. Values must increase down the column. Leave trailing rows at 0 to use fewer than ten points. Fuel Burngal/hr ℹ️Burn rate at that engine speed. Measure it, or take it from the engine manufacturer's fuel curve.

Burn curve (gal/hr) as the regulator will read it

Used to estimate fuel burned from engine RPM. Totals appear in Cloud Features → Statistics.

Phase Definitions

No battery shunt is installed, so every setting that reads battery current is greyed below: Tail Current, zero-current float, Force "Maintain Mode" and the Rebulk Current Threshold. Absorption ends on time alone, and float (if enabled) then holds the float voltage, until a shunt is fitted under Setup → Battery → Measurement Sources.

Bulk Phase
Bulk Voltage (V) (?):
ℹ️ 14.4V typical.

Bulk Voltage Debounce Time (sec) (?): ℹ️ How long battery voltage must remain continuously within 50 mV below Bulk voltage (or higher) before Absorption begins. The 50 mV arming band is hard-coded — it lets the timer start as the battery approaches Bulk, rather than waiting for the exact crossing. Prevents transient voltage spikes from triggering an early Absorption entry. 0.25s typical. Note that there isn't any controls difference between Bulk and Absorb other than the limiting voltage, if those are set differently, so this is more a question of display nomenclature.
Absorption Phase
Absorption Voltage (V) (?): ℹ️ Voltage held during Absorption. Typically 0.1 to 0.2 below Bulk Voltage for an AC charger/ solar or 0.3 to 0.4 below for an alternator controller. It's wise to leave some margin for transients during rapid engine speed changes. The battery dictates how much current it accepts — current tapers naturally as the battery fills.

Tail Current (A) (?): ℹ️ Absorption ends when charging current tapers to or below this value continuously for the Absorption Completion Time. Confirms the battery is genuinely full. 5 amps per 100Ah of bank is typical.

Two things must both be true before this counts: current at or below your number, AND the battery still sitting up at the Absorption Voltage. A big load coming on, or the engine dropping to idle, can pull charging current down to almost nothing while the battery is only part full — on its own that looks exactly like a finished battery. Requiring the voltage to still be up there tells the two apart. If another charge source (solar, shore power) is holding the battery even higher, that still counts.

Absorption Completion Time (sec) (?): ℹ️ How long current must remain at or below Tail Current before Absorption ends. Prevents a momentary current dip from triggering a premature exit. 10-60s typical.

Absorption Timeout (min) (?): ℹ️ Maximum time in Absorption before forcing a transition regardless of current. Safety fallback in case Tail Current is never reached. Typical starting point: 30m per 100Ah of battery bank.

This clock only runs while the battery is actually held up at the Absorption Voltage. If the voltage sags — engine at idle, a heavy load, or any limit holding the alternator back — the clock pauses and picks up where it left off, so time spent not really absorbing doesn't count against you. As a backstop the phase always ends at twice this figure of real elapsed time, even if the battery never got up to voltage.
Float Phase
Float Mode (?): ℹ️ No Float (idle) — after Absorption the field turns off. The battery carries the house loads, and charging restarts when the rebulk criteria (next section) are met.

Voltage Float — the classic third stage: holds the battery at Float Voltage indefinitely to maintain near-full charge.

Zero-Current Float — the alternator carries exactly the house loads and the battery rests at 0 A, at whatever voltage it naturally sits. The battery is neither charged nor discharged while the engine runs. Needs the INA228 battery shunt. The rebulk criteria stay armed — unlike the manual Force Maintain Mode override below, which suspends the charge-stage machine entirely.

Float Voltage and Float Duration only apply to the Voltage Float mode selected above. Pick Voltage Float to set them.


Float Voltage (V) (?):
ℹ️ Holding voltage used only when Use Float is ON. Typical: ~13.4V

Float Duration (hrs) (?): ℹ️ Maximum time in Float before returning to Bulk.

Minimum Float Time (min) (?): ℹ️ Delay after Absorption completes before any rebulk is allowed. Applies in all three Float Modes (idle, voltage float, zero-current float).

Physical Panel Override is on, so Force "Maintain Mode" is set by the switch on data Cable 3 pin 7, and this toggle only shows what that switch has chosen. Turn the override off under Setup → System → Security & Maintenance to set it from here.

Force "Maintain Mode" (?): ℹ️ Targets 0A net battery current- this is not a recommended mode, as errors may build up over time.
Off On
Charge Start / Rebulk Criteria
Rebulk Voltage (V) (?): ℹ️ If battery voltage drops below this threshold during Float or Idle, and stays there for Rebulk Debounce Time, the system returns to Bulk. 13V typical.

Rebulk Current Threshold (A) (?): ℹ️ If net battery current is more negative than this value (i.e. the battery is discharging at this rate or faster), the system returns to Bulk. Provides more reliable rebulk detection than voltage alone under load. Typical ~0.02–0.05C discharge 2 to 5 amps per 100Ah of battery bank.

Rebulk Debounce Time (sec) (?): ℹ️ How long the rebulk condition (voltage sag or discharge current) must persist continuously before a return to Bulk is triggered. Prevents nuisance rebulk from transient loads. 10-60s typical.
Safety

Sensor cross-checks that stop charging when the two voltage readings disagree, plus the shared shutdown-timing knobs (fault lockout duration, settle time before the field is cut). The over-voltage cut thresholds — the timed cut tiers, the Alternator Hard Shutdown Voltage, and the Hardware Shutdown Voltage — live together in the Over-Voltage Ladder card under Setup → Alternator → Protections → Detection.

Shortcut to the Over-Voltage Ladder →

Voltage Disagree Threshold (V) (?): ℹ️Voltage difference between BatteryV and IBV that indicates sensor disagreement. Helps detect wiring or sensor issues. Typical: 0.15V.

Voltage Disagree Timeout (s) (?): ℹ️How long voltage disagreement must persist before triggering warning. Filters transient differences.

Field Collapse Delay (s) (?): ℹ️Lockout/cooldown duration after a fault that triggered the slow ramp-down path. Once a qualifying fault fires, charging will not restart until this time elapses, even if the fault clears. Triggered by: voltage sensor disagreement (warning or critical), both voltage sensors implausible, temperature warning/sustained, temperature data stale, alternator current data stale. The alternator hard-shutdown (Alternator Hard Shutdown Voltage exceeded) uses its own adaptive cooldown instead — 0.5 s for an isolated event, escalating toward 10 s on repeats, resetting after a minute without one. NOT triggered by immediate-cut faults (hardware overvoltage, hard overcurrent, temperature critical, RPM below minimum) — those just cut the field and re-enable as soon as the condition clears, no cooldown.

Settle Time Before Cut (ms) (?): ℹ️How long duty must be at 0% before GPIO4 field enable goes LOW. Prevents relay chatter during brief dips. Typical: 500ms.
Battery Temperature
Battery Temperature Source (?): ℹ️Which measurement the regulator reads as battery temperature. Automatic takes the first available in this order: battery probe, NMEA 2000 battery status (PGN 127508), VE.Direct battery monitor, RV-C source. Any single source disables the fallback chain and reports no temperature while that source is missing or stale. None disables battery temperature entirely. Every option is a measurement taken at the bank; with none of them reporting, the cold and hot charge lockouts stay inactive and the voltage-loop gain derate stays at 1.00.

No battery temperature available

Cold-Charge Lockout (?): ℹ️ On: charging stops (the field ramps to zero and cuts) while the battery temperature from the source selected above is below Min Charge Temp, the alarm sounds if alarms are enabled, and charging resumes once the temperature climbs about 2 °F (1 °C) back above the floor; with no battery temperature available the lockout stays inactive. Off: charging continues at any temperature (not recommended for lithium, which is permanently damaged by charging below freezing; lead-acid and AGM charge in the cold).
Off On

Min Charge Temp (°F) (?): ℹ️ Battery-temperature floor for the Cold-Charge Lockout: below it charging is disabled. Set it at the battery's own cutoff, conventionally 32 °F (0 °C) for lithium. Re-arms after the temperature climbs about 2 °F (1 °C) back above this floor. Has no effect unless the lockout is On, and nothing happens without a measured battery temperature (probe, NMEA 2000, VE.Direct or RV-C).

Hot-Charge Lockout (?): ℹ️ On: charging stops (the field ramps to zero and cuts) while a measured battery temperature (probe, NMEA 2000, VE.Direct or RV-C) is above Max Charge Temp, the alarm sounds if alarms are enabled, and charging resumes once the temperature falls about 2 °F (1 °C) back below the ceiling; with no measured battery temperature the lockout stays inactive. Off: charging continues regardless of battery temperature.
Off On

Max Charge Temp (°F) (?): ℹ️ Battery-temperature ceiling for the Hot-Charge Lockout: above it charging is disabled. Set it at the battery manufacturer's maximum charge temperature. Re-arms after the temperature falls about 2 °F (1 °C) back below this ceiling. Acts only on a measured battery temperature (probe, NMEA 2000, VE.Direct or RV-C). Has no effect unless the lockout is On.
SoC Integration

State of charge is counted from battery current, and no battery shunt is installed — so this whole card is greyed and no state of charge is reported. Fit a shunt and turn it on under Measurement Sources below.

SoC Info Available? (?) ℹ️ If the regulator is hooked up to a battery shunt per the installation directions and you select Yes, SoC is used to reduce unnecessary rebulk cycles near full. If OFF, charger ignores SoC.
No Yes
SoC Block Rebulk Above (%) (?): ℹ️ Suggest 90%. If SoC is at or above this value, rebulk is blocked even if voltage or current drop below the rebulk trigger thresholds. Prevents nuisance stage resets when the battery is already near full. Set this near the top of your acceptable charge band — 90% is a good starting point. Must be meaningfully higher than SoC Allow Rebulk to create a stable hysteresis gap.

SoC Allow Rebulk Below (%) (?): ℹ️ Suggest 75%. If SoC falls below this value, rebulk is forced regardless of the block threshold or float timer. Use this as a safety floor — when the battery has genuinely depleted, a full bulk charge should always run. Should be at least 10–15% below SoC Block Rebulk to prevent hunting between stages. Setting this too close to the block threshold causes rapid oscillation between bulk and float.
Measurement Sources

Battery Shunt Present is Off, so the three rows that calibrate the shunt — Invert Battery Amps, Battery Current Offset and Shunt Resistance — are greyed. Switch it to Yes to set them up.


Battery Shunt Present (?): ℹ️ Turn off if this device has no battery shunt (battery-current sensor). Battery current, State of Charge, battery health, the battery charge-current limit, load-dump detection and float charging all become unavailable — the alternator current limit is then the only thing bounding charge current. Their settings stay on their pages, greyed, and each card says why; only the live readouts that would sit at a dash are hidden.
No Yes

Invert Battery Amps (?):
No Yes

Battery Current Offset (A) (?):

Shunt Resistance uOhms (micro)(?): ℹ️ Resistance of your current shunt in micro-ohms (µΩ). The current sensor converts the shunt's measured voltage drop to amps using this value — a wrong value scales all current and SoC readings proportionally. Shunts are rated by a full-scale millivolt drop at a rated current, and the resistance follows: µΩ = mV ÷ amps × 1000. Victron SmartShunt / BMV are the 50 mV family (500 A = 100 µΩ, 1000 A = 50 µΩ, 2000 A = 25 µΩ). Check your shunt's datasheet for the exact rating.
RatedµΩmΩ
50 mV — Victron / marine
100 A5000.5
200 A2500.25
300 A1670.167
400 A1250.125
500 A — BMV-7121000.1
1000 A500.05
2000 A250.025
75 mV — industrial / analog meter
50 A15001.5
100 A7500.75
150 A5000.5
200 A3750.375
300 A2500.25
400 A1880.188
500 A1500.15
600 A1250.125
100 mV
100 A10001.0
200 A5000.5
300 A3330.333
500 A2000.2
1000 A1000.1

Shunt Resistance Compensation (?): ℹ️ On: the battery voltage reading is corrected for the shunt's own voltage drop, which is what a Regulator Ground Wire landed on the load side of a shunt in the battery negative lead adds to it. Off: for a Regulator Ground Wire landed on the battery negative post, or a shunt in the positive lead.
Off On

How It Works

Rebulk: The system always begins in Bulk when charging is enabled. It returns to Bulk from Float or Idle if battery voltage drops below Rebulk Voltage or net discharge current exceeds Rebulk Current Threshold — continuously for Rebulk Debounce Time. The timer resets if the condition clears before the debounce expires. If SoC data is available, it suppresses rebulk when the battery is at or above the block threshold and permits it again when SoC drops to the allow threshold — but SoC alone cannot trigger rebulk; voltage, current, or (in float) timeout criteria must also be met.

Bulk: The system pushes the maximum thermally- (and otherwise-) allowed current from the RPM Cap Table. Bulk ends once battery voltage has remained continuously at or above Bulk Voltage for Bulk Voltage Debounce Time.

Absorption: The voltage loop holds the battery at Absorption Voltage. Current is no longer commanded — the battery dictates how much it accepts and it tapers naturally as the battery fills. Absorption ends when current drops to or below Tail Current continuously for Absorption Completion Time. If the system is thermally constrained (the thermal penalty is meaningfully active and current is already near the tail threshold), tail detection is suspended until thermal headroom recovers — this prevents a false "battery full" exit triggered by the thermal loop pulling current down. If tail current is never reached, a safety exit to float or idle occurs after Absorption Timeout.

Float (if enabled): The system holds the battery gently at Float Voltage. After Minimum Float Time has elapsed, rebulk criteria are evaluated. Float also has a hard ceiling — if Float Duration elapses while in float, the system returns to Bulk regardless of voltage or current. (Idle has no equivalent timeout; only the rebulk conditions can leave it.) If Use Float is OFF, charging stops after Absorption and the system idles until rebulk criteria are met — better for lithium longevity in cycling applications.

Full Charge Detection

Full-charge detection watches battery current fall off, and no battery shunt is installed — so this card is greyed and full charge is never declared. Setup → Battery → Measurement Sources → Battery Shunt Present.

Battery Capacity (Amp hr) (?): ℹ️Total usable capacity of your battery bank in amp-hours. Used by the coulomb counter to calculate State of Charge. Set to your battery's rated AH at the 20-hour rate. This does not affect alternator output — it only affects the SoC display and rebulk logic.

Max Charge Detection Voltage (?): ℹ️Battery voltage must be at or above this level for full-charge detection to trigger. Set slightly below your Absorption voltage. If voltage never reaches this threshold during charging, SoC will never be reset to 100%.

Max Charge Detection Tail Current (%) (0): ℹ️ A percentage of battery capacity (A*hr), ex: 3% for 100A*hr bank = 3 amps

Max Charge Detection Time (s) (?): ℹ️Seconds the battery must simultaneously hold at or above Charged Voltage AND at or below the Tail Current before full charge is declared and SoC is reset to 100%. Longer values reduce false-positive full-charge detections.
Efficiency Parameters

These correct the coulomb count, which needs measured battery current. No battery shunt is installed, so the card is greyed. Setup → Battery → Measurement Sources → Battery Shunt Present.

Peukert Exponent (?): ℹ️Corrects for capacity reduction at high discharge rates. Lead acid: 1.15–1.35. AGM: 1.05–1.15. Lithium: 1.0–1.05. A value of 1.0 disables the correction. Higher values mean more capacity is lost at high current draws.

Charge Efficiency (%) (?): ℹ️Accounts for energy lost as heat during charging — not all current put in gets stored. Lead acid: 85–90%. AGM: 92–95%. Lithium: 97–99%. Setting too high overstates SoC; too low understates it.
SOC Correction

State-of-charge correction has nothing to correct without a coulomb count, and that needs a battery shunt. None is installed, so the card is greyed. Setup → Battery → Measurement Sources → Battery Shunt Present.

SOC Auto-Correction (0): ℹ️ Automatically corrects battery current readings when full charge is detected. Requires INA228 battery shunt to be installed.
Off On

SOC Gain Factor (Current Value): ℹ️Live read-only multiplier applied to the shunt current measurement. Adjusted automatically by SOC Auto-Correction each time a full charge is detected. Above 1.0 means the shunt was reading low; below 1.0 means it was reading high. Use Reset Factor to return to 1.0.
?
Other Settings

Battery Current Source below is greyed: no battery shunt is installed, so there is no battery-current measurement to choose a source for. Setup → Battery → Measurement Sources → Battery Shunt Present.

Set SoC (%) Manually (?): ℹ️Force the State of Charge to a specific value. Use this to seed the SoC after a known full or partial charge, or to correct a badly drifted reading. The coulomb counter resumes from this point immediately.

Battery Current Source (?): ℹ️This setting only chooses the source for the battery-monitor SoC and current readouts. It does NOT change which sensor drives any safety or control loop. The onboard INA228 shunt is always required for this controller — Load Dump Protection, fast over-voltage, tail-current detection, rebulk-by-current, and MaintainMode all read the INA228 directly regardless of this setting.

INA228 Shunt = onboard high-precision sensor (most accurate, recommended; also makes the battery-monitor numbers consistent with the safety logic). Victron VE.Direct = use serial data from a Victron BMV or smart shunt for the SoC display only. Note that Victron data lags the actual current by ~1–2 s, so short transients (e.g. windlass pulls) will be smeared in the SoC readout.

Battery Voltage Source (?): ℹ️Chooses the battery voltage used to decide bulk, absorption, float, and rebulk. The onboard INA228 always drives the control loops and protections. Choose an external source when the Regulator Ground Wire is long enough to shift the onboard reading; the regulator falls back to the onboard sensor whenever the external source is stale.
Temperature Sensors

Warm one probe by hand to identify it; its reading rises within a few seconds.

SerialTempAgeRole
No probe data yet

Battery temperature probe (?): ℹ️On: the probe assigned the Battery role supplies the battery temperature used by the cold-charge and hot-charge lockouts, the voltage-loop gain derate and the NMEA 2000 battery status message. Off: the Battery probe is still read for the table above but is not used as a battery temperature source.
Off On

Extra temperature probe (?): ℹ️On: the probe assigned the Extra role is shown as Extra Temperature on Live Data, can raise the high and low alarms under Setup → Alarms → Temperature Alarms, and can be transmitted on NMEA 2000. Off: the Extra probe is still read for the table above but is not reported anywhere else.
Off On
Extra Temperature
Extra Temperature: ℹ️Live reading from the probe assigned the Extra role in the Temperature Sensors card. Greyed when no reading has arrived for a while.
— °F
Defer to Solar ℹ️ Saves fuel, emissions, and alternator wear when solar forecast is optimistic for at least 2 of the next 3 days in your GPS location. Useful for solar-dominant systems.
Off On
GPS Location ℹ️ Where your position comes from, in priority order:
1. Boat GPS (NMEA2000) when it's connected and reporting.
2. Your phone's location, used automatically when the boat GPS goes quiet (the app needs location permission).
3. A position you type below. This is a manual override — it sticks and takes priority over both the boat and phone GPS until you press "Use automatic GPS".
The italic note next to the coordinates tells you which one is active right now.
Current: 0.000000°, 0.000000°
Override manually
The solar forecast needs an internet connection.
The regulator is running its own WiFi network (Access Point mode), so it cannot download one. The position and array settings on this page still save, and the forecast picks up again on its own once the regulator is back on a WiFi network with internet.
Solar Forecast
Day Irradiance (kWh/m²) ℹ️ Solar energy hitting your location per square meter per day Predicted (kWh) ℹ️ Expected output based on your panels' rating and performance ratio
Today 0.0 0.00
Tomorrow 0.0 0.00
Day 2 0.0 0.00
Configuration
Nominal Solar Array Power (W): ? System-rated solar capacity, e.g. 600 for two 300W panels

Solar Performance Ratio: ? Fraction of nameplate output the array really delivers after tilt, shading, temperature and charger losses. Learned from the ledger automatically while Learn Performance Ratio is on; a value typed here restarts the learning from that point.

High Solar Threshold (kWh): ? Forecast harvest a day must exceed to count as sunny; at least 2 of the next 3 days must clear it to pause the alternator. Decides alone when Size Threshold from Consumption is off, and stands in until the ledger has consumption history.

Size Threshold from Consumption: ? On: a day counts as sunny enough when its forecast harvest covers the consumption predicted from the ledger plus the margin below; until that history exists the High Solar Threshold stands in. Off: the High Solar Threshold alone decides.
Off On

Consumption Margin (%): ? Headroom added to the predicted consumption before a day counts as covered by solar. Larger values pause the alternator less readily.

Learn Performance Ratio: ? On: each complete day with a forecast and a VE.Direct link nudges the performance ratio toward what the panels actually delivered, so the forecast fits this array. Off: the ratio stays at the value entered above.
Off On

Learning Rate (% per day): ? How far one day's result moves the performance ratio. Small values ride out a single cloudy day; large values track a real change, such as new shade or a cleaned array, within a few days.
How It Works

Defer to Solar rests the alternator when the sun is forecasted to make up any charging shortfall in the next few days. The regulator downloads a solar irradiance forecast for your position, converts it to expected panel output using your array's nominal watts and performance ratio, and if the predicted output clears your High Solar Threshold on at least two of the next three days, it stops charging. The goal is to save fuel and alternator wear when it's energy the panels would deliver anyway.

Where your position comes from. Boat GPS (NMEA 2000) first. Your phone's location when the boat GPS goes quiet and the app has location permission. Or a position you type in, which is a sticky override that outranks both until you press "Use automatic GPS". Without a position there is no forecast, and the alert above the table says so.

Where the forecast comes from. The regulator fetches it straight from Open-Meteo, a public weather service. That request carries your latitude and longitude to their servers, and it repeats every few hours while Defer to Solar is on. This is a separate path from Cloud Features — the fetch continues whether Cloud Features is on or off. Turning Defer to Solar off is what stops it. If you would rather your position never leave the boat, leave Defer to Solar off.

When it refreshes. The download needs the field off for about 75 seconds, so the forecast updates while you are not charging — at anchor, or between engine runs. On a long motoring day the numbers above can be hours old; the line under the table tells you exactly how old. "Update Weather Now" forces a fetch on demand.

How it checks itself. Every day the regulator books what the forecast promised, what the panels delivered over VE.Direct, and what the boat consumed (from the battery shunt). With Learn Performance Ratio on, each complete day nudges the ratio toward the real array, so the forecast fits your boat rather than a typical one. With Size Threshold from Consumption on, the bar a day must clear becomes the consumption the last week predicts plus the margin, instead of a fixed number. The ledger and its chart are on Live Data, Weather.

If the forecast goes stale. A forecast the regulator can no longer refresh — no internet, Access Point mode, a run of failed fetches — stops holding the alternator off once it ages past its refresh window. Charging resumes normally, the table is marked invalid, and the pause returns on the next successful fetch.

Alarm Enable (0):
Off Armed

Alarm Status:
Silent
Temperature Alarms
Alternator
High Temp Alarm (°F) (0):

Low Temp Alarm (°F) (0):

Extra temperature probe

The Extra temperature probe is off, so these alarms cannot fire. Turn it on under Setup → Temperature → Temperature Sensors, and assign a probe the Extra role.

High Alarm (?): ℹ️On: the alarm sounds whenever the Extra probe reads above the High Alarm threshold below, provided alarms are enabled. Off: no high-temperature alarm from the Extra probe.
Off On

High Alarm Threshold (°F) (?): ℹ️Extra-probe temperature above which the High Alarm sounds. Has no effect unless the High Alarm is On.

Low Alarm (?): ℹ️On: the alarm sounds whenever the Extra probe reads below the Low Alarm threshold below, provided alarms are enabled. Off: no low-temperature alarm from the Extra probe.
Off On

Low Alarm Threshold (°F) (?): ℹ️Extra-probe temperature below which the Low Alarm sounds. Has no effect unless the Low Alarm is On.
Voltage & Charge Alarms

The Low State of Charge Alarm is greyed: state of charge needs a battery shunt and none is installed. The voltage alarms are unaffected. Setup → Battery → Measurement Sources → Battery Shunt Present.

High Voltage Alarm (0):

Low Voltage Alarm (0):

Low State of Charge Alarm (%) (0): ℹ️Sounds the alarm when the battery's state of charge falls below this percentage. Only active when the battery monitor's state of charge information is available. 0 disables.
Current Alarms

The High Current Alarm (Battery) is greyed: no battery shunt is installed, so battery current is not measured. The alternator current alarm is unaffected. Setup → Battery → Measurement Sources → Battery Shunt Present.

High Current Alarm (Alternator) (A) (0):

High Current Alarm (Battery) (A) (0): ℹ️Alarm only — never reduces the field. Fires when battery current magnitude exceeds this value in either direction, so it catches heavy discharge as well as over-charge. Separate from the Group 4 Battery Charge Current Limit (which actively caps the command); set this alarm above that limit so a correctly limited charge doesn't alarm. 0 disables.
Alarm Controls
Alarm Latch Mode (0):

Alarm Test (0):

Reset Alarm Latch:
NMEA 2000Rx ? · Tx ?

Nav, engine and battery data in and out over the 250 kbps CAN backbone. That one port is shared: the Victron VE.Can and RV-C charge limits under Battery Charge Limits over CAN below arrive on the same wire, and they are decoded whenever the receive switch here is on or the follow switch there is.

Receive NMEA2K Data (?): ℹ️Master switch for reading data from the NMEA2000 network: GPS, heading, speed, wind, depth, and battery monitors. Transmit below works even with this off.
Off On

Read Battery Instance (?): ℹ️Battery instance number of a shunt, battery monitor, or BMS on the network whose voltage, current, temperature, and state of charge this device reads - including a "virtual shunt" a managed battery publishes through a gateway. Shown below and in telemetry for reference only; charge control always runs on this device's own sensors.

Received Battery Data (no data): ℹ️Latest values read from the battery instance above. Shows "stale" when nothing has arrived for 20 seconds and "no data" when nothing has ever arrived - check that Receive NMEA2K Data is on and the instance number matches the sender.
- · - · - · SOC -

Transmit on NMEA2K (?): ℹ️Broadcast this regulator's data onto the NMEA2000 network so chartplotters and displays can show it and raise their own alarms on it. Joining or leaving the bus happens at boot, so this switch takes effect after a reboot; the message toggles below apply immediately.
Off On

Device Instance (?): ℹ️NMEA2000 device instance for this regulator. Only matters when more than one regulator shares the network — give each its own number. Applied at boot.

Transmit Status: ℹ️Address is the source address this device claimed on the network (-1 means transmit is off or no claim yet). Sent counts messages accepted for transmission; dropped counts messages discarded because the bus would not take them - a steadily climbing dropped count usually means no powered NMEA2000 network is connected. Both reset with Reset Peak Values.
address - · sent - · dropped -
Battery
Battery Status (127508 + 127506) (?): ℹ️Battery voltage, current, and state of charge as Battery Status (PGN 127508) paired with DC Detailed Status (PGN 127506). Current and state of charge are sent only when a battery shunt is configured; without one those fields read not-available.
Off On

Battery Instance (?): ℹ️Battery instance number displays use to identify this bank. Match your MFD's bank numbering, and avoid the instance of a battery monitor that already broadcasts this bank or displays will see two senders.

Battery Configuration (127513) (?): ℹ️Battery chemistry, nominal voltage, and capacity as Battery Configuration Status (PGN 127513), sent slowly for displays that show bank setup. Leave off if a battery monitor already describes this bank.
Off On
Alternator
Alternator Status (127508 + 127506) (?): ℹ️Alternator voltage, output current, and temperature as a separate DC source (PGN 127508 paired with PGN 127506, DC type Alternator). Displays list it under its own instance, so you can put alternator amps on screen and set an MFD alarm on them.
Off On

Alternator Instance (?): ℹ️DC instance number for the alternator readings. Must be different from the battery instance. Avoid 48 through 55 on a boat that also has a Wakespeed regulator — those are the instances it uses for its alternator, and two devices on the same instance talk over each other.

Alternator Temperature (130312) (?): ℹ️The alternator temperature - the same sensor your temperature alarms use - as a standard Temperature message (PGN 130312) that MFDs can display and alarm on. Transmission stops entirely while the sensor reading is missing or implausible, so an MFD data-lost alarm on this instance also catches a failed temperature sensor.
Off On

Network Label for Alternator Temp (?): ℹ️The value sent is ALWAYS the alternator temperature - this does not choose a sensor. NMEA2000's temperature message must carry one of these standard location names (its N2K temperature source) and the standard has no Alternator entry, so this picks the name displays file the reading under. Example: with Engine Room selected, your MFD shows a temperature named Engine Room at the instance below whose value is the alternator temperature - point the MFD's temperature alarm at that name and instance.

Temperature Instance (?): ℹ️Instance number the alternator temperature is sent under. Pick one no other temperature sensor on the network uses, so the network label above plus this number uniquely means the alternator.

Extra Temperature (130312) (?): ℹ️The Extra probe's temperature (assigned under Setup → Temperature) as a standard Temperature message (PGN 130312) under the network label and instance below. Transmission stops entirely while the probe reading is missing or stale, so an MFD data-lost alarm on this instance also catches a failed probe.
Off On

Network Label for Extra Temp (?): ℹ️The standard location name displays file the Extra probe's reading under (its N2K temperature source). Pick the name that matches where the probe is mounted; an MFD temperature alarm is pointed at this name plus the instance below.

Extra Temperature Instance (?): ℹ️Instance number the Extra probe's temperature is sent under. Pick one no other temperature sensor on the network uses, including the alternator temperature instance above.
Charge Stage
Charger Status (127507) (?): ℹ️Charge stage (bulk, absorption, float) and charger on/off as Charger Status (PGN 127507), so displays show what the regulator is doing. A stage change transmits promptly instead of waiting for the normal interval.
Off On

Charger Configuration (127510) (?): ℹ️Publishes field drive percentage, charger mode and enabled state as Charger Configuration (PGN 127510). Field drive is how hard the regulator is driving the alternator field, and this is the message a chartplotter or Victron system reads it from. It is the only place this regulator publishes field drive.
Off On

Charger Instance (?): ℹ️Charger instance number for this regulator. Avoid instances used by other chargers (shore charger, solar) on the network.

Charger Mode (?): ℹ️How this regulator describes itself when more than one charger shares a battery. Standalone means it is the only charger of its kind on the bus. Primary and Secondary label a lead and follower pair. This is a label published on the network only, it does not change how the regulator regulates, and it does not coordinate anything with another device.
Engine
Engine RPM (127488) (?): ℹ️Engine speed as Engine Parameters Rapid Update (PGN 127488), useful on boats with no other tachometer source on the network. Leave off if an engine gateway or NMEA2000 engine already broadcasts RPM - two senders on one engine instance confuse displays.
Off On

Engine Instance (?): ℹ️Engine instance for the RPM and engine dynamic messages. 0 is a single engine (or the port engine on twins).

Engine Dynamic (127489) (?): ℹ️Alternator voltage plus the warning flags below as Engine Parameters Dynamic (PGN 127489). Same caveat as RPM: leave off if a real engine source already transmits on this engine instance.
Off On

Engine Alarm Bits (?): ℹ️Sets the standard engine warning flags inside PGN 127489, which most MFDs turn into pop-up alarms with no setup: over temperature (a hard over-temperature cutoff or your high temperature alarm point - never normal temperature-based output reduction), low system voltage (your low voltage alarm point), and charge indicator (a protection has cut the field while the engine is running).
Off On
NMEA 0183?

NMEA 0183 has its own protected serial input and its own wires, independent of VE.Direct, so both can be connected at once. Set the speed and signal type to match your talker, then watch the sentence count under Live Data → Integrations to confirm the link before trusting anything it carries.

NMEA 0183 Data (?): ℹ️Master switch for the NMEA 0183 serial input. Off leaves the port closed and costs nothing.
Off On

Serial Speed, baud (?): ℹ️Must match the talker exactly or every sentence fails its checksum. 4800 is the standard NMEA 0183 rate used by most instruments wired direct. 38400 is the high-speed rate AIS receivers and multiplexers use. 19200 is what a YachtDevices gateway sends on its combined output. If the sentence count stays at zero, this is the first thing to change.

Signal Type (?): ℹ️Which way round the talker drives the line. Normal suits a proper NMEA 0183 / RS-232 output, where the idle state sits negative — that is what a gateway or a marine instrument sends. Inverted suits a bare 3.3 V or 5 V logic output, which idles high instead. Wrong choice looks exactly like the wrong speed: the sentence count stays at zero or the checksum error count climbs. Try the other setting before rechecking the wiring.
Victron VE.Direct?

Reads a Victron battery monitor or MPPT solar charger over the VE.Direct serial port. Live values appear under Live Data → Integrations.

VE.Direct Data (?):
Off On
Battery Charge Limits over CAN

Obeying the charge limits a managed battery, BMS or Victron GX publishes takes two parts. Pick the dialect your battery authority speaks — Victron VE.Can or RV-C — in its own card; a dialect card holds only what belongs to that dialect. Everything else is shared and lives in the Charge-Limit Follow card at the bottom of this group. Only one dialect is decoded and followed at a time.

Victron CAN (DVCC)?

Listens for the charge voltage and current limits (CVL/CCL) Victron equipment exchanges over its proprietary VE.Can messages — the coordination Victron calls DVCC. The GX device or managed battery must share this regulator's 250 kbps NMEA2000/VE.Can port, and that port has to be listening: turn on Receive NMEA2K Data in the NMEA 2000 card above, or the follow switch below. There is no bank filter here — the first device heard becomes the authority, and its address shows in the status row below.

Use as Limit Source (?): ℹ️Makes Victron VE.Can the dialect this regulator decodes and follows. Same setting as Limit Source in the shared Charge-Limit Follow card — changing it here changes it there. Only one dialect is decoded at a time, and switching starts a fresh settling period.

Victron Messages (?): ℹ️Whether Victron limit messages are actually arriving. heard = decoded within the last 20 seconds; silent = decoded earlier but nothing recently; none heard = nothing has ever decoded, so check the GX is on this same CAN backbone and that DVCC is enabled there. Only the selected dialect is decoded, so this reads "idle" while RV-C is the chosen source. The decoded numbers themselves are in the shared status row below.
—

Everything else this dialect uses is shared with RV-C and lives in the Charge-Limit Follow card below: the follow switch, decoded CVL/CCL and follow state, settling and silence times, the plausibility window, trust reset and raw frame capture.

RV-CRx ? · Tx ?

Listens for the DC Source Status messages an RV-C battery management system broadcasts on the same CAN port, and that port has to be listening: turn on Receive NMEA2K Data in the NMEA 2000 card above, or the follow switch below. RV-C messages carry a bank number, so the instance filter here selects which battery bank is obeyed — the one setting that belongs to this dialect alone.

Use as Limit Source (?): ℹ️Makes RV-C the dialect this regulator decodes and follows. Same setting as Limit Source in the shared Charge-Limit Follow card — changing it here changes it there. Only one dialect is decoded at a time, and switching starts a fresh settling period.

RV-C Battery Instance (?): ℹ️For the RV-C source: the battery bank number to obey. 1 is the main house bank by RV-C convention; 0 obeys whichever bank is heard. This setting is ignored with the Victron source, where the first device heard becomes the authority and is shown in the status row.

RV-C Messages (?): ℹ️Whether RV-C limit messages are actually arriving. heard = decoded within the last 20 seconds; silent = decoded earlier but nothing recently; none heard = nothing has ever decoded, so check the sender is on this CAN backbone and that the battery instance above matches the bank it broadcasts. Only the selected dialect is decoded, so this reads "idle" while Victron VE.Can is the chosen source. The decoded numbers themselves are in the shared status row below.
—

Transmit RV-C (?): ℹ️Publishes this regulator onto the CAN port as an RV-C charging source, so RV-C displays and battery systems can see the alternator the same way they see a converter or solar controller. RV-C shares the wire and the address with NMEA 2000, so nothing extra is wired and nothing else has to be turned off. Joining the bus happens once at startup, so a reboot is needed after switching this on. Off by default: on a purely NMEA 2000 boat there is nothing listening.
Off On

Charger Messages (?): ℹ️Charger Status, Charger Status 2, Charger Status 3 and Charger Configuration Status. Between them they carry the voltage and current being aimed for, the voltage, current and temperature actually measured at the alternator, the charge stage, whether output is being held back and why, and the battery type, bank size and alternator rating.
Off On

DC Source Messages (?): ℹ️DC Source Status 1, 2 and 3, published for the alternator as its own DC source: its voltage, output current and temperature. This regulator never publishes DC Source messages for a battery bank — that is the battery monitor's or BMS's job, and two devices describing one bank is how displays end up showing the wrong number.
Off On

Fault Messages (?): ℹ️The RV-C diagnostic message: a red or yellow fault flag plus a code naming what failed and how. It reports the protection cuts — over voltage, over current, alternator over temperature, a sensor that stopped updating or disagrees with its partner, an implausible tachometer reading, a bank too cold to charge — and repeats every five seconds when nothing is wrong so a display can tell a healthy regulator from a missing one. Deliberate states are never faults: switched off, manual mode, engine below the minimum speed, a solar rest, or a BMS withholding permission.
Off On

RV-C Charger Instance (?): ℹ️Which charger this regulator calls itself in its RV-C messages. 49 marks it as an alternator: the upper digit of the number is a charger type, 3 meaning engine alternator, and the lower digit is the charger number. Change only if another alternator regulator on the same bus already claims it — a Wakespeed WS500 at its own default lands on 48.

RV-C DC Source Instance (?): ℹ️The DC source number the alternator is published under. 1 to 4 are reserved by RV-C for battery banks — house, chassis start, second house, generator start — so the default of 5 keeps the alternator clear of them. Anything from 5 up is free for other sources.

RV-C Device Priority (?): ℹ️How much weight a display gives this regulator's numbers when more than one device describes the same DC source. RV-C ranks by this number: 120 a battery management system, 100 an inverter/charger, 80 a charger, 40 a meter. 80 is correct here, and keeps a real BMS ahead of this regulator wherever both are heard.

Everything else this dialect uses is shared with Victron VE.Can and lives in the Charge-Limit Follow card below: the follow switch, decoded CVL/CCL and follow state, settling and silence times, the plausibility window, trust reset and raw frame capture.

Charge-Limit Followsharedoff

Everything here applies to whichever dialect is selected above — Victron VE.Can or RV-C — and the status row shows what that dialect has decoded. Received limits are requests: they can only lower this regulator's own targets, never raise them, and every local protection stays fully in charge.

Follow External Charge Limits (?): ℹ️Obey the charge voltage and current limits (CVL/CCL) a battery management system or gateway publishes on the NMEA2000 port — the coordination Victron calls DVCC. Received limits are requests: they can only lower this regulator's own targets, never raise them, and every local protection stays fully in charge. A new authority must send steady, plausible values for the settling time before its limits apply. If no limits ever arrive, or the sender goes silent, this regulator falls back to its own targets and a warning strip appears at the top of the dashboard — charging is never left ungoverned, but the sender is not the backstop it would be while following. A current limit of 0 A is obeyed as "stop charging" — that is the battery's strongest command. While a lower external voltage limit is in control, the internal bulk/absorption/float progression pauses and resumes when the limit releases. Leave this off to simply watch the decoded limits below and confirm they match what your BMS or GX displays.
Off On

Charge Limit Status (off): ℹ️Live decoded limits and the follow state. off = follow disabled (decoded values still shown for verification); waiting = no limit messages heard; settling = values arriving and being vetted; following = limits actively clamping; stale = the authority went silent, so this regulator's own targets resumed; UNTRUSTED = an implausible or flapping value was received and the sender is ignored — control is fully local until the trust latch is reset below. Greyed when nothing has arrived for 20 seconds. Before enabling follow, confirm these numbers match what the BMS or GX itself displays.
CVL - · CCL - · from -

The trust latch is not set, so there is nothing to reset. This button becomes live if the charge authority sends implausible values and the regulator stops following it.

Reset Trust Latch: ℹ️Clears the untrusted latch after you have investigated why the authority sent implausible values — something is wrong in the system when this trips, so find the cause first. The authority must settle again before being followed. Turning the follow switch off and on, or rebooting, also clears the latch.

Limit Source (?): ℹ️Which dialect the battery authority speaks. Victron VE.Can listens for the charge limits Victron equipment exchanges over its proprietary messages — the GX device or managed battery must share this same 250 kbps backbone, and the decode should be verified against your system (watch the status row above) before follow is enabled. RV-C listens for the DC Source Status messages an RV-C battery management system broadcasts. One authority is followed at a time; there is no automatic scanning across dialects.

Silence Timeout (s) (?): ℹ️How long without a valid limit message before this regulator stops following and returns to its own targets, through the normal rate-governed ramp. When messages resume, a fresh settling period runs before limits apply again.

Settling Time (s) (?): ℹ️How long a new authority must send steady, in-range values before its limits are obeyed. Prevents acting on a glitch, a mid-boot partial configuration, or a device that has only just appeared on the network.

Voltage Limit Plausibility Min (V) (?): ℹ️Lower edge of the believable window for a received charge voltage limit. A value below this marks the sender untrusted and control stays fully local until the trust latch is reset — one bad message must never move a target. Scales automatically on a system voltage class change.

Voltage Limit Plausibility Max (V) (?): ℹ️Upper edge of the believable window for a received charge voltage limit. A value above this marks the sender untrusted — a charge limit can never raise targets regardless, but a device publishing nonsense is not trusted for anything, including its current limit. Scales automatically on a system voltage class change.

Raw Frame Capture: ℹ️Opens the raw candidate frames heard on the network as plain hex text — everything in the charge-limit ranges, deduplicated. Used to verify limit decoding against your exact equipment: copy the text and send it to support when setting up a new battery system. Capture runs whenever NMEA2K receive or follow is on and never touches charge control.
Minimal BMS On/Off Control

One wire from a battery management system (BMS) that says charge, or don't — any BMS with a spare relay or a charge-enable output can drive it. The BMS applies 5 to 28 V to the BMS on/off wire (Cable 1, pin 16) and the regulator takes that as permission to charge.

If your BMS or Victron GX also publishes charge limits on the CAN backbone, use Battery Charge Limits over CAN above as well: those limits taper the charge, this wire is a full stop. Both can be connected at once, and the stop wins.

Use BMS On/Off Signal (?):
Off On

Charge When Signal Is (?): ℹ️Present charges while your BMS applies 5 to 28 V and stops when the wire goes dead, so a cut or unplugged wire reads as stop. Absent inverts it, for a BMS whose output energizes to signal a fault.

Signal at Input (?):
-
Data & Communication
Time Source (?): ℹ️ Where the clock comes from. This is the time only — position has its own setting under Setup ▸ Boat, so this device can set the clock without sharing where you are.
Auto: NMEA 2000 time when present, this device (the phone or computer running the app) next, internet time last.
NMEA only / This device only / NTP time only: force one source.
In access-point mode this device is the only clock available — there is no internet and usually no bus.

Cloud Features needs an internet connection, and the regulator is running as its own access point. The switch below is greyed until it is joined to a WiFi network with internet.

Cloud Features (?):
Off On

Remote Diagnostics (?): ℹ️When you ask X Engineering for help, support can request this regulator's log files. Whatever device has this app open checks for such a request about once a minute and, if one is waiting, gathers the logs from the regulator and uploads them. Off stops the checking. Nothing is ever requested unless you have asked for support.
Off On

WiFi Standby keeps the regulator reachable on your boat’s router between engine runs. In access-point mode there is no router to stay joined to, so it is greyed. Join a WiFi network above to use it.

WiFi Standby (Keep Reachable) (?): ℹ️When the engine is off, the regulator normally shuts WiFi off completely to save power, and you must press the wake button (or switch the ignition on) to reach it. Turn this On and it instead keeps WiFi connected to your boat's router in a low-power napping state, so you can open the dashboard any time with no button press. It uses only about a milliamp more than full-off, so it can stay reachable indefinitely while the regulator is on your router.
Off On
This Regulator
Name: ℹ️ The name saved on this unit, under Setup ▸ Vessel Info. An unnamed unit shows the name it makes from its own hardware ID.
—

Address: ℹ️ This unit's own network name. Every regulator also answers to alternator.local, so on a boat with two, that shared name can reach either one — this address reaches only this unit.
—

Unit ID:
—

Connect To: ℹ️ Scans for every regulator on this network and lets you pick which one to use. The app reconnects to that unit by identity, so a changed IP address or a second regulator appearing cannot swap it out; a browser moves to that unit's own address.
Regulators on This Boat
Add a Regulator: ℹ️ Lists the other regulators on this network so you can mark one as part of this boat. Paired units are shown together, and first, whenever the dashboard asks which regulator to use, and a stranger's unit on shared marina WiFi is never mixed in with them. Both units remember the pairing; Remove takes it off both.
Settings Password
Password for Changes (?): ℹ️ Off: anyone on the same network can press Unlock Settings and change anything, which is fine on a boat's own WiFi. On: Unlock Settings asks for this password first, and the unlock belongs to the phone or browser that typed it. Live readings stay visible either way, and turning the alternator off never needs a password. Each device remembers the password after its first unlock. If it is lost, ground pin 11 at boot: that clears it along with the WiFi credentials.
Display Preferences
Dark Mode:
Off On

Temperature Units: ℹ️ Choose Fahrenheit or Celsius for all temperature displays and form inputs. Setting is saved on the device.

Fuel Volume Units: ℹ️ Choose US gallons or litres for the fuel table, the live burn and economy readouts, and the fuel-used totals. Setting is saved on the device. The regulator stores fuel in its own units either way, so switching never changes a stored value.

Dashboard Update Rate (ms) (?): ℹ️ How often the dashboard receives fresh sensor data, in milliseconds (default 100 ms ≈ 10/s). Affects the display only, not how the regulator controls the alternator.

Advanced — not recommended. Several display features assume the default rate; changing it has downstream effects (plot spacing, buffer windows) that may need firmware changes to track correctly. Leave at default unless you know why you're changing it.

Fast Channel Plot Sampling (?): ℹ️ Several signals are measured far faster than the dashboard send rate, so each sent point can only represent one instant of that window. This selects what that point reports: Average takes the mean of the window (smoothed, anti-aliased); Max reports the largest-magnitude sample so brief peaks and spikes are not missed. Max applies to the battery voltage, battery current, and alternator current traces and readouts; the other averaged channels stay on the mean either way.

Diagnostic. Max makes those readouts show the window peak rather than the present value, and it corrupts Voltage Control Autotuning — use Average for normal operation and commissioning.
Emergency Overrides
⚠️ Caution!
These settings are dangerous and for expert use only.
Ignition Override (0): ℹ️ Auto follows the physical ignition wire (the normal setting). Force On ignores the wire and treats the ignition as always on — for bench testing or when no ignition wire is connected. It keeps WiFi up and can energize the field with the engine off, which drains the battery, so leave this on Auto in normal use.
Auto Force On

Hardware Present? (?): ℹ️ When lacking wiring harnesses, this mode will fake data inputs to allow interface testing.
No Yes

Ignore Alt Temp (0): ℹ️ For emergency use, if temp sensor is bad
No Yes

Ignore RPM (0): ℹ️ For emergency use only. Bypasses the RPM gate (Min RPM For Field, under Setup → Alternator → Output Control) — field will be enabled regardless of RPM. Use if RPM sensor is absent or malfunctioning.
No Yes

Limp Home Mode (?): ℹ️ DO NOT USE CASUALLY. Will ignore all sensors and set a field of 30%, even with IGNITION OFF! Hardware Over-voltage protection is still active.
Off On
Protection Actuation Tests
⚠️ Fires a real field collapse
Deliberately trigger a field collapse to reproduce an electrical fault in a controlled way. The normal Live Data plots, CSV, and Console capture the transient. One test runs at a time.
1. Manual Bench Testing
For a manually-set field on the bench (Manual Field driving a power resistor). Hard-cuts the field you already set — no auto-energize. Turn Manual Field ON first; Ignore RPM is fine. In manual mode the regulator's own lockout is bypassed, so the cut duration below is what sets the off-time. Set the values, then press Fire.
Cut duration (ms) (?): ℹ️ How long the field-enable line is held open (a true hard cut) before your manual field is restored. In manual mode the regulator's adaptive lockout ladder is bypassed, so this fixed hold gives a clean, repeatable off-time. On release the field ramps back up at Duty Ramp Rate.

Repeats (?): ℹ️ How many cut / restore cycles to run (1-20). Applies to both the manual cut and the auto Ladder Walk below.

Gap between cuts (ms) (?): ℹ️ For repeated cuts, how long the field is left restored (energized) between cuts so it can ramp back before the next one — set it longer than the field takes to recover.

Manual field hard cut: ℹ️ Fires immediately. Drives the field-enable line open (the same hard chop as a fast over-voltage cut) against the field you set manually, holds it for the cut duration, then restores your manual field and ramps it back at Duty Ramp Rate. Requires Manual Field ON. Works with Ignore RPM on.

2. Engine Running (auto mode)
For a running engine in AUTO mode. Each Fire button first ramps the field up to the test current through the real current loop, holds until it settles, then triggers the protection. Refuses to start unless in AUTO with charging enabled and RPM above Min RPM For Field, so it can never chop into a dead field.
Test current (A) (?): ℹ️ The field is driven up until the alternator delivers this output current (through the real current loop) and held until settled before the selected protection fires, so there is always real field current to collapse. "auto" picks a moderate level at fire time; enter 0 to return to auto.

Instant field cut (hard over-voltage path): ℹ️ Fires immediately. The field-enable output is driven low instantly (open driver) and the field freewheels through the flyback diode, then the adaptive lockout ladder arms — identical to a genuine fast over-voltage event. This is the prime suspect for a hardware electrical problem: it is the same instant chop shared by the fast over-voltage, low-RPM, implausible-tach, hard over-current, critical-temperature, and stale-sensor cuts.

Load-dump collapse: ℹ️ Fires immediately. The field-enable output stays on but the commanded current snaps to zero and the inner current-loop integrator is dumped — the fastest commanded field collapse (duty driven to the minimum-duty floor). Electrically distinct from the instant cut above, which opens the driver entirely.

Graceful ramp-to-zero: ℹ️ Fires immediately. Eases the field down at the normal protection ramp rate (Duty Ramp Rate) instead of chopping it — the clean control case. If the instant cut or load-dump reproduces the fault but this does not, the electrical problem is in the abrupt collapse, not the shutdown itself. Stands in for the softer warning ramps: cold-charge lockout, temperature warning, and voltage-disagreement.

Ladder walk (repeated cuts): ℹ️ Fires immediately. Fires the instant cut, waits out the lockout, lets the field re-energize, and repeats (uses the Repeats value above) — climbing the adaptive lockout ladder (about 0.5 s escalating to 10 s, 3 cuts per rung; set Repeats to 16 to walk every rung up to the 10 s cap). Exposes the re-energize (restart) transient at each rung.

Abort running test:
Security & Maintenance
Physical Panel Override (?): ℹ️ Chooses who sets the charge rate and Force "Maintain Mode": this app, or the two switch-panel wires on data Cable 3 (Charge Rate on pin 5, Force Float on pin 7).

Off — this app decides both modes. The wires are still read and reported below, but they change nothing.

On — the panel decides both modes, and the matching controls in this app grey out and stop having any effect. Charge Rate: switch on = High, switch off = Low. Force Float: switch on = Force "Maintain Mode", which still needs a battery shunt and still yields to Target Voltage mode.
Off On

Charge Rate Wire (?): ℹ️Live state of the Charge Rate switch wire (data Cable 3 pin 5). Energized means 5 to 28 V is present at the wire, which is the panel switch turned on, asking for the High charge rate. Read at all times, so you can prove the wiring before the switch is given any authority.
-

Force Float Wire (?): ℹ️Live state of the Force Float switch wire (data Cable 3 pin 7). Energized means 5 to 28 V is present at the wire, which is the panel switch turned on, asking for Force "Maintain Mode". Read at all times, so you can prove the wiring before the switch is given any authority. Force "Maintain Mode" needs the battery shunt and yields to Target Voltage mode.
-

Lock Settings:

Erase All Memory: ℹ️ Scorched-earth reset. Erases all settings, WiFi credentials, calibration data, and buffered logs. The cloud registration token is deliberately preserved so your cloud account and history stay intact — after reconnecting WiFi, cloud features resume automatically. To also delete your cloud account, press Delete My Account first. Device restarts into WiFi config mode; you will need to re-enter your WiFi network name and password before the regulator will operate again.
Recommend Initial Charging Settings

Works out starting values for the charge stages, the current limits and the over-voltage protection ladder from the battery type, capacity and system voltage on file under Vessel Info. Every row is listed with its current value beside the recommendation and you choose which ones to apply. Nothing changes until you press Apply Selected.

Configuration Backup & Sharing


Position, Speed & Course Sources ℹ️Where the regulator gets the boat's position, speed and course. The phone can stand in for a missing NMEA 2000 GPS. The clock has its own separate setting under Setup → System, so you can let the phone set the time without sharing position.


Position Source (?) — live: ?: ℹ️ Where latitude and longitude come from. Position drives distance logged, anchorage detection, and the solar forecast.
Backup (the default): NMEA 2000 when present, this phone when the bus is silent or absent. While NMEA GPS is live the phone is never read at all.
NMEA 2000 only: never use this phone, even with no other GPS aboard. Choose this to keep your phone's location entirely out of it.
This phone only: ignore NMEA even when it is present.
Forcing a stale source still shows its last value (greyed) so you can diagnose.
Note: a position typed manually in Setup ▸ Solar overrides every option here until you clear it there.

Speed / Course Source (?): ℹ️ Which source owns speed over ground and course: the NMEA 2000 bus, or this app's phone GPS. The phone is never used automatically — only when selected here.
With Phone GPS selected, the app streams GPS fixes to the regulator about every 2 seconds, and keeps doing so with the app in the background or the screen locked. Battery drain is substantial with GPS running full-time.
Speed records set while Phone GPS is selected are flagged in cloud uploads and excluded from the speed leaderboard.

Performance Learning ℹ️Settings for the best-ever boat-speed learning system. The live polar / motoring display is under Live Data → GPS/Travel/Wind.


Speed source ℹ️Which boat-speed to learn from. Water (STW, from a paddlewheel/log) removes current. GPS (SOG) is always available but a current makes you read fast or slow. Switching source wipes all learned data (same as Clear All).

Polar symmetry ℹ️Symmetric folds port and starboard together (|wind angle|) at display + scoring time — fills the polar twice as fast and assumes the boat sails the same on both tacks. Both tacks keeps them separate (for a lopsided rig or instrument offset). Raw both-sided data is always stored either way.

Reference ℹ️Learning keeps updating the best-ever reference as conditions are sailed. Frozen holds the current (or loaded) reference so it stops changing — useful to keep a known-good baseline while comparing.

Simulator ℹ️Injects synthetic sailing/motoring data for bench testing without a boat. Leave off on the water.

Learned data ℹ️Clear All erases every learned point in both the sailing and motoring maps and zeroes the best surface points and hours counters. Use after a major rig, sail, or propeller change. Cannot be undone.

Tuning

A reading is only banked when conditions hold steady. Most inputs below come as a pair: a band (how much that value may drift) and a steady time (how long it must stay inside the band before the reading counts). Tighter bands and longer times give fewer but cleaner points.

Wind-speed band (kt) (?) ℹ️Max apparent-wind-speed spread allowed within a steady run. Wider accepts more data but blurs the map.

Wind-speed steady time (s) (?) ℹ️How long the apparent wind speed must stay within its band (above) before the run is banked.

Wind-angle band (°) (?) ℹ️Max change in apparent wind angle allowed within a steady run. Wider accepts more data but blurs the polar.

Wind-angle steady time (s) (?) ℹ️How long the apparent wind angle must stay within its band before the run is banked.

Sea-state band (° pitch std) (?) ℹ️Max change in sea-state (pitch standard deviation) allowed within a steady run.

Sea-state steady time (s) (?) ℹ️How long the sea state must stay within its band before the run is banked.

Sea-state window (s) (?) ℹ️Rolling window the pitch-standard-deviation NUMBER is computed over (default 20 s — long enough to span many wave cycles). Different from the steady time above.

Motoring RPM band (?) ℹ️Max change in engine RPM allowed within a steady motoring run. Wider accepts more data but blurs the speed-vs-RPM curve.

Motoring RPM steady time (s) (?) ℹ️How long the engine RPM must stay within its band before a motoring run is banked.

Headwind band (kt) (?) ℹ️Motoring: max change in the apparent headwind component (wind speed × cos angle) within a steady run.

Headwind steady time (s) (?) ℹ️How long the headwind must stay within its band before a motoring run is banked.

Min boat speed (kt) (?) ℹ️Below this speed the boat isn't really under way, so nothing is learned — keeps drifting and maneuvering out of the maps.

Min wind speed (kt) (?) ℹ️Below this apparent wind speed, sailing data is ignored — too little wind to learn a meaningful polar.

Engine-off RPM threshold (?) ℹ️Below this alternator RPM = sailing; above = motoring. Splits which front a run feeds.

Safety margin (kt) (?) ℹ️Biases the keep test toward keeping a point — a kept non-best is pruned by the cloud, a wrongly-discarded best is lost until it recurs.

Interpolation power (IDW) (?) ℹ️How the maps estimate speed between learned points (inverse-distance weighting). Higher = the nearest points dominate (sharper, more local); lower = smoother blending across conditions.

Prune neighbors (k, cloud) (?) ℹ️How many nearby points the cloud checks when deciding to drop a redundant one. Higher keeps the maps denser; lower trims more aggressively. Applied in the cloud, not on the device.

Reference validity radius (?) ℹ️How close (in normalized axis units) the nearest recorded point must be for the % of best to be trusted. Operating farther than this from everything recorded shows "No reference here yet" instead of comparing against a guess.

Local fit stiffness (?) ℹ️How strongly the local trend fit (the once-per-second % of best comparison) is held flat when the recorded points around the live point line up poorly. Higher = steadier; lower = follows the records more exactly. Default 0.10.

Learning-state risk threshold (?) ℹ️How much could-be-wrong (as a fraction of the predicted speed) is tolerated before the panel says "Learning this operating region" instead of showing a %. Raise to show numbers in more conditions at the cost of less trustworthy ones. Default 0.15.

Motion Events

Capsize Threshold (degrees) (?):

Pitchpole Threshold (degrees) (?):

Slam Threshold (g's) (?):

Alternator Current

0 A ↑— ↓—

Temperature

Alternator 0 °F ↑— ↓—
Thermistor 0 °F
Since Last Overheat ℹ️Hours elapsed since the last overheat event. Stays at 0.00 if this alternator has never overheated — the clock only starts once an overheat is actually recorded. Resets to zero on reboot, on any new overheat, and when overheat history is cleared. Does not persist across power cycles. — hr

Field Control

Command Field Duty Cycle 0 %
Field Volts (Calc'd) ℹ️Not measured — calculated as commanded duty cycle × battery voltage. It tracks the command, so it will not show a fault in the field wiring or the drive stage. 0 V
Field Amps (Calc'd) ℹ️Not measured — calculated as Field Volts divided by the entered field resistance of ? Ω, adjustable in Settings → Alternator → Basic → Output Control → Field Resistance. Real field resistance drifts 10–20% with rotor temperature, so treat this as an estimate. 0 A

Alt Current Zero Offset (Auto-Learned)

0.00 A

Statistics

Energy Output
Lifetime 0kWh
Session 0kWh

Fuel Consumed ℹ️ Assumes 15% system efficiency (diesel engine and electrical machine combined)
Lifetime 0gal
Session 0gal

Field On Time
Lifetime 0H:M:S
Session 0H:M:S

Max Current
Lifetime 0A
Session 0A

Max Temperature
Digital Sensor
Lifetime 0°F
Session 0°F
Thermistor
Lifetime 0°F
Session 0°F

No battery shunt is installed, so battery current, state of charge, time-to-full and the coulomb count cannot be measured and are not shown. The voltage readings below are unaffected. Setup → Battery → Measurement Sources → Battery Shunt Present.

State of Charge

0 % ↑— ↓—

Voltage

Battery Voltage (INA) ℹ️ Measured by INA228 uC - primary source 0 V ↑— ↓—
Battery Voltage (ADS) ℹ️ Measured by ADS1115 uC - for redundancy 0 V

Charging Mode

-

Current

Battery Current 0 A ↑— ↓—

Temperature ℹ️The battery temperature the regulator is using and where it comes from: the battery probe, NMEA 2000 battery status, a VE.Direct monitor, or an RV-C source. The source is chosen under Setup → Battery → Battery Temperature. Greyed when the active source has stopped reporting.

Battery Temperature — °F ↑— ↓—
Source none

Charge/Discharge Time

Time to Full Charge 0
Time to Full Discharge 0

SOC Gain Factor (Auto-Learned)

1.000

Energy and Statistics

Energy
Charged
Lifetime 0kWh
Session 0kWh
Discharged
Lifetime 0kWh
Session 0kWh

Voltage
Maximum
Lifetime 0V
Session 0V
Minimum
Lifetime 0V
Session 0V

Average State of Charge
0%

Charge Cycles
Lifetime 0
Session 0

Apparent Wind ℹ️ Wind as measured on the boat (includes boat motion). The needle points to the apparent wind angle off the bow; the two screens read apparent speed and angle.

SPEED kt 0.0 ANGLE 0°
—
Gust
—
Lull
—
True dir
—
True spd
—

Wind Trend ℹ️ Direction (left axis) and speed (right axis) over the last hour, so you can see wind shifts and gust trends. Toggle between true and apparent wind. The Beaufort force and gale duration (from the 2-minute sustained true wind) show as a watermark.

Source
Window
Direction --° Speed -- kt
Barometric Pressure ℹ️ Sea-level barometric pressure (mbar — the unit used by the BBC Shipping Forecast, NOAA marine VHF, and most marine instruments; 1 mbar = 1 hPa exactly). Sampled every 10 minutes into a 7-day PSRAM ring buffer, persisted to NVS only at the field-off edge (no impact on loop timing). Forecast uses the Zambretti algorithm (1915, refined 1985) when true wind direction (NMEA2k) and GPS latitude are both fresh — it combines current pressure, 3-hour tendency, wind direction, and hemisphere/season into one of 26 outcomes. When either is stale, it falls back to a simpler tendency-only rule based on the UK Met Office Shipping Forecast Glossary (Steady / Rising slowly / Rising / Rising quickly / Rising very rapidly, thresholds 0.1 / 1.5 / 3.5 / 6 mbar over 3 h). History older than 7 days is available in your cloud storage.
Zone
—
—
Current
— mbar
↑— ↓—
3-Hour Tendency
— —
Forecast Method
—
—
—
NMEA 2000

Received Battery Data (no data) ℹ️Latest values read from the battery instance set in Setup → Integrations. Shows "stale" when nothing has arrived for 20 seconds and "no data" when nothing has ever arrived - check that Receive NMEA2K Data is on and the instance number matches the sender.

Voltage —
Current —
Temperature —
State of Charge —

Transmit Status ℹ️Address is the source address this device claimed on the network (-1 means transmit is off or no claim yet). Sent counts messages accepted for transmission; dropped counts messages discarded because the bus would not take them - a steadily climbing dropped count usually means no powered NMEA2000 network is connected. Both reset with Reset Peak Values.

Claimed Address —
Messages Sent —
Messages Dropped —
NMEA 0183

Serial Link (no data) ℹ️Proof the wiring and the port settings are right, independent of what any sentence carries. Sentences counts every message that arrived complete and passed its checksum, whatever its type - if this climbs, the link works. Checksum errors climbing while sentences stays at zero means the speed or the signal type is wrong; both are set under Setup → Integrations → NMEA 0183. Both counts reset with Reset Peak Values.

Sentences Received —
Checksum Errors —
Drain Time, Worst —

Heading ℹ️A worked example of decoding one signal off this port - it reads HDT, THS, HDM and HDG sentences. It is shown here only, and is deliberately kept separate from the heading on the Boat tab, which comes from NMEA2000. Nothing on this regulator steers, navigates or charges by it.

Heading —
Reference —
Victron VE.Direct

Battery Monitor

Victron Battery Voltage ℹ️ Available if VE.Direct Data is turned on in Setup→Integrations 0 V
Victron Battery Current 0 A

Solar (Victron MPPT)

Solar Power ℹ️ Live solar panel power from a Victron MPPT over VE.Direct (PPV). Available if VE.Direct Data is turned on in Setup→Integrations. 0 W
Solar Voltage 0 V
Solar Current 0 A
Charge State —
Tracker Mode —
Charger Error —
Yield Today 0 kWh
Max Power Today 0 W
Yield Yesterday 0 kWh
Max Power Yesterday 0 W
Charge-Limit Follow

Charge Limit Status (off) ℹ️Live decoded limits and the follow state. off = follow disabled (decoded values still shown for verification); waiting = no limit messages heard; settling = values arriving and being vetted; following = limits actively clamping; stale = the authority went silent, so this regulator's own targets resumed; UNTRUSTED = an implausible or flapping value was received and the sender is ignored — control is fully local until the trust latch is reset in Setup → Integrations. Greyed when nothing has arrived for 20 seconds. Before enabling follow, confirm these numbers match what the BMS or GX itself displays.

Charge Voltage Limit (CVL) —
Charge Current Limit (CCL) —
Source Dialect —
Sender Address —
Solar Energy Ledger

Today ℹ️Harvest: what the forecast promised for today, frozen the evening before (the number Defer to Solar was acting on overnight), against what the panels have delivered so far over VE.Direct. Consumption: what the last week of history predicted for today against what the boat has drawn so far — alternator plus solar plus battery discharge, minus battery charge, which needs the battery shunt. A dash means the value is not measurable on this install or there is no history yet.

Predicted Harvest — kWh
Harvest So Far — kWh
Predicted Consumption — kWh
Consumption So Far — kWh
Performance Ratio ℹ️Fraction of the array's nameplate the forecast is scaled by. Learned from complete days when Learn Performance Ratio is on (Setup, Solar). —
Complete Days on Record —
Awake Today —

Predicted vs Actual, by Day ℹ️Bars are what happened; the line with points is what was predicted the evening before. Days the regulator was awake under 20 hours are drawn but do not feed the learned ratio or the consumption prediction. A missing bar means that quantity was not measurable that day (no VE.Direct link, no battery shunt); a missing point means there was no forecast or no history to predict from.

Window

Speed ℹ️Best-ever boat speed versus the wind (Sailing) or engine RPM (Motoring), corrected for sea state — how much the boat pitches. Predicts speed through the water, or GPS speed if no log. Curve = learned best; the "now" dot is your current speed — green while it is being recorded into the learned best (a steady run), orange while conditions are still settling. A sustained drop below best = dirty bottom or adverse current.


Apparent wind
—
—
KNOTS
Sea state
—
—
of best
—
best surface points
—
sailing hours
How it works

What it measures. The fastest boat speed achieved for the conditions — apparent wind speed and angle when sailing, engine speed (RPM) when motoring — corrected for sea state (measured as how much the bow pitches) and wind. A sustained shortfall against best may point to a dirty bottom, poor sail trim, or adverse current (if not using STW).

Learned on the device. Steady-state capture runs about 10 times a second; the % of best comparison runs once per second. Instead of averaging nearby records (which reads falsely low at the edge of the conditions sailed so far), it fits the local slope of the best-ever surface through the nearby records and compares the present speed against that fit. The label under the % says what the comparison is based on — MEASURED (a recorded best exists for these conditions), ESTIMATED (interpolated between nearby records), or "learning" / "no reference" when there isn't enough recorded here to grade fairly (no number is shown). Two surfaces are learned independently: a sailing polar and a motoring speed-vs-RPM map.

Reading the plot. The blue curve is the learned best. The moving dot is your current speed for the conditions right now: it turns green once conditions have held steady long enough that the point is being recorded into the best (a steady run), and orange while conditions are still settling and nothing is being recorded yet. The status by the title mirrors this — Settling with a countdown of the seconds left before recording begins, then Settled once it does.

Pruned in the cloud (optional). About every 15 minutes, engine off and system online, new points upload and the cloud prunes redundant interior points back to the envelope, then returns the cleaned set.


Learning — ℹ️Turn off to stop learning while under tow, or in strong current with no water-speed log, so bad data can't poison the map. Stays off across reboots.

Quick View

Speed (SOG) ℹ️SOG is GPS speed over ground — includes current and tide. STW is speed through the water from a paddlewheel/log (excludes current); shows "—" when no log is connected.
0 kts
↑—↓—
STW — kts
Engine Speed
0 rev/min
↑—↓—
Water Depth ℹ️Depth at the transducer (NMEA2k PGN 128267, incl. transducer offset if reported). "—" when no depth sensor is broadcasting. Feeds the Deepest Anchorage leaderboard.
— ft
Fuel
— gal/hr
— naut mi/gal
VMG Upwind ℹ️Speed made good to windward (toward the true wind). Positive = gaining ground upwind. Needs true wind angle and boat speed.
0 kts↑— ↓—
Leeway ℹ️Heading minus COG. Positive = drifting to starboard, negative = drifting to port.
0 °
Heel Angle
0.0 °↑— ↓—
Pitch Angle
0.0 °↑— ↓—
Fuel Economy vs RPM (this session)

Fuel Economy vs RPM (this session) ℹ️ Observed naut mi/gal at each RPM, this session only. A point is recorded only after RPM and boat speed hold steady for 40 s (so the boat has reached true steady speed for that throttle), then the next 20 s of economy is averaged in. The peak is your most efficient cruise RPM. Cleared on reboot, on Reset, or when the fuel table is edited.

Most efficient so far: —

Heading, GPS & VMG

Heading & Course

Heading 0°
Course Over Ground (COG) 0°

GPS Position —

Latitude 0°
Longitude 0°
# Satellites 0

VMG (Manual Bearing)

VMG — Manual Bearing ℹ️ Speed made good toward your manual target bearing (set below). Positive = getting closer, negative = getting farther away. 0 kts ↑— ↓—
Manual Bearing (-1)° ℹ️ Enter compass heading you want to sail toward (0-359°). Set to -1 to disable.

Comfort & Motion

Motion

Total Acceleration 0.00 g
Yaw Rate 0.0 °/s
Vertical Acceleration 0.00 g ↑— ↓—

Anchorage Comfort

Anchorage Comfort ℹ️Comfort score at anchor on a 0–100 scale (100 = flat calm). Based on rolling (heel deviation, 65% weight) and hobby-horsing (pitch deviation, 35% weight) over the last 60 seconds. Full penalty at 12° heel deviation or 8° pitch deviation. Grayed out underway — contextually meaningful only at anchor. Motion history resets on departure so passage data never skews the score. Activates below 1.3 kt. -- / 100
Roll Deviation (2 min) ℹ️Peak-to-peak heel (roll) deviation over the last 2 minutes. Measures how much the boat rolls side to side at anchor. Color coded: green = comfortable, yellow = moderate, red = uncomfortable. Grayed out underway. -- °
Pitch Deviation (2 min) ℹ️Peak-to-peak pitch (fore-aft) deviation over the last 2 minutes. Measures how much the boat hobby-horses at anchor. Color coded: green = comfortable, yellow = moderate, red = uncomfortable. Grayed out underway. -- °
Yaw Swing (2 min) ℹ️Peak-to-peak heading swing over the last 2 minutes from the NMEA2000 compass. Shows how much the boat swings on its anchor rode. "--" if no compass data. Color coded: green = steady, yellow = moderate swing, red = wide swing. Grayed out underway. -- °

Sea State Hours (Lifetime) ℹ️Cumulative hours bucketed by Motion Sickness Index and speed (moving = SOG ≥ 1.5 kt). Buckets: Gentle (MSI < 10), Moderate (10–30), Rough (30–70), Extreme (MSI ≥ 70). Logged once per minute.

Moving — Gentle 0.0 hr
Moving — Moderate 0.0 hr
Moving — Rough 0.0 hr
Moving — Extreme 0.0 hr
Stationary — Gentle 0.0 hr
Stationary — Moderate 0.0 hr
Stationary — Rough 0.0 hr
Stationary — Extreme 0.0 hr

Passage Comfort

Wave Period ℹ️Dominant wave period in seconds, auto-detected from the vertical acceleration signal. Calculated via zero-crossings of the 10 Hz-decimated vertical accel after DC (gravity) removal. Shows "--" until enough crossings are detected. -- s
Motion Sickness Index ℹ️Lawther & Griffin (1987) motion sickness index. Frequency-weights vertical acceleration — peaks at 0.2 Hz (5-second waves), which causes the most sickness. Scale: 0–30 low, 30–70 moderate, 70+ severe. Not a percentage; higher is worse. Only accumulates underway (SOG ≥ 1.7 kt); grayed out at anchor. Resets to zero on departure and arrival — no cross-contamination between trips. --
Vomit Probability (2hr) ℹ️Estimated percentage of an average population who would vomit during a 2-hour voyage at the current sustained motion level. Derived from the Motion Sickness Index using the Lawther & Griffin power-law model. Only accumulates underway (SOG ≥ 1.7 kt); grayed out at anchor. -- %
Heel Change (60s) ℹ️Total change in heel angle over the last 60 seconds (latest minus oldest sample). Captures slow, persistent roll shifts — e.g. a jibe or load transfer. 0.0°
Heel Deviation (60s) ℹ️Average absolute departure from the 60-second mean heel angle. Measures how much the boat is rocking side-to-side regardless of its steady list. High deviation = active rolling. Used in the Anchorage Comfort score. 0.0°
Pitch Change (60s) ℹ️Total change in pitch angle over the last 60 seconds (latest minus oldest). Captures slow fore-aft trim shifts. 0.0°
Pitch Deviation (60s) ℹ️Average absolute departure from the 60-second mean pitch angle. Measures fore-aft hobby-horsing. High deviation = active pitching. Used in the Anchorage Comfort score. 0.0°

Lifetime Maximums

Max Heel Angle 0.0°
Max Pitch Angle 0.0°
Worst Slam 0.0 g

Events (Current Window) ℹ️The current window is the regulator's fixed data-recording interval (10 minutes). At the end of each window the accumulated statistics are written to the history log and these counters reset to zero. The Events (Lifetime) counters are never reset.

Slam Count ℹ️Number of slams in the current window. A slam is counted when vertical (upward) acceleration exceeds the configurable Slam Threshold, with a 300 ms refractory period to avoid counting one physical event multiple times. 0
Slam Peak (Max) ℹ️Highest single vertical acceleration reading recorded during a slam event in the current window, in g's. Resets each window. 0.0 g

Events (Lifetime)

Total Slams ℹ️Cumulative slam count since the device was last reset. Persists across power cycles via non-volatile storage. 0
Capsize Events ℹ️Number of times heel angle has exceeded the configurable Capsize Threshold (settable in IMU Settings). An NVS save is forced immediately on each event in case of power loss. 0
Pitchpole Events ℹ️Number of times pitch angle has exceeded the configurable Pitchpole Threshold (settable in IMU Settings). An NVS save is forced immediately on each event in case of power loss. 0
Raw & Diagnostics

Raw Accelerometer (g)

Accel X 0.000 g
Accel Y 0.000 g
Accel Z 0.000 g

Raw Gyroscope (°/s)

Gyro X 0.0 °/s
Gyro Y 0.0 °/s
Gyro Z 0.0 °/s

Window Stats — Accel (g) ℹ️Min/max/average accumulated over the regulator's fixed data-recording window (10 minutes). Values reset when each window is written to the history log.

MinAvgMax Accel X 0.000 0.000 0.000 Accel Y 0.000 0.000 0.000 Accel Z 0.000 0.000 0.000

Window Stats — Gyro (°/s) ℹ️Min/max/average accumulated over the regulator's fixed data-recording window (10 minutes). Values reset when each window is written to the history log.

MinAvgMax Gyro X 0.0 0.0 0.0 Gyro Y 0.0 0.0 0.0 Gyro Z 0.0 0.0 0.0

Window Stats — Calculated ℹ️Min/max/average accumulated over the regulator's fixed data-recording window (10 minutes). Values reset when each window is written to the history log.

MinAvgMax Heel (°) 0.0 0.0 0.0 Pitch (°) 0.0 0.0 0.0 Vert Accel (g) 0.00 0.00 0.00 Total Accel (g) 0.00 0.00 0.00
IMU Status ℹ️ Whether the LSM6DSOX IMU is enabled and initialized. Disabled
Mounting Orientation ℹ️ Detected or configured physical orientation of the IMU on the PCB. Unknown
Lifetime Statistics
Distance Traveled ℹ️ Distance actually traveled along your track, summed from GPS position changes — not straight-line distance from where you started. A round trip back to the same port still counts the full distance out and back. Lifetime keeps accumulating; Session resets with the button.
Lifetime 0.0nm
Session 0.0nm

Speed ℹ️ Average is the mean of your GPS speed readings over time (not distance ÷ time), so it can differ slightly from distance covered over many hours. Sustained is the best 60-second average — the fastest you have held for a full minute, so a brief surf down a wave does not set it. Both are speed over ground, so they include current. Lifetime persists; Session resets with the button.
Average
Lifetime 0.0kts
Session 0.0kts
Sustained
Lifetime 0.0kts
Session 0.0kts

Longest Single Trip ℹ️ The longest single continuous voyage you've ever logged, in nautical miles (a trip ends after the boat sits stationary long enough). Feeds the leaderboards. Resetting does not affect the trip currently in progress.
Lifetime 0.0nm

Max 24-Hour Distance ℹ️ The most distance you've ever covered in any rolling 24-hour window, in nautical miles. Feeds the leaderboards. Resetting clears the watermark and the rolling-window history.
Lifetime 0.0nm

Deepest Anchorage ℹ️ The deepest water you've ever sat anchored in, in feet (requires a depth sensor; detected when the boat holds position with little swing). Feeds the leaderboards. Resetting clears the watermark and the anchorage history.
Lifetime 0.0ft

Best Upwind VMG ℹ️ The best velocity made good toward the wind you've ever achieved under sail (engine off), in knots — how fast you were truly progressing upwind, not just boat speed. Feeds the leaderboards.
Lifetime 0.00kts

Longest Gale Duration ℹ️ The longest continuous stretch of gale-force wind you've ridden out, in hours. Feeds the leaderboards. Resetting clears the record and any gale currently being timed.
Lifetime 0.00hr

Engine Fuel Consumed ℹ️ Based on measured RPM and RPM-consumption table defined in Setup → Engine
Lifetime 0gal
Session 0gal

Engine Run Time
Lifetime 0:00:00
Session 0:00:00

Engine Rev Counter
Lifetime 0rotations
Session 0rotations

Max Engine RPM
Lifetime 0rev/min
Session 0rev/min
ℹ️ Clears every worst-case, maximum and error count on this whole page at once, and restarts the "since reset" window used by the Function Timing table.

System Overview: CPU Load Max, Max Loop Time.
Sensor Health: ADS1115 and INA228 I2C error counts, INA bus-read worst and slow-read count, IMU fetch worst.
Timing & Diagnostics: every Function Timing worst case, the current- and voltage-loop interval ladders, RPM/voltage read-gap worsts, CSV2 build and send worsts, and the NVS full-save duration and count.

It does not touch the temperature-sensor counters (their own button in Sensor Health), the ripple analyzer's session peaks, or any lifetime record on the Statistics pages.
System Overview

System

Mode ℹ️ Client = on ship's network, Access Point = regulator providing its own hotspot ?
Device Serial ℹ️ Unique factory-burned ID for this regulator. Include this in any email to support about cloud account recovery. ?
Software Version Loading...
Software Image ℹ️ Factory Golden = safe working default, User Updateable = newer versions loaded from Cloud Features → Software Update ?
CPU Speed ℹ️ Processor clock. 240 MHz = full speed (engine running or a dashboard connected). 80 MHz = engine-off low-power throttle to cut standby draw; the regulator drops here automatically when idle and bumps back up the moment it has work to do. ?
Board Temperature ℹ️ Temperature measured in the regulator, will often be 5-25°F (3-14°C) hotter than ambient depending on location and electrical demands 0 °F ↑— ↓—
Extra Temperature ℹ️ Reading from the probe assigned the Extra role under Setup → Temperature. Greyed when no reading has arrived for a while. — °F ↑— ↓—
Clock / GPS Source ℹ️ Where the regulator's clock and position are coming from right now. A "drifting" or "estimated" clock means no time source is available — history timestamps may have gaps until GPS, phone, or internet (NTP) time returns. ?
Device Clock ℹ️ The regulator's own clock. The regulator itself keeps UTC and has no time zone setting, so the time here is converted into the zone of the phone or computer you are reading this on — that zone is named beside it. If the regulator's clock disagrees with the screen you are viewing from by more than half a minute, the difference is shown underneath. Everything the regulator timestamps — history records, cloud uploads, alarm logs — uses this clock. ?
Power Cycles (count) ℹ️ Lifetime, or since re-flashing 0

Connectivity & Cloud

Signal strength, client disconnects, last cloud upload and Upload Now are greyed: The regulator is running as its own access point, so it has no internet connection and no router to report on. Join it to a WiFi network under Setup → System → WiFi to bring these back.

Network (SSID) ℹ️ The WiFi network the regulator is connected to. In Access Point mode this is the name of the hotspot the regulator itself is broadcasting. ?
IP Address ℹ️ The regulator's address on the network — useful for bookmarking or connecting directly if name-based discovery fails. ?
Strength (dBm) ℹ️ Above -67dBm good. Below -75dBm unstable 0
Client Disconnects (count) ℹ️ WiFi connection losses detected by ESP32 (router drops, signal loss, network issues) 0
Heartbeat (count) ℹ️ Increments with each packet sent 0
Last Cloud Upload ℹ️ Time since the last confirmed telemetry upload to the cloud. Uploads run periodically when WiFi and internet are available; a growing value with WiFi connected points at an internet or cloud-side problem rather than a local one. ?
Buffered Records (count) ℹ️ Data buffered when WiFi disconnected. Will upload to Cloud at next opportunity. Resetting might take a few tries, brute force works. 0/?

Memory ℹ️ Updated every 7 seconds. Internal RAM is fast on-chip SRAM shared by the CPU, stacks, and DMA. PSRAM is the external 8 MB SPI RAM used for most heap allocations. Heap fragmentation is an internal-only metric: 0% = fully contiguous, 100% = worst case. High fragmentation with adequate free space can still cause allocation failures for large contiguous buffers.

Free Heap (kB) ℹ️ Total free heap across all regions (internal + PSRAM). Includes ~8,000 kB PSRAM. 0
Min Ever Free Heap (kB) ℹ️ Watermark since boot — the lowest free heap total ever recorded. A useful lower bound for leak detection. 0
Free Internal RAM (kB) ℹ️ Free / total on-chip SRAM. Stacks, DMA buffers, and WiFi/BT stack live here. This is the more constrained resource. 0 / 0
Largest Free Block (kB) ℹ️ Largest single contiguous free block in internal RAM. Allocations larger than this will fail even if total free space looks adequate. 0
Free PSRAM (kB) ℹ️ Free / total external SPI RAM. Most heap allocations land here. Plenty of headroom is normal. 0 / 0
Heap Fragmentation (%) ℹ️ Internal RAM only. 100 × (1 − largest_free_block / total_free). 0% = fully contiguous; above ~70% warrants attention. 0
Free Data Storage (kB) ℹ️ Free space on the internal flash filesystem holding history rings, logs, and buffered cloud uploads. Oldest data is pruned automatically, so this should stabilize rather than run to zero. Measured at boot and re-measured shortly after each file write once the alternator has settled off — files are only ever written with the alternator off, so a value that holds still during a charge is exact, not stale. ?

CPU Load (%) ℹ️ Core 0: WiFi/system tasks, Core 1: main control loop. Per-core CPU load for ESP32-S3 using FreeRTOS runtime stats. Works for SMP with unpinned tasks because idle tasks are core-pinned, but does not provide per-task or per-core attribution of non-idle time; values are estimates, not exact accounting of where each task actually executed.

Current
Max
Core 0
0
0
Core 1
0
0

Session Info

This
Last
Duration
0
0
Max Loop (s)
0
0
Reset Reason ℹ️ Common reset reasons: Scheduled Restart (11) is the automatic maintenance reboot — after a day of continuous running, the regulator restarts itself at the first quiet moment that holds for 5 minutes (engine off, not charging, nobody connected, battery healthy, uploads finished). After 2 days it no longer waits for you to disconnect. If no quiet moment appears it restarts anyway after 3 days — even under way and charging — showing a 10-minute countdown banner first. Low contiguous RAM can request one before the 1-day mark. Software Reset (1) is an unscheduled restart from crash recovery or manual commands. Task Watchdog (4) means the main program froze for over 16 seconds. Power On (0) occurs after battery disconnect/reconnect. Most frequently seen: Scheduled Restart during normal operation. Note: Sessions following OTA updates may show inaccurate reset reasons.
Unknown
Unknown
Sensor Health

Sensor Bus Health

ADS1115 I2C Error Count ℹ️ Count for this power cycle only, does not persist thru power loss 0
INA Bus-Only Read Worst (ms) ℹ️ Time spent in JUST the two INA228 I2C reads. Compare to the "INA228" row in Function Timing (shown in ms): if they roughly match, a loop stall is the bus itself; if this is much smaller, the loop is being preempted mid-read by other work. Resets with Reset Peak Values. 0
INA Bus Reads > 15 ms ℹ️ How many INA228 bus reads took longer than 15 ms (one Wire-timeout's worth) since the last Reset Peak Values. Non-zero means real bus stalls are happening, not just a one-off worst case. 0
INA228 Dropped Reads ℹ️ INA228 reads thrown away because the value was implausible (timeout/garbage). The counterpart to the ADS1115 error count. If this climbs during a stall, transactions are truly failing (electrical); if it stays 0 while reads are still slow, the bus is completing but starved. Resets with Reset Peak Values. 0
INA228 Die Temperature ℹ️ The INA228's own on-chip temperature sensor — the only reading taken at the power stage itself. Board Temperature comes from the BMP388, which sits away from the hot parts and barely moves while the field transistor and its diode heat up. Watch this alongside Battery Voltage (INA) to tell chip self-heating apart from a real change on the battery. Accurate to about 2 °F. A dash means the chip returned no usable reading. — °F
INA228 Die Temperature (Peak) ℹ️ Hottest the INA228 chip has been since the last restart or Reset Peak Values. This is the number sent to the cloud once a day. It ignores the first few seconds after a restart and only accepts a reading the previous second's reading agrees with, so one bad value off the chip cannot lodge itself here permanently. A dash means nothing has qualified yet. — °F
IMU Bus-Only Fetch Worst (ms) ℹ️ Time spent in JUST the IMU FIFO read (Get_FIFO_Sample), excluding the sample-parsing loop. Compare to the "IMU FIFO Drain" row in Function Timing the same way as the INA bus-only timer. Resets with Reset Peak Values. 0
IMU Worst-Fetch Sample Count ℹ How many samples were in the read that produced the worst fetch time above. Each sample is 7 bytes, so 6 samples = 42 bytes = ~1 ms of real bus time at 400 kHz. If the worst fetch shows a large microsecond value but only 6 samples here, the time was NOT spent moving bytes — the read was stalled on the shared bus or the loop was preempted (e.g. by WiFi/TCP on Core 1), not transfer-bound. Resets with Reset Peak Values. 0

Accelerometer / IMU

FIFO Overruns ℹ️ Count of times the IMU FIFO filled before it could be drained. Indicates loop() is too slow to keep up with the sensor output rate. 0
80 MHz Worst Loop (5 s) ℹ️ Slowest single loop pass during engine-off low-power mode (the CPU drops to 80 MHz to save power), over the last 5 seconds, in milliseconds. A few ms is normal. It becomes a concern as it climbs toward 38 ms — the point where the accelerometer can start filling its buffer faster than it's emptied. Blank/0 means the boat hasn't been in low-power mode recently. 0
80 MHz Worst Loop (Session) ℹ️ Slowest single low-power (80 MHz) loop pass since the last Reset Peak Values, in milliseconds. Catches one-off spikes such as a flash write happening while the boat is asleep. A single high value is harmless; it's only a problem if it repeatedly sits above ~38 ms — watch the near-miss count below. 0
Accel Drain Near-Misses ℹ️ How many engine-off (80 MHz) loop passes ran longer than ~38 ms — where the accelerometer buffer fills faster than it drains — followed by the total number of low-power passes. A handful is harmless: the buffer is deep and absorbs brief spikes. A steadily rising count is the early warning that the accelerometer could begin dropping samples; if that actually happens, the FIFO Overruns counter above starts incrementing. Resets with Reset Peak Values. 0 of 0
I²C Errors ℹ️ Cumulative I²C communication failures on the IMU bus since boot. A rising count here points to bus contention or signal integrity issues. 0
Unknown Tags ℹ️ FIFO samples with unrecognised tag bytes. Expected to be zero — a non-zero value suggests a FIFO configuration mismatch or hardware issue. 0
Accel Ring Drops ℹ️ Accelerometer samples discarded because the ring buffer was full. Should be zero during normal operation. 0
Gyro Ring Drops ℹ️ Gyroscope samples discarded because the ring buffer was full. Should be zero during normal operation. 0
Total Accel Samples ℹ️ Cumulative accelerometer samples successfully pushed to the ring buffer since boot. 0
Total Gyro Samples ℹ️ Cumulative gyroscope samples successfully pushed to the ring buffer since boot. 0
IMU Read Time (last call) ℹ️ Duration of the most recent IMU FIFO drain in milliseconds. Previously labelled "current" — now reflects the last completed call via the FuncTiming lastCall field. 0 ms
IMU Read Time (worst 5s) ℹ️ Worst IMU FIFO drain duration in the rolling 5-second window. Resets every 5 seconds alongside all other function timing windows. 0 ms
Accel Ring Usage ℹ️ Current accelerometer ring buffer fill level as a percentage of total capacity. 0%
Gyro Ring Usage ℹ️ Current gyroscope ring buffer fill level as a percentage of total capacity. 0%

Temperature Sensor Health (DS18B20)

Counts since boot. One read failure on startup is normal. Persistent failures need attention; occasional CRC recoveries are fine.

Per probe

SerialRoleOKFail
No probe data yet

Bus totals

Read Failures ?
CRC Failures ?
CRC Recovered (retry) ?
All-0xFF Reads ?
Power-On 85°C Reads ?
Out of Range Reads ?
Request Failures ?
Connected Check Failures ?
Resolution Auto-Fixes ?
Re-read Failures ?
Resolution Fix CRC Failures ?
Enumerate Failures ?
Timing & Diagnostics

Function Timing — Worst Case (ms) ℹ️ Worst-case execution time (duration) per function. The 5s column resets every 5 seconds — shows active spikes. The "Worst — last X min / X.X hr" column shows the worst since the most recent "Reset Peak Values" press (or boot, if never pressed) — catches infrequent spikes. Nested calls are included: a flash write inside Read Analog Inputs shows up under that row. Important: because these are durations, a whole-core freeze is charged to whichever function happened to be running when it hit, so the row that spikes is not necessarily the cause. These rows are not gated by field state — to tell whether a spike actually landed during active control, use the gated interval cards lower down (INA228 Read Interval and CV Voltage Loop Firing Interval only count while the field is on).

5s Worst (ms)
Worst — last … min
Loop Time ℹ️ Total duration of one full pass through the main loop. A high value here means one loop pass genuinely blocked — but a LOW value does not prove the loop is healthy: the timer starts after a housekeeping block at the top of each pass and stops before the system code that runs between passes, so a freeze landing in those untimed regions shows up in the interval cards but not here (observed in practice: a 59 ms sampling gap alongside a 19 ms worst Loop Time). The interval cards are the authoritative stall detectors; use this row to localize a stall that hit inside a pass. The 5s column resets every 5s — shows active spikes; the right column tracks the worst since the most recent "Reset Peak Values" press (or boot). Note: not gated by field state, so a spike here can come from either field-on control or field-off background work (such as a flash write while the field is off, which is intentional and harmless to control) — the field-gated row below isolates the passes that matter for control.
0
0
Loop Time when Field is On ℹ️ Same measurement as Loop Time, but only counting passes that started with the field gate open — i.e. while the regulator was actively controlling the alternator. This is the number that matters for safety: a stall here means voltage-control ticks were delayed while charging. The Loop Time row above is not field-gated, so its worst is dominated by deliberate field-off background work (flash writes, cloud uploads). Compare the two: a big Loop Time with a small value here means the ugliness is harmless housekeeping; a spike HERE is a real control-path finding. Shows 0 until the field has been on. Same blind spots as Loop Time (the untimed regions at the top of a pass and between passes), so the interval cards remain the authoritative stall detectors.
0
0
↳ Worst Field-On Pass — Top Consumers ℹ Captured the instant the field-on worst (right column above) was set: the timed functions that consumed the most time in that exact pass, in ms. Attribution is automatic — no counter reset needed to learn what caused a spike. Untimed glue between calls doesn't appear, so the parts may not sum to the total. Resets with Reset Peak Values.
n/a
WiFi Send ℹ️ SendWifiData() — builds and streams all SSE payloads to connected clients. Runs every loop tick. Spikes here indicate slow TCP send or large payload backlog.
0
0
Read Analog Inputs ℹ️ Primary spike suspect — includes any NVS or flash writes triggered by new max values inside this function.
0
0
↳ RAI Total ℹ️ Full ReadAnalogInputs() duration including all sub-sections and any flash writes. Should match the outer ft_ReadAnalogInputs row closely — a large gap between them indicates overhead outside the measured sections.
0
0
↳ INA228 ℹ️ INA228 battery monitor read block only. Includes any flash writes triggered by new voltage max/min values. If this is consistently near zero while RAI Total spikes, the culprit is ADS, BMP, or IMU.
0
0
↳ ADS1115 State ℹ️ ADS1115 state machine cost per state step — not a full conversion cycle. A spike here indicates an I²C timeout or a slow Wire.requestFrom() call on the ADS bus.
0
0
↳ BMP388 State ℹ️ BMP388 pressure/temperature state machine cost per state step. Normally near zero — a spike indicates a slow forced-conversion read or I²C contention.
0
0
↳ IMU FIFO Drain ℹ️ LSM6DSOX FIFO drain cost per poll. Scales with sample backlog — if loop() slows down and samples accumulate, this will spike. Collision avoidance skips the drain if INA228 just ran long, which shows as zero here.
0
0
↳ Accel Metrics ℹ️ updateAccelMetrics() cost per call — ring-buffer processing, complementary filter, and wave period detection. Only runs when Accelerometer Data is enabled. Reported in µs.
0
0
VE Direct Read ℹ️ ReadVEData() duration in µs. ~12,000µs typical for a full Victron frame parse. Spikes indicate UART contention or a long frame with many fields.
0
0
Alternator Control Logic ℹ️ AdjustFieldLearnMode — field duty cycle calculation and learning table updates.
0
0
Check Alarms ℹ️ CheckAlarms() — alarm state machine, INA228 hardware OV latch management.
0
0
Calc Derived Metrics ℹ️ calculateDerivedMetrics() — computes filtered voltages, currents, and power figures from raw sensor data.
0
0
Log Dashboard Values ℹ️ logDashboardValues() — records periodic min/max/history samples to ring buffers and flash.
0
0
Update System Health Stats ℹ️ updateSystemHealthStats() — polls FreeRTOS heap stats, CPU load, fragmentation. Involves system calls that can occasionally stall.
0
0
Check WiFi Connection ℹ️ checkWiFiConnection() — reconnect logic and RSSI polling. Only runs when ignition is on.
0
0
CH1 Compute Stats ℹ️ ch1_compute_stats() — scans mini-bucket rings to publish 10s/2m/all-time CH1 interval stats.
0
0
Upload Sensor History ℹ️ Times the LittleFS read and queue send. Actual HTTP transfer happens on Core 0 and is not included.
0
0
Long-Term Ring Flash Flush ℹ️ Writes the 30-day plot ring to flash storage. Runs only with the alternator field off, on a 15-minute cycle, so its flash-erase stall can never disturb live charging.
0
0
Fast Alt-Current Drain ℹ️ Empties the fast current-waveform sampler's hardware buffer and updates its frequency analysis. Hard-capped at about 1 ms per pass by design — values above that mean the cap logic is broken. Sampling itself is hardware-timed and costs no processor time.
0
0
Alt-Current Window Finalize ℹ️ The once-per-0.5-second wrap-up of the fast alternator-current channel: it runs the frequency-tone FFT, folds the peaks into the Resonance & Ripple Map, and extends the fault detector's 2-second capture (arming it once that capture is complete). Runs inside the drain pass, so its time is already part of the Fast Alt-Current Drain row above — this row breaks it out so a spike there can be attributed. Normally well under a millisecond.
0
0
Resonance & Ripple Map Flash Flush ℹ️ Writes the current-waveform survey matrix and reference flipbook to flash storage. Runs only with the alternator field off, on a 15-minute cycle, same policy as the long-term ring flush above. 0ms is normal while charging.
0
0
Zero-Drift Log Flash Flush ℹ️ Writes the zero-drift diagnostic ring to flash. Field-off only, dirty-gated, ~30-minute cycle. 0ms is normal while charging; only the flush pass costs anything.
0
0
Solar Ledger Service ℹ️ Books the solar ledger's day at local midnight and writes it to flash. The write happens only with the field off; every other pass is a clock compare.
0
0
Battery Health NVS Save ℹ️ Persists the battery-health capacity blob and DCIR results to NVS. Field-off only, dirty-gated — fires only after a capacity anchor or completed health test.
0
0
Keep-Alive Learn NVS Save ℹ️ Persists the learned tachometer keep-alive floors to NVS. Field-off only, dirty-gated, throttled to once per 5 minutes.
0
0
Upload Buffered Records ℹ️ Times the LittleFS read and queue send. Actual HTTP transfer happens on Core 0 and is not included.
0
0
Build Config Payload ℹ️ Builds the configuration snapshot JSON for cloud upload. Fires infrequently — 0ms is normal between snapshot intervals.
0
0
Alternator Health ℹ️ Updates the alternator best-ever health record book. Fires only when readings are steady — 0ms is normal between qualifying samples.
0
0
Alt Health Fold (200 Hz) ℹ️ Best-ever front IDW evaluation, folded once per control tick (~200 Hz). Cost scales with the number of front support points; near-zero until a front exists. This is the hot-path cost that bounds how large the front cap can grow.
0
0
Boat Perf Fold (10 Hz) ℹ️ Best-ever sail/motor front IDW evaluation, folded every ~100 ms (10 Hz). Cost scales with the number of front support points; near-zero until a front exists. The vessel-performance counterpart of the Alt Health Fold.
0
0
NMEA2K Transmit ℹ️ The NMEA2000 transmit tick: composes at most one message per loop pass and hands its frames to the CAN controller without ever waiting on the bus. Near-zero when transmit is off. This row is the standing proof the N2K output never intrudes on the control loop.
0
0
NMEA 0183 Receive ℹ️ The NMEA 0183 serial drain: pulls whatever arrived on the 0183 port in block copies and parses it out of memory, once every 50 ms. It never reads more than 512 bytes in a pass, and gives up part way through if it has used 250 microseconds, leaving the rest in the port's buffer for the next pass - so a busy talker costs latency rather than loop time. Near-zero when the port is off. This row is the standing proof the 0183 input never intrudes on the control loop; if it ever crosses 500 microseconds the regulator says so on the console by itself.
0
0
NMEA2K Receive ℹ️ The NMEA2000 bus-service call (ParseMessages): drains received CAN frames, reassembles multi-frame messages, and services the address claim and heartbeat when transmit is on. The only N2K cost that scales with bus traffic — near-zero with no bus attached. Watch this row the first time the regulator joins a real network.
0
0
DVCC Follow ℹ️ The charge-limit follow brain: a once-per-second check of the external limit stream (settling, silence, plausibility) that publishes the clamps the control loop reads. Pure arithmetic — this row is the standing proof it never intrudes on the control loop.
0
0
Oscillation Damper ℹ️ Time the wobble detector spends inside the control loop. It samples once per control tick and runs its frequency analysis only every 32 ticks (~1.6 s), so almost every pass costs nothing and the worst pass is the analysis itself. More than a fraction of a millisecond here means something is wrong.
0
0
Efficiency Tracker ℹ️ efficiencyTracker_tick() — includes NVS matrix and session health commits every 2 minutes. Spikes to 200–500ms every 2 min are expected in real mode; in fake mode these writes are suppressed.
0
0
SOC / Update Block
Update Battery SOC
0
0
Update Sensor Window ℹ️ updateSensorWindow() — computes rolling min/max window used for efficiency tracking and thermal analysis. Can spike when the window fills or flushes.
0
0
Check Time Sync ℹ️ checkTimeSync() — NTP sync check. Gated: skipped while in critical zone.
0
0
Core 0 — Background Tasks (off the control loop)
Rectifier Fault Detector ℹ️ Time to run the whole rectifier/stator fault analysis on a 2-second current recording, at most once a minute. This runs on the second processor core (Core 0), off the control loop, so it no longer affects charging — for this row the left value is the LAST run and the right value is the WORST since Reset Peak Values (not a 5-second window). 0ms means it has not run yet. This is processor compute time (CPU time): only the time the math actually held the core, NOT any pauses while Wi-Fi or other background work borrowed it — so the reading stays clean and is never inflated by network traffic. It assumes the chip's normal full speed (240 MHz).
0
0
Cloud Upload (HTTPS) ℹ️ How long the last cloud upload took end to end on the second processor core (Core 0) — opening the secure connection, sending the data, and reading the reply. Left is the LAST upload, right is the WORST since Reset Peak Values. This is real elapsed (wall-clock) time, so it includes time spent waiting on the network — a slow Wi-Fi link or a busy server shows up here. It runs off the control loop, so a slow upload never affects charging. 0 means nothing has uploaded yet.
0
0

Inner Current Loop Timing — two separate clocks: how often the current sensor is READ vs how often the control loop FIRES

Current Sensor Read (always) ℹ️How often the alternator-current sensor channel (CH1 on the ADS1115 ADC) is READ. Tracked continuously, field on or off. This ADC is shared — it rotates through four measurements and alternator current gets 3 of every 6 conversion slots — so even on a perfect run, samples arrive only about every 10 ms. This column and the Current PID Firing column next to it measure DIFFERENT events at different natural rates — do not compare them directly: this read cadence (~10 ms) normally reads HIGHER than the firing column without anything being wrong. Judge each column against its own Avg / Over-2× rows. A real freeze stops the whole loop and stretches BOTH columns at once — that pairing is the stall signature. Current PID Firing (field-on) ℹ️How often the fast inner current-control loop actually FIRES (sets field duty from CH1) — a DIFFERENT event from the Current Sensor Read column, not the same number gated by field. Gated to ticks where the field is driven, and re-baselines when the field turns off, so it never counts idle gaps. IMPORTANT: in MANUAL field mode the control tick runs every loop pass, so this reads the loop rate (~1–2 ms), NOT a true control cadence — it only reflects real control timing in AUTO field-on (where it rises to ~10 ms like the read column). A worst value well above this column's own Avg rows means a tick was starved during active control. Do not compare this column's worst against the Sensor Read column's — that one tracks the shared ADC's slower ~10 ms spacing and normally reads higher even when nothing is wrong.
Worst All-Time (ms) ℹ️Longest interval since boot or last Reset Peak Values, ms — the headline number. 0 0
Worst Field-On (ms) ℹ️Same clock as Worst All-Time, but only counting reads that completed while the field gate was open — the control-relevant number. The field-blind worst above is inflated by deliberate field-off background passes (flash flushes), which are harmless. The PID firing column is field-on by nature, so it needs no split. Resets with Reset Peak Values. 0 —
Last Interval (ms) ℹ️Most recent gap between firings, ms. Wall-clock across several loop iterations, so it can exceed the worst single Loop Time without any one loop being blocked. 0 0
Avg 10s (ms) ℹ️Mean interval over the last 10 seconds. 0 0
Worst 10s (ms) ℹ️Longest interval seen in the last 10 seconds, ms. 0 0
Over 2× 10s (count) ℹ️Count of intervals exceeding 2× the running mean in the last 10 seconds. 0 0
Avg 2m (ms) ℹ️Mean interval over the last 2 minutes (closed 10 s buckets only). 0 0
Worst 2m (ms) ℹ️Longest interval seen in the last 2 minutes, ms. 0 0
Over 2× 2m (count) ℹ️Count of intervals exceeding 2× the mean in the last 2 minutes. 0 0
Avg All-Time (ms) ℹ️Mean interval since boot or last Reset Peak Values. 0 0
Over 2× All-Time (count) ℹ️Count of intervals exceeding 2× the running mean since boot or last Reset Peak Values. 0 0

Voltage Loop Timing — two separate clocks: how often the voltage sensor is READ vs how often the CV loop FIRES

Voltage Sensor Read (field-on) ℹ️How often the battery voltage/current sensor (INA228) is READ. These stats only count while the field is on. Field on, the sensor runs in fast mode (~5 ms cycle) and these update live; field off, it drops to a slow ~1 s cycle and freezes at the last field-on reading — so a dash or 0 means the field has not been on yet this session. This is the sensor-read clock; the CV Loop Firing column next to it is a DIFFERENT event (how often the voltage control loop runs), so do not compare the two columns directly. A large gap here means the loop was starved while actively controlling. Each interval is wall-clock across several loop iterations, so it normally reads higher than the worst single Loop Time without anything being blocked; cross-check the worst Loop Time to tell a single freeze from accumulated jitter. CV Loop Firing (CV mode) ℹ️How often the constant-voltage (CV) loop's slow integral-correction term FIRES — a DIFFERENT event from the Voltage Sensor Read column. Only updates while the field is on AND the regulator is actively holding a voltage target (bulk, absorption, float, Target Voltage mode, or Maintain Mode); frozen otherwise, and reads a dash until CV has fired at least twice. Target spacing is set by Voltage Loop Interval (default 100 ms) — a value well above that means a loop tick was starved during active voltage control, the case that risks overvoltage. Each value is wall-clock across several loop iterations, so it can exceed the worst single Loop Time without any one loop being blocked. Re-baselines whenever CV turns off, so an off-then-on gap is never counted.
Worst All-Time (ms) ℹ️Longest interval since boot or last Reset Peak Values, ms — the headline number. — —
Last Interval (ms) ℹ️Most recent gap between firings, ms. Wall-clock across several loop iterations, so it can exceed the worst single Loop Time without any one loop being blocked. — —
Avg 10s (ms) ℹ️Mean interval over the last 10 seconds. — —
Worst 10s (ms) ℹ️Longest interval seen in the last 10 seconds, ms. — —
Over 2× 10s (count) ℹ️Count of intervals exceeding 2× the running mean in the last 10 seconds. — —
Avg 2m (ms) ℹ️Mean interval over the last 2 minutes (closed 10 s buckets only). — —
Worst 2m (ms) ℹ️Longest interval seen in the last 2 minutes, ms. — —
Over 2× 2m (count) ℹ️Count of intervals exceeding 2× the mean in the last 2 minutes. — —
Avg All-Time (ms) ℹ️Mean interval since boot or last Reset Peak Values. — —
Over 2× All-Time (count) ℹ️Count of intervals exceeding 2× the running mean since boot or last Reset Peak Values. — —

Read Gaps & Telemetry Timing

RPM Read Gap — Last (ms) ℹ Milliseconds since the previous valid RPM (ADS channel 2) reading. RPM is a time-shared channel: with the continuous-mode sampler it is read on a brief mux excursion off the parked current channel. Target is under 30 ms so RPM stays smooth for the control logic that uses it. Glitch/out-of-range reads do not count. 0
RPM Read Gap — Worst (ms) ℹ Largest gap between valid RPM readings since the last Reset Peak Values. Confirms the excursion scheduler is not starving RPM. Should stay under ~30 ms; a spike means a heavy loop pass stretched the excursion. Resets with Reset Peak Values. 0
RPM Read Gap — Worst Field-On (ms) ℹ Same gap meter, counting only gaps that ended while the field gate was open — the control-relevant figure. The field-blind worst above includes field-off background passes (flash flushes) that stretch the loop harmlessly. Resets with Reset Peak Values. 0
Voltage Read Gap — Last (ms) ℹ Milliseconds since the previous valid ADS battery-voltage (channel 0) reading. This is the secondary voltage used only as a sanity cross-check against the INA228; like RPM it is read on a brief mux excursion. Target is under 30 ms. Out-of-range reads do not count. 0
Voltage Read Gap — Worst (ms) ℹ Largest gap between valid ADS battery-voltage readings since the last Reset Peak Values. Confirms the cross-check voltage channel is not starved by the excursion scheduler. Resets with Reset Peak Values. 0
Voltage Read Gap — Worst Field-On (ms) ℹ Same gap meter, counting only gaps that ended while the field gate was open — the control-relevant figure. The field-blind worst above includes field-off background passes (flash flushes) that stretch the loop harmlessly. Resets with Reset Peak Values. 0
CSV2 Build — Last (ms) ℹ Time to BUILD the ~548-field CSV2 diagnostic payload (the snprintf) on the most recent send, ~every 5 s. This is the CPU half of the WiFi-send cost. If this dominates the WiFi Send timer, the win is chunking/offloading the build; if it's small, the cost is in the send instead. 0
CSV2 Build — Worst (ms) ℹ Worst CSV2 build (snprintf) time since the last Reset Peak Values. Resets with Reset Peak Values. 0
CSV2 Send — Last (ms) ℹ Time to SEND the CSV2 payload (events.send → AsyncTCP) on the most recent send. This is the transport half of the WiFi-send cost. If this dominates, the win is splitting CSV2 into smaller events; if the build dominates instead, chunk/offload the build. 0
CSV2 Send — Worst (ms) ℹ Worst CSV2 send (events.send) time since the last Reset Peak Values. Resets with Reset Peak Values. 0

NVS Full Save ℹ️ The full save writes all session and lifetime totals (charged energy, runtime, fuel, distance, lifetime damage, learned tuning, motion-event counters) to flash in one blocking commit. By design it runs only at the field-off edge (about 5 s after the field cuts), at shutdown, and on capsize/pitchpole events — never while the field is on. The commit freezes the control core for as long as it takes, which is safe precisely because the field is off so there is no overvoltage risk during the stall. Trade-off: if you run continuously for hours and lose power before the next field-off edge, everything accumulated since the last save is lost.

Time Since Last Save (s) ℹ️ Seconds since the last successful saveNVSDataFull(). The longer this gets, the more accumulated session/lifetime data is at risk if the device loses power before the next field-off edge. 0 means no save has happened yet this boot. 0
Last Save Duration (ms) ℹ️ Wall-clock time the most recent saveNVSDataFull() call took to complete, including the nvs_commit() flash write. Expected 50-300ms depending on how many sectors needed erasing. Always runs with field off so any duration is safe. 0
Worst Save Duration (ms) ℹ️ Longest saveNVSDataFull() duration seen since boot. Useful as a long-term wear indicator — if this climbs steadily over many months, the NVS partition is fragmenting and may benefit from an erase. 0
Save Count ℹ️ Total saveNVSDataFull() calls since boot. Confirms the field-off drain is firing as expected — should increment each time the field cuts (engine pause, anchor, dock). 0
App Usage

Counted on the regulator across everything that connects to it. "Today" resets at midnight; lifetime totals never reset.

Totals

TodayLifetime
Screen Time----
Opens----
Days Uploaded—--

Top Pages (Today)

PageOpensScreen Time
No data yet

Top Buttons (Today)

ButtonClicks
No data yet
About

XREG-010
Copyright (C) 2026 X Engineering LLC
Contact: joe@xengineering.net

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.

This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details: www.gnu.org/licenses

This regulator is an accessory to a charging system, not a safety device. It must not be relied upon as the sole means of protecting batteries, alternators, wiring, or the vessel. Overcurrent protection, wire sizing, and installation practice conforming to applicable standards remain the responsibility of the owner and installer. Performance, navigation, and health data are provided for informational purposes only and must not be used for navigation or any safety-critical decision.

Source code and third-party license notices: docs.xengineering.net  ·  Privacy Policy  ·  Terms of Sale

Counts of protection events since boot or last reset. All counters are rising-edge — each number represents how many times that protection mechanism activated, not how long it was active. Use the per-category reset buttons to establish a clean baseline after tuning changes or suspected transient conditions. FastOV events are normal during load transients; sustained accumulation at idle is not.

Voltage & Current Protection

FastOV Cap (live) ℹ️ Live per-tick ceiling on commanded current (A) from the fast overvoltage supervisor. Equals MaxTableValue when inactive. ? A
Protection Events (total) ℹ️ Rising-edge count of the unified protection flag — increments on every distinct activation of any protection: Group 1 (predictive OV), Group 2 (measured OV), Group 3 (alternator iExcess), or Group 5 (Load Dump). Slow growth during transients is normal. Fast growth at steady state means thresholds need tuning. Overlapping events count as one activation (rising edge only). ?
FastOV Hard Events ℹ️ Rising-edge count of hard OV activations only — Group 1 (predictive K_HARD) OR Group 2 (measurement hysteresis). Both contribute to this single counter. Does NOT include the Group 3 iExcess detectors or Group 5 Load Dump (those increment the Protection Events counter above, plus their own per-group counters). Should be rare. Accumulation at steady state means real overshoot is occurring. ?
iExcess Events ℹ️ Rising-edge count: iExcess over-current supervisor trips — Group 3 (alternator), both regimes combined; Load Dump is counted separately. Near the voltage target it fires when the time-averaged alternator current rises above the setpoint by more than the Detection Threshold (% of command). Below the band the bulk sub-mode (alternator) fires when the averaged current rises above the commanded ceiling by more than the Detection Threshold (Bulk). ?
Voltage D-Term Engagements ℹ️ Rising-edge count: the CV voltage D term trimmed the current setpoint because the smoothed battery voltage was rising fast toward target. Consecutive trim ticks count as one engagement; a new one is counted after at least a second of quiet. This is a pre-protection save, not a trip — each engagement is an approach that would otherwise have run hotter into the overvoltage protections. Knobs: Tuning → Voltage → Voltage D term. ?
INA228 OV Events ℹ️ Rising-edge count: the shunt monitor's hardware alert pin fired (INA228 ALERT — its averaged bus voltage crossed the Hardware Shutdown Voltage). Hardware cuts the field electrically with no processor involvement. Should be zero under normal operation — the Hardware Shutdown Voltage sits above every software rung, so software always acts first; a nonzero count means software failed to protect. ?
Hard OC Events ℹ️ Rising-edge count: hard overcurrent trip (MeasuredAmps exceeded HardOCTripAmps for HardOCDebounceMs). Field cut immediately. Should be zero. ?
Voltage Spike Events ℹ️ Rising-edge count: raw per-tick battery voltage exceeded the Alternator Hard Shutdown Voltage (software instant cut, armed in every mode). Field cut immediately with an adaptive re-enable lockout. Should be zero — sustained approaches are resolved earlier by the timed cut tiers. ?
Timed OV Cuts (Low Tier) ℹ️ Rising-edge count: the filtered battery voltage held above the voltage target plus the low-tier margin continuously for the low-tier time to act. Field cut immediately with the same adaptive lockout as the other overvoltage cuts. This tier resolves a bus stuck just above the proportional-shed line — occasional events mean the shed layer could not bring the bus down in time. ?
Timed OV Cuts (Mid Tier) ℹ️ Rising-edge count: the filtered battery voltage held above the voltage target plus the mid-tier margin continuously for the mid-tier time to act. A faster response to a larger excursion than the low tier; same immediate cut and adaptive lockout. Should be rare — the low tier or the proportional shed usually resolves the event first. ?
Volt Disagree Critical Events ℹ️ Rising-edge count: ADS1115 and INA228 voltage readings diverged beyond the critical threshold. Field cut. Indicates a sensor fault or wiring problem. ?
Volt Disagree Warning Events ℹ️ Rising-edge count: ADS1115 and INA228 voltage readings diverged into the warning zone (less than critical). Field ramps down but may recover if disagreement clears. ?
Volt Implausible Events ℹ️ Rising-edge count: voltage sensor reading flagged as implausible (out of expected range). Indicates hardware or calibration fault. ?
Current Sensor Stale Events ℹ️ Rising-edge count: alternator current sensor (ADS1115 CH1) stopped updating. Field cut after 10s without fresh data. Check clamp sensor wiring and ADS1115 connection. ?

Thermal Protection Events

Temp Critical Events ℹ️ Rising-edge count: alternator temperature exceeded the critical threshold (TempLimit + critical excess). Field cut immediately. Should be rare. ?
Temp Sustained Events ℹ️ Rising-edge count: alternator temperature remained in the warning zone long enough to trigger a sustained overtemp shutdown. Less severe than critical but indicates prolonged thermal stress. ?
Temp Stale Events ℹ️ Rising-edge count: temperature sensor data went stale (DS18B20 stopped updating). Field cut as a precaution. Investigate sensor wiring if this is nonzero. ?

No battery shunt is installed, so the battery diagnostics panel has no signal to report and is not shown — only the alternator panel below. Setup → Battery → Measurement Sources → Battery Shunt Present.

Charging System Health
Charging System Health ℹ️Output amps as a percentage of the best the charging system has done in the past under these same conditions. Both sides of the comparison are the same statistic — a sustained multi-second average, the same window the record book stores — so a momentary dip can't read as lost health. MEASURED means a recorded best exists at this operating point (within a small matching window); ESTIMATED means it's interpolated.
—
Learning
no best surface points yet
no graded points yet this session

Charging System Health vs Engine Hours ℹ️A healthy charging system holds a roughly flat line near 100 — a steady downward trend is what to watch for. The lower line is each hour's low 10% mark (a tenth of that hour's readings fell below it), so one odd reading never defines an hour.

Window:
low 10% average

This Session

Click a dot to see the conditions behind it.
How it works

Today's output vs. the highest the alternator has produced at the same conditions.

MEASURED — a recorded best exists at this operating point; ESTIMATED — interpolated between trustworthy nearby records; Learning this operating region — the recorded data around this point is too one-sided to grade fairly, so no number is shown; No reference here yet — nothing recorded nearby, and a steady run here records a new point instead of guessing.

Data is optionally pruned in the cloud. Every 15 minutes, if the engine is off and device online, new frontier points upload. The cloud then drops points that have become redundant (sitting below the envelope of their neighbours) and returns the cleaned set.


Live Oscilloscope & Historical Snapshots

Fast current channel: ?

Live Oscilloscope
ℹ️ Displays a snapshot of alternator output current, sampled at 20 kHz — fast enough to show the rectifier ripple pulses, mechanical drive resonances, and other content. It is diagnostic only (plays no part in regulation) and refreshes every few seconds. The Filtered trace applies a 16 sample boxcar moving average (same one used by Resonance and Ripple Map). Absolute level is less accurate than the control channels (the price we pay for speed). No capture yet. Refreshes every 5 seconds; each capture is a 20,000-per-second snapshot.
Time window (both plots):
Historical Snapshots
ℹ️ A photo album of healthy waveforms. The first time the engine runs steadily in each RPM band (and alternator is charging at 20–100 A), the regulator permanently freezes a snapshot of the current waveform, a "known good" record to compare against at any point in the future. Anomaly captures sit alongside so you can see before/after. Diagnostic only. Filtered trace is a 16 sample boxcar moving average (same one used by Resonance and Ripple Map).
Reference pages
Anomaly Captures ℹ️If detected, a new anomaly snapshot is saved at most once every 5 minutes, into 4 rotating slots (the oldest is overwritten). Detection, alerts, and the alarm keep running regardless; the Pause button on the chart below only stops new snapshots from overwriting the ones you're examining. This panel refreshes itself every ~30 seconds while open. Lifetime anomalies: ? · Last fault class: ? ℹ️A developer/diagnostic readout, not a confirmed diagnosis. The number is the monitor's best guess at the failure type from the ripple pattern. That classification is not yet validated against real teardowns and can be wrong — treat it as a prompt to look at the anomaly captures below yourself. 0 or blank means no fault detected.
Resonance & Ripple Map
Resonance & Ripple Map ℹ️A learned table of the strongest current-ripple tones at every engine speed and load. Each cell is a rolling recent-average of the last 4 qualified windows (fixed depth, not user-adjustable), so it tracks the machine lately and never freezes; the map persists until Clear Map. The worst-value table below is fed by those same windows, but keeps the largest single values instead of averaging them. A tone that stays at a fixed frequency as RPM changes points to a resonance (drive-system most likely, then crankshaft torsional, then electrical); a tone that scales with RPM is ordinary rectifier ripple. This picture is not live: it reloads when you open the Diag tab, expand this section, or reload the page. While the map is nearly empty it also refreshes itself every 10 seconds, so a freshly cleared map visibly refills, then it stops once there is real shape to look at. ? cells learned
Ripple by speed & load ℹ️Tap or hover a square for its numbers.
—
Worst ripple & tone — and where each occurred ℹ️Of the data admitted to the Resonance & Ripple Map, these are the largest values.
Worst Pk-Pk (A) Tone (Hz) RPM Output Current (A) Alt Temp (°F) Date
Ripple Pk-Pk ? ALL ? ? ? ?
Highest Tone ? ? ? ? ? ?
Biggest Actionable Disturbance in the Ripple Map ℹ️The strongest ripple tone in the Resonance & Ripple Map above that is slow enough for the field to actually chase — the band from 4 Hz up to the actuator bandwidth set by the plant time constant (τ) from the Commissioning Plant Delay sweep. On a normal alternator the field is slower than 4 Hz, so no tone is chaseable: there is nothing to tune and this line just says so, updating automatically from the fitted τ. Only if a sweep ever fits a fast plant (τ below ~40 ms) does a Compute button appear, to scan the map for the actual tone and the residual current that leaks past the over-current detector. Plant τ: not fitted yet — run a Plant Delay sine sweep in Commissioning
Run a Plant Delay sine sweep in Commissioning to evaluate this.
Oscillation Damper
How It Works

Some engine, alternator and belt combinations develop a slow wobble, somewhere between 0.3 and 2 Hz, in field drive, engine speed and voltage together. This damper watches field drive for it while speed is steady, makes a single test cut in the current loop's integral gain, and retains the cut (at that speed) only if the wobble significantly shrinks.

The damper also has a second lever, for a wobble that keeps the voltage damper (the D-term) rhythmically switching direction. This is tested by pausing the D-term instead — if the wobble significantly reduces, the change is kept.

Status —

Oscillation Damper ℹ️The same switch as Setup ▸ Alternator ▸ Tuning ▸ Current ▸ Controller Parameters — either one sets it, and the test/map settings live there too. On: the damper tests a detected wobble with a single gain cut — or by pausing the voltage damper (D-term) when that is the part swinging — maps verified trouble spots by engine speed, and applies the fix across them proactively. Off: the regulator always runs at full strength; the learned map is kept but not applied. Switching it off restores full strength immediately.
Off On

Shortcut to the damper's settings →


Current-loop gain now, as a share of your PID Ki ℹ️ The integral gain the current loop is actually running at, as a percentage of the PID Ki you set. 100% is your full setting; anything less means the engine is inside a mapped trouble spot, or a test cut is being verified right now. It follows the speed map directly — full gain outside every pocket, the Damped Gain inside one, ramping across the tapered edges. —

Wobble frequency ℹ️ The frequency of the most recent wobble the damper confirmed, in cycles per second. It stays on screen after the episode ends as the last thing seen this session, so it is a live measurement only while the Status line says a wobble is being damped. —

Voltage damper (D-term) ℹ️ The regulator's fast voltage damper. Normally Running. During a damper test it can be paused, and if pausing it stopped a verified wobble it stays off across that trouble spot on the speed map — shown purple on the plot — while every other gain stays at full strength. It is never reduced partway: a half-strength damper would let the same wobble settle at a larger swing. —

Episodes on record ℹ️ Each entry says what the wobble was doing when the episode opened and when it closed: field swing is how far field drive was swinging, and gain left at is where the current loop's integral gain stood when the episode ended. The list survives restarts; it holds roughly the last hundred episodes, and once full it drops the oldest half. The raw file is served at /huntledger. —

—
Fetches the record again from the regulator, including episodes not yet saved to its flash. Reads only — nothing is changed, cleared, or restarted.
Permanently erases everything the damper has learned — the speed map and the episode record — and cancels any test in progress. Gain returns to 100% everywhere until a new wobble is verified. Requires the dashboard to be unlocked.
Wear Rate & Component Life
Wear Rate ℹ️ How long a new alternator would last if it ran continuously at the present speed and temperature. This is an instantaneous wear rate, not accumulated damage.
Theoretical Life @ Current Conditions
10000hours Good

Component Life Remaining ℹ️ Insulation: Exponential degradation with temperature (Arrhenius model). Reference: 50k hrs at 212°F.

Grease: Life halves every 18°F above 158°F. Also decreases with RPM. Reference: 40k hrs at 158°F, 6k RPM.

Brush: Wear increases 0.25% per °F above 150°F. Life decreases with RPM. Reference: 5k hrs at 6k RPM.
Insulation
100.0% Good
Bearing Grease
100.0% Good
Brush
100.0% Good
Control Accuracy

Each loop reports how it performs during normal running — no test needed. Tracking is the share of challenged time (target moving, or just after a disturbance) spent inside the accuracy band — quiet steady running earns nothing here. Excursions counts how often the loop left its band, with the average time it took to get back. Time when the output was pinned at a limit or a protection held it is set aside as "constrained" (shown in the small line) rather than blamed on the loop. A dash means not observed yet — never perfection. Accumulates since the last reset; auto-resets after each daily cloud snapshot, or press Reset below.

Loop Tracking Excursions

Current loop (A) — — —

Voltage loop (mV) — — —

Thermal loop (°F) — — —

Color guide
Good Watch Poor
Tracking (all loops) ≥ 95 % 85 – 95 % < 85 %
Current recovery < 5 s avg 5 – 15 s ≥ 15 s
Voltage recovery < 20 s avg 20 – 60 s ≥ 60 s

Excursion cells show count · average recovery time and are colored by the recovery time. The thermal row's middle cell counts containment sessions (not colored).

Diag

Developer diagnostics. Study firmware to make better sense of this panel.

—
Overvoltage History

Lifetime record of bus-voltage excursions above the Bulk target, from any charge source (alternator, solar, shore). Each band measures how far the voltage climbed above the Bulk target in effect at that moment — the record follows the target wherever it is set or adjusted. Coverage is continuous from the Bulk target to more than 15 V above it: 0.2 V resolution through ≈18 V on a 12 V system, 1 V bands beyond, and an overflow band at the top. It survives restarts and firmware updates; a full power-down (battery disconnected) starts it fresh.

Voltage D-Term Engagements ℹ️ Times the CV voltage D term trimmed the current setpoint to soften a fast climb toward target — a pre-protection save, not a trip. If the D term is doing its job, this counter grows while the protection counts below grow more slowly. —

Soft-Cap Engagements —

Timed Cuts (Low Tier) —

Timed Cuts (Mid Tier) —

Software Hard Cuts —

Hardware (INA228) Cuts —
Voltage band Events Total time
—

Only bands with activity are listed, plus the first empty band above them — that zero row marks where the record continues upward. Band labels are printed using the current Bulk setting — if Bulk is later changed, past time keeps its above-target meaning and the printed voltages shift to match. The lowest bands accumulate large event counts from normal regulation ripple crossing band edges — total time is the better severity measure there.

About this Alternator Diag Page

This subtab is the health station for the charging system — the alternator, its rectifier and belt drive, and the control loops driving them. Everything here is results; the detection gates and tuning knobs live in Setup → Alternator → Diag.

Shortcut to the Diag gates & tuning knobs →

Charging System Health grades today's alternator output against the best it's ever done under the same conditions. The engine-hours trend is the plot to watch: a healthy system holds roughly flat in the mid-90s+, and a steady downward slope is an early warning. The "This Session" plot below it shows the same grading data "live" since the page was opened.

Live Oscilloscope & Historical Snapshots shows the alternator's output current sampled at 20khz — fast enough to see individual rectifier pulses. Reference pages are known-good waveforms frozen once per RPM band; anomaly captures are saved automatically when the fault monitor trips. When something looks off, flip between the capture and a close reference for that speed and compare.

Resonance & Ripple Map is a learned table of the strongest ripple tone at every speed and load — used by the commissioning wizard to help optimize signal filters and control response.

Wear Rate & Component Life estimates how fast the alternator is aging at the present speed and temperature, and roughly how much component life remains (based on physics, but not yet calibrated…)

Control Accuracy reports how each loop — current, voltage, thermal — performs during normal running: time-in-band while challenged, and how often it leaves its band and how fast it recovers. Quiet steady running earns nothing, and time spent pinned at a limit is reported separately instead of blamed on the loop.

Is an anomaly alert a confirmed failure? No. The fault class is the monitor's best guess from the ripple pattern. Treat it as a prompt to compare the anomaly capture against the reference page for that RPM band before touching hardware.

Does it need anything from me? No — everything on this page learns on its own during ordinary steady running. A new install shows gaps and "learning" labels until the engine has spent time at more speeds and loads.

Replaced the alternator, regulator, or belt? Reset the learned baselines so old data doesn't grade the new hardware: Start Over (health record book, in Setup → Alternator → Diag), Re-baseline (reference pages), and Clear Map (ripple map).

Resistance Test (DCIR)
Test status:
—
Last resistance (DCIR):
—
Test settings
Step low current (A) (?):

Step size (A) (?):

Dwell per level (sec) (?):

Scored steps (?):

Resistance test history

Oldest row is the baseline. @25°C normalizes for battery temperature so runs are comparable; a run made with no measured battery temperature shows — there and keeps its raw value. Δ base is the temp-corrected change since the baseline (the aging signal). Fit ✓ = the scored steps agreed; ⚠ = scattered, treat that row with care.

When DCIR (mΩ) @25°C (mΩ) Δ base Fit ΔV (mV) ΔI (A) Dwell (s) SoC Batt V Batt °F Step Steps
No tests yet
Capacity Trend
Battery Capacity — awaiting first deep cycle
—
No capacity points yet — one is recorded only after the bank rests at a low charge (the anchor window set for your chemistry) and then charges to full. Hollow markers = low-confidence reads.
Capacity tracker settings

Measured capacity needs an independent low state-of-charge anchor from a rested voltage. Edit the rested open-circuit-voltage curve for your bank (a chemistry preset is filled in when you save Vessel Info; the buttons below reload one), scaled to your nominal voltage. On lithium (LiFePO4) only the flat curve's bottom-knee rows map reliably to charge, so the anchor is taken there (≤20%); lead-acid and AGM slope across the whole range, so the anchor can sit at a shallower, non-damaging rest — the anchor window is set per chemistry.

Rested (open-circuit) voltage curve
SoC %Rested V
…

Battery capacity (Ah) (?): ℹ️Read-only here. Set it in the Battery Monitor tab (Battery Capacity Ah). "% of rated" is measured against this value, and it also scales the rest-current threshold and the plausibility bounds.
set in Battery Monitor tab

Capacity reference (0=rated, 1=first reading) (?):

Rest current threshold (C-fraction) (?):

Rest floor before OCV trusted (min) (?):

Voltage settle rate (mV per 10 min) (?):

Low-anchor max SoC (%) (?):

Full-anchor SoC (%) (?):

Minimum span (full − low, %) (?):

Charge efficiency (?): ℹ️Read-only here. Set it in the Battery Monitor tab (Charge Efficiency %). The capacity-fade math uses that same value so the SoC counter and this tracker stay consistent.
set in Battery Monitor tab

Battery temperature normalization (0=off, 1=on) (?):

Capacity temp coefficient (%/°C) (?):

Temp reference (°F) (?):

About this Battery Diag Page

This page tracks how the battery bank is aging, from two independent signals: an internal-resistance test you run on demand, and a capacity estimate captured automatically each time the bank reaches full charge. The bank is assumed brand-new when first installed — the first capacity reading becomes the 100% baseline.

Resistance Test (DCIR) steps the charge current up and down with the engine running and measures how far the battery voltage moves for a known change in current. Rising resistance over months is an early aging signal. The absolute number depends on temperature and state of charge, so compare runs taken under similar conditions; the trend matters more than any single value.

Capacity Trend: each time the bank charges from a low point all the way to full, the amp-hours returned are extrapolated to a full 0–100% span and plotted. A falling line is real capacity fade. Only deep charges qualify, so the plot fills in slowly.

Replaced the bank? Press Start Over in the Resistance Test section — the next capacity reading becomes the new 100% baseline.

Note: lots of better functionality is planned for future versions of this page.

Timestamps show when messages were received by the app, not when sent by the regulator. Messages are throttled: max 5 every 700ms (adjustable in firmware).
ℹ️ Downloads three diagnostic logs as CSV files to the Downloads folder (pc) or Files (mobile device): a temperature log (up to the last ~2 hours at 1-second resolution), a control-loop log (the last ~11 seconds at the full control-loop rate, ~200 Hz), and a voltage-tuning log (the last ~28 seconds, also ~200 Hz). Logs are automatically cleared after download. Pause Logs freezes the log buffers so their contents stay fixed; Resume Logs continues recording — the dot on the button shows the state (pulsing green = recording, amber = paused). Start Fresh Log clears the buffers and begins a new log.

Filename Tag (optional) ℹ️Optional text added to the end of every downloaded log filename, after the date/time — e.g. "dock-test" gives pidlog_20260710_143205_dock-test.csv. Leave blank for none. Spaces and unusual characters become dashes. The tag is locked in when you press Download — retyping it mid-transfer won't rename files already in flight.
Time Window: ℹ️Sets how many seconds of live data all four short-term plots show on the X axis. The highlighted button is the current setting. To zoom the Y axis, drag a box directly on a plot; double-click a plot to reset its zoom.
Time Axis Labels (?): ℹ️ UNIX: Proper time labels, but slower
Relative: "Seconds ago" labels, but smoother plotting
Loading long-term history…
Charge Stage

Cloud Features is switched off, so registration, leaderboards, fleet stats, config sharing and software update are unavailable. Turn it on under Setup → System → Cloud Features.

The regulator is running as its own access point, so it has no internet connection. Registration, leaderboards, fleet stats, config sharing and software update need one. Join the regulator to a WiFi network under Setup → System to use them.

Device Information
Device ID
—
Account Information

Username (suggest using your boat name — shown publicly on leaderboards)

Email (kept private)
Account Management

What's public: Registering shows your username, boat type, and boat length on the public leaderboards, visible to anyone. Your email and location are never shared. You can leave at any time with Delete My Account — this permanently deletes your cloud account and associated cloud data. Your hardware device will continue working locally without cloud features.


Loading leaderboards...

Loading fleet statistics...

Loading shared configurations...

Current Version:
Loading...

Available Versions:
Press refresh button...