GUI: live STM32 telemetry + sweep guards + auto-logging + bench-plot
- stm32_link.py: port to the live 114-byte broadcast protocol (magic 0xAA55AA55, odd parity 8-O-1, 100 Hz publish, repetition-validated, no CRC); 39 params incl. adc4_trig_phase/iin_zero_sum, CLEAR_FLAGS, 30-bit flag table; commands stay CRC-16 framed; Telemetry aliases BroadcastData, efficiency uses iout_slow and eff_net subtracts P_sys - gui_workers.py: STM32Worker reader thread with counter dedup, rate/ loss counters, 20 s graph history, full-rate telemetry CSV writer - gui.py: right-side telemetry panel (link state, power + EFF net, heatsink/board temps, Vfly group, control, HRTIM, status-flag checkboxes, fault registers), Vfly + selectable corr/phase-ofs graphs, 20 s rolling window on all plots, dual CSV logging (merged stm_* columns + <stem>_telem.csv), logging on by default into logs/data_<timestamp>.csv, Plot Eff button - sweep guards: PSU 20 A input-current gate (conservative estimate + measured backstop + I-limit clamp), thermal pause at 57/77 C holding the load at 1 A until cooled 5 C below threshold, CC range pinned to R2 for the whole run with empirical range-max readback rejection - plot_eff.py + bench-plot entry point: efficiency vs Vin vs current maps from any logged CSV (sweep / data log / telem autodetect), file dialog when launched without args - bench.py: HIOKI FAST response speed, 5 s settle defaults; cli.py stm32-read prints the full broadcast; README + .gitignore updates Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -84,8 +84,42 @@ The GUI provides:
|
||||
- HIOKI channel range selectors + degauss buttons
|
||||
- Meter format selector (scientific/normal)
|
||||
- 2D sweep panel with time estimate
|
||||
- Live-updating power, efficiency, voltage, and current plots
|
||||
- Console log panel
|
||||
- Live-updating power, efficiency, voltage, and current plots plus STM32
|
||||
Vfly and vfly_correction/vfly_ofs_applied plots (selectable) — all graphs
|
||||
show the last 20 seconds
|
||||
- STM32 telemetry panel ("Link STM32", COM4 @ 460800 8-O-1): every field of
|
||||
the 100 Hz broadcast (V/I/P + net efficiency, temps, Vfly group, control
|
||||
mode, HRTIM compare registers, status flags, fault registers, param echo),
|
||||
with Ping and Clear Flags buttons; auto-reconnects on serial errors
|
||||
- Data logging: instrument rows (with the latest STM32 snapshot merged in as
|
||||
`stm_*` columns) to the chosen CSV, plus the full-rate 100 Hz telemetry
|
||||
stream to `<name>_telem.csv` alongside. Logging is ON by default: every
|
||||
launch auto-starts a log at `logs/data_<timestamp>.csv` (relative to the
|
||||
working directory); use Stop Log / Start Log to switch to a custom path
|
||||
- Console log panel (STM32 fault flags are reported here as they latch)
|
||||
- PSU capability guard: the HV supply can source at most 20 A
|
||||
(`PSU_MAX_CURRENT_A` in `gui.py`). Sweep steps whose estimated input draw
|
||||
`I_in = P_out / (0.90 * V_in)` exceeds that are rejected (skipped and
|
||||
reported per voltage), regardless of the requested step range; a measured
|
||||
backstop additionally drops any point where the supply actually exceeded
|
||||
the limit and backs the load off. The programmed supply current limit
|
||||
(sweep "I limit" field and manual supply controls) is clamped to 20 A, and
|
||||
manual CC/CP load setpoints are checked against live Vin/Vout readings.
|
||||
- Load range pinning: a mid-sweep auto-range transition on the Prodigit
|
||||
momentarily unloads the converter, so at sweep start the CC range is
|
||||
pinned to Range II for the whole run (auto-ranging restored after, with
|
||||
the load off). The reachable maximum of the selected range is verified
|
||||
empirically -- the sweep max is programmed with the load off and read
|
||||
back; if the readback comes back clamped, steps above it are rejected
|
||||
instead of silently clamped, and a sweep that fits nothing aborts up
|
||||
front.
|
||||
- Thermal sweep guard (needs the STM32 link): before every sweep step the
|
||||
heatsink/board temperatures are checked against the firmware trip limits
|
||||
(60 C / 80 C). At 57 C / 77 C the sweep pauses, holds the load at 1 A
|
||||
(CC; ~1 A worth of W in CP), and waits until both temps drop 5 C below
|
||||
the pause thresholds, then resumes at the same step -- no points are lost.
|
||||
If the STM32 link is down the sweep still runs, with a console warning
|
||||
that the guard is inactive.
|
||||
|
||||
### 5. Run efficiency sweeps
|
||||
|
||||
@@ -141,6 +175,32 @@ Produces three PNG files:
|
||||
- `*_heatmap.png` -- 2D efficiency surface (voltage x load)
|
||||
- `*_loss.png` -- power loss vs load, all voltages overlaid
|
||||
|
||||
#### Efficiency vs Vin vs current from any logged CSV
|
||||
|
||||
`bench-plot` auto-detects all three CSV formats the tooling produces -- sweep
|
||||
CSVs, GUI data logs (`data_*.csv`), and full-rate telemetry logs
|
||||
(`*_telem.csv`) -- and draws an operating-point map (x = Vin, y = current,
|
||||
color = efficiency) plus efficiency-vs-current curves grouped by Vin bin:
|
||||
|
||||
```bash
|
||||
uv run bench-plot # no args -> file-picker dialog
|
||||
uv run bench-plot data_20260703_140000.csv
|
||||
uv run bench-plot run1_telem.csv run2_telem.csv --vin-bin 2 --save eff.png
|
||||
|
||||
# options: --current iout|iin, --source auto|hioki|instr|stm (data logs),
|
||||
# --min-pout W (default 5), --vin-bin V (default 1), --save PNG
|
||||
```
|
||||
|
||||
Also reachable via the GUI's "Plot Eff..." button (Logging section, opens the
|
||||
same dialog preselecting the last log) and `plot_eff.bat` one level up
|
||||
(double-click for the dialog, or drag && drop CSV files onto it).
|
||||
|
||||
For GUI data logs the efficiency source defaults to `auto`: HIOKI EFF1 if the
|
||||
meter was connected, else supply/load power ratio, else the board's own
|
||||
`stm_eff_net_pct`. Telemetry logs always use the board's net efficiency
|
||||
(`(P_out - P_sys) / P_in`, iout_slow). Points below `--min-pout` (default
|
||||
5 W, same as the GUI display gate) are dropped.
|
||||
|
||||
### 7. Tune converter parameters
|
||||
|
||||
The tuning commands combine the testbench instruments (ground truth efficiency from HIOKI) with direct STM32 parameter writes to find optimal settings.
|
||||
@@ -317,6 +377,8 @@ Names, IDs, types and ranges mirror the firmware (`code64/debug_console/protocol
|
||||
| `dither_band_lo` / `dither_band_hi` | uint16 | 716-6442 | Forbidden duty band edges (CMP ticks) |
|
||||
| `dither_anear` / `dither_afar` | uint16 | 716-6442 | Out-of-band dither anchors |
|
||||
| `dither_dzero` | uint16 | 716-6442 | \|e\| fold center (D=0.5) |
|
||||
| `adc4_trig_phase` | uint16 | 3-14313 | HRTIM master CMP3: iout_slow sample instant |
|
||||
| `iin_zero_sum` | uint16 | 0-32760 | IIN software zero offset (sum-of-8 counts) |
|
||||
|
||||
## CSV Output Format
|
||||
|
||||
@@ -335,6 +397,16 @@ Sweep CSV files contain:
|
||||
|
||||
Tuning CSV files additionally contain `param_name`, `param_value`, and STM32 telemetry columns (`stm_vin`, `stm_vout`, `stm_iin`, `stm_iout`, `stm_eff`, `stm_vfly`, `stm_etemp`).
|
||||
|
||||
GUI data-log CSVs contain the instrument columns plus the latest STM32
|
||||
broadcast snapshot per row (`stm_counter` … `stm_age_s`; flag/fault registers
|
||||
as hex). While logging, the full-rate 100 Hz telemetry stream is additionally
|
||||
written to `<name>_telem.csv` with every broadcast field (one row per fresh
|
||||
publish, `pc_time`/`t_mono` timestamps, computed `p_in_W`/`p_out_W`).
|
||||
|
||||
Note: STM32-derived `power_out_W`/`efficiency` now use `iout_slow` (the
|
||||
PWM-synchronous ADC4 output current) instead of the fast protection-path
|
||||
`iout` — tuner numbers shift slightly vs. old logs.
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
@@ -348,7 +420,8 @@ mppt-testbench/
|
||||
| +-- cli.py unified CLI entry point
|
||||
| +-- gui.py tkinter GUI with live plots
|
||||
| +-- gui_workers.py background instrument I/O thread
|
||||
| +-- stm32_link.py synchronous STM32 debug protocol interface
|
||||
| +-- stm32_link.py STM32 debug protocol: 114B broadcast RX + CRC-framed TX commands (8-O-1)
|
||||
| +-- plot_eff.py efficiency vs Vin vs current plots from any logged CSV
|
||||
| +-- tuner.py automated tuning routines (param sweep, deadtime opt)
|
||||
+-- code64/
|
||||
| +-- Core/ STM32G474 firmware (C)
|
||||
@@ -356,7 +429,7 @@ mppt-testbench/
|
||||
| +-- debug_console/ Textual TUI for live debugging
|
||||
| +-- pyproject.toml uv-compatible package config
|
||||
+-- samples/ shade profile CSV examples
|
||||
+-- pyproject.toml package config, entry points: bench, bench-gui
|
||||
+-- pyproject.toml package config, entry points: bench, bench-gui, bench-plot
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
Reference in New Issue
Block a user