Current Control#

Synchronous-frame two-degrees-of-freedom (2DOF) proportional-integral (PI) current control is commonly used in three-phase AC machine drives [1], [2], [3]. This control structure allows to compensate for the cross-coupling originating from rotating coordinates as well as to improve disturbance rejection. The structure and design principles are essentially the same as those of 2DOF PI speed control (see Speed Control).

In the following, current control of an induction machine is first considered in detail. Then, the same control structure is applied to synchronous machines. Finally, the discrete-time implementation is described. Complex space vectors are used to represent three-phase quantities.

Induction Machines#

System Model#

The inverse-Γ model of an induction machine is considered (see Electric Machines). Using the stator current \(\boldsymbol{i}_\mathrm{s}\) and the rotor flux linkage \(\boldsymbol{\psi}_\mathrm{R}\) as state variables, the model in synchronous coordinates rotating at \(\omega_\mathrm{s}\) can be written as

\[\begin{split}L_\sigma \frac{\mathrm{d} \boldsymbol{i}_\mathrm{s}}{\mathrm{d} t} &= \boldsymbol{u}_\mathrm{s} - (R_\sigma + \mathrm{j} \omega_\mathrm{s}L_\sigma)\boldsymbol{i}_\mathrm{s} - \underbrace{\left(\mathrm{j}\omega_\mathrm{m} - \frac{R_\mathrm{R}}{L_\mathrm{M}}\right)\boldsymbol{\psi}_\mathrm{R}}_{\text{back-emf } \boldsymbol{e}_\mathrm{s}} \\ \frac{\mathrm{d} \boldsymbol{\psi}_\mathrm{R}}{\mathrm{d} t} &= R_\mathrm{R}\boldsymbol{i}_\mathrm{s} - \left(\frac{R_\mathrm{R}}{L_\mathrm{M}} + \mathrm{j}\omega_\mathrm{r} \right)\boldsymbol{\psi}_\mathrm{R}\end{split}\]

where \(R_\sigma = R_\mathrm{s} + R_\mathrm{R}\) is the total resistance and \(\omega_\mathrm{r} = \omega_\mathrm{s} - \omega_\mathrm{m}\) is the slip angular frequency. The rotor flux linkage \(\boldsymbol{\psi}_\mathrm{R}\) and the rotor speed \(\omega_\mathrm{m}\) change slowly as compared to the stator current.

Consequently, the back-emf \(\boldsymbol{e}_\mathrm{s}\) can be considered as a quasi-constant input (load) disturbance for the current controller, and it suffices to consider the stator current dynamics

(1)#\[L_\sigma \frac{\mathrm{d} \boldsymbol{i}_\mathrm{s}}{\mathrm{d} t} = \boldsymbol{u}_\mathrm{s} - (R_\sigma + \mathrm{j} \omega_\mathrm{s}L_\sigma)\boldsymbol{i}_\mathrm{s} - \boldsymbol{e}_\mathrm{s}\]

Equivalently, the stator current dynamics in (1) can be expressed as

(2)#\[\begin{split}\frac{\mathrm{d} \boldsymbol{\psi}_\sigma}{\mathrm{d} t} &= \boldsymbol{u}_\mathrm{s} - \left(\frac{R_\sigma}{L_\sigma} + \mathrm{j} \omega_\mathrm{s}\right)\boldsymbol{\psi}_\sigma - \boldsymbol{e}_\mathrm{s} \\ &= \boldsymbol{u}_\mathrm{s} - \mathrm{j} \omega_\mathrm{s}\boldsymbol{\psi}_\sigma - \boldsymbol{v}_\mathrm{s}\end{split}\]

where \(\boldsymbol{\psi}_\sigma = L_\sigma \boldsymbol{i}_\mathrm{s}\) is the leakage flux linkage and \(\boldsymbol{v} = \boldsymbol{e}_\mathrm{s} + R_\sigma \boldsymbol{i}_\mathrm{s}\) is the input disturbance.

2DOF PI Control Structure#

First, synchronous-frame 2DOF PI current control is designed and analyzed in the continuous-time domain. The controller can be expressed in a state-space form as [3]

(3)#\[\begin{split}\frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= \boldsymbol{k}'_\mathrm{i}\left(\boldsymbol{i}_\mathrm{s,ref} - \boldsymbol{i}_\mathrm{s}\right) \\ \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}'_\mathrm{t}\boldsymbol{i}_\mathrm{s,ref} - \boldsymbol{k}'_\mathrm{p}\boldsymbol{i}_\mathrm{s} + \boldsymbol{u}_\mathrm{i}\end{split}\]

where \(\boldsymbol{u}_\mathrm{s,ref}\) is the output of the controller, i.e., the stator voltage reference, \(\boldsymbol{i}_\mathrm{s,ref}\) is the stator current reference, and \(\boldsymbol{u}_\mathrm{i}\) is the the integral state. Furthermore, \(\boldsymbol{k}'_\mathrm{t}\) is the reference-feedforward gain, \(\boldsymbol{k}'_\mathrm{p}\) is the proportional gain, and \(\boldsymbol{k}'_\mathrm{i}\) is the integral gain. Setting \(\boldsymbol{k}'_\mathrm{t} = \boldsymbol{k}'_\mathrm{p}\) results in the standard PI controller.

Closed-Loop System#

Here, ideal voltage production is assumed, \(\boldsymbol{u}_\mathrm{s} = \boldsymbol{u}_\mathrm{s,ref}\). Using (1) and (3), the closed-loop system in the Laplace domain becomes

\[\boldsymbol{i}_\mathrm{s} = \boldsymbol{G}_\mathrm{c}(s)\boldsymbol{i}_\mathrm{s,ref} - \boldsymbol{Y}_\mathrm{c}(s)\boldsymbol{e}_\mathrm{s}\]

The disturbance rejection depends on the closed-loop admittance

(4)#\[\boldsymbol{Y}_\mathrm{c}(s) = \frac{s}{L_\sigma s^2 + (R_\sigma + \mathrm{j}\omega_\mathrm{s} L_\sigma + \boldsymbol{k}'_\mathrm{p}) s + \boldsymbol{k}'_\mathrm{i}}\]

The closed-loop poles can be arbitrarily placed by means of \(\boldsymbol{k}'_\mathrm{p}\) and \(\boldsymbol{k}'_\mathrm{i}\). The reference-tracking transfer function is

(5)#\[\boldsymbol{G}_\mathrm{c}(s) = \frac{s \boldsymbol{k}'_\mathrm{t} + \boldsymbol{k}'_\mathrm{i}}{L_\sigma s^2 + (R_\sigma + \mathrm{j}\omega_\mathrm{s} L_\sigma + \boldsymbol{k}'_\mathrm{p}) s + \boldsymbol{k}'_\mathrm{i}}\]

whose zero can be placed by means of the reference-feedforward gain \(\boldsymbol{k}'_\mathrm{t}\).

Gain Selection#

Two typical gain selections, known as the internal-model-control (IMC) design [1] and the complex-vector design [2], are described in the following.

IMC Design#

Consider the gains

\[\boldsymbol{k}'_\mathrm{p} = (2\alpha_\mathrm{c} - \mathrm{j}\omega_\mathrm{s}) \hat L_\sigma - \hat R_\sigma \qquad\qquad \boldsymbol{k}'_\mathrm{i} = \alpha_\mathrm{c}^2 \hat L_\sigma \qquad \qquad \boldsymbol{k}'_\mathrm{t} = \alpha_\mathrm{c} \hat L_\sigma\]

where the hat indicates the parameter estimates. Assuming accurate parameter estimates, the closed-loop transfer functions (4) and (5) reduce to

\[\boldsymbol{Y}_\mathrm{c}(s) = \frac{s}{L_\sigma(s + \alpha_\mathrm{c})^2} \qquad\qquad \boldsymbol{G}_\mathrm{c}(s) = \frac{\alpha_\mathrm{c}}{s + \alpha_\mathrm{c}}\]

where \(\alpha_\mathrm{c}\) is the closed-loop bandwidth for reference tracking. The effect of the resistance is negligible, i.e., \(\hat R_\sigma = 0\) can be chosen.

Complex-Vector Design#

Consider the gains

\[\boldsymbol{k}'_\mathrm{p} = 2\alpha_\mathrm{c} \hat L_\sigma - \hat R_\sigma \qquad\qquad \boldsymbol{k}'_\mathrm{i} = \alpha_\mathrm{c}(\alpha_\mathrm{c} + \mathrm{j}\omega_\mathrm{s}) \hat L_\sigma \qquad \qquad \boldsymbol{k}'_\mathrm{t} = \alpha_\mathrm{c} \hat L_\sigma\]

Assuming accurate parameter estimates, the closed-loop transfer functions (4) and (5) reduce to

\[\boldsymbol{Y}_\mathrm{c}(s) = \frac{s}{L_\sigma (s + \alpha_\mathrm{c})(s + \alpha_\mathrm{c} + \mathrm{j}\omega_\mathrm{s})} \qquad\qquad \boldsymbol{G}_\mathrm{c}(s) = \frac{\alpha_\mathrm{c}}{s + \alpha_\mathrm{c}}\]

It can be seen that both gain designs result in the first-order reference-tracking dynamics. 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.

Flux Linkage as an Internal State#

Based on (2), both the reference current and the measured current can be scaled by the leakage inductance estimate,

(6)#\[\begin{split}\boldsymbol{\psi}_{\mathrm{ref}} &= \hat L_\sigma \boldsymbol{i}_\mathrm{s,ref} \\ \hat{\boldsymbol{\psi}} &= \hat L_\sigma \boldsymbol{i}_\mathrm{s}\end{split}\]

where the notation of the leakage flux has been simplified by dropping the subscript \(\sigma\) (in order to be able to reuse some of the following equations for synchronous machines). Now the 2DOF PI controller (3) can be rewritten as

(7)#\[\begin{split}\frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= \boldsymbol{k}_\mathrm{i}\left(\boldsymbol{\psi}_{\mathrm{ref}} - \hat{\boldsymbol{\psi}}\right) \\ \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}_\mathrm{t}\boldsymbol{\psi}_{\mathrm{ref}} - \boldsymbol{k}_\mathrm{p}\hat{\boldsymbol{\psi}} + \boldsymbol{u}_\mathrm{i}\end{split}\]

It can be easily seen that the controllers (3) and (7) are equivalent if \(\boldsymbol{k}_\mathrm{p} = \boldsymbol{k}'_\mathrm{p}/\hat L_\sigma\), \(\boldsymbol{k}_\mathrm{i} = \boldsymbol{k}'_\mathrm{i}/\hat L_\sigma\), and \(\boldsymbol{k}_\mathrm{t} = \boldsymbol{k}'_\mathrm{t}/\hat L_\sigma\). As an example, gains for the complex-vector design reduce to

(8)#\[\boldsymbol{k}_\mathrm{p} = 2\alpha_\mathrm{c} \qquad\qquad \boldsymbol{k}_\mathrm{i} = \alpha_\mathrm{c}(\alpha_\mathrm{c} + \mathrm{j}\omega_\mathrm{s}) \qquad \qquad \boldsymbol{k}_\mathrm{t} = \alpha_\mathrm{c}\]

where \(\hat R_\sigma = 0\) is assumed. This choice of using the leakage flux linkage as the internal state has some advantages: the gain expressions become simpler; the magnetic saturation would be more convenient to take into account; and the same control structure can be extended to synchronous machines [3].

Disturbance-Observer Structure#

The controller (7) can be equally represented using the disturbance-observer structure,

(9)#\[\begin{split}\frac{\mathrm{d} \boldsymbol{u}_\mathrm{i}}{\mathrm{d} t} &= \boldsymbol{\alpha}_\mathrm{i}\left(\boldsymbol{u}_{\mathrm{s,ref}} - \hat{\boldsymbol{v}}_\mathrm{s}\right) \\ \hat{\boldsymbol{v}}_\mathrm{s} &= \boldsymbol{u}_\mathrm{i} - (\boldsymbol{k}_\mathrm{p} - \boldsymbol{k}_\mathrm{t})\hat{\boldsymbol{\psi}} \\ \boldsymbol{u}_\mathrm{s,ref} &= \boldsymbol{k}_\mathrm{t}\left(\boldsymbol{\psi}_{\mathrm{ref}} - \hat{\boldsymbol{\psi}}\right) + \hat{\boldsymbol{v}}_\mathrm{s}\end{split}\]

where \(\boldsymbol{\alpha}_\mathrm{i} = \boldsymbol{k}_\mathrm{i}/\boldsymbol{k}_\mathrm{t}\) is the redefined integral gain and \(\hat{\boldsymbol{v}}_\mathrm{s}\) is the estimated input disturbance. This structure is convenient to prevent the integral windup that originates from the actuator saturation [4]. The stator voltage is limited in practice due to the limited DC-bus voltage of the converter. Consequently, the realized (limited) voltage reference is

\[\bar{\boldsymbol{u}}_\mathrm{s,ref} = \mathrm{sat}(\boldsymbol{u}_\mathrm{s,ref})\]

where \(\mathrm{sat}(\cdot)\) is the saturation function. The limited voltage can be obtained from a pulse-width modulation (PWM) algorithm. The anti-windup of the integrator can be implemented simply as

\[\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 motulator.common.control.ComplexPIController class is based on this disturbance-observer form.

Synchronous Machines#

The flux-based control algorithms (7) and (9) can be directly used for both non-salient and salient synchronous machines by mapping the stator current to the flux linkage, [3]

(10)#\[\begin{split}\boldsymbol{\psi}_\mathrm{ref} &= \hat{L}_\mathrm{d}\mathrm{Re}\{\boldsymbol{i}_\mathrm{s,ref}\} + \mathrm{j} \hat{L}_\mathrm{q}\mathrm{Im}\{\boldsymbol{i}_\mathrm{s,ref}\} \\ \hat{\boldsymbol{\psi}} &= \hat{L}_\mathrm{d}\mathrm{Re}\{\boldsymbol{i}_\mathrm{s}\} + \mathrm{j} \hat{L}_\mathrm{q}\mathrm{Im}\{\boldsymbol{i}_\mathrm{s}\}\end{split}\]

It is important to notice that \(\boldsymbol{i}_\mathrm{s,ref} = \boldsymbol{i}_\mathrm{s}\) holds in the steady state even with inductance estimate inaccuracies, since the same inductances are used to map both the reference current and the actual current to the corresponding flux linkages.

Discrete-Time Algorithm#

The discrete-time variant of the disturbance-observer form (9) is given by

\[\begin{split}\boldsymbol{u}_\mathrm{i}(k+1) &= \boldsymbol{u}_\mathrm{i}(k) + T_\mathrm{s} \boldsymbol{\alpha}_\mathrm{i} \left[\bar{\boldsymbol{u}}_\mathrm{s,ref}(k) - \hat{\boldsymbol{v}}_\mathrm{s}(k) \right] \\ \hat{\boldsymbol{v}}_\mathrm{s}(k) &= \boldsymbol{u}_\mathrm{i}(k) - (\boldsymbol{k}_\mathrm{p} - \boldsymbol{k}_\mathrm{t})\hat{\boldsymbol{\psi}}(k) \\ \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]\end{split}\]

where \(T_\mathrm{s}\) is the sampling period and \(k\) is the discrete-time index. Depending on the machine type, either (6) or (10) is used to map the stator current to the flux linkage. This discrete-time algorithm corresponds to the implementation in the motulator.drive.control.sm.CurrentController class. The default gain selection corresponds to the complex-vector gains in (8).

References