Files
hugo/content/zettels/anti_windup_control.md
tdehaeze b826ca3340
Deploy / deploy (push) Successful in 5s
Update content - 2026-10-07
2026-10-07 16:20:18 +02:00

51 lines
2.5 KiB
Markdown

+++
title = "Anti-Windup Control"
author = ["Dehaeze Thomas"]
draft = false
category = "Control Theory"
subcategory = "Fundamentals"
+++
Tags
:
Anti-windup control deals with the problem of **actuator saturation**.
When the control signal \\(u\\) requested by the controller exceeds the actuator limits, the actual actuator input is clipped and the plant no longer responds as the controller expects.
If the controller contains an integrator, it keeps integrating the error even though the plant input is saturated: the integral state "winds up" to a very large value.
When the error finally changes sign, this large integral state has to be unwound first, which leads to large overshoot, long settling time, and possibly instability.
This is mostly relevant for [Voice Coil Actuators]({{< relref "voice_coil_actuators.md" >}}), which have a limited current/force range and are usually controlled with high-gain integral action.
It is much less relevant for [Piezoelectric Actuators]({{< relref "piezoelectric_actuators.md" >}}).
In order to implement anti-windup, the integrator usually has to be **explicit** in the controller (i.e. a separate integral term whose state can be modified).
This is one of the reasons why the PID controller is so useful: the integral action is clearly separated from the other terms.
### Anti-windup strategies {#anti-windup-strategies}
#### Conditional integration (integrator clamping) {#conditional-integration--integrator-clamping}
The integrator is simply stopped (or reset) when the actuator is saturated.
For instance, the integration is frozen as long as \\(u \neq \text{sat}(u)\\), possibly only if the error would further increase the saturation (i.e. same sign of \\(u\\) and \\(e\\)).
#### Back-calculation {#back-calculation}
The difference between the saturated and the requested control signal, \\(e\_s = \text{sat}(u) - u\\), is fed back to the integrator input through a gain \\(1/T\_t\\):
\begin{equation}
\dot{x}\_i = K\_i e + \frac{1}{T\_t} \left( \text{sat}(u) - u \right)
\end{equation}
When there is no saturation, \\(e\_s = 0\\) and the controller behaves as usual.
When saturated, the integrator state is driven so that \\(u\\) tracks the saturation limit.
The tracking time constant \\(T\_t\\) sets how fast the integrator is unwound (a common choice is \\(T\_t = \sqrt{T\_i T\_d}\\) or \\(T\_t = T\_i\\)).
## Bibliography {#bibliography}
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><div class="csl-bib-body">
</div>