Control PID para un planta RC (control de la carga del capacitor), los parámetros se ingresan por medio de 4 pulsadores, teniendo en cuenta una librería antirebote y el resultado del control se visualiza en una pantalla LCD 16x2.

Dependencies:   TextLCD mbed

Fork of DebouncedIn_HelloWorld by Chris Styles

/media/uploads/Wilmar87/img_4005.jpg

Files at this revision

API Documentation at this revision

Comitter:
Wilmar87
Date:
Fri Dec 13 03:54:21 2013 +0000
Parent:
0:672241227e0d
Child:
2:4f7db5225536
Commit message:
Libreria Pantalla

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Fri Dec 13 03:54:21 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/sbts/code/TextLCD/#b38a0bcedd44
--- a/main.cpp	Fri Nov 27 16:05:32 2009 +0000
+++ b/main.cpp	Fri Dec 13 03:54:21 2013 +0000
@@ -1,16 +1,255 @@
 #include "mbed.h"
 #include "DebouncedIn.h"
+#include "TextLCD.h"
 
+AnalogIn Vin(PTC2);
+AnalogOut Vout(PTE30);
 
-DigitalOut led(LED1);
-DebouncedIn button(p21);
+TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); //Puertos LCD rs, e, d4, d5, d6, d7
+ 
+DigitalOut led1(LED1);      //led de cambio de posición
+DigitalOut led2(LED2);      //led incremento de parámetros
+DigitalOut led3(LED3);      //led decremento de parámetros
+DebouncedIn bot1(PTC12);    //cambiar la posición
+DebouncedIn bot2(PTC13);    //incrementar variable
+DebouncedIn bot3(PTC16);    //decrementar variable
+DebouncedIn bot4(PTC17);    //salida de bucle
+  
+   //Códigos LCD
+int C1=0x0E;            // Muestra el cursor
+// 0x18;                // desplazamiento izquierda
+// 0x1A;                // desplazamiento derecha
+int C4=0x0C;            // Quita el cursor
+                     
+                     
+int a, sp, kp, ki, kd, ciclo; // indice de la variable
+float med, sp0, ap, err, ai, ad, pid, err_v;
 
+ 
 int main() {
 
+    led1=led2=led3=1;
+    lcd.printf("Control PID");
+    wait(1.5);
+    lcd.cls();
+    
+    lcd.writeCommand(C1);          //Comando para mostrar el cursor en el LCD                   
+    lcd.locate(0,0);               //Ubica e imprime nombre de las variables en la LCD
+    lcd.printf("Sp=%d",sp);
+    lcd.locate(8,0);
+    lcd.printf("Kp=%d",kp);
+    lcd.locate(0,1);
+    lcd.printf("Ki=%d",ki);
+    lcd.locate(8,1);
+    lcd.printf("Kd=%d",kd);
+   
+    
+    //Inicio del ciclo
+        
     while(1) {
-        if (button.rising()) {
-           led = !led;
-        }
-    }
-
-}
+           if (bot1.falling()) {      //Aumenta posición el cursor       
+               a++;
+               led1=0;
+               wait(.15);             //enciende el led azul cada vez que se oprime este botón
+               led1=1;
+               if (a>3){
+               a = 0;
+               }   
+               switch (a) {
+               case 0:
+               
+               lcd.locate(2,0);
+               lcd.printf("=");
+               break;
+               
+               case 1:
+               lcd.locate(10,0);
+               lcd.printf("=");
+               break;
+               
+               case 2:
+               lcd.locate(2,1);
+               lcd.printf("=");
+               break;
+               
+               case 3:
+               lcd.locate(10,1);
+               lcd.printf("=");
+               break;
+               }
+           }
+               
+                        if  (bot2.falling()) {      //Incrementa la variable      
+                            led2=0;
+                            wait(.15);              //enciende el led verde cada vez que se oprime el botón de incremento
+                            led2=1;
+                            
+                            switch (a) {
+                            case 0:
+               
+                            lcd.locate(2,0);        //Ubica el parámetro Set-point
+                            lcd.printf("=  ");
+                            lcd.locate(3,0);
+                            lcd.printf("%d", ++sp);
+                            break;
+               
+                            case 1:
+                            lcd.locate(10,0);       //Ubica el parámetro kp
+                            lcd.printf("=  ");
+                            lcd.locate(11,0);
+                            lcd.printf("%d", ++kp);
+                            break;
+               
+                            case 2:
+                            lcd.locate(2,1);        //Ubica el parámetro ki
+                            lcd.printf("=  ");
+                            lcd.locate(3,1);
+                            lcd.printf("%d", ++ki);
+                            break;
+                            
+                            case 3:
+                            lcd.locate(10,1);       //Ubica el parámetro kd
+                            lcd.printf("=  ");
+                            lcd.locate(11,1);
+                            lcd.printf("%d", ++kd);
+                            break;
+                    }
+               }
+                                  if   (bot3.falling()) {      //Decrementa la variable      
+                                     wait(0.1);
+                                     led3=0;
+                                     wait(.15);             //enciende el led roja cada vez que se oprime este botón
+                                     led3=1;
+                                     
+                                     switch (a) {
+                                     case 0: 
+                                     if (sp<0) {            //No se admite valores negativos
+                                      sp=0;
+                                      }                                                                                                                             
+                                     lcd.locate(2,0);       //Ubica el parámetro Set-point
+                                     lcd.printf("=    ");
+                                     lcd.locate(3,0);
+                                     lcd.printf("%d",sp--);
+                                     break;
+                                     
+                                     case 1:
+                                     if (kp<0) {            //No se admite valores negativos
+                                     kp=0;
+                                     }
+                                     lcd.locate(10,0);      //Ubica el parámetro kp
+                                     lcd.printf("=    ");
+                                     lcd.locate(11,0);
+                                     lcd.printf("%d",kp--);
+                                     break;
+                                       
+                                     case 2:
+                                     if (ki<0) {             //No se admite valores negativos
+                                     ki=0;
+                                     }
+                                     lcd.locate(2,1);        //Ubica el parámetro ki 
+                                     lcd.printf("=    ");
+                                     lcd.locate(3,1);
+                                     lcd.printf("%d",ki--);
+                                     break;
+                                       
+                                     case 3:
+                                     if (kd<0)  {            //No se admite valores negativos
+                                     kd=0;
+                                     }
+                                     lcd.locate(10,1);       //Ubica el parámetro kd
+                                     lcd.printf("=    ");
+                                     lcd.locate(11,1);
+                                     lcd.printf("%d",kd--);
+                                     break;
+                                }
+                          }
+                           if (bot4.falling()){         //sale del bucle de la pantalla
+                           led1=led2=led3=0;            //Flash para salir del bucle
+                           wait(0.25);
+                           led1=led2=led3=1;
+                           break;                                                 
+                     }  
+                  }              
+           lcd.writeCommand(C4);                                   //Quita el cursor bajo del LCD
+           lcd.cls();                                              //borra la pantalla
+           lcd.printf("GUARDADOS!"); 
+           wait(2);
+           lcd.cls();
+           lcd.printf("INICIA EL PID");
+           wait(2);
+                                                                   // se imprimen los parches del control  *****************************************
+           lcd.cls();
+                 
+           lcd.printf("Er%d",err);
+           lcd.locate(8,0);
+           lcd.printf("Me%d",med);
+           lcd.locate(0,1);
+           lcd.printf("Sp%d",sp0);
+           lcd.locate(8,1);
+           lcd.printf("Pid%d",pid);
+                      
+           // CICLO PRINCIPAL CONTROLADOR PID
+         
+           while(1) {
+           
+           wait(0.001);
+           //leer puerto analogo y asignar a med
+           
+           
+           med = (Vin*3.27);
+           sp0 = sp*0.0327;
+           err = (sp0-med); 
+           float kp0;
+           kp0 = kp*0.001;
+           ap = kp0*err;
+           float ki0;
+           ki0 = ki*0.001;      
+           ai =  (ki0*err)+ai;     //calculo de la integral del error
+           float kd0;
+           kd0 = kd*0.0001;
+           ad =  kd0*(err-err_v);  //calculo de la accion derivativa
+           pid = ap+ai+ad;
+           
+           
+              // se verifica que pid sea menor o igual la valor maximo *****************
+           if (pid > 0.999){
+           pid=1;
+           } 
+           
+           // se verifica que pid sea positivo **************************************
+           if (pid < 0){
+           pid=0;
+           } 
+                 
+           // se verifica que la accion integral no sea muy grande
+           if (ai > 999){
+           ai=1000;
+           } 
+                     
+           Vout=(pid);                
+                                //Mostrar resultados PID
+          if(ciclo>700)  {         
+           lcd.locate(2,0);
+           lcd.printf("      "); 
+           lcd.locate(0,0);
+           lcd.printf("Er%2.1f",err);
+           lcd.locate(10,0);
+           lcd.printf("      ");
+           lcd.locate(8,0);
+           lcd.printf("Me%4.2f",med);
+           lcd.locate(2,1);
+           lcd.printf("      ");
+           lcd.locate(0,1);
+           lcd.printf("Sp%4.2f",sp0);
+           lcd.locate(10,1);
+           lcd.printf("      ");
+           lcd.locate(8,1);
+           lcd.printf("Pid%4.3f",pid);
+           ciclo=0;
+           }
+           else 
+           ciclo++;     
+           err_v = err;  //guarda el error 
+          }      //  Envía parámetro pid al puerto analogico de salida (D/A) y se repite el ciclo
+      }
+       
\ No newline at end of file
--- a/mbed.bld	Fri Nov 27 16:05:32 2009 +0000
+++ b/mbed.bld	Fri Dec 13 03:54:21 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/20a79241b4a0
+http://mbed.org/users/mbed_official/code/mbed/builds/673126e12c73
\ No newline at end of file