The live scatter plot for anomaly detection is shown in Live Data → Alternator (Field vs Output for this RPM and Temperature Bucket). The reset button is also there, just below the plot.
What This System Does: The efficiency matrix learns the normal relationship between alternator field drive and output current across engine operating conditions. Once enough data is accumulated, it can detect when the alternator is producing significantly more or less current than it historically has under the same conditions — an early warning of problem such as brush wear, diode failure, belt slip, etc.
The Reference Matrix: Operating conditions are divided into bins along three axes — engine RPM, alternator case temperature, and field drive voltage (duty cycle × battery voltage). Every qualifying operating point is accumulated into the appropriate bin as a time-weighted running average, with minimum and maximum values tracked. This matrix persists across power cycles and accumulates forever. The more hours of operation, the more reliable each bin becomes.
Reference Finalization: Once the matrix has accumulated enough data across a sufficiently wide spread of operating conditions, the system automatically selects the best-populated bins as reference bins and freezes their values. These frozen values become the permanent baseline for anomaly detection. The selection algorithm favors bins that collectively span a wide range of RPM, temperature, and field drive — ensuring the reference is not built from a single narrow operating region. Until finalization occurs, the plot displays available data at reduced opacity with a "Low Confidence" label.
Two-Tier Anomaly Detection: Once reference bins are finalized, every qualifying operating point is checked against the reference for its current bin. Tier 1 is instantaneous — if the current output falls outside the stored reference min/max range (plus your configured tolerance), an error is counted immediately and continues to count on every qualifying tick the deviation persists. This catches sudden failures like a broken belt or failed diode. Tier 2 is thermal — once at least 90 qualifying samples have accumulated in the same bin during this session (roughly 90 seconds at the typical 1 Hz sample rate), the running session average is compared against the reference average. If it has drifted past your configured degradation percentage, a single Tier 2 error is recorded for that bin (it fires at most once per bin per power cycle). This catches gradual degradation that stays inside the historical range on any individual reading but represents a sustained drift. Both tiers check in both directions — unexpectedly high output is also flagged, as it can indicate a regulator fault or measurement error.
The Plot: The scatter plot shows field drive voltage on the horizontal axis and alternator output current on the vertical axis. When a finalized reference bin is active, a gray shaded band shows the historical min/max range and a solid gray line shows the historical average for that operating region. The red dot shows the live operating point. If the red dot sits inside the band, the alternator is performing normally. If it drifts outside, the band color and the warning banner below reflect the deviation. When operating in a populated but non-finalized bin, the band is shown faded with a Low Confidence label. When no reference data exists for the current conditions, only the red dot is shown.
Alarms and Reset: The session error count resets each power cycle. If the combined Tier 1 and Tier 2 error count exceeds the configured threshold in a single session, a warning banner appears on screen and optionally triggers the physical alarm output. The warning banner gives specific detail about which operating conditions triggered the anomaly, what the reference values were, and by how much the current output deviated. Use the Reset button only if you have replaced the alternator or made a mechanical change that invalidates the existing reference — it clears all accumulated matrix data and reference bins permanently.
Pick a pill to focus on one protection. Tune the control loops first (in the Tuning tab, protections off), then adjust these after.
When measured current exceeds the safe system limit for the debounce duration, the trip fires. Set Command Limit to the lowest safe maximum across the whole system — including alternator continuous rating, battery acceptance, mechanical belt drive capacity, fuse ratings, and wiring limits. Whichever is lowest. 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.
Engages when measured alternator current exceeds the commanded setpoint by K_excess amps for the N — Persistence count of consecutive ticks (~5 ms each). Signal Filter selects how the current signal is filtered before comparison — Raw, MA(N), or EMA(TC). MA Window sets the moving-average window when MA(N) is selected; the EMA time constant is the Excess current detection filter shown read-only here (lives in Tuning → Plant Delay). Arming requires the CV loop to be active AND measured voltage to be within the Arming Margin below target.
Three tiered thresholds on the rate-of-change of battery current. Tier 1 fires when one sample exceeds its threshold. Tier 2 fires when two consecutive samples exceed its threshold. Tier 3 fires when three consecutive samples exceed its threshold.
The field drive FET is powered off and the field collapses through the coil's natural time constant. Hardware-level cut — no adjustable parameter, and 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 — applied every tick, cumulative across the overshoot duration. Shared with Measured OV. AW Bleed Rate continuously drains the voltage integrator while any of the other protections is clamping, scaled to alternator size via Command Limit.
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.
K_bleed — Integrator Bleed Mode drains the voltage integrator during the event — 0 means snap to zero every tick (default, maximum response); > 0 walks the integrator down proportionally to the amount of excess. AW Bleed Rate also drains continuously while active.
The voltage integrator is snapped to 0 instantly on the rising edge of the trip — hardcoded, no adjustable parameter for the snap itself. AW Bleed Rate also drains continuously while active.
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.
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.
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.
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.
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 (Settings → Alternator → Protections) and the INA228 hardware ALERT pin (a hardware backup that needs no configuration).
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 (default 0.25 sec).
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.
| 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 |
Weather mode automatically fetches solar irradiance forecasts using your GPS coordinates and calculates expected solar panel output. GPS coordinates are obtained automatically from your NMEA2000 network, or can be entered manually if no GPS compass is connected. 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.
Test Parameters
Last Test Results
Rise Delays (ms)
Fall Delays (ms)
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 current filters and the full plant delay to the voltage filter — see each tooltip below for the reasoning. You can also override any value individually.
IExcessN persist counter on top of this EMA, so the effective trip lag is roughly N × loop_tick + 3τ. Filtering at the full plant delay would make the trip too sluggish to catch real transients before the fastOV supervisor has to clean them up; plant/3 gives the detector a clear view of current dynamics in the plant's response band while still rejecting noise above it. Only active when Group 3 signal source is set to EMA(TC) — has no effect in MA(N) (default) or Raw modes. Echoed read-only in Current tab → OV Protection Group 3. Default: 100 ms.
plant/3 lets the controller see current dynamics in close to real time without feeding raw sensor noise into Kp/Kd. Independent from the Group 3 excess-current filter. 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. Default: 100 ms.
Control Loop
Term Contributions
Field Output
| # | Score ↑ | Kp | Ki | Kd | SDiv | Track | DRamp | Amp | Per | RPM | Temp°F | Worst | t(s) |
|---|
Score = ISE/s (lower is better). Scored within 5s of each setpoint step, after 2 ring-in cycles. ■ <2 ■ <6 ■ ≥6. Highlighted rows match current PID + wave settings.
Voltage Control Loop
| # | Score | ↑Settle | ↑OvV | ↑ISE | ↓Score | ↓Settle | ↓OvV | ↓ISE | ↓US | VKp | VKi | SRR | SFR | AwBl | AwRec | AwSP | RsF | KS | KH | IExK | IExN | IKB | LDT2 | LDT1 | LDT3 | TC | WA | WP | KO | CR | OVf | IEf | LDf | HOCf | RPM | Temp | BattV | SOC% | CVT |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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. ■ <2 ■ <10 ■ ≥10. Highlighted rows match current VKp/VKi + wave settings. OVf/IEf/LDf/HOCf = protection fire counts during scored phases.
Temp Loop Status
Term Contributions
Steps the temperature setpoint between a low and high value. Scores each step-up transition on settling time and overshoot. Requires alternator to be thermally engaged — run at steady mid-RPM with unconstrained current demand and a low setpoint so the loop is active. Allow 2 full cycles to ring in before scoring begins.
| # | Score | Settle (s) | Worst Over (°F) | Avg Over (°F·s) | Avg Under (°F·s) | Steps | Kp | Ki | Lookahead (s) | Filter α | Interval (ms) | Low (°F) | High (°F) | Half-Period (min) | RPM | Ambient (°F) | Rise (A/s) | Fall (A/s) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No records — open section to load. | ||||||||||||||||||
Score = AvgSettle + K_over × AvgIntOver + K_under × AvgIntUnder. Lower is better. Live score (always-on) uses asymmetric ISE when loop is actively engaged.
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, but only during Bulk, Absorption, and Float — it computes the current target that holds the battery at the configured voltage. 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 does not act on the current temperature reading. It acts on a projected temperature — current filtered temperature plus the measured rate of rise multiplied by the Thermal Lookahead horizon (default 90 seconds). This is what lets the loop pull current down before the alternator actually reaches the limit. 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 Bulk, Absorption, and Float. 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.
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 caps current when a sustained battery-current rise rate is detected, catching FET disconnect or load drop events. Group 3 (iExcess) bleeds the voltage-loop integrator if current overshoots, killing the cause rather than just the symptom. 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 to Tune the PID Controller
Overview: The output current loop, the voltage loop, and the temperature loop each have their own dedicated tuning mode (Tuning Mode for the inner current loop, CV Tuning Mode for the voltage loop, Thermal Tuning Mode for the temperature loop). Tune them in that order — inner loop first, then voltage, then thermal — because each layer depends on the one beneath it being stable. This section covers the inner current loop. Voltage and thermal tuning have their own dedicated tabs with built-in step tests and live scoring.
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 from its default 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, Group 3 iExcess, GPIO4 hard cut) handle the
unsafe edges — you don't need the loop itself to react instantly. Smooth and stable beats fast and
harsh.
Current Defaults: Kp = 0.5, Ki = 2.0, Kd = 0.01, PID Tracking Gain = 4.0, Duty Ramp Rate = 50 %/s, Setpoint Rise Rate = 30 A/s, Setpoint Fall Rate = 50 A/s. These are sensible starting points but every installation is different — always verify with a step test in your own setup.
Alternator Current
0 A ↑— ↓—
Temperature
Field Control
Alt Current Zero Offset (Auto-Learned)
0.00 A
Field vs Output for this RPM and Temperature Bucket
Anomaly detection settings (tolerance, alarm threshold, degradation sensitivity) live in Settings → Alternator → Advanced → Anomaly Detection.
Performance Matrix — Coverage Summary
Total SS time accumulated across all operating condition bins. Gray = no data collected yet in that bucket.
DS18B20 Temperature Sensor Health
Counts since boot. One read failure on startup is normal. Persistent failures need attention; occasional CRC recoveries are fine.
Live Tuning Scores
Always-running scores over rolling clock-time windows. Lower is better. Dash = no qualifying data yet for that window.
State of Charge
0 % ↑— ↓—
Battery Voltage
Charging Mode
-
Battery Current
Charge/Discharge Time
SOC Gain Factor (Auto-Learned)
1.000
Engine Speed
0 rev/min ↑— ↓—
Boat Speed
Wind Data
Heading & Course
GPS Position
Heel Angle
0.0° ↑— ↓—
Pitch Angle
0.0° ↑— ↓—
Vertical Acceleration
0.00 g ↑— ↓—
Current Motion
Anchorage Comfort
Underway Metrics
Events (Current Window)
Events (Lifetime)
Raw Accelerometer (g)
Raw Gyroscope (°/s)
Lifetime Maximums
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.
Window Stats - Accel (g)
Window Stats - Gyro (°/s)
Window Stats - Calculated
Diagnostics
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.
Function Timing — Worst Case (ms) ℹ️ Worst-case execution time per function. 5s window 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 ReadAnalogInputs shows up under that row.
NVS Full Save ℹ️ saveNVSDataFull() persists all session/lifetime accumulators (charged energy, runtime, fuel, distance, lifetime damage, dynamic learning, IMU lifetime counters) to flash in a single synchronous commit. It runs only at the field-off edge (5s after field cuts), at shutdown, and on capsize/pitchpole events. The commit blocks Core 1 for as long as it takes — that's safe because the field is off so there's no OV risk during the stall. If you've been running continuously for hours and the device loses power before the next field-off edge, the deltas since the last save are lost.
CH1 Sample Interval (ms)
INA228 Read Interval (ms) ℹ️ Inter-sample timing for INA228 voltage/current reads. Stats are gated to "field on" only. With the field on the INA228 runs in fast mode (~5 ms cycle target) and these values update. With the field off the INA228 drops to low-speed mode (~1054 ms cycle) and these values are intentionally frozen at their last reading — zero / dashes here means the field has not been on yet this session. Note: this interval is wall-clock time between successive read completions and spans multiple loop iterations. It commonly exceeds the worst single-loop time without anything actually being blocked — only the worst loop time tells you about a true stall.
Voltage Loop Actual Interval (ms) ℹ️ Measured time between consecutive voltage loop PI fires in CV mode. Target is VoltageLoopInterval (100ms). Values significantly above target indicate a stalled loop tick during CV operation. Zero until CV mode has fired at least twice. Note: this interval is wall-clock time across multiple loop iterations — it can exceed the worst single-loop time without any single loop being blocked. Also note that CV exit/re-entry inflates this number because the gap to the previous in-CV fire is reported even when CV mode was off in between. The worst single-loop time in the Function Timing table is the authoritative stall indicator.
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.
WiFi Status
Session Info
System
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
Thermal Protection Events
Board Temperature ℹ️ Temperature measured in the regulator, will often be 5-25 deg hotter than ambient depending on location and electrical demands
0 °F ↑— ↓—
ADS Ch3 Voltage
0 V
Loading historical data viewer...
Loading leaderboards...
Loading fleet statistics...