Current Control#

Synchronous-frame two-degrees-of-freedom (2DOF) proportional-integral (PI) current control is commonly used in three-phase AC machine drives [Awan et al., 2019, del Blanco et al., 1999, Harnefors and Nee, 1998]. This control structure allows compensating for the cross-coupling originating from rotating coordinates as well as to improve disturbance rejection.

Figure 1 shows current-vector control, implemented in the motulator.drive.control.im.CurrentVectorController and motulator.drive.control.sm.CurrentVectorController classes. The reference generation, see Reference Generation, computes the current reference from the torque reference. The observer, see Observers, provides the feedback signals for the current controller.

Current-vector control

Figure 1: Current-vector control. The observer transforms the measured current \(\iss\) into the controller coordinates and estimates their angle \(\thetac\) and angular speed \(\omegac\). For synchronous machines, estimated rotor coordinates are used, \(\thetac = \hatthetam\), while for induction machines the coordinates rotate at the estimated stator angular frequency, \(\omegac = \hatomegas\). For induction machines, the reference generation uses the rotor flux magnitude estimate \(\hatabspsiR\) and the realized voltage reference instead of \(\hatomegam\). The observer uses the realized voltage \(\usreflim\) (in stationary coordinates) obtained from the PWM, taking into account the voltage limitation and the computational delay.#

Current-vector control

Figure 1: Current-vector control. The observer transforms the measured current \(\iss\) into the controller coordinates and estimates their angle \(\thetac\) and angular speed \(\omegac\). For synchronous machines, estimated rotor coordinates are used, \(\thetac = \hatthetam\), while for induction machines the coordinates rotate at the estimated stator angular frequency, \(\omegac = \hatomegas\). For induction machines, the reference generation uses the rotor flux magnitude estimate \(\hatabspsiR\) and the realized voltage reference instead of \(\hatomegam\). The observer uses the realized voltage \(\usreflim\) (in stationary coordinates) obtained from the PWM, taking into account the voltage limitation and the computational delay.#

A 2DOF PI current controller for induction machines is available in the motulator.drive.control.im.CurrentController class and for synchronous machines in the motulator.drive.control.sm.CurrentController class, both of which inherit from the motulator.common.control.ComplexPIController class. In the following, current control of induction machines is first considered in detail. Then, the same principles are applied to synchronous machines.

For Induction Machines#

Machine Model#

The inverse-Γ model of an induction machine is considered (see (7) in Induction Machines). The rotor flux linkage \(\psiR\) and the rotor speed \(\omegam\) change slowly as compared to the stator current. Consequently, it suffices to consider the stator current dynamics

(1)#\[ \Lsgm \frac{\D \is}{\D t} = \us - (\Rsgm + \jj \omegac\Lsgm)\is - \es\]

where \(\Rsgm = \Rs + \RR\) is the total resistance. The back-emf \(\es\) is considered as a quasi-constant load disturbance. Here, the machine model is considered in the control system coordinates rotating at \(\omegac = \hatomegas\).

2DOF PI Controller#

The design of synchronous-frame 2DOF PI current control is considered in the continuous-time domain, even though the actual implementation is discrete. Two typical gain selections for this control type are known as the internal-model-control (IMC) design [Harnefors and Nee, 1998] and the complex-vector design [del Blanco et al., 1999]. Here, only the complex-vector design is considered, see Complex-Vector 2DOF PI Controller, which is compatible with the motulator.common.control.ComplexPIController base class. The controller can be expressed in a state-space form as

(2)#\[\begin{split} \frac{\D \uI}{\D t} &= (\kI + \jj\hatomegas\kT )\left(\isref - \is\right) \\ \usref &= \kT\isref - \kP\is + \uI\end{split}\]

where \(\usref\) is the stator voltage reference, \(\isref\) is the stator current reference, and \(\uI\) is the integral state. Furthermore, \(\kT\) is the reference-feedforward gain, \(\kP\) is the proportional gain, and \(\kI\) is the integral gain.

The converter voltage is limited due to the limited DC-bus voltage. The realized voltage (limited voltage reference) is obtained from the pulse-width modulation (PWM) algorithm,

(3)#\[ \usreflim = \mathrm{sat}(\usref)\]

where \(\mathrm{sat}(\cdot)\) is the saturation function, containing digital delay compensation [Bae and Sul, 2003]. The motulator.common.control.ComplexPIController base class implements the anti-windup of the integrator based on the realized voltage.

Closed-Loop System Analysis#

Here, ideal voltage production is assumed, \(\us = \usref\). Using (1) and (2), the closed-loop system in the Laplace domain becomes

(4)#\[ \Delta\is(s) = \mathbf{G}_\mathrm{c}(s)\Delta\isref(s) - \mathbf{Y}_\mathrm{c}(s)\Delta\es(s)\]

The reference-tracking transfer function is

(5)#\[ \mathbf{G}_\mathrm{c}(s) = \frac{(s + \jj\omegaso) \kT + \kI }{\Lsgm s^2 + (\Rsgm + \jj\omegaso \Lsgm + \kP) s + \kI + \jj\omegaso \kT}\]

where \(\omegaso\) is the operating-point stator angular frequency. The closed-loop poles can be arbitrarily placed by means of the gains. The zero can be placed by means of the reference-feedforward gain \(\kT\). The disturbance rejection depends on the closed-loop admittance

(6)#\[ \mathbf{Y}_\mathrm{c}(s) = \frac{s}{\Lsgm s^2 + (\Rsgm + \jj\omegaso \Lsgm + \kP) s + \kI + \jj\omegaso \kT}\]

Gain Selection#

Consider the gains

(7)#\[ \kP = (\alphac + \alphai) \hatLsgm - \hatRsgm \qquad \kI = \alphac\alphai\hatLsgm \qquad \kT = \alphac \hatLsgm\]

where \(\alphac\) is the closed-loop reference-tracking bandwidth and \(\alphai\) is the integral action bandwidth. Assuming accurate parameter estimates, the closed-loop transfer functions (6) and (5) reduce to

(8)#\[ \mathbf{G}_\mathrm{c}(s) = \frac{\alphac}{s + \alphac} \qquad \mathbf{Y}_\mathrm{c}(s) = \frac{s}{\Lsgm (s + \alphac)(s + \alphai + \jj\omegaso)}\]

It can be seen that this design results in the first-order reference-tracking dynamics. Furthermore, one pole is placed at the real axis at \(s = -\alphac\), while another pole moves with the angular frequency of the coordinate system, \(s= -\alphai - \jj\omegaso\). The complex-vector design tends to be slightly more robust to parameter errors than the IMC design since the other closed-loop pole approximately corresponds to the open-loop pole. Notice that \(\hatRsgm = 0\) can be used in practice in (7). This gain selection is used in the motulator.drive.control.im.CurrentController class.

For Synchronous Machines#

Machine Model#

Consider the synchronous machine model in rotor coordinates rotating at \(\omegam\),

(9)#\[\begin{split} \frac{\D\psis}{\D t} &= \us - \Rs\is - \jj\omegam\psis \\ \psis &= \psisfcn(\is)\end{split}\]

where \(\psisfcn(\is)\) is the flux linkage map (see Synchronous Machine Model). If the magnetic saturation is omitted, the flux linkage map is \(\psis = \psif + \Ld\id + \jj\Lq\iq\).

2DOF PI Controller#

A 2DOF PI controller for synchronous machines is available in the motulator.drive.control.sm.CurrentController class. An internal change of the state variable from the stator current to the stator flux linkage is used [Awan et al., 2019]. This choice of using the flux linkage as the internal controller state has several advantages: the gain expressions become simpler; the same control structure can be used for salient and non-salient machines; and the magnetic saturation is easy to take into account.

For simplicity, assume perfect alignment of the controller coordinate system with the rotor coordinate system (corresponding to sensored drives). The controller can be expressed in a state-space form as

(10)#\[\begin{split} \frac{\D \uI}{\D t} &= (\kI + \jj\omegam\kT )\left[\hatpsisfcn(\isref) - \hatpsisfcn(\is)\right] \\ \usref &= \kT\hatpsisfcn(\isref) - \kP\hatpsisfcn(\is) + \uI\end{split}\]

where both reference and actual currents are transformed using the same flux linkage map \(\hatpsisfcn\). Hence, \(\isref = \is\) holds in the steady state even with flux map inaccuracies. If the magnetic saturation is omitted, this flux-linkage-based current controller becomes equivalent to a regular 2DOF PI current controller (even if inductance estimates are inaccurate).

Note

The control law (10) omits the effect of the stator resistance for simplicity, i.e., \(\hatRs = 0\) is assumed. This is a common and practical assumption. However, if needed, the resistive voltage drop term \(\hatRs\is\) could be simply added to \(\usref\) in (10).

Gain Selection and Closed-Loop System Analysis#

Ideal voltage production \(\us = \usref\), accurate flux maps \(\hatpsisfcn = \psisfcn\), and \(\hatRs = \Rs = 0\) are assumed for simplicity. Consider the gains

(11)#\[ \kP = \alphac + \alphai \qquad \kI = \alphac\alphai \qquad \kT = \alphac\]

Using (9)–(11), the closed-loop in the Laplace domain become

(12)#\[ \frac{\Delta\psis(s)}{\Delta \psisref(s)} = \frac{\alphac(s + \alphai + \jj\omegamo)}{(s + \alphac)(s + \alphai + \jj\omegamo)} = \frac{\alphac}{s + \alphac}\]

where \(\omegamo\) is the operating-point rotor angular speed. Assuming linear magnetics, the above dynamics are valid for the current as well, i.e., \(\Delta\is(s)/\Delta \isref(s) = \Delta\psis(s)/\Delta \psisref(s)\).

This control design corresponds to the implementation in the motulator.drive.control.sm.CurrentController class.

Direct Discrete-Time Design#

When the closed-loop bandwidth is high compared with the sampling frequency, the computational delay and the zero-order hold degrade the continuous-time design. The flux-linkage-based current controller can also be designed directly in discrete time [Awan et al., 2019]. Assume \(\Rs = 0\) and the stator voltage constant in stationary coordinates over the sampling period \(\Ts\). The hold-equivalent model of (9) in rotor coordinates, including the computational delay of one sampling period, is

(13)#\[\begin{split} \psis(k+1) &= \Phi\left[\psis(k) + \Ts\us(k)\right] \\ \us(k+1) &= \Phi\usreflim(k)\end{split}\]

where \(\Phi = \e^{-\jj\omegam\Ts}\) is the rotation of the coordinates over the sampling period. The control law is

(14)#\[\begin{split} \usref(k) &= \kT\hatpsisfcn(\isref) - k_1\hatpsisfcn(\is) - k_2\usreflim(k-1) + \uI(k) \\ \uI(k+1) &= \uI(k) + \Ts\kI\left[\hatpsisfcn(\isref) - \hatpsisfcn(\is)\right] - \frac{\Ts\kI}{\kT}\left[\usref(k) - \usreflim(k)\right]\end{split}\]

where the term with \(k_2\) compensates for the computational delay and the last term is the anti-windup. The complex-vector design

(15)#\[ \kT = \frac{1 - \beta}{\Phi^2\Ts} \qquad \kI = \frac{(1 - \beta)(1 - \beta\Phi)}{\Phi^2\Ts^2} \qquad k_1 = \frac{1 - \beta}{\Ts}\left(1 + \frac{1 - \beta}{\Phi} + \frac{1}{\Phi^2}\right) \qquad k_2 = (1 - \beta)(1 + \Phi)\]

where \(\beta = \e^{-\alphac\Ts}\), results in the closed-loop dynamics

(16)#\[ \Delta\psis(k) = \frac{1 - \beta}{z(z - \beta)}\Delta\psisref(k)\]

where \(z\) is the forward-shift operator. A constant rotor speed, an accurate flux linkage map, and no voltage limitation are assumed.

This design is implemented in the motulator.drive.control.sm.DiscreteCurrentController class, which is selected by discrete=True in motulator.drive.control.sm.CurrentVectorControllerCfg. Since the controller compensates for the delays itself, the PWM must be configured as PWM(k_comp=0). The same design is available for induction machines in the motulator.drive.control.im.DiscreteCurrentController class, where the leakage flux linkage \(\hatLsgm\is\) replaces the flux linkage map. See the examples 5.6-kW saturated PM-SyRM, discrete-time current control and 2.2-kW IM, discrete-time current control.