Skip to content

Commit

Permalink
Improve the class names (#134)
Browse files Browse the repository at this point in the history
* Minor corrections in docstrings

* Minor correction in docstring

* Improve the naming of classes
  • Loading branch information
mhinkkan authored Jun 11, 2024
1 parent 557835a commit e23c315
Show file tree
Hide file tree
Showing 38 changed files with 130 additions and 124 deletions.
2 changes: 1 addition & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
author = "Aalto Electric Drives"

# The full version, including alpha/beta/rc tags
release = "0.3.0"
release = "0.3.1"

# -- General configuration ---------------------------------------------------

Expand Down
4 changes: 2 additions & 2 deletions docs/source/control/current_ctrl.rst
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ where :math:`\mathrm{sat}(\cdot)` is the saturation function. The limited voltag
.. math::
\frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} = \boldsymbol{\alpha}_\mathrm{i}\left(\bar{\boldsymbol{u}}_\mathrm{s,ref} - \hat{\boldsymbol{v}}_\mathrm{s}\right)
The other parts of the above controller are not affected by the saturation. The implementation in the :class:`motulator.common.control.ComplexPICtrl` class is based on this disturbance-observer form.
The other parts of the above controller are not affected by the saturation. The implementation in the :class:`motulator.common.control.ComplexPIController` class is based on this disturbance-observer form.

Synchronous Machines
--------------------
Expand All @@ -184,7 +184,7 @@ The discrete-time variant of the disturbance-observer form :eq:`cc_disturbance`
\boldsymbol{u}_\mathrm{s,ref}(k) &= \boldsymbol{k}_\mathrm{t}\left[\boldsymbol{\psi}_{\mathrm{ref}}(k) - \hat{\boldsymbol{\psi}}(k)\right] + \hat{\boldsymbol{v}}_\mathrm{s} \\
\bar{\boldsymbol{u}}_\mathrm{s,ref}(k) &= \mathrm{sat}\left[\boldsymbol{u}_\mathrm{s,ref}(k)\right]
where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete-time index. Depending on the machine type, either :eq:`flux_mapping_im` or :eq:`flux_mapping_sm` is used to map the stator current to the flux linkage. This discrete-time algorithm corresponds to the implementation in the :class:`motulator.drive.control.sm.CurrentCtrl` class. The default gain selection corresponds to the complex-vector gains in :eq:`complex_vector_gains_flux`.
where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete-time index. Depending on the machine type, either :eq:`flux_mapping_im` or :eq:`flux_mapping_sm` is used to map the stator current to the flux linkage. This discrete-time algorithm corresponds to the implementation in the :class:`motulator.drive.control.sm.CurrentController` class. The default gain selection corresponds to the complex-vector gains in :eq:`complex_vector_gains_flux`.

.. rubric:: References

Expand Down
6 changes: 3 additions & 3 deletions docs/source/control/speed_ctrl.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Speed Control
=============

Proportional-integral (PI) control is widely used in machine drives. A standard one-degree-of-freedom (1DOF) PI controller manipulates only the control error, i.e., it has single input and single output. Its two-degrees-of-freedom (2DOF) variants have two inputs (reference signal and feedback signal), which allows to design disturbance rejection and reference tracking separately [#Sko1996]_. In the following, we will use a speed controller as an example, cf. the :class:`motulator.drive.control.SpeedCtrl` class. The presented control design can be extended to many other control tasks as well.
Proportional-integral (PI) control is widely used in machine drives. A standard one-degree-of-freedom (1DOF) PI controller manipulates only the control error, i.e., it has single input and single output. Its two-degrees-of-freedom (2DOF) variants have two inputs (reference signal and feedback signal), which allows to design disturbance rejection and reference tracking separately [#Sko1996]_. In the following, we will use a speed controller as an example, cf. the :class:`motulator.drive.control.SpeedController` class. The presented control design can be extended to many other control tasks as well.

Continuous-Time Design
----------------------
Expand Down Expand Up @@ -52,7 +52,7 @@ where :math:`\mathrm{sat}(\cdot)` is the saturation function. If this saturation
.. math::
\frac{\mathrm{d} \tau_\mathrm{i}}{\mathrm{d} t} = \alpha_\mathrm{i}\left(\bar{\tau}_\mathrm{M,ref} - \hat \tau_\mathrm{L}\right)
The other parts of the above controller are not affected by the saturation. The implementation in the :class:`motulator.drive.control.SpeedCtrl` class is based on this disturbance-observer form.
The other parts of the above controller are not affected by the saturation. The implementation in the :class:`motulator.drive.control.SpeedController` class is based on this disturbance-observer form.

Gain Selection Example
^^^^^^^^^^^^^^^^^^^^^^
Expand Down Expand Up @@ -94,7 +94,7 @@ The discrete-time variant of the controller is given by
\tau_\mathrm{M,ref}(k) &= k_\mathrm{t}\left[\omega_\mathrm{M,ref}(k) - \omega_\mathrm{M}(k)\right] + \hat \tau_\mathrm{L}(k) \\
\bar{\tau}_\mathrm{M,ref}(k) &= \mathrm{sat}[\tau_\mathrm{M,ref}(k)]
where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete-time index. This corresponds to the implementation in the :class:`motulator.drive.control.SpeedCtrl` class.
where :math:`T_\mathrm{s}` is the sampling period and :math:`k` is the discrete-time index. This corresponds to the implementation in the :class:`motulator.drive.control.SpeedController` class.

.. rubric:: References

Expand Down
2 changes: 1 addition & 1 deletion docs/source/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ After :doc:`installation`, *motulator* can be used by creating a continuous-time
par = control.ModelPars(
R_s=3.7, R_R=2.1, L_sgm=.021, L_M=.224, n_p=2, J=.015)
cfg = control.CurrentReferenceCfg(par, max_i_s=1.5*np.sqrt(2)*5)
ctrl = control.VectorCtrl(par, cfg)
ctrl = control.VectorControl(par, cfg)
# Acceleration at t = 0.2 s and load torque step of 14 Nm at t = 0.75 s
ctrl.ref.w_m = lambda t: (t > .2)*(2*np.pi*50)
Expand Down
2 changes: 1 addition & 1 deletion examples/flux_vector/plot_flux_vector_pmsm_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.FluxTorqueReferenceCfg(par, max_i_s=1.5*base.i, k_u=.9)
ctrl = control.FluxVectorCtrl(par, cfg, J=.015, T_s=250e-6, sensorless=True)
ctrl = control.FluxVectorControl(par, cfg, J=.015, T_s=250e-6, sensorless=True)

# %%
# Set the speed reference and the external load torque.
Expand Down
2 changes: 1 addition & 1 deletion examples/flux_vector/plot_flux_vector_pmsyrm_5kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ def i_s(psi_s):
# Limit the maximum reference flux to the base value
cfg = control.FluxTorqueReferenceCfg(
par, max_i_s=2*base.i, k_u=1, max_psi_s=base.psi)
ctrl = control.FluxVectorCtrl(par, cfg, J=.015, sensorless=True)
ctrl = control.FluxVectorControl(par, cfg, J=.015, sensorless=True)
# Select a lower speed-estimation bandwidth to mitigate the saturation effects
ctrl.observer = control.Observer(
control.ObserverCfg(par, alpha_o=2*np.pi*40, sensorless=True))
Expand Down
2 changes: 1 addition & 1 deletion examples/flux_vector/plot_flux_vector_syrm_7kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def i_s(psi_s):
# Disable MTPA since the control system does not consider the saturation
cfg = control.FluxTorqueReferenceCfg(
par, max_i_s=2*base.i, k_u=.9, min_psi_s=base.psi, max_psi_s=base.psi)
ctrl = control.FluxVectorCtrl(par, cfg, J=.015, sensorless=True)
ctrl = control.FluxVectorControl(par, cfg, J=.015, sensorless=True)
# Since the saturation is not considered in the control system, the speed
# estimation bandwidth is set to a lower value. Furthermore, the PM-flux
# disturbance estimation is enabled at speeds above 2*pi*20 rad/s (electrical).
Expand Down
4 changes: 2 additions & 2 deletions examples/obs_vhz/plot_obs_vhz_ctrl_im_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@

# Inverse-Γ model parameter estimates
par = mdl_ig_par # Assume accurate machine model parameter estimates
cfg = control.ObserverBasedVHzCtrlCfg(
cfg = control.ObserverBasedVHzControlCfg(
nom_psi_s=base.psi, max_i_s=1.5*base.i, slip_compensation=False)
ctrl = control.ObserverBasedVHzCtrl(par, cfg, T_s=250e-6)
ctrl = control.ObserverBasedVHzControl(par, cfg, T_s=250e-6)

# %%
# Set the speed reference.
Expand Down
4 changes: 2 additions & 2 deletions examples/obs_vhz/plot_obs_vhz_ctrl_pmsm_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
# Configure the control system.

par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.ObserverBasedVHzCtrlCfg(par, max_i_s=1.5*base.i)
ctrl = control.ObserverBasedVHzCtrl(par, cfg, T_s=250e-6)
cfg = control.ObserverBasedVHzControlCfg(par, max_i_s=1.5*base.i)
ctrl = control.ObserverBasedVHzControl(par, cfg, T_s=250e-6)
#ctrl.rate_limiter = control.RateLimiter(2*np.pi*120)

# %%
Expand Down
4 changes: 2 additions & 2 deletions examples/obs_vhz/plot_obs_vhz_ctrl_pmsm_2kw_two_mass.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@
# Configure the control system.

par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.ObserverBasedVHzCtrlCfg(par, max_i_s=1.5*base.i)
ctrl = control.ObserverBasedVHzCtrl(par, cfg, T_s=250e-6)
cfg = control.ObserverBasedVHzControlCfg(par, max_i_s=1.5*base.i)
ctrl = control.ObserverBasedVHzControl(par, cfg, T_s=250e-6)
#ctrl.rate_limiter = control.RateLimiter(2*np.pi*120)

# %%
Expand Down
4 changes: 2 additions & 2 deletions examples/obs_vhz/plot_obs_vhz_ctrl_pmsyrm_thor.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ def i_s(psi_s):
# Configure the control system.

par = SynchronousMachinePars(n_p=2, R_s=.2, L_d=4e-3, L_q=17e-3, psi_f=.134)
cfg = control.ObserverBasedVHzCtrlCfg(par, max_i_s=2*base.i)
ctrl = control.ObserverBasedVHzCtrl(par, cfg, T_s=250e-6)
cfg = control.ObserverBasedVHzControlCfg(par, max_i_s=2*base.i)
ctrl = control.ObserverBasedVHzControl(par, cfg, T_s=250e-6)

# %%
# Set the speed reference and the external load torque.
Expand Down
4 changes: 2 additions & 2 deletions examples/obs_vhz/plot_obs_vhz_ctrl_syrm_7kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,9 @@ def i_s(psi_s):
# Configure the control system.

par = SynchronousMachinePars(n_p=2, R_s=.54, L_d=37e-3, L_q=6.2e-3, psi_f=0)
cfg = control.ObserverBasedVHzCtrlCfg(
cfg = control.ObserverBasedVHzControlCfg(
par, max_i_s=2*base.i, min_psi_s=base.psi, max_psi_s=base.psi)
ctrl = control.ObserverBasedVHzCtrl(par, cfg)
ctrl = control.ObserverBasedVHzControl(par, cfg)

# %%
# Set the speed reference and the external load torque.
Expand Down
4 changes: 2 additions & 2 deletions examples/signal_inj/plot_signal_inj_pmsm_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@

par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.CurrentReferenceCfg(par, nom_w_m=base.w, max_i_s=2*base.i)
ctrl = control.SignalInjectionCtrl(par, cfg, J=.015, T_s=250e-6)
# ctrl.current_ctrl = control.sm.CurrentCtrl(par, 2*np.pi*100)
ctrl = control.SignalInjectionControl(par, cfg, J=.015, T_s=250e-6)
# ctrl.current_ctrl = control.sm.CurrentControl(par, 2*np.pi*100)

# %%
# Set the speed reference and the external load torque.
Expand Down
4 changes: 2 additions & 2 deletions examples/signal_inj/plot_signal_inj_syrm_7kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@
par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.CurrentReferenceCfg(
par, nom_w_m=base.w, max_i_s=2*base.i, min_psi_s=.5*base.psi)
ctrl = control.SignalInjectionCtrl(par, cfg, J=.015, T_s=250e-6)
# ctrl.current_ctrl = control.sm.CurrentCtrl(par, 2*np.pi*100)
ctrl = control.SignalInjectionControl(par, cfg, J=.015, T_s=250e-6)
# ctrl.current_ctrl = control.sm.CurrentControl(par, 2*np.pi*100)
# ctrl.signal_inj = control.sm.SignalInjection(par, U_inj=200)

# %%
Expand Down
7 changes: 4 additions & 3 deletions examples/vector/plot_vector_ctrl_im_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,12 @@ def L_s(psi, L_su=.34, beta=.84, S=7):
cfg = control.CurrentReferenceCfg(
par, max_i_s=1.5*base.i, nom_u_s=base.u, nom_w_s=base.w)
# Create the control system
ctrl = control.CurrentVectorCtrl(par, cfg, J=.015, T_s=250e-6, sensorless=True)
ctrl = control.CurrentVectorControl(
par, cfg, J=.015, T_s=250e-6, sensorless=True)
# As an example, you may replace the default 2DOF PI speed controller with the
# regular PI speed controller by uncommenting the following line
# from motulator.common.control import PICtrl
# ctrl.speed_ctrl = PICtrl(k_p=1, k_i=1)
# from motulator.common.control import PIController
# ctrl.speed_ctrl = PIController(k_p=1, k_i=1)

# %%
# Set the speed reference and the external load torque. You may also try to
Expand Down
2 changes: 1 addition & 1 deletion examples/vector/plot_vector_ctrl_im_2kw_tq_mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
cfg = control.CurrentReferenceCfg(
par, max_i_s=1.5*base.i, nom_u_s=base.u, nom_w_s=base.w)
# Create the control system
ctrl = control.CurrentVectorCtrl(par, cfg, T_s=250e-6, sensorless=True)
ctrl = control.CurrentVectorControl(par, cfg, T_s=250e-6, sensorless=True)

# %%
# Set the torque reference and the actual speed.
Expand Down
3 changes: 2 additions & 1 deletion examples/vector/plot_vector_ctrl_pmsm_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@

par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.CurrentReferenceCfg(par, nom_w_m=base.w, max_i_s=1.5*base.i)
ctrl = control.CurrentVectorCtrl(par, cfg, J=.015, T_s=250e-6, sensorless=True)
ctrl = control.CurrentVectorControl(
par, cfg, J=.015, T_s=250e-6, sensorless=True)

# %%
# Set the speed reference and the external load torque.
Expand Down
3 changes: 2 additions & 1 deletion examples/vector/plot_vector_ctrl_pmsm_2kw_diode.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@

par = mdl_par # Assume accurate machine model parameter estimates
ref = control.CurrentReferenceCfg(par, nom_w_m=base.w, max_i_s=1.5*base.i)
ctrl = control.CurrentVectorCtrl(par, ref, J=.015, T_s=250e-6, sensorless=True)
ctrl = control.CurrentVectorControl(
par, ref, J=.015, T_s=250e-6, sensorless=True)

# %%
# Set the speed reference and the external load torque.
Expand Down
4 changes: 2 additions & 2 deletions examples/vector/plot_vector_ctrl_pmsyrm_thor.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@
par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.CurrentReferenceCfg(
par, nom_w_m=base.w, max_i_s=2*base.i, k_u=.9)
ctrl = control.CurrentVectorCtrl(
ctrl = control.CurrentVectorControl(
par, cfg, T_s=125e-6, J=.0042, sensorless=True)
ctrl.observer = control.Observer(
control.ObserverCfg(par, sensorless=True, alpha_o=2*np.pi*200))
ctrl.speed_ctrl = control.SpeedCtrl(
ctrl.speed_ctrl = control.SpeedController(
J=.0042, alpha_s=2*np.pi*4, max_tau_M=1.5*nom.tau)

# %%
Expand Down
3 changes: 2 additions & 1 deletion examples/vector/plot_vector_ctrl_syrm_7kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
par = mdl_par # Assume accurate machine model parameter estimates
cfg = control.CurrentReferenceCfg(
par, nom_w_m=base.w, max_i_s=1.5*base.i, min_psi_s=.5*base.psi, k_u=.9)
ctrl = control.CurrentVectorCtrl(par, cfg, J=.015, T_s=125e-6, sensorless=True)
ctrl = control.CurrentVectorControl(
par, cfg, J=.015, T_s=125e-6, sensorless=True)

# %%
# Set the speed reference and the external load torque.
Expand Down
5 changes: 3 additions & 2 deletions examples/vhz/plot_vhz_ctrl_6step_im_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@
# Control system (parametrized as open-loop V/Hz control).

par = InductionMachineInvGammaPars(R_s=0*3.7, R_R=0*2.1, L_sgm=.021, L_M=.224)
ctrl = control.VHzCtrl(
control.VHzCtrlCfg(par, nom_psi_s=base.psi, k_u=0, k_w=0, six_step=True))
ctrl = control.VHzControl(
control.VHzControlCfg(
par, nom_psi_s=base.psi, k_u=0, k_w=0, six_step=True))

# %%
# Set the speed reference and the external load torque.
Expand Down
4 changes: 2 additions & 2 deletions examples/vhz/plot_vhz_ctrl_im_2kw.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@

# Inverse-Γ model parameter estimates
par = InductionMachineInvGammaPars(R_s=0*3.7, R_R=0*2.1, L_sgm=.021, L_M=.224)
ctrl = control.VHzCtrl(
control.VHzCtrlCfg(par, nom_psi_s=base.psi, k_u=0, k_w=0))
ctrl = control.VHzControl(
control.VHzControlCfg(par, nom_psi_s=base.psi, k_u=0, k_w=0))

# %%
# Set the speed reference and the external load torque.
Expand Down
8 changes: 4 additions & 4 deletions examples/vhz/plot_vhz_ctrl_im_2kw_lc.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@

# Inverse-Γ model parameter estimates
par = InductionMachineInvGammaPars(R_s=0*3.7, R_R=0*2.1, L_sgm=.021, L_M=.224)
ctrl = control.VHzCtrl(
control.VHzCtrlCfg(par, nom_psi_s=base.psi, k_u=0, k_w=0))
ctrl = control.VHzControl(
control.VHzControlCfg(par, nom_psi_s=base.psi, k_u=0, k_w=0))

# %%
# Set the speed reference. The external load torque is zero (by default).
Expand Down Expand Up @@ -75,7 +75,7 @@
mdl.converter.data.u_cs.real/base.u,
label=r"$u_\mathrm{ca}$")
ax1.plot(
mdl.converter.data.t,
mdl.machine.data.t,
mdl.machine.data.u_ss.real/base.u,
label=r"$u_\mathrm{sa}$")
ax1.set_xlim(t_span)
Expand All @@ -88,7 +88,7 @@
mdl.converter.data.i_cs.real/base.i,
label=r"$i_\mathrm{ca}$")
ax2.plot(
mdl.converter.data.t,
mdl.machine.data.t,
mdl.machine.data.i_ss.real/base.i,
label=r"$i_\mathrm{sa}$")
ax2.set_xlim(t_span)
Expand Down
8 changes: 4 additions & 4 deletions motulator/common/control/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""Common control functions and classes."""
from motulator.common.control._control import (
Ctrl, ComplexPICtrl, PICtrl, PWM, RateLimiter)
ControlSystem, ComplexPIController, PIController, PWM, RateLimiter)

__all__ = [
"Ctrl",
"ComplexPICtrl",
"PICtrl",
"ControlSystem",
"ComplexPIController",
"PIController",
"PWM",
"RateLimiter",
]
6 changes: 3 additions & 3 deletions motulator/common/control/_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ def __call__(self, T_s, ref_u_cs, u_dc, w):


# %%
class PICtrl:
class PIController:
"""
2DOF PI controller.
Expand Down Expand Up @@ -292,7 +292,7 @@ def update(self, T_s, u):


# %%
class ComplexPICtrl:
class ComplexPIController:
"""
2DOF synchronous-frame complex-vector PI controller.
Expand Down Expand Up @@ -456,7 +456,7 @@ def update(self, T_s):


# %%
class Ctrl(ABC):
class ControlSystem(ABC):
"""
Base class for control systems.
Expand Down
2 changes: 1 addition & 1 deletion motulator/common/model/_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ class Simulation:
----------
mdl : Model
Continuous-time system model.
ctrl : Ctrl
ctrl : ControlSystem
Discrete-time controller.
"""
Expand Down
4 changes: 2 additions & 2 deletions motulator/drive/control/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""Controllers for machine drives."""
from motulator.drive.control._common import DriveCtrl, SpeedCtrl
from motulator.drive.control._common import DriveControlSystem, SpeedController

__all__ = ["DriveCtrl", "SpeedCtrl"]
__all__ = ["DriveControlSystem", "SpeedController"]
10 changes: 5 additions & 5 deletions motulator/drive/control/_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@

import numpy as np

from motulator.common.control import Ctrl, PICtrl
from motulator.common.control import ControlSystem, PIController
from motulator.common.utils import abc2complex, wrap


# %%
class SpeedCtrl(PICtrl):
class SpeedController(PIController):
"""
2DOF PI speed controller.
Expand All @@ -36,9 +36,9 @@ def __init__(self, J, alpha_s, max_tau_M=np.inf):


# %%
class DriveCtrl(Ctrl, ABC):
class DriveControlSystem(ControlSystem, ABC):
"""
Base class for control of electric machine drives.
Base class for drive control systems.
This base class provides typical functionalities for control of electric
machine drives. This can be used both in speed-control and torque-control
Expand Down Expand Up @@ -72,7 +72,7 @@ class DriveCtrl(Ctrl, ABC):
`motulator.drive.control.im.Observer` or
`motulator.drive.control.sm.Observer`
depending on the machine type. The default is None.
speed_ctrl : SpeedCtrl | None
speed_ctrl : SpeedController | None
Speed controller. The default is None.
"""
Expand Down
Loading

0 comments on commit e23c315

Please sign in to comment.