/*
MOdelagem de um sistema de primeira ordem
y[n] = (Ts * Kp * u[n] + tau * y[n-1]) / (Ts + tau)
Equaçõa de diferenças para um controle PI
u[n] = Kp * e[n] + Ki * Ts * (e[n] + e[n-1]) / 2.0
*/
float Kp = 1.0; // ganho proporcional
float Ki = 0.1; // ganho integral
float Ts = 0.1; // tempo de amostragem
float T = 0.0; // tempo atual
float T_ant = 0.0; // tempo anterior
float e = 0.0; // erro
float e_ant = 0.0; // erro anterior
float u = 0.0; // sinal de controle
float y = 0.0; // saída do sistema
float y_ant = 0.0; // saída anterior do sistema
float integral = 0.0; // termo integral
void setup() {
// configurar o pino de saída do sinal de controle
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.print("sinal");
Serial.print(", ");
Serial.println("control");
}
void loop() {
// calcular o tempo atual
T = millis() / 1000.0;
// ler o valor da saída do sistema
y = analogRead(A0);
// calcular o erro
e = 500.0 - y;
// calcular o termo integral
integral = integral + Ki * (e_ant + e) / 2.0 * (T - T_ant);
// calcular o sinal de controle
u = Kp * e + integral;
// limitar o sinal de controle
if (u > 255.0) u = 255.0;
if (u < 0.0) u = 0.0;
// escrever o sinal de controle no pino de saída
analogWrite(9, u);
// atualizar as variáveis
e_ant = e;
T_ant = T;
y_ant = y;
Serial.print("SISTEMA ");
Serial.print(y);
Serial.print(", ACAO DE CONTROLE ");
Serial.println(u);
// aguardar o tempo de amostragem
delay(Ts * 1000);
}