Results

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.

MS2Sim + FOC current loopshipped

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.

i_q (measured)i_q reference
-0.060.501.060 µs24.9 ms49.9 msA
Rise 10–90%: 1.00 msOvershoot: 0.0%Steady-state error: 0.0%

Free rotor

1 A q-axis step, unloaded — the rotor accelerates until back-EMF approaches the bus and the drive runs out of volts.

i_q (measured)i_q reference
-0.230.421.070 µs59.9 ms119.9 msA
Rise 10–90%: 0.90 msSteady-state error: 99.4%

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.

MS4Sensorless foundationshipped

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.

ω̂ estimated speed800 rad/s el target
-1743769270 µs1000.0 ms2.00 srad/s el

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

MS5G474 bring-upshipped

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.

ω̂ estimated speed600 rad/s el target
-10964213930 µs3.01 s6.02 srad/s el

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.

ω̂ estimated speed400 rad/s el800 rad/s el
-74.3065413820 µs4.01 s8.03 srad/s el

Captured live from mmc-g474 (NucleoG474) over mmc-proto; 9441 frames.

Run it yourself

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.