Nesse exemplo mostro como utilizar uma rotina de controle PID.

Segue o código:

[sections] [section title=”Código Fonte”]

Estrutura para armazenamento dos dados PID

//Estrutura do Controle PID
typedef struct
{
float Erro;
float P_Erro;
float A_Erro;
float D_Erro;
float Proporcional;
float Integral;
float Derivativo;
}sPID;

Declaração da Variável Global da Estrutura

// Declaração da estrutura como variável
sPID stPID;

Função e definição dos “pesos” de cada valor, sendo Kp o valor proporcional, Ki o integral e Kd o derivativo.

// Rotina para controle PID
#define KGanho (0.005)
// de 0 a 5
#define Kp (2)
// de 0 a 0.1
#define Ki (0.001)
// de 0 a 255
#define Kd (0)

float controlador_PID(sPID *pd , float SetPoint, float ValorLido)
{
//// Este espaço é reservado para a lei de controle ///////////////////////////
pd->Erro = SetPoint – ValorLido; // Cálculo do sinal de erro
pd->A_Erro += pd->Erro;
pd->D_Erro = (pd->Erro – pd->P_Erro);
//// Cálculo da parte proporcional ////////////////////////////////////////////
pd->Proporcional = Kp * pd->Erro;

//// Cálculo da parte integral ////////////////////////////////////////////////
pd->Integral = Ki * pd->A_Erro;

//// Cálculo da parte derivativa //////////////////////////////////////////////
pd->Derivativo = Kd* pd->D_Erro;

//// Guarda erro atual
pd->P_Erro = pd->Erro;

//// Cálculo da saída /////////////////////////////////////////////////////////
return (KGanho * (
(pd->Proporcional) +
(pd->Integral) +
(pd->Derivativo)
));
}

Utilização:

controlador_PID(&stPID,ValorDesejado,VariavelLidaDoADC,);
OQueControlar += stPID_Corrente.saida; // Podendo ser o valor de um DAC ou DutyCycle do PWM

[/section] [/sections]
Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[C] Rotina de PID
Tags:                     

Deixe uma resposta

%d blogueiros gostam disto: