
Passo 1 de 7
Identificar windup nos registros
Reconheça, em registros temporais coerentes, quando a saturação do atuador evolui para windup integral.
Trilha de aprendizado · Nível 13 · Tutorial 7
Acrescentar anti-windup ao PI para impedir que a ação integral continue crescendo no sentido de uma saída já saturada.
Identificar windup nos registros
Reconheça, em registros temporais coerentes, quando a saturação do atuador evolui para windup integral. 2 min
Decidir quando integrar
Use o comando e o estado integral candidatos para aceitar somente atualizações que não agravem uma saturação. 3 min
Implementar a atualização protegida
Implemente a sequência que testa a integral candidata antes de alterar o estado e limita o comando aplicado ao final. 3 min
Testar os dois limites e suas fronteiras
Verifique a regra de integração condicional nos limites superior e inferior, incluindo recuperação, igualdade e incrementos nulos. 2 min
Comparar a recuperação com e sem anti-windup
Compare rastreamentos numéricos de PI com limitação apenas da saída e PI com integração condicional nos limites superior e inferior. 3 min
Tratar pausas e perda de medição
Defina uma política explícita para interrupções: comando seguro e integral congelada durante a pausa; retomada autorizada com medição válida e reinicialização da integral antes do próximo cálculo. 3 min
Validar o PI protegido de ponta a ponta
Valide, por rastreamento e aplicação final, o contrato de um PI com integração condicional, incluindo saturação, recuperação, pausas e retomada. 3 min

Passo 1 de 7
Reconheça, em registros temporais coerentes, quando a saturação do atuador evolui para windup integral.
No PI já conhecido, o controlador calcula um comando solicitado, aqui chamado de u_calculado. O atuador só pode receber valores dentro de sua faixa; depois do limitador, temos u_aplicado.
Se a faixa permitida é de 0 a 100 e o PI solicita 128, então:
u_calculado = 128u_aplicado = 100Isso é saturação superior. A diferença não é erro de registro: ela mostra a ação do limitador. De modo simétrico, um comando calculado abaixo de 0 resulta em comando aplicado igual a 0.

Saturação limita a atuação; o estado integral pode continuar evoluindo internamente.
Para distinguir uma saturação passageira de windup, registre grandezas sincronizadas a cada atualização:
O estado I não é o comando aplicado. Comparar essas colunas ao longo do tempo mostra se a memória integral está mudando sem produzir aumento adicional de atuação.
Use parâmetros constantes em toda a sequência: Kp = 2, Ki × Ts = 0,6, limites de saída de 0 a 100 e I inicial igual a 0. Nas amostras de 0 a 8, mantenha r = 50 e y = 20; portanto, e = +30, P = +60 e ΔI = +18 em todas elas.
| Amostra | r | y | e | I | u calculado / aplicado |
|---|---|---|---|---|---|
| 0 | 50 | 20 | +30 | 18 | 78 / 78 |
| 1 | 50 | 20 | +30 | 36 | 96 / 96 |
| 2 | 50 | 20 | +30 | 54 | 114 / 100 |
| 3 | 50 | 20 | +30 | 72 | 132 / 100 |
| 4 | 50 | 20 | +30 | 90 | 150 / 100 |
| 5 | 50 | 20 | +30 | 108 | 168 / 100 |
| 6 | 50 | 20 | +30 | 126 | 186 / 100 |
| 7 | 50 | 20 | +30 | 144 | 204 / 100 |
| 8 | 50 | 20 | +30 | 162 | 222 / 100 |
Nas amostras 2 a 8, a saída já está saturada em 100. Mesmo assim, I cresce de 54 para 162 e u_calculado se afasta de 114 para 222. O comando aplicado permanece em 100.
Esse acúmulo de I no mesmo sentido da saturação é windup. Uma única amostra limitada evidencia saturação, mas não basta para evidenciar windup. Para isso, observe uma sequência: estado integral crescendo, comando calculado se afastando do limite e atuação sem aumento correspondente.
Agora a referência muda para r = 10, mantendo y = 20 como dado de teste. Logo, e = −10, P = −20 e ΔI = −6. Os mesmos ganhos continuam valendo. Embora I comece a diminuir, o valor acumulado mantém u_calculado acima de 100 por várias atualizações.
| Amostra | r | y | e | I | u calculado / aplicado |
|---|---|---|---|---|---|
| 9 | 10 | 20 | −10 | 156 | 136 / 100 |
| 10 | 10 | 20 | −10 | 150 | 130 / 100 |
| 11 | 10 | 20 | −10 | 144 | 124 / 100 |
| 12 | 10 | 20 | −10 | 138 | 118 / 100 |
| 13 | 10 | 20 | −10 | 132 | 112 / 100 |
| 14 | 10 | 20 | −10 | 126 | 106 / 100 |
| 15 | 10 | 20 | −10 | 120 | 100 / 100 |
| 16 | 10 | 20 | −10 | 114 | 94 / 94 |
Analise as duas tabelas em conjunto. A igualdade com um limite pertence à faixa permitida: u_calculado = 100 não excede o máximo de 100. Portanto, diferencie o instante em que a saturação termina daquele em que o comando passa a ficar estritamente abaixo do máximo.
Qual alternativa identifica corretamente a evidência de windup e a fronteira de recuperação neste registro?

Passo 2 de 7
Use o comando e o estado integral candidatos para aceitar somente atualizações que não agravem uma saturação.
Limitar apenas o comando final protege o atuador, mas não impede que I continue crescendo enquanto a saída já está no limite. Já limitar I a uma faixa fixa é uma regra diferente e pode ser inadequado: o comando é a soma u = P + I.
Por exemplo, mesmo que I = 90 esteja dentro de uma faixa de 0 a 100, uma parcela P = 80 produz u = 170. Portanto, limitar I à mesma faixa da saída não limita o comando total.
A integração condicional toma uma decisão mais direta: bloqueia somente o incremento integral que empurra o comando ainda mais para fora de um limite.

A regra observa o efeito de ΔI sobre o comando total P + I, não apenas o valor isolado de I.
Dica
Não escolha a faixa de I copiando automaticamente os limites da saída. A contribuição útil de I depende da parcela proporcional P naquele instante; por isso, a decisão usa o comando candidato.
Ainda não altere o estado integral persistente. Primeiro, calcule valores provisórios:
Depois classifique o efeito de ΔI. Só então I poderá ser aceito ou preservado. Essa separação mantém disponível o valor anterior caso a atualização precise ser bloqueada.
Exemplo
Considere u_min = 0, u_max = 100, P = 80, I_anterior = 25 e ΔI = +10.
Então, I_candidato = 25 + 10 = 35 e u_candidato = 80 + 35 = 115.
O candidato está acima do máximo e ΔI é positivo: o incremento levaria o comando ainda mais para cima. Portanto, bloqueie a atualização e preserve I = 25.
A convenção deste tutorial é:
u_candidato > u_max e ΔI > 0.u_candidato < u_min e ΔI < 0.O teste do limite identifica onde está o candidato. O sinal de ΔI mostra se a atualização aponta para fora da faixa ou de volta para ela.
A existência de saturação não basta para bloquear a integral. Acima do limite superior, um ΔI negativo reduz I e ajuda o comando a retornar. Abaixo do limite inferior, um ΔI positivo faz o equivalente no outro sentido.
Assim, uma atualização corretiva é aceita mesmo quando um único passo ainda não traz u_candidato de volta para dentro da faixa.
Exemplo
Com u_min = 0, u_max = 100, P = 90, I_anterior = 40 e ΔI = -8:
I_candidato = 32 e u_candidato = 122.
O comando candidato ainda excede 100, mas ΔI é negativo: ele reduz o excesso em vez de agravá-lo. A atualização é aceita. Em chamadas sucessivas, incrementos corretivos podem continuar reduzindo I.
Dica
Não confunda “ainda está saturado” com “deve bloquear”. A pergunta decisiva é: este ΔI move o comando para fora ou para dentro?
Agora aplique a regra a casos novos. Em cada situação, some I_anterior + ΔI para obter I_candidato; depois some P para obter u_candidato. Relacione cada caso ao resultado completo correto.
Considere sempre u_min = 0 e u_max = 100.
Associe cada situação ao valor de u_candidato e à decisão sobre a atualização integral.
Toque em um item e depois no par correspondente.

Passo 3 de 7
Implemente a sequência que testa a integral candidata antes de alterar o estado e limita o comando aplicado ao final.
A atualização protegida é uma sequência de cálculo e decisão. Trate state.i como o estado confirmado da chamada anterior: ele não deve mudar enquanto você avalia o candidato.
p e deltaI.iCandidate e uCandidate.deltaI agrava uma saturação.state.i.I escolhido.O último limite continua necessário. Mesmo com a integral bloqueada, a parcela proporcional pode manter uCalculated além da faixa permitida.

O estado integral só é confirmado depois do teste com os valores candidatos.
A função abaixo é autocontida: recebe erro, ganhos, período e limites; recebe o estado integral por referência; e devolve os valores úteis para registro. Ela não lê sensores nem escreve em periféricos.
uCandidate é usado apenas na decisão. Após a decisão, uCalculated é recomposto com o estado efetivamente escolhido. Já uApplied é sempre o comando dentro dos limites.
Trecho de referência para estudar ou adaptar em seu próprio editor.
struct PIState { float i; };
struct PIResult {
float deltaI, iCandidate, uCandidate;
bool integrated;
float i, uCalculated, uApplied;
};
float clamp(float x, float low, float high) {
if (x < low) return low;
if (x > high) return high;
return x;
}
PIResult piStep(float error, float kp, float ki, float ts,
float uMin, float uMax, PIState& state) {
float p = kp * error;
float deltaI = ki * ts * error;
float iCandidate = state.i + deltaI;
float uCandidate = p + iCandidate;
bool blocks = (uCandidate > uMax && deltaI > 0.0f) ||
(uCandidate < uMin && deltaI < 0.0f);
bool integrated = !blocks;
if (integrated) state.i = iCandidate;
float uCalculated = p + state.i;
float uApplied = clamp(uCalculated, uMin, uMax);
return {deltaI, iCandidate, uCandidate, integrated,
state.i, uCalculated, uApplied};
}Dica
Para cada chamada, registre os campos retornados. deltaI mostra o sentido da tentativa; integrated informa a decisão; i mostra o estado confirmado; uCandidate documenta o teste; e a dupla uCalculated/uApplied revela a atuação do limite.
Ordene as operações de uma chamada da função, da primeira à última.
A ordem correta evita confirmar um estado que ainda precisava ser bloqueado. O limite final vem depois da recomposição de P + I com o estado escolhido.
Organize a sequência da atualização PI protegida.
Complete os trechos que implementam o bloqueio, a confirmação do estado e a limitação final.
Preencha as lacunas da função.
bool blocks = () ||
();
if (!blocks) {
state.i = ;
}
float uCalculated = p + ;
float uApplied = clamp(uCalculated, uMin, );
Passo 4 de 7
Verifique a regra de integração condicional nos limites superior e inferior, incluindo recuperação, igualdade e incrementos nulos.
Teste cada atualização como um caso independente. Fixe u_min = 0 e u_max = 100 e registre P, I_anterior, ΔI, u_candidato, decisão, I_resultante e u_aplicado.
A regra já implementada é:
u_candidato > u_max e ΔI > 0;u_candidato < u_min e ΔI < 0;Após escolher o estado integral, recalcule u_calculado = P + I_resultante e limite esse valor para obter u_aplicado. Casos pontuais isolam erros de sinal e evitam que um resultado anterior esconda uma atualização incorreta.

A decisão depende simultaneamente da posição de u_candidato e do sentido de ΔI.
Dica
A simetria é essencial: no limite superior, um incremento positivo agrava o excesso; no inferior, um incremento negativo agrava a falta. Já um incremento apontando de volta para a faixa deve ser aceito, mesmo que uma única atualização ainda deixe o candidato fora da faixa.
Use estes casos pontuais para conferir sinais, desigualdades e preservação do estado. Em todos, o comando aplicado é limitado ao intervalo de 0 a 100 depois da decisão.
| Caso | P | I anterior | ΔI | u candidato | Decisão esperada |
|---|---|---|---|---|---|
| Dentro da faixa | 40 | 20 | +5 | 65 | Aceitar |
| Excesso superior | 80 | 15 | +10 | 105 | Bloquear |
| Excesso inferior | -20 | 10 | -15 | -25 | Bloquear |
| Recupera do superior | 80 | 40 | -15 | 105 | Aceitar |
| Recupera do inferior | -20 | -30 | +10 | -40 | Aceitar |
Exemplo
Com P = 80, I_anterior = 40 e ΔI = -15:
I_candidato = 40 + (-15) = 25;u_candidato = 80 + 25 = 105;ΔI é negativo: ele reduz o integral e ajuda a sair do limite superior;I_resultante = 25;u_calculado = 105 e u_aplicado = 100.Bloquear esse caso impediria justamente a recuperação do estado integral.
Atenção
Não confunda a decisão sobre I com a limitação final. Uma parcela proporcional alta pode manter u_calculado fora da faixa mesmo quando a integral foi corretamente bloqueada ou aceita.
A comparação é estrita. Se u_candidato for exatamente 100 ou exatamente 0, a atualização é aceita: não há comando além do limite. No ciclo seguinte, qualquer avanço para fora será avaliado novamente.
Se ΔI = 0, então I_candidato é igual a I_anterior. Logo, o estado integral não muda, independentemente de a lógica classificar a chamada como aceita ou bloqueada.
Examine também saltos grandes: não basta concluir que uma mudança de sinal “recupera” o sistema. O candidato final deve ser comparado aos dois limites.
Complete a condição geral de bloqueio superior e avalie-a no caso a seguir: uMin = 0, uMax = 100, P = 80, I anterior = 10 e deltaI = 10.
Nesse caso, iCandidate = 20 e uCandidate = 100. A primeira comparação da condição geral deve resultar falsa, pois a igualdade com o limite é permitida. Portanto, a atualização não é bloqueada.
Preencha a condição geral. Em seguida, aplique-a mentalmente ao caso apresentado, no qual uCandidate é exatamente igual a uMax.
bool bloqueiaSuperior = () && ();Avalie a afirmação considerando que ΔI pode ser grande o bastante para levar o comando candidato de uma região acima do máximo para uma região abaixo do mínimo em uma única chamada.
Uma inversão de sinal em ΔI torna a atualização automaticamente segura, mesmo se uCandidate cruzar a faixa inteira.
Dica
Antes de avançar, confira sua matriz de testes: ela deve conter operação interna, bloqueio superior, bloqueio inferior, recuperação nos dois sentidos, igualdade em cada fronteira e ΔI = 0. Esses casos isolam erros de > versus >=, de sinal e de atualização prematura de I.

Passo 5 de 7
Compare rastreamentos numéricos de PI com limitação apenas da saída e PI com integração condicional nos limites superior e inferior.
Use dois controladores com os mesmos parâmetros: Kp = 0,2, Ki × Ts = 0,1, limites numéricos de comando de −10 a +10 e I inicial igual a 0.
A única diferença é a política da integral:
I em toda chamada e limita apenas u_aplicado.ΔI que agravaria uma saturação.Para dar sentido às referências do teste, suponha uma variável medida com faixa alcançável de 0 a 40. Assim, r = 70 e r = −50 ficam propositalmente fora dessa faixa; os retornos para r = 20 ficam dentro dela. Esta faixa é uma hipótese para rastrear a lógica, não um modelo nem uma previsão de uma planta RC.

Nos dois casos o limitador protege o comando aplicado; somente o anti-windup evita o acúmulo integral que prolonga a recuperação.
Dica
No rastreamento superior, as três primeiras entradas são r = 70 e y = 10. Logo, e = +60, P = +12 e ΔI = +6. Depois, use r = 20 e y = 30: e = −10, P = −2 e ΔI = −1.
As referências e medições são entradas fixas. Elas servem para isolar a decisão de integração. Durante a fase saturada, u_aplicado = +10 nas duas políticas; por isso, compare também I e u_calculado.
A tabela usa a sequência superior declarada anteriormente. Nas três primeiras atualizações, a integral continua crescendo apesar de a saída já estar limitada. Após o retorno a r = 20, cada ΔI = −1 reduz o estado acumulado.
u_calculado é o valor antes do limitador. u_aplicado é o comando que respeita a faixa de −10 a +10.
| Atualização | e | ΔI | I após ΔI | u calculado | u aplicado |
|---|---|---|---|---|---|
| 1 | +60 | +6 | +6 | +18 | +10 |
| 2 | +60 | +6 | +12 | +24 | +10 |
| 3 | +60 | +6 | +18 | +30 | +10 |
| 4 | −10 | −1 | +17 | +15 | +10 |
| 5 | −10 | −1 | +16 | +14 | +10 |
| 6 | −10 | −1 | +15 | +13 | +10 |
| 7 | −10 | −1 | +14 | +12 | +10 |
| 8 | −10 | −1 | +13 | +11 | +10 |
| 9 | −10 | −1 | +12 | +10 | +10 |
Sem anti-windup, I chega a +18. Mesmo quando o erro se torna corretivo, o comando calculado fica acima do máximo até a atualização 8. Na atualização 9, u_calculado = +10: ele volta à faixa porque a igualdade com o limite é permitida.
Portanto, são necessárias seis atualizações corretivas, da 4 à 9, para o comando calculado deixar de exceder o limite superior.
Com integração condicional, as tentativas positivas iniciais são bloqueadas. Quando o erro muda, a atualização negativa é aceita: ela reduz I, mesmo que a decisão seja tomada a partir de um comando candidato calculado antes da confirmação do estado.
| Atualização | ΔI | I candidato | Decisão | I escolhido | u calculado / aplicado |
|---|---|---|---|---|---|
| 1 | +6 | +6 | Bloquear | 0 | +12 / +10 |
| 2 | +6 | +6 | Bloquear | 0 | +12 / +10 |
| 3 | +6 | +6 | Bloquear | 0 | +12 / +10 |
| 4 | −1 | −1 | Aceitar | −1 | −3 / −3 |
Dica
O anti-windup não torna r = 70 alcançável na hipótese de faixa medida de 0 a 40. Ele também não altera a parcela proporcional inicial, que já solicita um comando acima de +10. Sua função é impedir que a integral acumule ainda mais no mesmo sentido enquanto existe saturação.
Repita o raciocínio no limite inferior, reiniciando I = 0. Nas três primeiras atualizações, use r = −50 e y = 10. Então, e = −60, P = −12 e ΔI = −6. Depois, use r = 20 e y = 10: e = +10, P = +2 e ΔI = +1.
Os valores negativos são somente dados numéricos para testar a simetria da lógica. Eles não indicam aplicar tensão negativa, alterar a alimentação ou executar esse caso no circuito.
Sem anti-windup, a integral acumula valores negativos até −18. Depois da mudança para erro positivo, cada atualização soma +1 a I, mas o excesso negativo persiste por várias chamadas.
| Atualização | e | ΔI | I após ΔI | u calculado | u aplicado |
|---|---|---|---|---|---|
| 1 | −60 | −6 | −6 | −18 | −10 |
| 2 | −60 | −6 | −12 | −24 | −10 |
| 3 | −60 | −6 | −18 | −30 | −10 |
| 4 | +10 | +1 | −17 | −15 | −10 |
| 5 | +10 | +1 | −16 | −14 | −10 |
| 6 | +10 | +1 | −15 | −13 | −10 |
| 7 | +10 | +1 | −14 | −12 | −10 |
| 8 | +10 | +1 | −13 | −11 | −10 |
| 9 | +10 | +1 | −12 | −10 | −10 |
Na versão protegida, as três tentativas de ΔI = −6 são bloqueadas, pois o candidato está abaixo de −10 e o incremento é negativo. Na primeira atualização de retorno, ΔI = +1 é aceito: I passa de 0 para +1 e u_calculado = +2 + 1 = +3, dentro da faixa.
A simetria é exata: no limite superior bloqueia-se o incremento positivo que agrava o excesso; no inferior, bloqueia-se o negativo que agrava a falta.
Atenção
Estas tabelas reproduzem entradas fixas para verificar a regra de anti-windup. Em uma simulação de malha fechada, a medição mudaria conforme o comando e seria necessário um modelo da planta. Portanto, os registros não preveem a tensão futura de um RC, não demonstram estabilidade e não substituem ajuste de ganhos.
Complete dois pontos do registro superior sem anti-windup. Após as três chamadas saturadas, I = +18. No retorno, P = −2 e cada chamada acrescenta ΔI = −1 ao estado integral.
Observe que o comando calculado é obtido antes do limitador. O comando aplicado continua em +10 enquanto o calculado estiver acima desse limite.
Preencha os dois valores de comando calculado no rastreamento sem proteção.
// Após três chamadas saturadas: I = +18.
// Quarta atualização de retorno: I = 18 + 4 * (-1).
float iRetorno4 = 14.0f;
float uRetorno4 = -2.0f + iRetorno4; //
// Sexta atualização de retorno: I = 18 + 6 * (-1).
float iRetorno6 = 12.0f;
float uRetorno6 = -2.0f + iRetorno6; // Compare as versões após a saturação superior em 3 a 5 frases. Explique como o estado integral altera a quantidade de atualizações corretivas. Cite a diferença entre u_calculado e u_aplicado e explique por que as tabelas não são uma simulação da planta.
Escreva pelo menos 120 caracteres (0/120).

Passo 6 de 7
Defina uma política explícita para interrupções: comando seguro e integral congelada durante a pausa; retomada autorizada com medição válida e reinicialização da integral antes do próximo cálculo.
O bloqueio por saturação e uma pausa de controle resolvem problemas diferentes. Na saturação, o PI continua ativo e decide se aceita ou bloqueia apenas o incremento integral que agravaria um limite. Já com o controle desabilitado ou uma medição inválida, não há uma atualização de controle confiável: não calcule erro, ΔI nem comandos candidatos.
A política usada neste tutorial é explícita:
Nos exemplos numéricos do RC de baixa energia, o comando seguro é 0. Isso não é uma regra universal: outro atuador pode exigir outro comando seguro, definido pelo seu contexto.

A verificação de habilitação e validade vem antes de qualquer cálculo do PI. O anti-windup atua somente quando o controle está ativo.
Congelar I durante a pausa evita modificar o estado sem dados válidos. Porém, congelar não autoriza reutilizar esse valor indefinidamente: ele pode ter sido acumulado para uma condição anterior da planta e da referência.
Por isso, a retomada adotada reinicializa I antes da primeira atualização normal. Não some o erro durante o intervalo parado e não tente compensar a pausa executando várias atualizações atrasadas. A primeira amostra válida e autorizada inicia uma nova sequência de controle.
Atenção
A reinicialização de I não garante um comando sem salto: a parcela proporcional ainda depende do erro presente na retomada. Registre e observe esse transiente na validação. Evite esconder esse efeito reutilizando silenciosamente um estado integral antigo.
Comparação da política adotada para um RC de baixa energia.
| Condição | Comando aplicado | Estado I | Próximo passo |
|---|---|---|---|
| Desabilitado | Seguro: 0 | Congelar | Aguardar habilitação |
| Medição inválida | Seguro: 0 | Congelar | Aguardar medição recente |
| Válido, sem autorização | Seguro: 0 | Congelar | Aguardar autorização |
| Retomada autorizada | Ainda seguro nesta decisão | Reiniciar para 0 | Calcular próxima atualização |
| Controle ativo | PI limitado | Atualizar pela regra anti-windup | Repetir no próximo período |
Use esta porta de entrada antes do cálculo do PI protegido. Se ela retornar false, mantenha o comando seguro e não calcule erro nem atualize a integral nesta chamada.
struct PiState {
float integral;
bool pausado;
};
// Retorna true somente quando é permitido executar a atualização do PI.
bool prepararPi(PiState& s,
bool habilitado,
bool medicaoValidaERecente,
bool retomadaAutorizada,
float& comandoAplicado) {
const float comandoSeguro = 0.0f; // Exemplo: RC de baixa energia.
if (!habilitado || !medicaoValidaERecente) {
s.pausado = true;
comandoAplicado = comandoSeguro;
return false; // Não calcular erro, ΔI ou candidato.
}
if (s.pausado) {
comandoAplicado = comandoSeguro;
if (!retomadaAutorizada) {
return false;
}
s.integral = 0.0f; // Antes da primeira atualização retomada.
s.pausado = false;
}
return true; // Agora o chamador pode executar o PI com anti-windup.
}Dica
Quando prepararPi(...) retorna true, calcule normalmente P, ΔI, I_candidato e aplique a regra de integração condicional já estudada. A função não substitui o limite final do comando nem a decisão anti-windup; ela impede que esses cálculos ocorram durante uma pausa.
Complete a condição que detecta uma pausa. Enquanto ela for verdadeira, o estado fica pausado, o comando seguro é aplicado e a função deve retornar antes de qualquer cálculo do PI.
Preencha as duas condições de interrupção.
if ( || ) {
s.pausado = true;
comandoAplicado = comandoSeguro;
return false;
}Ordene as ações quando chegam habilitação e medição válida após uma pausa.

Passo 7 de 7
Valide, por rastreamento e aplicação final, o contrato de um PI com integração condicional, incluindo saturação, recuperação, pausas e retomada.
A validação final é um rastreamento lógico: ela não energiza uma planta nem demonstra estabilidade. Para cada chamada permitida, registre error, deltaI, uCandidate, a decisão, I, uCalculated e uApplied.
O contrato está atendido quando:
I não avança no sentido que agrava uma saturação;deltaI corretivo é aceito, mesmo se o candidato ainda estiver fora da faixa;uApplied sempre respeita os limites;I e aplicam o comando seguro;I antes da primeira atualização.Essas evidências verificam a lógica do software. A resposta do circuito RC e a sintonia dos ganhos serão tratadas no próximo tutorial.

A pausa é um estado persistente: não basta aplicar o comando seguro em uma única chamada.
A função final calcula deltaI internamente, preservando a relação do PI discreto: deltaI = ki × ts × error. Assim, com ki e ts positivos, deltaI tem o mesmo sinal do erro.
O campo persistente pausado impede uma retomada implícita. Uma entrada inválida marca a pausa e retorna sem calcular erro, candidato ou integral. Mesmo quando a medição volta a ser válida, o comando seguro permanece até existir autorização de retomada. Só então a integral é zerada, a pausa é limpa e uma atualização protegida pode ocorrer.
Função autocontida para estudo, rastreamento ou execução local opcional. Ela calcula deltaI a partir de ki, ts e error.
struct PiState {
float integral;
bool pausado;
};
struct PiResult {
float deltaI, iCandidate, i;
float uCandidate, uCalculated, uApplied;
bool integrated;
};
float clamp(float x, float low, float high) {
if (x < low) return low;
if (x > high) return high;
return x;
}
PiResult updatePiProtected(float error, float kp, float ki, float ts,
float uMin, float uMax, PiState& s,
bool habilitado, bool medicaoValidaERecente,
bool retomadaAutorizada) {
const float comandoSeguro = 0.0f;
PiResult r{};
if (!habilitado || !medicaoValidaERecente) {
s.pausado = true;
r.i = s.integral;
r.uApplied = comandoSeguro;
return r;
}
if (s.pausado) {
r.i = s.integral;
r.uApplied = comandoSeguro;
if (!retomadaAutorizada) return r;
s.integral = 0.0f;
s.pausado = false;
}
float p = kp * error;
r.deltaI = ki * ts * error;
r.iCandidate = s.integral + r.deltaI;
r.uCandidate = p + r.iCandidate;
bool blocks = (r.uCandidate > uMax && r.deltaI > 0.0f) ||
(r.uCandidate < uMin && r.deltaI < 0.0f);
r.integrated = !blocks;
if (r.integrated) s.integral = r.iCandidate;
r.i = s.integral;
r.uCalculated = p + s.integral;
r.uApplied = clamp(r.uCalculated, uMin, uMax);
return r;
}Use kp = 1, ki = 1, ts = 0,2 s, limites de 0 a 10 e estado inicial deliberadamente elevado: I = 14, pausado = false. Portanto, em toda chamada válida, deltaI = 0,2 × error.
Esse estado inicial é um dado de teste para verificar a recuperação de uma integral já alta. O estado confirmado em cada linha alimenta a linha seguinte. O caso começa dentro da faixa, passa por saturação superior, aceita uma correção ainda saturada, testa o limite inferior e então atravessa pausa e retomada.
“—” indica que não há cálculo de erro, deltaI ou candidato durante a pausa. u* é o comando calculado depois de aceitar ou bloquear a atualização integral.
| Erro | ΔI | Condição | uCandidate | Decisão e I final | uApplied |
|---|---|---|---|---|---|
| −5 | −1,0 | válida, habilitada | 8,0 | aceita; I=13,0; u*=8,0 | 8,0 |
| +3 | +0,6 | válida, habilitada | 16,6 | bloqueia alto; I=13,0; u*=16,0 | 10,0 |
| −2 | −0,4 | válida, habilitada | 10,6 | aceita corretiva; I=12,6; u*=10,6 | 10,0 |
| −20 | −4,0 | válida, habilitada | −11,4 | bloqueia baixo; I=12,6; u*=−7,4 | 0,0 |
| — | — | habilitado=false | — | pausa; I=12,6 congelado | 0,0 |
| — | — | medição inválida | — | continua em pausa; I=12,6 | 0,0 |
| +3 | +0,6 | válida; retomada autorizada | 3,6 | zera I, aceita; I=0,6; u*=3,6 | 3,6 |
Dica
Na recuperação superior, error = −2 produz necessariamente deltaI = −0,4. O candidato 10,6 ainda excede o máximo, mas o incremento reduz I de 13,0 para 12,6; por isso é aceito.
No limite inferior, error = −20 produz deltaI = −4,0. Como o candidato fica abaixo de zero e o incremento negativo agravaria a falta, a atualização é bloqueada. Mesmo bloqueada, a saída final continua limitada a zero.
Complete o cálculo coerente de deltaI e os dois testes de bloqueio.
float deltaI = * * error;
bool blocks = () ||
();Com base na tabela, justifique em 3 a 5 frases por que a lógica atende ao contrato. Cite o bloqueio superior, a atualização corretiva aceita ainda saturada, o bloqueio inferior, a pausa persistente e a retomada. Termine explicando por que isso não prova estabilidade nem sintonia na planta.
Escreva pelo menos 220 caracteres (0/220).
Resumo
Parabéns! Você concluiu: Anti-windup por integração condicional
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks