Algoritmo PID: como contabilizar alterações rápidas do valor de entrada após um longo atraso


15

Estou tentando implementar um algoritmo PID básico em um Leonardo do Arduino para misturar água quente e fria da torneira usando válvulas servo-controladas. O objetivo é manter a temperatura o mais próximo possível de um ponto de ajuste. Especialmente importante é impedir que a temperatura de saída ultrapasse o ponto de ajuste para proteger o usuário de queimaduras. Secundariamente importante é obter a temperatura perto do ponto de ajuste o mais rápido possível.

Para pequenas mudanças de temperatura, uma implementação padrão do algoritmo PID parece funcionar bem. Mas não sei explicar os longos atrasos que podem ocorrer ao esperar que a água quente atinja a válvula, pois esses atrasos são muito mais longos do que os atrasos padrão após alterar as posições da válvula.

Obviamente, dependendo do comprimento da linha de água quente e do tempo desde o último uso da água quente, pode levar várias dezenas de segundos para que a água quente alcance a válvula; portanto, durante esse tempo, a temperatura da água permanece razoavelmente constante a uma temperatura baixa e a válvula de água quente logo abre 100%. O componente integral começa a acumular um grande valor de erro.

Quando a água quente finalmente atinge a válvula, a temperatura detectada aumenta muito rapidamente para a temperatura máxima da água quente. Devido ao grande erro integral, a válvula de água quente é mantida em 100% por um longo tempo após a temperatura exceder o ponto de ajuste, devido à espera que o valor integral seja reduzido para níveis normais. Assim, o resultado é a temperatura máxima da água por vários (dezenas) de segundos.

Não sei como explicar esse possível atraso. Nesse caso, seria aconselhável definir um limite superior (e inferior) no valor integral do erro, a fim de limitar o tempo máximo de resposta? Isso parece derrotar o objetivo do componente integral e ainda imporia algum atraso após atingir o ponto de ajuste.

Ou existe uma maneira melhor de lidar com alterações rápidas de entrada após um longo atraso?

Obrigado por qualquer conselho!


1
Na verdade, estou me perguntando se você precisa da ação I, porque acho que as mudanças de temperatura da água são relativamente lentas em comparação com a atuação da válvula. Pior ainda, você pode ter um comportamento oscilatório por causa da margem de fase extremamente baixa que provavelmente obterá (seu sistema pode ser estável em teoria, mas pode nunca parar de oscilar na prática, porque a ação I acrescenta atraso de fase). Além disso, como você pode queimar pessoas, não posso enfatizar o suficiente para dar uma olhada nos comentários de Chu e JonRB!
Sanchises 25/05

Respostas:


15

Seu problema se chama Integral Windup , é um problema de controle comum. Em uma região não linear ou de outra forma limitada, o controlador não pode rastrear o ponto de ajuste e a integral aumenta para um valor grande. Isso causa um grande overshoot quando o ponto de ajuste é finalmente alcançado, e é exatamente o que você deduziu que é o problema.

A solução mais simples é limitar o valor do Integrator a um máximo razoável. Limitar a contribuição integral não funcionará tão bem, porque o integrador ainda terá um grande valor.

O Mathworks possui uma página com algumas outras soluções para conclusão integral.

Em um controlador PID, você geralmente deseja o mínimo de termo integral possível. Em uma válvula de controle de temperatura mecânica padrão, apenas o controle proporcional é usado e eles funcionam bem. Mantenha o termo integral o menor possível - o usuário não notará um pequeno erro na temperatura final. Você pode achar que obtém desempenho aceitável com apenas PD.

Como esse é um caso conhecido e muito especial, você pode considerar um modo diferente para o controlador. Meça a temperatura da entrada quente e, enquanto estiver abaixo do ponto de ajuste, apenas aqueça 100%, frio 20%. Quando aquecer, mude para o PID, com boas condições iniciais.


1
Sim. Idealmente, você pode medir a temperatura da entrada quente de forma independente e inibir a conclusão dessa maneira.
Brian Drummond

2
A conclusão pode ser um problema, mas se o integrador não fosse implementado, por exemplo, o efeito desestabilizador do atraso ainda permaneceria. O Smith Predictor é um bom método para mitigar os efeitos de um atraso de tempo puro. A solução da solução do integrador por si só não faz nada para superar o atraso de fase inerente introduzido pelo atraso de tempo.
Chu

2
exatamente, não acho que isso seja apenas uma conclusão integradora, mesmo que seja isso. é uma preocupação válida que deve ser mitigar sempre Pois mesmo que as operações normais não atingiu as condições necessárias
JonRB

Uau, ótima resposta! Eu estava pensando nessa linha (limitando o valor máximo do integrador), mas não expressei a pergunta corretamente, de modo que fui mal interpretado. É bom ver que estou pelo menos no estádio com uma solução. Estou pensando que a solução mais simples seria desativar o fator "I" até que a temperatura atinja uma faixa controlável. Isso permitiria uma resposta muito rápida às mudanças. Então, quando observarmos alguma mudança real de temperatura e chegarmos perto do resultado desejado, reative a integral para adicionar o impulso extra necessário. Obrigado por uma resposta detalhada!
Ryan Griggs

Mas o termo integral não existe para acelerar, existe para corrigir um erro sistemático, especialmente um coeficiente proporcional que não está correto. Não? E nessa situação o coeficiente P. não pode ser perfeito o tempo todo, pois variará dependendo da pressão da água nos dois tubos.
Roman Starkov

4

A chave para controlar esse processo com eficiência é perceber que as torneiras de água quente e fria não operam simetricamente, e qualquer algoritmo ideal deve levar isso em consideração.

Quando você não usa a água quente por um tempo, ela esfria no cano.

Quando você não usa a água fria por um tempo, ela permanece a mesma de sempre (a menos que a água seja de um tanque de água fria com um resfriador, o que seria incrível de se ter nos dias quentes de verão, mas estou apostas são bastante raras na prática).

Assim, assumimos que não sabemos o que obtemos do cano de água quente, mas podemos depender do cano de água fria ser praticamente constante ao longo de uma corrida.

Assim, a partir da temperatura da água misturada e do conhecimento do ajuste da válvula e de uma estimativa da temperatura da água fria, podemos estimar quão quente é a água atualmente proveniente do tubo de água quente. Em seguida, você pode ajustar a válvula para obter a temperatura de saída correta sem PID, apenas com base na avaliação de uma fórmula termodinâmica.

Para obter a "estimativa da temperatura da água fria", você pode executar água fria por um curto período de tempo (talvez alguns segundos) no início do ciclo e ler a temperatura. Então assuma que não mudará a partir de então, pois você não possui dados suficientes para resolver as duas temperaturas.

Esse esquema não será perfeitamente preciso, mas eu acredito que ele entrará de maneira confiável dentro do estádio sem a possibilidade de ultrapassagem drástica. Em seguida, você executa o PID no topo desse esquema para ajustar os resultados, mas limita a alteração na configuração da válvula que o PID pode produzir. E, possivelmente, redefina o estado do PID quando houver alterações significativas na temperatura de entrada de água quente.

Soluções mais sofisticadas são possíveis com vários sensores de temperatura.


Outra ótima resposta - pensar fora da caixa PID. Eu tinha considerado apenas testar as temperaturas da água e criar algum tipo de tabela de pesquisa com posições aproximadas da válvula para obter a temperatura de saída desejada. Você está certo de que o frio é relativamente constante, embora possivelmente mais frio no inverno. As linhas de água estão enterradas a cerca de 24 a 36 polegadas e geralmente temos temperaturas amenas aqui. Também pude considerar a temperatura máxima de saída de água quente (cerca de 120 F) e criar uma tabela de pesquisa que posicione as válvulas adequadamente, usando o PID para o ajuste fino após o aquecimento.
Ryan Griggs

1
A água do poço pode ficar muito fria mesmo durante os verões quentes, dependendo da profundidade / fonte. A água "fria" que fica nos canos da casa é mais quente do que o que será bombeado por baixo. Portanto, a água fria fica realmente mais fria com o uso (até se aproximar da temperatura da água subterrânea). Fico sempre "surpreso" quando vou à "cidade grande" e a água fria nunca fica fria.
Rickhg12hs

2

Eu só queria adicionar um detalhe às boas respostas acima sobre o que os engenheiros de controle fazem para as possibilidades integrais de liquidação. Isso também acontece em muitos processos industriais e é mais uma arte do que uma ciência.

Existem ações típicas de livros contra isso sem sacrificar o ganho integral que pode ser realmente necessário para a especificação de desempenho.

  1. Toda vez que você cruza o nível de erro zero, redefine o integrador. Isso faz do integrador um elemento não linear do tipo integrador sob demanda, em vez de um acumulador cego.

  2. Basicamente, você conecta o bloco de entrada de ação integral a um elemento indicativo no loop. Essa pode ser a saída do integrador para julgar se iniciou a construção (o que requer uma compreensão do processo para tornar o julgamento adequado). Ou você verifica se seus atuadores estão saturados ou não e forma um loop de feedback com base nessas informações. Eu escolhi aleatoriamente o primeiro link que saiu do google e, no final deste vídeo, há uma explicação gráfica do meu último ponto. https://www.youtube.com/watch?v=H4YlL3rZaNw


Bons pontos, obrigado por expandir a ideia. Obrigado pelo vídeo, explica muito bem o problema.
Tomnexus 31/05

1

Às vezes, pode ser útil ter vários conjuntos de parâmetros PID, para estágios de granulação grossa do intervalo de operação do sistema, que você altera rapidamente quando o sistema passa de um estágio de comportamento para outro. Por exemplo, um conjunto de Kp, Ki e Kd para quando você abre a torneira quente e obtém apenas água fria; depois que começar a ver a temperatura subir, mude para outro conjunto de Kp, Ki & Kd. Depois, ajuste os dois de acordo.

Você está usando a Biblioteca PID no Arduino Playground de Brett Beauregard? Este é bem legal. E há um exemplo 'adaptativo' disso também.


Obrigado pelas sugestões. Não usando a biblioteca pid, eu mesmo a escrevi para aprender mais sobre como ela funciona.
Ryan Griggs

Você considerou o feed forward? É como mudanças rápidas afetam a saída através do loop aberto, para que você não espere o loop fechado para reagir.
Gregory Kornblum

Estou tentando entender como o "feed forward" funcionaria nesse caso. A entrada seria a temperatura desejada e a saída definiria as válvulas para uma posição pré-determinada (conforme discutido no meu outro comentário acima) usando uma tabela de pesquisa ou uma equação simples?
Ryan Griggs

Você pode usar o feedforward além dos seus comentários (PID de circuito fechado). Você simplesmente adiciona a ação do controlador de feedback à ação do controlador de feedforward. Idealmente, o controlador de avanço seria um modelo inverso da válvula. O feedforward basicamente oferece ação instantânea na alteração do ponto de ajuste. Mesmo com o feedforward mais o feedback, você ainda precisa considerar a conclusão no compensador de controle de feedback. O componente de feedback precisa ser levado em consideração.
docscience 27/05

1

Você modelou o sistema?

Você tem alguns dados com base no tempo mostrando o overshoot - especialmente o freq

Essas são duas perguntas que devem ser feitas com qualquer consulta baseada em controle.

Pelo que você descreveu, seu ganho integral é muito alto, muito alto. Pode ser devido à conclusão do integrador: o código mostrado tem algumas preocupações práticas reais, uma das quais é que não é o maior dos integradores discretos

  • Topologia do integrador discreto muito ruim
  • Não há grampos / limites na saída I e muito menos na saída P + I

Igualmente poderia ser porque é muito alto e leva tempo para diminuir.

Portanto, sim, o valor armazenado no registro I pode ter acabado em dizer ... 1000C porque o P + I não foi definido para a resposta do sistema e, em seguida, ele deve ser encerrado.

A primeira coisa que eu faria seria capturar dados em tempo real para pós-processamento. Em seguida, eu executaria apenas P e garantiria que o ganho proporcional atingisse QUASE a temperatura desejada (a teoria do controle afirma que não). Dependendo se

  1. Análise dos dados de captura atuais, facilitando a determinação do ganho I adequado
  2. Um modelo de planta é derivado para criar ganhos adequados

Começaria alterando o código PID para ser uma melhor implementação e, em seguida, adicionaria um pouco de I, apenas para provar um ponto.

Você realmente precisa determinar contra o que esses ganhos se destinam. A entrada é temperatura, a saída é ... fluxo? portanto, deve haver uma função de transferência de fluxo / C e uma função de transferência de fluxo / Cs.


Boa resposta também, obrigado. Ainda não modelei o sistema, pois ainda não sei - apenas começando a molhar os pés neste estudo. Você está certo de que o valor I aumenta fora dos limites razoáveis. Você pode me indicar um algoritmo de implementação melhor para o Integrator? O pseudocódigo é o melhor, pois me permite aprender e colocar o código em minhas próprias palavras, em vez de copiar / colar. Além disso, você pode me indicar algumas introduções para modelar sistemas simples como esse? Você está certo de que os níveis de fluxo (mistura quente e fria) são as saídas deste sistema. Atualmente, é apenas H / C inversamente proporcional.
Ryan Griggs

1
Vou adicionar um ajuste em breve
JonRB

1

Uma maneira de eu gostar de resolver a Integral Windup é parar de acumular o erro sempre que sua saída de controle estiver na sua deflexão máxima . Ou dimensione-o a que distância está da deflexão máxima. Portanto, sempre que o seu controlador emitir "água quente a 100%, água fria a 0%", não acumule o erro, mas também não o zere.

Não gosto de limitar a integral ao máximo, porque há um limite para o erro sistemático que seu PID pode compensar.

Eu também sugeriria que, em vez de fazer um PID "burro" que tenha apenas um parâmetro que está tentando controlar sem o conhecimento do sistema subjacente, instale dois sensores de temperatura extras, nas entradas quente e fria. Você tenta encontrar uma função que se aproxime da posição desejada com base nas temperaturas de entrada e só usa o loop PID para ajustar o erro na saída desta função.

O erro será significativo porque você não mede o fluxo (bem, a menos que você faça), que depende não apenas das posições da válvula (conhecidas), mas também da pressão da água (desconhecida).

Ainda assim, isso deve ajudar muito com o problema da água quente finalmente chegar à torneira, porque em um loop PID bem amortecido, é necessário confiar no elemento D que está bem calibrado para reduzir rapidamente o fluxo quente. Na minha experiência, obter o coeficiente de derivação correto é geralmente o mais difícil. Mas se você tivesse os dois sensores extras, a saída principal mudaria exatamente tão rapidamente quanto a temperatura da água de entrada, de modo basicamente instantâneo, sem a necessidade do elemento derivado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.