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!
fonte
Respostas:
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.
fonte
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.
fonte
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.
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.
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
fonte
À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.
fonte
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
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
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.
fonte
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.
fonte