XEngineering
Sailboat
Connecting to regulator
XEngineering
?
Batt - V SOC - %
Alt - A Batt - A
Temp
- °F
RPM - IGN ?
Alternator Enable
Settings are Locked
⚠ Avoid parameter changes during rapid RPM or load swings — controls may briefly lag.
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.

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. The commissioning step initially fills this column, and it self-maintains automatically (Learning). Stored values are referenced to a 150°F winding temperature and adjusted to the live alternator temperature each tick. Turn off Learning below to edit values 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 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 (0–100%) applied to the field winding when Manual mode is active. 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 / 48 V banks each duty-percent drives ~2× / ~4× the field current, so the default is scaled down (≈50% at 24 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.

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.

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) (?): ℹ️️°F above the alternator temperature limit 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) (?): ℹ️️°F above the alternator temperature limit 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.

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/4 iExcess detectors (alternator + battery), 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:
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 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 turns the whole layer off.

Watches alternator output current. Two regimes, split at the Strict Over-Current Band below target. Near the target: engages when the time-averaged current rises above the commanded setpoint by more than the Detection Threshold. Below the band: the looser Detection Threshold (Bulk) takes over, judged against the commanded ceiling instead of the moving setpoint — so normal speed-up ramps don't false-trip. The threshold is bounded by the Threshold Floor / Ceiling (amps), and Release Hysteresis sets the re-arm point.

Two battery-side features. 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 is a protection: 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 — catching FET-disconnect or load-drop events. Unlike the over-current detectors, Load Dump stays armed even when test protections are disabled.

G0 Command Limit (A) (?) — OC trips at ?A
A
G0 Overcurrent Trip Debounce (ms) (?)
ms
G1 Group 1 Enable (?)
Off On
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 Group 2 Enable (?)
Off On
G2 OvMeasMargin — Group 2 Trigger Margin (V) (?) ℹ️Lower = engages sooner above target. Set it above the normal voltage variation you see above target, so ordinary fluctuation doesn't trip it. Does not affect the iExcess detectors (Group 3/4) — 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 fire 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 (?) ℹ️Within this band of the presently acting voltage target (usually, the bulk voltage), it's strict — it reacts whenever current exceeds the current setpoint. Below this band, current is allowed to momentarily run well above the moment-to-moment setpoint, all the way up toward the “ceiling” (the most current allowed right now).
V
G3 Detection Threshold — % of command (?%) ℹ️How far the measured current may rise above the commanded current before the near-target detector steps in, as a percentage of that command. It acts on a time-averaged current, so a brief spike won't trip it — only a sustained excess — and it is bounded by the Threshold Floor / Ceiling. Well below the target, the Detection Threshold (Bulk) takes over instead.
%
G3 Detection Threshold (Bulk) — % of ceiling (?%) ℹ️The Group 3 threshold used when battery voltage is well below the charge target — a percentage of the ceiling (the most current allowed right now) rather than the moving setpoint. Intentionally looser than the threshold above: far from the voltage target, more difference between commanded and actual current is acceptable, so it only catches large overshoots. The handoff between the two is the Strict Over-Current Band.
%
G3 Threshold Floor (alternator) — minimum amps (?) ℹ️The smallest the detection threshold is ever allowed to become, in amps. When the commanded current is small, the percentage-of-command threshold above could shrink so far that normal current variation trips it — this floor prevents that. Whichever is larger, the percentage or this floor, is used. The ripple-vs-threshold plot shows whether your value clears the measured ripple.
A

G3 Threshold Ceiling (alternator) — maximum amps (?) ℹ️The largest the detection threshold is ever allowed to become, in amps, for the alternator-current (bulk / current-limited) detector. On a very large commanded current the percentage-of-command threshold could grow so wide that a real overshoot slips under it — this ceiling caps it. Whichever is smaller, the percentage or this ceiling, is used.
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
Ripple projection is from Commissioning ▸ Step 5 (Disturbances) ▸ current check. Re-run that step to update it.
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.
A
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 Tier 1 — Single-Sample Threshold (A/s) (?) 10s peak slew: —
A/s
G4 Tier 2 — Two-Consecutive Threshold (A/s) (?) 10s peak slew: —
A/s
G4 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
G1G2G3G4 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 voltage 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.

G1G2G3G4 Recovery Seed Fraction (?)
×
G1G2G3G4 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
G1G2G3G4 Over-Ramp Restraint (?) ℹ️When on, restrains how fast the output-current integrator is allowed to climb during a recovery whenever measured current stays below command while the integrator keeps ramping up — the signature of the loop chasing a falling engine speed. This prevents the self-inflicted second over-current trip on the way back to idle. Off restores the classic (unrestrained) integrator.
Off On
G1G2G3G4 Restraint Arm Threshold (A·s) (?) ℹ️How much accumulated under-current must build up before the restraint engages: command minus measured current, integrated over time, in amp-seconds. The accumulator leaks back toward zero whenever current is at or above command, so only a sustained shortfall reaches this threshold. Higher engages only on a longer or deeper sustained shortfall; lower engages sooner.
A·s
G1G2G3G4 Restrained Integration Rate (?) ℹ️How fast the integrator is still allowed to climb while the restraint is engaged, as a fraction of its normal rate. 1 means no restraint; lower means a slower climb. Avoid 0 (fully frozen): a frozen integrator can never catch command, so the restraint would never release on its own and would run to the time limit below.
×
G1G2G3G4 Restraint Time Limit (ms) (?) ℹ️Hard upper bound on how long the restraint can stay engaged. Normally it releases on its own the moment measured current catches command; this is only a backstop for the case where current never catches. Set it comfortably longer than the time the loop needs to settle after a trip, so a premature release cannot restart the over-ramp.
ms
G3G4 Restraint Auto-Sizing ℹ️Measures the uncut recovery over-ramp on a real worst-case throttle chop, then proposes the three restraint settings above. Arm it, then do a hard throttle chop down through the alternator's steep speed band with the charge command near the top of its range. The first over-current trip fires normally; the second (the recovery over-ramp) is suspended and measured — over-voltage protection and the absolute hard-over-current trip stay live the whole time. Nothing changes until you press Apply.
idle
G1G2G3G4 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.
×
G1G2G3G4 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
G1G2G3G4 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/4) can still arm during fast-rise. Range 0.05–2.0 V.
V
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.

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.
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. 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; alongside it sits a separate hardware overvoltage backup at the same default threshold of BulkVoltage + 0.3 V, using a slow-averaged voltage (see the console log on boot for the exact programmed threshold). Should be set just below your battery BMS shutdown voltage so the alternator stops before the BMS opens the contactor. First-boot default auto-scales to BulkVoltage + 0.3 V (so 14.8 V on a 12V system, 29.1 V on a 24V system, 57.9 V on a 48V system). Once you save your own value it stays absolute — re-set it manually if you later change BulkVoltage to a different system class.

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: alternator hard-shutdown (Alternator Hard Shutdown Voltage exceeded), voltage sensor disagreement (warning or critical), both voltage sensors implausible, temperature warning/sustained, temperature data stale, alternator current data stale. 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
Invert Battery Amps (?):
No Yes

Battery Current Offset (A) (?):

Shunt Resitance uOhms (micro)(?): ℹ️ Resistance of your current shunt in micro-ohms (µΩ). The current sensor uses this value to convert measured voltage drop to amps. Victron SmartShunt / BMV shunts = 100µΩ. Check your shunt's datasheet if unsure — an incorrect value will scale all current and SoC readings proportionally.
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 the Console tab 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:

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

Debug data ℹ️Downloads a single CSV with everything useful for debugging this subsystem: all parameters, live/gate state, both reference surfaces (My History + Uploaded), the trend buckets (committed + in-progress), and the engine-hour frame. Hand it to an AI or engineer to diagnose behaviour.

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 5. 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: —
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 the CV plant fit — 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 (?): ℹ️ Used to convert measured stator frequency (Hz) into RPM. Adjust until RPM in this App matches your tachometer. Decent guess = 1100.

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! Harware Over-voltage protection is still active.
Off On
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
Hardware settings (current sensor type, shunt resistance, amp polarity): ℹ️These describe this boat's physical installation, not the charge profile. Include them only when the file will go onto identical hardware — a backup of this regulator, or a sister vessel with the same sensors and wiring. Per-device calibration (sensor zero offsets) is never included either way.

Save this regulator's complete configuration to a file:

Apply a configuration file to this regulator: ℹ️Shows every setting the file would change before anything is written — nothing applies until you approve. Settings the file does not contain keep their current values. The regulator reboots to apply; reconnect after about 30 seconds.

Share this configuration to the community library: ℹ️Shares the charge profile and tuning only — hardware settings never leave the boat, because they describe this installation's sensors and wiring, not anything another boat could reuse. Submissions are reviewed before appearing publicly. Requires cloud registration.

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) (?):

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 and Group 4 iExcess over-current detectors (alternator + battery), 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 4 battery rate-of-change tiers), the INA228 hardware ALERT pin, and the hardware overcurrent trip (Alternator Current Limit + 10 A) stay active regardless.

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 two alternator-current filters (the PID feedback and the on-screen display) and the full plant delay to the voltage filter — see each tooltip below for the reasoning. You can also override any value individually.

Alternator current display filter (ms) (?): ℹ️ EMA time constant that smooths the alternator-current value shown on the dashboard and written to the logs. It does not feed any control loop, and it does not feed the iExcess over-current detector (Group 3/4) — that detector does its own averaging (its Averaging Time Constant, on the Current tab) on the raw current signal. Set All Filters writes plant/3 here, which keeps the on-screen reading responsive while taking the edge off sensor noise. Lower values track faster but look noisier; higher values are smoother but lag the real current.

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/4). 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 and Group 4 iExcess over-current detectors (alternator + battery), 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 4 battery rate-of-change tiers), the INA228 hardware ALERT pin, and the hardware overcurrent trip (Alternator Current Limit + 10 A) stay active regardless.

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 (?): ℹ️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.
Test Limiters
Turn the rate limiters in the current-control (CC) path on or off to study the test with and without them. Both default On — leave them On for normal operation.

Setpoint smoothing limiter (current setpoint slew) (?): ℹ️ Master switch for the rate limit on the commanded current target (setpoint slew, SetpointRiseRate / SetpointFallRate). On (default): each square-wave edge ramps at those rates instead of stepping, so the loop sees a paced target. Off: the target steps instantly — the true square the controller-tuning fit wants. This also applies in normal operation, where Off additionally bypasses the turn-on startup ramp and the large-step gentling, so leave it On except during a test. The over-voltage protections and absolute backstops are independent of this and always instant.
Off On

Field smoothing limiter (duty slew) (?): ℹ️ Master switch for the rate limit on the field PWM output (duty slew, DutyRampRate) — this is 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, linked with the same switch on the Voltage tab — changing it in either place changes both, and it applies in both tests and in normal operation, so leave it On except during a deliberate test.
Off On
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

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, 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, 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, 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 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/4) 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):
Voltage Step Generator
⚠️ Protections: ℹ️Toggle right = Enabled (default). The regulator runs Group 1 (predictive OV), Group 2 (measured OV), the Group 3 and Group 4 iExcess over-current detectors (alternator + battery), 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 4 battery rate-of-change tiers), the INA228 hardware ALERT pin, and the hardware overcurrent trip (Alternator Current Limit + 10 A) stay active regardless.

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 30s. Must be long enough for the voltage to fully settle in the high phase.

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.
Test Limiters
Turn the rate limiters in the voltage-control (CV) path on or off to study the test with and without them. All default On — leave them On for normal operation. The ramp rate values live under Controller Parameters.

Target voltage ramp limiter (?): ℹ️ Master switch for the voltage-target slew. On (default): the active charge target voltage can only move at the up/down rates (set under Controller Parameters), so a commanded change (stage transition or a new setpoint) glides instead of stepping. Off: the target changes instantly — byte-for-byte the old behaviour, for A/B comparison. This limiter also applies during the CV-tuning square-wave test so you can study the loop with it on or off. It changes nothing about the protections: over-voltage detection fires at the same speed relative to the current target, and the absolute backstops (hardware over-voltage comparator + software hard-shutdown, both fixed voltages) are completely independent of this and always instant.
Off On

Rise governor / anti-windup limiter (?): ℹ️ Master switch for the inner anti-windup clamp on the voltage target (rise governor). 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. Off: the loop sees the full up-step at once — useful to see the un-clamped step response, but the integrator can wind up and trip over-voltage on a rising step, which ends the test. Falling steps are instant either way. The fast over-voltage backstop still fires and cuts the field, so this is safe to throw on the bench but expect aborted up-steps. Leave On in normal operation.
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, linked with the same switch on the Current tab — changing it in either place changes both, and it applies in both tests and in normal operation, so leave it On except during a deliberate test.
Off On
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 KS KH IEx% IEτ IKB LDT2 LDT1 LDT3 TC WA WP KO CR OVf IEf LDf HOCf RPM Temp BattV SOC% CVT Stage Date/Time
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
Shortcut to Voltage Setpoint adjustment

ℹ️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.

CV Gain Source (?): ℹ️How Voltage Loop Kp/Ki are set. Auto computes them from the commissioned plant fit (the measured finite-horizon gain K20 from the CV plant-fit step) via the exact PI magnitude condition at the target crossover ω_c: Kp = 1 ÷ (K20 × √(1 + (ρ/ω_c)²)), Ki = ρ × Kp — you set only the desired recovery speed in the "CV Response Time (s)" field below (ω_c is derived from it) and the integral-zero ratio ρ. 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 / 48 V systems.
Manual Auto

No plant fit yet — run the CV plant-fit step in commissioning. Auto uses safe defaults until then.

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) slope-aware integrator bleed — drains the integrator early when voltage is rising fast near the target. 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

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, 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 above — 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, or 48 V bank, so you never re-tune it when you change system voltage (it is scaled to the bus behind the scenes).

CV Response Time (s) (?):  ℹ️Sets how fast the auto gain mode pulls battery voltage back to target after a disturbance or target change. Valid range 5–80 s; recommended 13–15 s (leaves some margin for cold batteries, which have higher internal resistance and can lead to overshoot). The other floor is the field ramp-rate limit (currently %/s of duty), so stay clear of that or you'll start seeing a more linear / less exponential recovery. Only affects Auto mode.

CV auto-tune Ki/Kp ratio ρ (?): ℹ️In Auto gain mode the integral gain is set as a fixed fraction of the proportional gain: Ki = ρ × Kp. This places the integrator's corner (where it starts pulling out steady-state error) relative to the loop's response speed. Lower ρ = lazier integral (slower to erase residual error, less windup); higher ρ = more aggressive integral. Default 0.70. Only affects Auto mode. (Was a hard-coded constant; exposed here for bench tuning.)

Battery-Temp Gain Derate (?): ℹ️The CV plant fit 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 CV plant-fit step.

Battery-Temp Resistance Coefficient (?): ℹ️How strongly the gain derate reacts to temperature: the battery's fractional internal-resistance change per °C, entered as a fraction (0.03 = 3 %/°C). The derate scales the gains by exp(coeff × ΔT in °C) between the commissioning temperature and now. Higher = stronger correction. Typical battery internal resistance rises roughly 2–4 %/°C as it cools; default 3 %/°C is a conservative middle value. The result is clamped to a safe band (gains never fall below 30% or rise above 120% of the commissioned value) and the temperatures are clamped to 0–100 °C, so a wild proxy reading can't produce dangerous gains. Set to 0 to make the derate inert without turning it off.

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

Slope bleed threshold (V/s) (?):10s peak rise: — ℹ️ Voltage rise rate above which the voltage loop integrator begins to drain. The rise rate is computed from the smoothed voltage signal (set by "Voltage sensor smoothing filter" in Tuning → Plant Delay), not from the voltage rate-of-change EMA used by Group 1 prediction. Below this threshold the integrator is unaffected. Setting too low causes false drains during normal charging; too high and it never fires in time.

Slope bleed gain (A per V/s) (?): ℹ️ How aggressively to drain the voltage loop integrator when slope exceeds the threshold. At 50 with 0.2 V/s excess slope, drains 1A per 100ms tick. Higher = more aggressive preemptive wind-down.

Slope bleed proximity gate (V) (?): ℹ️ Are we close enough to setpoint that the integrator could cause overshoot?

When measured battery voltage is more than this many volts below the active charge target, slope-bleed is fully suppressed — the voltage loop integrator needs every amp it can build to climb toward target. As voltage approaches target, bleed strength ramps smoothly from 0 to full, draining the integrator just before overshoot becomes likely.

Compares: measured voltage vs the live stage target (bulk, absorption, float — whichever is active right now).

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.
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. During warmup it is TemperatureLimit − 20°F, 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 in °F/s, 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 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 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.

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. The Slope Bleed Gain drains the integrator when voltage is climbing quickly, which prevents 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 plant fit 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 4) 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 eight 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.
Min% floor — finds the field level where each RPM range first starts making current, and fills the RPM table's Min(%) column.
Plant fit — 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 — 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.
Thresholds — a read-only review: it draws the over-current detector's trip threshold (from the floor, ceiling, and percent you set in Protections) against the ripple just measured, so you can confirm your settings clear it. Nothing is written here.
CV plant fit — 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.

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 plant-fit / 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 plant 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/4 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.

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

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 deg hotter than ambient depending on location and electrical demands 0 °F
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/?
Power Cycles (count) ℹ️ Lifetime, or since re-flashing 0
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
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

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

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 automatic maintenance every 4 hours (normal operation). 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

WiFi Status

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
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. This is the periodic loop spike that used to be invisible in this table.
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
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.

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

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 ?

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 4 (battery iExcess / 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/4 iExcess detectors or Group 4 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) and Group 4 (battery over-current) combined; Load Dump is counted separately. Near the voltage target it fires when the time-averaged current rises above the setpoint by more than the Detection Threshold (% of command) — on battery current when the CV loop regulates battery current, on alternator current otherwise. 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). ?
INA228 OV Events ℹ️ Rising-edge count: INA228 hardware ALERT pin fired (bus voltage crossed VoltageHardwareLimit = BulkVoltage + 0.3V). Hardware cuts GPIO4 immediately before software runs. Should be zero under normal operation. ?
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 — momentary dips and spikes are deliberately filtered out and never move this number. The label under the number tells you what the comparison is based on: MEASURED means a recorded best exists at this operating point (within a small matching window); ESTIMATED means it's interpolated between nearby records; "learning" means there isn't enough recorded here yet to grade fairly, so no number is shown.
Learning
no best surface points yet

Charging System Health vs Engine Hours ℹ️Each point is the alternator's output as a percentage of its own best-ever, plotted against engine-hours since the last "Start Over". The bold line tracks the WORST operating region (the early warning); the faint line is the overall average. Only FULL steady runs feed this trend — graded against the active reference (Measured/Estimated only; learning-a-new-region and no-reference runs are excluded), at most one sample every 10 seconds. A bucket needs at least 2 such samples (the "min samples per bucket" setting) before it commits a point; a sparser bucket shows a gap rather than a single-reading artifact. The bucket spans one engine-hour in normal use (shorter for testing). The in-progress bucket persists across reboots, so a part-finished hour resumes where it left off. A healthy charging system holds a roughly flat line in the mid-90s — a steady downward trend is what to watch for. A clean 100% is not expected (sensor noise + battery acceptance scatter). Absolute standing vs other alternators comes from the cloud, not this self-baseline. Use the Window buttons (10 h / 100 h / All) to zoom the engine-hours axis; click the axis numbers to set the % range, or the "auto" box to refit.

Window:
worst average

This Session ℹ️A health reading every 5 seconds since this page was opened, but only while the operating point is holding steady (the lighter session gate: all inputs steady for a few seconds and temperature steady for half the full record-book dwell). Green dots are measured comparisons (a recorded best exists at that operating point); blue dots are estimated (interpolated between nearby records). A dot ringed in orange is also a full steady run — the same kind of point that updates the reference and the engine-hours trend. Shaded spans are periods with no dot — not holding steady, no reference yet, or not running — where no number is shown on purpose. (A full steady run in brand-new territory has no reference to grade against, so it shows no dot and no ring here, by design.) Click the axis numbers to set the plot range.

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: ? ℹ️Whether the fast current sensor feeding this scope is actively sampling, dormant (its sense wire reads open, so the regulator stopped and re-probes every few minutes), or switched off with the Fast Current Channel master toggle in Setup → Diag.

Live Oscilloscope
ℹ️ The "scope" displays a snapshot of alternator output current, sampled 20,000 times per second — fast enough to show the rectifier ripple pulses, mechanical drive resonances, and other content the normal current reading averages away. 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). 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 ℹ️Not live. 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 — a separate, long-running dataset from the worst-value table below. 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. Download CSV saves the whole table; Clear Map wipes it (after a belt or alternator change) and it re-learns on the next steady runs. Clear Map also clears the Highest Tone row of the worst-value table below (that headline belongs to the map); the Ripple Pk-Pk worst is kept. 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 ℹ️Each square is one operating point — engine speed across, output current up. Color is the broadband ripple recorded there: darker teal means more ripple. Faint squares haven't been run long enough to learn yet; the map fills in on its own as the engine spends time at more speeds and loads. 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.
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 Scores

How tightly each control loop tracks its target, and its worst single excursion in the damaging direction — counted only while that loop actually held control (so a cold alternator or a stage with no current headroom is never scored against it). Lower is better. Accumulates since the last reset; auto-resets after each daily cloud snapshot, or press Reset below. Dash = no qualifying data yet.

Loop RMS error Worst overshoot

Current loop (A)

Voltage loop (mV)

Thermal loop (°F)

Color guide
Good Watch Poor
Current RMS < 3 A 3 – 5 A ≥ 5 A
Voltage RMS < 200 mV 200 – 300 mV ≥ 300 mV
Voltage overshoot < 100 mV 100 – 150 mV ≥ 150 mV
Thermal RMS < 10 °F 10 – 15 °F ≥ 15 °F
Thermal overshoot < 1 °F 1 – 2 °F ≥ 2 °F

Thermal-overshoot bands track the live over-temp shutdown trip (default 2 °F); red means it reached shutdown. Current overshoot is not scored at this time, too noisy to be meaningful.

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 → Diag (link at the bottom of the page).

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 live since this page was opened.

Live Oscilloscope & Historical Snapshots shows the alternator's output current sampled 20,000 times a second — 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 the 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 filter 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 Scores grade how tightly each loop — current, voltage, thermal — holds its target while avoiding overshoot. Grading is limited to transient scenarios so that long steady runs are not rewarded.

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 → 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 low (bottom knee) 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 (LiFePO4 default shown, scaled to your nominal voltage). Only the bottom-knee rows (≤20%) are actually used for the anchor, so those are the ones worth getting right.

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 (°C) (?):

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.

ℹ️ 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.
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
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).
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...

CONNECTED