XEngineering
Sailboat
Connecting to regulator
-A -°F -% duty -V -% -A -rpm -°F board
XEngineering
?
Batt - V SOC - %
Alt - A Batt - A
Alt - °F Board - °F
RPM - IGN ?
Alternator Enable
⚠ Avoid parameter changes during rapid RPM or load swings — controls may briefly lag.
minimize
Vessel Information
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 Level Zero button below.)


Level Zero (not set): ℹ️ With the boat at rest in calm water, press to record level. Corrects small mount tilt and gyro drift. Re-do anytime the device is remounted.

Regulator Location

Mounting Location: ℹ️ A battery's internal resistance rises as it cools, and that resistance is the quantity the voltage loop's gains were tuned against at commissioning. Mounted near the bank — or any space that tracks it — the regulator's board temperature follows the batteries closely enough to correct for this. Otherwise (example: regulator in engine room, batteries in bilge), it will incorrectly report a hot battery, and push the gains the wrong way.
Preferred — battery temperature can be approximated with regulator temperature Battery temperature is not approximately the same as regulator temperature

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
Charge Rate:
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.
Min
(%) ℹ️Lowest field duty cycle (%) the regulator will hold at this engine speed, even when the controls want less. Always applied, and never below the flat Min Field % setting; a 0 cell means no floor at that speed. Edit these cells by hand only while Automatic Min% Learning (card below) is off. When it is on, the learner owns this column — filling and maintaining the values and adjusting them to the live alternator temperature each tick — and the cells are locked so a manual edit cannot be silently overwritten. Turn learning off to edit by hand.
<
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
Automatic Min% Learning ℹ️When on, the regulator learns — for each RPM range — the field level where the alternator just begins to make current, and automatically keeps the Min (%) column a set margin below it. It learns only during light-load moments (full battery), never while charging hard. The Min (%) cells above update on their own; you can still turn this off and edit them by hand.

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

Margin Below Knee (%) (?): ℹ️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 knee). 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 knee 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 knee. 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 (%) Knee (%) 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 (?): ℹ️ Manual mode disables safeguards: no MinDuty or MaxDuty enforcement, no temperature or voltage limiting, no RPM-dependent minimum.

Manual Field PWM (%) (?): ℹ️Direct PWM duty cycle applied to the field winding when Manual mode is active, 0–100% in steps of 0.01. Has no effect in PID mode. Use with caution — Manual mode bypasses many thermal, voltage, and current protections.

Min Field (%) (?): ℹ️Minimum allowable field when Alternator is enabled (global). If in doubt, set to zero — the only penalty is that the tachometer may occasionally drop out. Better is to adjust Min Field locally (by speed) in the RPM table.

Max Field (%) (?): ℹ️Hard cap on commanded field duty, enforced across every mode. Set ≤99% to ensure bootstrap capacitor refresh for the gate driver — at 100% duty the high-side may not fully refresh, risking incomplete gate drive and increased MOSFET heating; 99% is effectively maximum in practice. On 24 V / 36 V / 48 V banks each duty-percent drives ~2× / ~3× / ~4× the field current, so the default is scaled down (≈50% at 24 V, ≈33% at 36 V, ≈25% at 48 V) to keep worst-case field current at the 12 V level, and it rescales automatically if you change system voltage in Vessel Info. The value shown here is exactly what's enforced — raise it if a large alternator needs more field and you accept the higher field current.

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.

Cold-Charge Lockout (?): ℹ️ Refuses to charge when the battery is too cold — protects lithium (LiFePO4/Li-ion) batteries, which are permanently damaged by charging below freezing. When ON, charging is locked out (field ramps to zero and cuts) whenever the regulator board temperature drops below the Min Charge Temp set below, and the alarm sounds if alarms are enabled.

The board temperature is only a proxy for battery temperature, and it runs WARMER than the surrounding air (the regulator makes its own heat), so set Min Charge Temp with margin above the real battery cutoff. Leave this OFF for lead-acid/AGM batteries, which charge fine in the cold. Turning this toggle off is the override.
Off On

Min Charge Temp (°F) (?): ℹ️ Board-temperature floor for the Cold-Charge Lockout above. Below this, charging is disabled. Because board temperature reads warmer than the battery, set this above the battery's true cutoff (lithium is conventionally 32°F / 0°C) — a value around 40°F is a conservative default. Re-arms after the board climbs ~2°F back above this floor (hysteresis prevents on/off chatter). Has no effect unless the lockout is ON.

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 (?): ℹ️Temperature-compensated zero correction. Once a day (engine and field off) it fits a line to the zero-drift log — sensor zero vs. temperature — and subtracts it live, tracking whichever temperature (board or alternator) the sensor actually follows. Blended slowly across days and hard-clamped to ±3 A. Reset Zero clears the learned fit. Turn On to apply the correction.
Off On
Fit: —

Zero-Drift Log (?): ℹ️Records the alternator current reading while the field is off — every 1 s while the engine spins (for a quick RPM sweep), every 10 min while it's off — with both board and alternator temperature. This is the data source the Alternator Zero Correction fits its temperature line to; leave it On. Download the CSV to inspect the raw drift, or Reset to start a fresh session.
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:
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.

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 — Tier 1 fires when one sample exceeds its threshold, Tier 2 when two consecutive do, Tier 3 when three consecutive do. 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.

G0 Command Limit (A) (?) — OC trips at ?A
A
G0 Overcurrent Trip Debounce (ms) (?)
ms
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.
V
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.
%
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
G5 Tier 2 — Two-Consecutive Threshold (A/s) (?) 10s peak slew: —
A/s
G5 Tier 3 — Three-Consecutive Threshold (A/s) (?) 10s peak slew: —
A/s
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 Min% 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

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.

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 field voltage. ? V
Field Curr ℹ️ Estimated field current. ? 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 for sustained slow hunting — a steady wobble in field drive, engine speed, and voltage that some engine/alternator/belt combinations develop at low engine speed under heavy load — and temporarily reduces the current loop's integral gain until the wobble dies. The change is verified: the reduced gain is kept only when the wobble measurably responds — dies out entirely, or at least halves and stays halved. If reducing gain does not calm the wobble (for example a cycling load or an engine problem is the cause), full gain is restored automatically and the event is noted in the console. Nothing is stored permanently; live state and every past episode are shown under Live Data ▸ Diag ▸ Oscillation Damper. Off: hunting persists at full gain until conditions change.
Off On

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 board 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 — whatever the board was when you commissioned. 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 board 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. Board temperature is a proxy for battery temperature, but the derate uses only the change in board temp since commissioning — so a constant board-warmer-than-battery offset cancels out; it only needs that offset to stay roughly stable, which it does. 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
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 always instant.
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 board 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.
Min% Floor & Field Decay — at each of three held speeds (max working → mid → idle) it finds the field onset knee, filling the per-RPM Min% floor 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.

Steady-State Detection

How stable a reading must hold, and for how long, before a point is recordable. Bands are judged on smoothed signals (see the smoothing filter below), so size them for real operating-point movement, not sensor noise.
RPM band (RPM) (?):

RPM steady time (s) (?):

Field-duty band (%) (?):

Field-duty steady time (s) (?):

Bus-voltage band (V) (?):

Bus-voltage steady time (s) (?):

Temperature band (°F) (?):

Temperature steady time, full (s) (?): ℹ️How long alternator temperature must hold steady 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. The This Session plot automatically uses half this time for its lighter "brief point" gate, so there is only one number to set.

Trend bucket length (s) (?): ℹ️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.

Output-amps band (% of reading) (?): ℹ️The alternator output itself must also hold steady before a point is recorded. The band scales with the reading so one setting works at low float current and full bulk current; the floor below takes over at low output.

Output-amps band floor (A) (?):

Output-amps steady time (s) (?):

Signal smoothing filter (s) (?): ℹ️Strips control-loop dither and sensor jitter so the bands above can stay tight enough to reject real transients. 0 = off. Heavier than about 1 second starts hiding real movement.

Minimum steady-run length (s) (?):

Point Admission

Minimum output before a steady point is admitted at all.
Admission: min amps (A) (?):

Admission: min duty (%) (?):

Curve Fitting

How the best-ever surface is built from recorded points.
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

Independent safety net: flags low output despite high field drive, even where the health gauge is still learning.
Alert: field drive at least (% of Max Field) (?):

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

Alert: must persist (s) (?):

Reference & Data

Choose which reference to grade against, pause or continue learning, back it up, simulate, or reset.
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.

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: —
Phase Definitions
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 (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).

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

Battery-side protections that ramp the field down or cut it entirely when a battery-safety limit is exceeded. These thresholds sit above the four control-loop throttling protections (Setup → Alternator → Protections) and a separate hardware overvoltage backup (needs no configuration).

Alternator Hard Shutdown Voltage (V) (?): ℹ️ Absolute battery voltage at which the alternator is force-shutdown: field is ramped to 0, GPIO4 is cut, and a cooldown lockout begins before charging can resume. The lockout is adaptive — 0.5 s for an isolated event, escalating toward 10 s if the cut keeps re-firing, and resetting after a minute without one. This is the only software-layer hard overvoltage shutdown — below it sit the Group 1/2/3 throttling protections (Voltage tab) which keep charging while trimming current, and a separate hardware overvoltage backup that uses a slow-averaged voltage to catch sustained overvoltage (for lithium it sits between the bulk target and this cut; for other chemistries it tracks this setting exactly — see the console log on boot for the programmed threshold). Where to set it depends on chemistry. Lithium: just below the battery protection circuit's (BMS) disconnect voltage, so the alternator stops before the BMS opens the contactor. Flooded/AGM: brief bounded excursions do not harm a lead-acid battery (its damage mechanisms accumulate over minutes to years), so the ceiling is placed to protect connected DC electronics from sustained high voltage instead — the commissioning battery-defaults proposal fills in the recommended value per chemistry. Changing the system voltage class later re-derives a conservative value; re-run the battery-defaults proposal afterward to restore the chemistry-specific one.

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.
SoC Integration
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 (?): ℹ️ 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 and are hidden — the alternator current limit is then the only thing bounding charge current.
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µΩ
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
BMS Integration
Defer to BMS Control (?):
No Yes

Charge on ___ BMS Signal (?):
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
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
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
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
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.
Weather Mode ℹ️ 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
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: ? Accounts for losses, 0.75 typical, adjust to fit your system

High Solar Threshold (kWh): ? If predicted solar output for at least 2 of next 3 days exceeds this value, pause alternator output
How It Works

Weather mode automatically fetches solar irradiance forecasts using your GPS coordinates and calculates expected solar panel output. GPS coordinates are obtained automatically — first from your NMEA2000 network (boat GPS), and if that goes silent, from your phone's location (when the app has location permission). You can also type coordinates manually below; a manual entry is a sticky override that takes priority over both the boat and phone GPS until you press "Use automatic GPS" to return to automatic sourcing. When high solar conditions are predicted for two of the next three days, alternator charging is paused. Solar panel wattage and performance ratio settings allow accurate prediction of future solar energy production. GPS coordinates are required for weather forecasts to work. If the "Update Weather Now" button fails and forecasts are not updated, check Live Data → Console for troubleshooting information (missing GPS, weak WiFi, etc.). This feature reduces fuel consumption and system wear when Mother Nature is planning to help.

Alarm Enable (0):
Off Armed

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

Low Temp Alarm (°F) (0):
Voltage & Charge Alarms
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
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:
Data & Communication
Cloud Features (?):
Off On

VE.Direct Data (?):
Off On

NMEA 0183 Data (?):
Off On

NMEA2K Data (?):
Off On

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

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.
Display Preferences
Temperature Units: ℹ️ Choose Fahrenheit or Celsius for all temperature displays and form inputs. Setting is saved on the device.
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
Emergency & Troubleshooting
⚠️ Caution!
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 — field will be enabled regardless of RPM. Use if RPM sensor is absent or malfunctioning.
No Yes

Min RPM For Field (RPM) (?): ℹ️ Field is cut immediately when RPM falls below this threshold. Set to 0 to disable (not recommended — use Ignore RPM instead).

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
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:
User Interface
Dark Mode:
Off On

Switch Panel Override (?): ℹ️ Coming soon
Off On
Security & Maintenance
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.
Configuration Backup & Sharing


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.

Fuel Consumption

RPM GPH

These values are used to estimate fuel burned based on engine RPM. Fuel consumption totals appear in Cloud Features → Statistics.

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 without an overheat event this boot session. Resets to zero on reboot and on any new overheat. Does not persist across power cycles. hr

Field Control

Command Field Duty Cycle 0 %
Field Volts (Calc'd) 0 V
Field Amps (Calc'd) 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 0L
Session 0L

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

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
Victron Battery Voltage ℹ️ Available if VE.Direct Data is turned on in Setup→System 0 V

Charging Mode

-

Current

Battery Current 0 A
Victron Battery Current 0 A

Charge/Discharge Time

Time to Full Charge 0 min
Time to Full Discharge 0 min

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
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

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→System. 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

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 nautical miles per gallon 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. Maximum is the highest GPS speed seen. Both are speed over ground, so they include current. Lifetime persists; Session resets with the button.
Average
Lifetime 0.0kts
Session 0.0kts
Maximum
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 0L
Session 0L

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 Setup→Software Updates ?
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
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

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. Refreshes about once a minute while the alternator is idle; measuring it reads flash, which is never touched while charging, so the value holds still during a charge. ?

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
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%

Alternator Temperature Sensor Health (DS18B20)

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

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
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
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
Auto Min% Learn NVS Save ℹ️ Persists learned field-onset floors (Auto Min%) 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
Oscillation Damper ℹ️ The wobble detector that sits inline in the control loop. It records one field-drive sample per control tick and runs its frequency analysis only once every 32 ticks (~1.6 s), so almost every pass costs nothing and the worst pass is the analysis itself. It never writes flash — episode records are queued in memory and saved only once the field has been off for ten seconds. If this number is ever more than a fraction of a millisecond, 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
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
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
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

How this interface gets used. "Today" counts reset at the daily cloud upload; lifetime totals persist on the device.

Time & Opens

Open Time (Today) --
Opens (Today) --
Open Time (Lifetime) --
Opens (Lifetime) --
Days Uploaded --

Top Pages (Today)

No data yet

Top Buttons (Today)

No data yet
About

X Engineering Alternator Regulator
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 ~1 s averaged bus voltage crossed the hardware limit: Bulk + 0.3 V for lithium, equal to the Alternator Hard Shutdown Voltage for other chemistries). Hardware cuts the field electrically before software runs. Should be zero under normal operation — the software cut acts first. ?
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: measured battery voltage exceeded BulkVoltage + spike margin. Field ramps down and cuts after settle. Occasional events during RPM transients are acceptable. ?
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. ?
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 that comparison are smoothed over several seconds (the Signal smoothing filter setting), so this reads steady-state performance only. 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

Charging System Health vs Engine Hours ℹ️A healthy charging system holds a roughly flat line in the mid to high 90s — a steady downward trend is what to watch for.

Window:
worst 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. ? 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

Some engine, alternator and belt combinations develop a slow wobble at low engine speed under heavy load — a steady swing, somewhere between about a third of a cycle and two cycles per second, in field drive, engine speed and voltage together. The damper watches field drive for that wobble and temporarily reduces the current loop's integral gain until it dies. Every reduction is verified: it is kept only if the wobble measurably responds. If it does not respond, the cause is outside the regulator — a cycling load, or the engine's own governor — and full gain is restored. No gain change is ever stored permanently; everything here clears on restart. The damper is switched on or off under Setup ▸ Alternator ▸ Tuning ▸ Current ▸ Controller Parameters.

Status

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 is the damper holding it down. It climbs back at about 0.2% per second, and after a verified episode it parks just above the level that proved quiet — so it will not reach 100% again until engine speed moves well away from where the wobble happened, or the regulator restarts.

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.

Episodes on record

Field swing is how far field drive was swinging when the episode opened and when it closed. 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 also served at /huntledger.

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

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 board temperature so runs are comparable; Δ 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 Board °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

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

GPS / Time Source (?) — live: ?: ℹ️ Auto: NMEA wins when present, phone fills in when NMEA goes silent, NTP as last resort.
NMEA only: ignore phone and NTP even if NMEA is dead.
Phone only: ignore NMEA and NTP even if phone is offline.
NTP time only: use internet time only; GPS still falls through Auto.
Forcing a stale source still shows its last value (greyed) so you can diagnose.
Note: a position typed manually in Weather Mode overrides every option here until you clear it there.
Loading long-term history…
Charge Stage
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...