segunda-feira, 13 de janeiro de 2014

Exemplo de um Algoritmo que implementa PID escrito em C

O Controlador PID (P=proporcional, I=integral e D=derivativo) é um controle com realimentação (isto é, de malha fechada)  muito usados em sistemas de controle industriais. A Figura abaixo ilustra graficamente através de blocos um Sistema de Controle PID, onde u(t) é a variável de entrada que se deseja controlar e y(t) é a varivel de saida do Controlador que pode ser usada por exemplo para se determinar o valor do PWM (Sistema de Modulação por largura de pulsos) que irá controlar a energia aplicada à carga que deve ser controlada.


No exemplo abaixo "dt" é o intervalo entre duas amostras consecutivas obtidas pelo Conversor AD.  O intervalo de tempo dt deve ser constante, então se aconselha que as amostras do ADC sejam obtidas por exemplo, por interrupção do timer, para manter o intervalo entre elas sempre constante.

As constantes  Kp (proporcional), Ki (integral) e Kd (derivativa) devem ser calculadas de acordo com o planta que se deseja controlar. Para "sintonizar o PID"  (isto é, calcular os melhores valores possíveis para Kp, Ki e Kd) diversos métodos podem ser usados, dentre os quais o mais famoso é o método de Ziegler e Nichols:

http://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method

Ainda no exemplo de código mostrado, Tdes é a variável que armazena a Temperatura desejada (valor do set-point) e temperatura é a variavel que armazena o valor real medido pelo sensor naquele determinado instante.

O erro é obtido pela diferença:    e = Tdes - temperatura

Segue em anexo um simples trecho de codigo de PID escrito por mim em C, generico. O programa é minimo, isto é, não tem nenhuma sofisticação como por exemplo anti wind-up:

//------------------------------------------
//    Algoritmo do Controlador PID mínimo
//    Desenvolvido por Francisco Fambrini
//    Unisal - Março 2009
//    Modif. na Versao 3.0
//------------------------------------------

void Controlador( ) {
     
     temperatura = Tatual ;
     
 e = Tdes - temperatura ;   //calcula o erro, pode ser negativo ou positivo
                  
 prop = (e * kp)/10 ;   // proporcional
    
 aatual = ((e + eant) / 2) * dt;  // soma dos erros multiplicado pelo tempo.

 aatual = e * dt; 

 aatual = aatual + aant;

 inte = (aatual * ki)/100 ;                           // integral

 derr = (e - eant) / dt;

 deri = derr * kd;                                   // derivativo

  calc = prop + inte + deri;                   // calculo PID

 //    Limites Superior e Inferior de Potência entregue a resistencia                 
 if(calc > 50)    calc = 50;
 if(calc < 0)      calc = 0;

 //   Ajusta o PWM com o valor calculado pelo algoritmo PID

 x = calc ;               // a potência entregue a carga pode variar entre 0 e 50
   
                            // armazena o valor do erro Anterior
 eant = e;
                            //armazena o valor do acumulado anterior
 aant = aatual;

 temperatura = 0;   //zera a variavel medida para nova medição, no tempo  dt + 1
               
}//Controlador
//-------------------------------------------------------------------

Lembrando ainda que o controle PID (Proporcional-Integral-Derivativo) não é a única possibilidade para se implementar um Algoritmo de Controlador de Processos.
Para Sistemas fortemente não-lineares, uma solução que pode ser melhor do que o Controlador PID é o Controlador de Lógica Fuzzy (Lógica Nebulosa), conforme descrito no excelente artigo de autoria de Sandra Sandri e Claudio Correa:
https://drive.google.com/file/d/0B0T8omiWkMq8Sktta1FpRi14TG8/edit?usp=sharing


Nenhum comentário:

Postar um comentário