Note
Go to the end to download the full example code.
5.6-kW PM-SyRM, GradNet models, FVC#
This example simulates flux-vector control (FVC) of a 5.6-kW PM synchronous reluctance machine drive natively. The system is that of the motulator example 5.6-kW PM-SyRM, GradNet from FEM data, FVC: the machine model uses a GradNet current map with spatial harmonics, and the control system uses a GradNet flux map, both trained on FEM data. The GradNets are evaluated in C, which makes the native simulation about 30 times faster than motulator.
Compute base values based on the nominal values.
nom = utils.NominalValues(U=460, I=8.8, f=60, P=5.6e3, tau=29.7)
base = utils.BaseValues.from_nominal(nom, n_p=2)
Configure the system model with the GradNet current map with spatial harmonics.
try:
MODEL_DIR = Path(__file__).parents[1] / "trained_models"
except NameError: # The gallery of the documentation runs the examples in their folder
MODEL_DIR = Path("..") / "trained_models"
path = MODEL_DIR / "baldor_fem_curr_map_harm_softmax_d48_sub10.npz"
magnetic_map = gn.CurrentMapWithHarmonics(gn.load_gradnet(path))
par = model.SpatialSaturatedSynchronousMachinePars(
n_p=2, R_s=0.63, magnetic_map_fcn=magnetic_map
)
machine = model.SynchronousMachine(par)
mechanics = model.MechanicalSystem(J=0.05)
converter = model.VoltageSourceConverter(u_dc=540)
mdl = model.Drive(machine, mechanics, converter)
Configure the control system with the GradNet flux map.
path = MODEL_DIR / "baldor_fem_flux_map_pnorm_d12_sub20.npz"
est_flux_map = gn.FluxMap(gn.load_gradnet(path))
est_par = control.SaturatedSynchronousMachinePars(
n_p=2, R_s=0.63, psi_s_dq_fcn=est_flux_map
)
cfg = control.FluxVectorControllerCfg(
i_s_max=2 * base.i, alpha_i=0, alpha_o=2 * pi * 8, J=0.05, sensorless=False
)
vector_ctrl = control.FluxVectorController(est_par, cfg)
speed_ctrl = control.SpeedController(J=0.05, alpha_s=2 * pi * 4)
ctrl = control.VectorControlSystem(vector_ctrl, speed_ctrl)
Set the speed reference and the external load torque.
ctrl.set_speed_ref(lambda t: (t > 0.25) * 2 * base.w_M)
mdl.mechanics.set_external_load_torque(lambda t: (t > 1.25) * 0.5 * base.tau)
Simulate natively and plot the results in per-unit values.
sim = native.Simulation(mdl, ctrl)
start = time.perf_counter()
res = sim.simulate(t_stop=1.75)
print(f"Run time: {time.perf_counter() - start:.2f} s")
utils.plot(res, base)

Run time: 0.54 s
Total running time of the script: (0 minutes 1.393 seconds)