Índice:

Controlador PID VHDL: 10 etapas
Controlador PID VHDL: 10 etapas

Vídeo: Controlador PID VHDL: 10 etapas

Vídeo: Controlador PID VHDL: 10 etapas
Vídeo: Lecture 73: Digital PID Control Implementation using Verilog HDL Programming 2024, Julho
Anonim
Controlador PID VHDL
Controlador PID VHDL
Controlador PID VHDL
Controlador PID VHDL

Este projeto foi meu projeto final para concluir meu bacharelado com distinção no Cork Institute of Technology. Este tutorial é dividido em duas seções, a primeira cobrirá o corpo principal do código PID, que é o objetivo principal do projeto e a segunda seção cobre a interface do código que foi implementado em uma placa de desenvolvimento Basys 3 e, em seguida, a interface com uma bola de pingue-pongue equipamento de levitação. O rig teórico e construído são mostrados nas imagens anexas.

Suprimentos

Simulação

Suíte Vivado Design

Implementação (entre colchetes é o que foi usado para o meu projeto)

  • Placa FPGA que pode dar entrada e saída de sinais digitais / analógicos (Basys 3)
  • um sistema que é controlável com uma única fonte de feedback (Ping Pong Ball Levitation Rig)

Equipamento

  • Tubo de policarbonato
  • Ventilador 5V
  • Sensor IR
  • Base impressa em 3D (este tutorial documenta a construção da plataforma, o sensor foi adicionado para fornecer feedback, mas a plataforma era geralmente a mesma)
  • Resistores 1k
  • Placa de ensaio com 5V e trilho GND

Etapa 1: Teoria de Controle Básico

Teoria de Controle Básico
Teoria de Controle Básico

Achei que adicionar alguma teoria básica de controle daria a qualquer pessoa que gostaria de tentar e implementar este código uma boa base para começar.

O diagrama anexado é o layout de um controlador de loop único.

r- É a referência. Isso determina para onde o controlador deve ir.

e-É o erro. Esta é a diferença entre o valor em seu sensor e sua referência. por exemplo. e = r- (d + saída do sensor).

K-Este é o controlador. Um controlador pode ser composto por três termos. Esses termos são P, I e D. Todos os três termos têm multiplicadores chamados Kp, Ki e Kd. Esses valores determinam a resposta do controlador.

  • P-Proporcional. Um controlador estritamente P terá uma saída proporcional ao erro de corrente. Um controlador P é simples de implementar e trabalhar rápido, mas nunca alcançará o valor definido (referência).
  • I-Integral. Um controlador estritamente integral somará o erro anterior que acabará por atingir a referência desejada. Este controlador é geralmente muito lento para implementar. Adicionar um termo P diminuirá o tempo necessário para alcançar a referência. O tempo no qual a entrada está sendo amostrada deve ser levado em consideração, o termo integral é integrado com respeito ao tempo.
  • D-Derivative. O termo Derivado terá uma saída que depende da taxa de variação do erro. Este termo é geralmente usado com um termo P ou com um termo PI. Como isso é proporcional à taxa de variação do erro, um único barulhento terá seu ruído amplificado, o que pode fazer com que o sistema fique instável. O tempo também deve ser levado em consideração, pois o termo derivado também diz respeito ao tempo.

U- Este é o sinal de controle. Este sinal é uma entrada para a plataforma. No caso deste projeto, u é uma entrada de sinal PWM para o ventilador para alterar a velocidade.

G- Este é o sistema que está sendo controlado. Este sistema pode ser modelado matematicamente no Domínio S ou Z. Os sistemas podem estar na enésima ordem, mas para alguém que está começando com o controle, um sistema de primeira ordem provavelmente deve ser assumido, pois é muito mais fácil de calcular. Há uma infinidade de informações sobre sistemas de modelagem que podem ser encontradas online. Dependendo do tempo de amostragem do sensor, o modelo do sistema é discreto ou contínuo. Isso tem um efeito drástico no controlador, portanto, é recomendável pesquisar ambos.

d- Este é um distúrbio que é adicionado ao sistema. Perturbação são forças externas que o modelo do sistema não leva em consideração. Um exemplo fácil disso seria um drone que você gostaria de pairar a 5 metros, uma rajada de vento vem e deixa cair o drone 1 metro o controlador irá reposicionar o drone após o distúrbio ter ocorrido. Isso é conhecido como perturbação, pois o vento não pode ser repetido, portanto, não pode ser modelado.

Para ajustar o controlador, há muitas regras para citar, mas algumas boas com as quais comecei são Cohen Coon e Zieger Nichols.

Modelar um sistema é geralmente a parte mais importante sem um modelo preciso, o controlador que foi projetado não responderá conforme desejado.

Deve haver informações suficientes aqui para entender como o controlador funciona junto com algumas pesquisas individuais e o código abaixo de um controlador com qualquer combinação dos três termos pode ser implementado.

Etapa 2: Escrevendo o código PID

Escrevendo Código PID
Escrevendo Código PID

O princípio básico do código encontrado no link a seguir foi usado e modificado, pois esse código não funcionava, mas tinha muitos dos princípios corretos, o que proporcionou um bom ponto de partida. PID original O código tinha vários erros, como

  • Operação contínua - o controlador é inerentemente discreto, portanto, o controlador teve que ser configurado para calcular apenas os 3 termos quando uma nova entrada estava disponível. A solução alternativa para esta simulação era verificar se a entrada havia mudado desde a última vez. isso só funciona para simular o código funcionando corretamente.
  • O tempo da amostra não teve efeito sobre o termo integral e derivado - O controlador também não considerou o tempo em que a amostra estava sendo tomada, então um valor chamado divisor para o tempo foi adicionado para garantir que os termos integrais e derivados estivessem operando sobre o correto intervalo.
  • O erro só poderia ser positivo - ao calcular o erro, também havia um problema, pois o erro nunca poderia ser negativo, significando que quando o sinal de feedback ultrapassasse o valor de referência, o controlador continuaria a incrementar a saída quando deveria estar diminuindo.
  • Os valores de ganho para os 3 termos eram inteiros - na minha experiência, sempre descobri que os valores para os 3 termos no controlador são sempre números de ponto flutuante devido ao Basys 3 não ter um número de ponto flutuante, os valores deveriam receber um valor de numerador e um valor do denominador que serviria como uma solução para contornar este problema.

O código está anexado abaixo, há o corpo principal do código e um testbench para simular o código. A pasta zip contém o código e o testbench já no Vivado para que possa ser aberto para economizar tempo. há também um teste simulado do código que mostra a saída rastreando a referência, o que prova que o código está funcionando conforme o esperado.

Etapa 3: Como modificar para o seu sistema

Em primeiro lugar, nem todos os sistemas são iguais, deve-se analisar as entradas e saídas do sistema. No meu caso, a saída do meu equipamento que me deu um valor para a posição era um sinal analógico e a entrada do sistema era um sinal PWM. O que significa que uma conversão ADC foi necessária. Felizmente, o Basys 3 tem um ADC embutido, então isso não foi problema, a saída do sensor IR teve que ser reduzida para 0V-1V, pois este é o alcance máximo do ADC integrado. Isso foi feito usando um circuito divisor de tensão que foi feito de resistores de 1k configurados como um resistor de 3k em série com um resistor de 1k. O sinal analógico agora estava dentro do alcance do ADC. A entrada PWM para o ventilador pode ser acionada diretamente pela saída de uma porta PMOD no Basys 3.

Etapa 4: Aproveitando o I / O no Basys 3

Há uma série de E / S no Basys 3 que permitiu uma depuração mais fácil quando o código estava em execução. o I / O foi configurado da seguinte maneira.

  • Display de sete segmentos - usado para mostrar o valor da referência e o valor no ADC em volts. Os primeiros dois dígitos do display de sete segmentos mostram os dois dígitos após a casa decimal do valor ADC, pois o valor está entre 0-1V. Os dígitos três e quatro no display de sete segmentos mostram o valor de referência em volts, isso também mostra os primeiros dois dígitos após a casa decimal, pois a faixa também está entre 0-1V.
  • 16 LEDs - Os LEDs foram usados para mostrar o valor da saída para garantir que a saída estava saturando e a saída estava mudando corretamente.

Etapa 5: Ruído na Saída do Sensor IR

Houve ruído na saída do sensor para corrigir esse problema, um bloco de média foi colocado no lugar, pois isso era suficiente e exigia muito pouco trabalho para ser concluído.

Etapa 6: Layout geral do código

Layout geral do código
Layout geral do código

Existe um código que ainda não foi falado. Este código é um divisor de relógio chamado gatilho. este pedaço de código aciona o código ADC para a amostra. o código ADC leva no máximo 2us para ser concluído, então a entrada atual e a entrada anterior são calculadas. Após esta média, o controlador calcula os termos P, I e D. o layout geral do código e da interface é mostrado no diagrama de conexão improvisado.

Etapa 7: Teste

Testando
Testando

O código foi implantado no Basys 3 e a seguinte resposta foi registrada. a referência mudou entre 2 valores. que é o caso no código do projeto concluído em anexo. O vídeo anexo mostra essa resposta em tempo real. As oscilações diminuem mais rapidamente na parte superior do tubo, pois o controlador foi projetado para esta região, mas o controlador não funciona tão bem na parte inferior do tubo, pois o sistema é não linear.

Etapa 8: Modificações para melhorar o projeto

O projeto funcionou como planejado, mas houve algumas modificações que eu teria feito se o projeto pudesse ser estendido.

  • Implemente filtro digital para atenuar completamente o ruído
  • configurar o código ADC, código médio e código de integração para disparar sequencialmente.
  • use um sensor diferente para feedback, pois a resposta não linear desse sensor causou uma grande variedade de problemas com este projeto, mas isso está mais no lado do controle, não no lado da codificação.

Etapa 9: Trabalho Extra

Ao longo do verão, escrevi o código para um controlador em cascata e implementei as modificações que recomendei para o controlador PID de loop único.

Modificações feitas no controlador PID regular

· Modelo de filtro FIR implementado, os coeficientes devem ser alterados para atingir a frequência de corte desejada. A implementação atual é um filtro de abeto de 5 torneiras.

· O tempo do código foi configurado para que o filtro propague a nova amostra e, quando a saída estiver pronta, o termo integral será acionado, o que significa que o código pode ser modificado para funcionar em diferentes intervalos de tempo com menos esforço para mudar código.

· O loop for principal que impulsiona o programa também foi reduzido, pois este loop for levou 7 ciclos anteriormente, isso desacelerou a velocidade máxima de operação do controlador, mas ao reduzir o loop for t 4 estados, isso significa que o bloco principal de código pode operar dentro de 4 ciclos de clock.

Testando

Este controlador foi testado e executado conforme planejado. Não tirei fotos dessa prova porque essa parte do projeto era apenas para manter a mente ativa. O código para teste, bem como o testbench, estará disponível aqui para que você possa testar o programa antes da implementação.

Por que usar um controlador em cascata

Um controlador em cascata controla duas partes do sistema. Nesse caso, um controlador em cascata teria um loop externo que é um controlador que recebe feedback do sensor IR. O loop interno tem feedback na forma de tempo entre os pulsos do tacômetro que determina a velocidade de rotação do ventilador. Ao implementar o controle, uma melhor resposta pode ser obtida fora do sistema.

Como funciona o controlador em cascata?

O loop externo do controlador fornecerá um valor para o tempo entre as pulas para o controlador do loop interno. Este controlador aumentará ou diminuirá o ciclo de trabalho para atingir o tempo desejado entre os pulsos.

Implementação de modificações na plataforma

Infelizmente, não fui capaz de implementar essas modificações na plataforma porque não tinha acesso a ela. Testei o controlador de loop único revisado que funciona conforme o planejado. Ainda não testei o controlador em cascata. Estou confiante de que o controlador funcionará, mas pode exigir algumas pequenas modificações para funcionar conforme o esperado.

Testando

Não consegui testar o controlador porque era difícil simular duas fontes de entrada. O único problema que posso ver com o controlador em cascata é que, à medida que o loop externo tenta aumentar o ponto de ajuste fornecido ao loop interno, um ponto de ajuste maior é na verdade um RPS mais baixo para o ventilador, mas isso pode ser corrigido facilmente. tome o ponto de ajuste a partir do valor máximo do sinal de ponto de ajuste (4095 - ponto de ajuste - tacho_result).

Etapa 10: Conclusão

No geral, o projeto funciona como eu pretendia quando ele começou, então estou feliz com o resultado. Obrigado por ler minha tentativa de desenvolver um controlador PID em VHDL. Se alguém estiver tentando implementar alguma variação disso em um sistema e precisar de alguma assistência para entender o código, entre em contato comigo, responderei o mais rápido possível. Quem tentar o trabalho extra que foi cumprido mas não implementado, por favor contacte-me para qualquer mão. Eu apreciaria muito se alguém que o implementasse me dissesse como foi.

Recomendado: