desarrollo de un controlador PID

Dependencies:   Debounced TextLCD mbed

Fork of PID by Carlos Alberto Arbeláez Giraldo

Files at this revision

API Documentation at this revision

Comitter:
squinteroz
Date:
Wed Oct 14 20:44:27 2015 +0000
Parent:
0:f0eb5248ae8f
Commit message:
PID

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r f0eb5248ae8f -r e7782774b135 main.cpp
--- a/main.cpp	Wed Apr 08 23:46:50 2015 +0000
+++ b/main.cpp	Wed Oct 14 20:44:27 2015 +0000
@@ -1,39 +1,44 @@
 #include "mbed.h"
-#include "TextLCD.h"
-#include "DebouncedIn.h"
-
+#include "TextLCD.h" // nos permite usar el lcd en nuestro comando 
+#include "DebouncedIn.h" // esta libreria es útil para podeer declarar todas las teclas o botones que se posean 
 TextLCD lcd(PTE0, PTE1, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 Teclado
 
-DebouncedIn button1(PTC12); //Botón Aumento 
-DebouncedIn button2(PTC13); //Botón Decremento
-DebouncedIn button3(PTC16); //Botón de pasar
-DebouncedIn button4(PTC17); //Botón para iniciar el PID
- 
+//asignamos el puerto a cada interruptor
+
+DebouncedIn button1(PTC12); //Aumentar
+DebouncedIn button2(PTC13); //Decrementar 
+DebouncedIn button3(PTC16); //Pasar 
+DebouncedIn button4(PTC17); //inicio
+
+// asignamos los pines a la salida y a la entrada  (analógicas)
+
 AnalogIn y(PTB1);   // Salida de la planta
 AnalogOut u(PTE30); // Señal de control
 
-DigitalOut led1(LED1); // Salidas para comprobar el funcionamiento del programa
+//Salidas digitales utilziadas para la comprobación del funcionamiento 
+
+DigitalOut led1(LED1); 
 DigitalOut led2(LED2);
 DigitalOut led3(LED3);
 
-Timer t;               //Para cuantizar el tiempoque se deja undido un botón de aumento o decremento
+Timer t;// nos permite saber cuanto tiempo permanecen presionados los botones asociados al aumento y al decremento  
 
-int C1=0x0F;                 // Codigo para escribir y matener el el LCD
-int sp=0,kp=0,kd=0,ki=0,p=1; // Inicializacion de las variables para el controlador
+int C1=0x0F;  // inicializamos el lcd y el tipo de formato que este ultizará 
+int sp=0,kp=0,kd=0,ki=0,p=1; // condiciones iniciales de los parametros de controlador. NOTA: la variable p indica en que se  parametro se desea intervenir (kp,ki,kd,sp, pasar e iniciar)
 float  ap, ai, ad, err, med, err_v, pid=0;  // 
 
 int main() {
     lcd.writeCommand(C1);
-    lcd.printf("  CONTROL PID\n");
+    lcd.printf(" Controlador PID\n");
     wait(2);
     lcd.cls();
-    lcd.printf("    EQUIPO1:\nJuan Jose Munoz");
+    lcd.printf("    Equipo_5:\nEliana Mejia E.");
     wait(2);
     lcd.cls();
-    lcd.printf("Carlos Arbelaez Rafael Barriento");
+    lcd.printf("Sebastian Quintero Z. Sebastian Vergara P");
     wait(2);
     lcd.cls();
-    lcd.printf("   INGRESO DE\n   PARAMETROS   ");
+    lcd.printf("  Ingresar Parametros ");
     wait(2);
     
     retorno:   //Cuando se presiona por segunda vez el botón 4 se retorna a la interfaz de parametros para modificarlos
@@ -50,10 +55,12 @@
     lcd.printf("Sp=%d", sp);
 
     while(1) {
-        if (button1.falling())
+        if (button1.falling()) // se presiona el botón de aumento
         {
             
-            led1 =!led1;
+            led1 =!led1; // se utiliza para prender el led 
+            
+            // sub menú para la constante sp
             if (p==1)
             {
                 
@@ -63,7 +70,7 @@
                 lcd.locate(3,0);
                 lcd.printf("%d", sp);
                 if(sp>=5){
-                    sp=5; //saturamos el setpoint hasta 5 segun la escala medida ya que trabajaremos entre 0V y 5V
+                    sp=5; //El límite de la señal de saida se va a encontrar entre [0V;5V]
                     lcd.locate(3,0);
                     lcd.printf("   ");
                     lcd.locate(3,0);
@@ -87,21 +94,23 @@
 
                
             }
+            
+            // sub menú para la constante kp
             else if (p==2)
             {
-                ++kp;                     //Aumento unitario de la constante
+                ++kp; // representa un aumento unitario de la variable 
                 lcd.locate(11,0);
                 lcd.printf("   ");
                 lcd.locate(11,0);
                 lcd.printf("%d", kp);
                
               
-              while(button1==0){       //Verifica si el botón 1 se deja presionado       
-                if(t==0){t.start();}   //Inicia a contar el tiempo que se deja presionado
+              while(button1==0){      //se ejecuta esta instrucción, mientras el botón se encuentra presionado       
+                if(t==0){t.start();}   //se contabiliza el tiempo que se deja presionado
                  
                 if((t<7) && (t>=1)){    //Primera velocidad de incremento en el intervalo 
                    
-                   wait(0.3);           //Espera 0.3 segundos para volver a imprimir 
+                   wait(0.3);           //Espera 0.3 segundos para volver a imprimir en el lcd
                    ++kp;
                    lcd.locate(11,0);
                    lcd.printf("   ");
@@ -110,25 +119,25 @@
                      }
                 
                 if((t>=7)&&(t<13)){    //Segunda velocidad de incremento
-                              
+                  //Aumento en un factor de 10         
                    wait(0.3);          
-                   kp=10+kp;               //ahora aumenta de 10 en 10
+                   kp=10+kp;               
                    lcd.locate(11,0);
                    lcd.printf("   ");
                    lcd.locate(11,0);
                    lcd.printf("%d", kp);
                     }
                 if((t>=13) && (t<19)){            //Tercera velocidad de incremento 100
-                   
+                   //Aumento en un factor de 100
                    wait(0.3);                     
-                   kp=100+kp;                     //Aumenta de 100 en 100
+                   kp=100+kp;                     
                    lcd.locate(11,0);
                    lcd.printf("   ");
                    lcd.locate(11,0);
                    lcd.printf("%d", kp);
                     }
 
-                if(kp>999){                      //Saturación máxima de los parametos
+                if(kp>999){      //condición limite que poseen los parámetros 
                    kp=999;
                    lcd.locate(11,0);
                    lcd.printf("    ");
@@ -138,6 +147,8 @@
                     }
                     t.reset();       //Se reinicia el tiempo y vuelve a incrementar unitariamente
             }
+            
+            // sub menú para la constante ki
             else if (p==3)
             {
                 ++ki;
@@ -189,7 +200,8 @@
                 
             }
             
-            
+          
+            // sub menú para la constante kd
             else if (p==4)
             {
                 ++kd;
@@ -241,7 +253,7 @@
                 
             }
         }
-         
+         // accionamiento del botón asociado al decrecimeinto de las constantes
          if (button2.falling())
         {
             led2 =!led2;
@@ -357,7 +369,7 @@
             }
             if (p==4)
             {
-                if (kd==0)  // no mostrar nada
+                if (kd==0)  // no se visualiza nada en el display
                 {
                 }
                 else
@@ -402,6 +414,7 @@
                 }
             }
         }
+        // accionamiento del botón pasar
                 if (button3.falling())
         {
             led3 =!led3;
@@ -438,37 +451,44 @@
                 
             }
         }
-      
+      // accionamiento del botón asociado al inicio del programa realizado
+       
        if(button4.falling()){ 
         p=1;
-        lcd.cls();
+        lcd.cls();// limpia la pantalla y la localiza en (0,0) 
         lcd.printf("Iniciando PID\n");
         wait(1); 
-        while(p==1){                 //La segunda vez que se presiona es para volver a la interfaz para modificar parametros
+        while(p==1){    //si se presiona por segunda vez es para modificar los parámetros 
             if(button4.falling()){
                 p=0;
-                goto retorno;
+                goto retorno; // se hace un llamado a la función retorno
                 }
         
-        med=5*y.read(); 
-        err=sp-med;
+        med=5*y.read(); // las constantes por la cuál se amplifica la señal dependen del sistema que se desee controlar y en donde lo deseamos limitar 
+        err=sp-med; // error del sistema 
         ap = kp*err; 
+        
         // se verifica que la accion integral no sea muy grande
+        
            if(ai<5)
            {
-              ai =(ki*err)+ai;    //calculo de la integral del error
+              ai =(ki*err)+ai; //calculo de la integral del error
            }                     
-           ad = kd*(err-err_v); //calculo de la accion derivativa
+           ad = kd*(err-err_v); //calculo de la acción derivativa
            pid = (ap+ai+ad);
+           
            // se verifica que pid sea positivo **************************************
            if(pid<=0){pid=0;}
-           // se verifica que pid sea menor o igual la valor maximo *****************
+           
+           // se verifica que pid sea menor o igual l valor maximo *****************
+          
            if(pid>=5){pid=5;}
-           u.write(pid);
+           u.write(pid); // enviamos el valor de PID  al puerto analógico  de salida 
            t.start();  
+            
             if(t>=1){
                     lcd.cls();
-                    lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
+                    lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD en este caso modulo 1
                     lcd.locate(8,0);
                     lcd.printf("Err=%0.1f", err);
                     lcd.locate(0,1);