Real runs, not renders.
Every chart on this page is computed at build time from CSV traces produced by the Modular Motor Controller's own test tooling — the same mmc-host suite and mmc-host capture commands referenced throughout the Learn series. Some are simulation regression runs; the sensorless hardware traces below came off a real STM32G474 driving a real motor.
This is a curated subset, decimated for the web. The project keeps a much larger self-contained dashboard (testresults/index.html, regenerated by mmc-host report) alongside the full-resolution CSVs in the repository itself.
The current loop, on the real numbers
These are the traces behind Part 3's claim that a 2000 rad/s current loop settles in about a millisecond. Command: mmc-host sim --scenario current-step --duration 0.05 --bandwidth 2000 --iq 1 --vbus 24 --locked
Locked rotor
1 A q-axis step at standstill — isolates the electrical dynamics from back-EMF; the regression baseline.
Free rotor
1 A q-axis step, unloaded — the rotor accelerates until back-EMF approaches the bus and the drive runs out of volts.
The current never reaches 1 A — the free rotor spins up until back-EMF meets the 24 V bus (~2364 rpm) and the loop runs out of voltage headroom. That's physics, not a controller defect: the same reason Part 3's tuner flattens out when you drop the bus voltage.
Sensorless, proven in simulation first
I-f startup, blend to the flux observer, a speed target, and a load step — the regression sweep MS4's sensorless estimator has to pass before it ever touches hardware. The noisy readings at the very start of each trace are real: the observer has no back-EMF to track until the rotor is moving, so it's blind during forced startup by design — not a data glitch.
Sensorless startup + load step
I-f startup, blend to the flux observer at 150 rad/s elec, speed loop to 800 rad/s elec, +0.03 N·m load step at 60% — angle estimate vs sim truth is the regression that MS4 lives by.
Sensorless: handoff at 0.425 s; post-handoff angle error max 0.227 rad / rms 0.079 rad; final speed estimate 800 rad/s elec (target 800).
The same loop, on a real STM32G474
Captured live over mmc-proto from an X-NUCLEO-IHM16M1 power stage — the sensorless estimator and speed loop from MS4, closing the loop on a real motor. As in the sim traces above, the noisy start of each run is the observer's blind zone during forced I-f startup, not a fault.
F1 sensorless: startup to 600 rad/s el
Stage F1: first closed-loop sensorless run. I-f ramp 0.375 s, 50 ms blend, then the flux observer + speed loop hold 600.0 rad/s el (std 5); i_q settles at 77 mA — exactly the friction current the F0 fit predicted.
Captured live from mmc-g474 (NucleoG474) over mmc-proto; 7080 frames.
F1 sensorless: speed step 400 to 800 rad/s el
Stage F1: live speed retarget 400 to 800 rad/s el while closed-loop sensorless. Tracks the 500 rad/s^2 reference slew (90 percent in 0.72 s), 9.7 percent overshoot, i_q peak 0.10 A.
Captured live from mmc-g474 (NucleoG474) over mmc-proto; 9441 frames.
The data's real — so is the code.
These charts are computed at build time from CSVs vendored straight out of the MMC's testresults/ tree. mmc-host suite regenerates the simulation runs; mmc-host capture pulls live traces off real hardware, sim and silicon through the identical code path.