Академический Документы
Профессиональный Документы
Культура Документы
Programa P_ResLM35.ino
// DEFINIR PINES
int PinSensor = A0;
int Res = 9; // Es PIN PWM
// DEFINIR VARIABLES
double x; // Temperatura
double y; // Salida PWM 0/255 Variable para ajustar
double z = 40; // Set Point Variable para ajustar
double Kp = 50; // Constante de proporcionalidad Variable para ajustar
double ymax = 200; // Maximo admitido de y (PWM) Variable para ajustar
double ymin = 0; // Minimo admitido de y (PWM) Variable para ajustar
int Retardo = 100; // Retardo en milisegundos Variable para ajustar
int y1, y2, y3, y4, y5, y6, y7, y8, y9, y10; // Para promediar la salida
// SETUP
void setup()
{
Serial.begin(115200);
pinMode(Res, OUTPUT); // configura el led (pin9) como salida
}
// LOOP
void loop()
{ // LEER X O SEA LA TEMPERATURA PROMEDIANDOLA CON 30 LECTURAS
for (int B = 0; B <= 29; B++) { x = x + analogRead(PinSensor); }
x = x /30; // Se leen 30 valores de x (Temperatura) para promediar
x = x * 100 * 5 / 1024; // Convertir a grados entigrados
// HACER EL CALCULO DEL CONTROL PROPORCIONAL Y = Kp * ERROR O SEA
SETPOINT - LECTURA DE TEMPERATURA
// SE PROMEDIAN 10 CALCULOS DE Y
y = Kp*(z-x); if (y < ymin) {y = ymin;} // Calculo com max y min acotado
y1 = y2; y2 = y3; y3 = y4; y4 = y5; y5 = y6; y6 = y7; y7 = y8; y8= y9; y9 = y10; y10 = y;
y = (y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8 + y9 + y10)/10; // calculamos 10 valores para
promediar
analogWrite(Res,y); // Cargar la salida y al PWM
// CARGAR LA SALIDA O SEA EL CALCULO PROPORCIONAL AL PWM
// PREPARAR LA SALIDA SERIAL PARA EL ARDU GRAFICADOR
Serial.print("ini");
Serial.print("x"); Serial.print(x); Serial.print(" ");
Serial.print("y"); Serial.print(y); Serial.print(" ");
Serial.print("z"); Serial.print(z); Serial.print(" ");
Serial.println("fin");
// IF QUE ESPERA EL ENVIO DE UN VALOR PARA CORREGIR EN EL PROGRAMA
if (Serial.available() > 0) // Espera un valor para cambiar seteos
{int Ki;int Kd;
for (int A = 0; A < 4; A++) { // Para recibir de 1 a 4 valores
switch (A)
{
case 0:
z = Serial.parseFloat(); // Serial.parseFloat(); recibe valores separados por coma (Kp)
break;
case 1:
Ki = Serial.parseFloat();
break;
case 2:
Kd = Serial.parseFloat();
break;
case 3:
for (int B = Serial.available(); B == 0; B--) {
Serial.read(); // Limpia el Buffer
}
break;
}
}/*
Serial.print(" Kp,Ki,Kd = "); // Imprime en el Serial los valores nuevos
Serial.print(Kp); // Imprime en el Serial los valores nuevos
Serial.print(","); // Imprime en el Serial los valores nuevos
Serial.print(Ki); // Imprime en el Serial los valores nuevos
Serial.print(","); // Imprime en el Serial los valores nuevos
Serial.println(Kd); // Imprime en el Serial los valores nuevos
myPID.SetTunings(Kp, Ki, Kd); // Setea las nuevas constantes y reinicia el calculo*/
} // FIN del if (Serial.available() > 0)
// RETARDO
delay(Retardo);
} // FIN del void loop()