pid teclas tarea 3

Dependencies:   Debounced TextLCD mbed

Fork of pid_teclas by Gustavo Ramirez

Files at this revision

API Documentation at this revision

Comitter:
procesadores_FAC
Date:
Fri Apr 10 02:26:50 2015 +0000
Parent:
0:9aa80672eb3d
Commit message:
pid teclado

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 9aa80672eb3d -r 0978505fcc1b main.cpp
--- a/main.cpp	Wed Oct 16 17:10:11 2013 +0000
+++ b/main.cpp	Fri Apr 10 02:26:50 2015 +0000
@@ -3,27 +3,36 @@
 #include "TextLCD.h"
 
 AnalogIn Vin(PTC2);
+AnalogOut Vout(PTE30);
 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
 
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
+
 DebouncedIn button1(PTC12);
 DebouncedIn button2(PTC13);
 DebouncedIn button3(PTC16);
+DebouncedIn button4(PTC17);
 
 int C1=0x0F;
+int C4=0x0C; // quito cursor bajo
 int sp=0,kp=0,kd=0,ki=0,p=1;
+int med,err,pid,ap,ai=0,ai1,ad,err_v;
+int i;
+int fe;
+float pidn;
+
+
 int main()
 {
     lcd.cls();
     lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
     lcd.locate(8,0);
-    lcd.printf("kp=%d", kp);
+    lcd.printf("Fe=%d", fe);
     lcd.locate(0,1);
-    lcd.printf("Ki=%d", ki);
-    lcd.locate(8,1);
-    lcd.printf("Kd=%d", kd);
+    lcd.printf("P=%d", kp);
+    lcd.locate(6,1);
+    lcd.printf("I=%d", ki);
+    lcd.locate(11,1);
+    lcd.printf("D=%d", kd);
     lcd.locate(0,0);
     lcd.printf("Sp=%d", sp);
 
@@ -31,7 +40,7 @@
     {
         if (button1.falling())
         {
-            led1 =!led1;
+            
             if (p==1)
             {
                 ++sp;
@@ -42,32 +51,54 @@
             }
             else if (p==2)
             {
-                ++kp;
+                ++i;
+                if (i==1){
+                 fe =1;}
+                if (i==2){
+                 fe =10;}
+                if (i==3){
+                 fe =100;
+                 i=0;} 
+                
                 lcd.locate(11,0);
                 lcd.printf("   ");
+                lcd.locate(12,0);
+                lcd.printf("   "); 
+                lcd.locate(13,0);
+                lcd.printf("   ");
+               
+                 
                 lcd.locate(11,0);
-                lcd.printf("%d", kp);
+                lcd.printf("%d", fe);
             }
             else if (p==3)
             {
-                ++ki;
-                lcd.locate(3,1);
+                ++kp;
+                lcd.locate(2,1);
                 lcd.printf("   ");
-                lcd.locate(3,1);
-                lcd.printf("%d", ki);
+                lcd.locate(2,1);
+                lcd.printf("%d", kp);
             }
             else if (p==4)
             {
+                ++ki;
+                lcd.locate(8,1);
+                lcd.printf("   ");
+                lcd.locate(8,1);
+                lcd.printf("%d", ki);
+            }
+             else if (p==5)
+            {
                 ++kd;
-                lcd.locate(11,1);
+                lcd.locate(13,1);
                 lcd.printf("   ");
-                lcd.locate(11,1);
+                lcd.locate(13,1);
                 lcd.printf("%d", kd);
             }
         }
         if (button2.falling())
         {
-            led2 =!led2;
+            
             if (p==1)
             {
                 if (sp==0)  // no mostrar nada
@@ -82,7 +113,8 @@
                     lcd.printf("%d", sp);
                 }
             }
-            if (p==2)
+         
+            if (p==3)
             {
                 if (kp==0)  // no mostrar nada
                 {
@@ -90,13 +122,13 @@
                 else
                 {
                     --kp;
-                    lcd.locate(11,0);
+                    lcd.locate(2,1);
                     lcd.printf("   ");
-                    lcd.locate(11,0);
+                    lcd.locate(2,1);
                     lcd.printf("%d", kp);
                 }
             }
-            if (p==3)
+            if (p==4)
             {
                 if (ki==0)  // no mostrar nada
                 {
@@ -104,13 +136,13 @@
                 else
                 {
                     --ki;
-                    lcd.locate(3,1);
+                    lcd.locate(8,1);
                     lcd.printf("   ");
-                    lcd.locate(3,1);
+                    lcd.locate(8,1);
                     lcd.printf("%d", ki);
                 }
             }
-            if (p==4)
+             if (p==5)
             {
                 if (kd==0)  // no mostrar nada
                 {
@@ -118,48 +150,132 @@
                 else
                 {
                     --kd;
-                    lcd.locate(11,1);
+                    lcd.locate(13,1);
                     lcd.printf("   ");
-                    lcd.locate(11,1);
+                    lcd.locate(13,1);
                     lcd.printf("%d", kd);
                 }
             }
         }
-        if (button3.falling())
-        {
-            led3 =!led3;
+   
+      if (button3.falling())
+        {         
             if (p==1)
             {
                 ++p;
                 lcd.locate(11,0);
-                lcd.printf("%d", kp);
-                
-                
+                lcd.printf("%d", fe);       
             }
             else if (p==2)
             {
                 ++p;
-                lcd.locate(3,1);
-                lcd.printf("%d", ki);
-                lcd.locate(3,1);
-                
+                lcd.locate(2,1);
+                lcd.printf("%d", kp);
+                lcd.locate(2,1);               
             }
             else if (p==3)
             {
                 ++p;
-                lcd.locate(11,1);
-                lcd.printf("%d", kd);
-                
-                
+                lcd.locate(8,1);
+                lcd.printf("%d", ki);               
             }
             else if (p==4)
             {
+                ++p;
+                lcd.locate(13,1);
+                lcd.printf("%d", kd);              
+            }
+             else if (p==5)
+            {
                 p=1;
                 lcd.locate(3,0);
-                lcd.printf("%d", sp);
-                
-                
+                lcd.printf("%d", sp);                            
             }
+          
         }
-    }
-}
+        
+        if (button4.falling()){
+           break;     //sale del bucle si pisan suiche4
+               }
+                        
+      }                                  
+           lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
+           lcd.cls(); //borra la pantalla
+           lcd.printf("   GUARDADOS!"); 
+           wait(1);
+           lcd.cls();
+           lcd.printf(" INICIA EL PID");
+           wait(1);
+           // 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",sp);
+           lcd.locate(8,1);
+           lcd.printf("SC=%d",pid);
+           wait(1);
+           
+           // CICLO PRINCIPAL CONTROLADOR PID
+            // DEFINIMOS LOS PARAMETROS Kp,Ki y Kd teniendo en cuenta la escala 
+            
+            kp= kp*fe;
+            ki = ki*fe;
+           kd= kd*fe;
+           
+           cicloPID :
+           
+           med=10*Vin.read();                  //leer puerto analogo y asignar a med
+           err = (sp-med);
+           ap = kp*err;
+           
+           ai=(ki*err)+ai;
+              //calculo de la integral del error
+           
+           ad = kd*(err-err_v); //calculo de la accion derivativa
+           pid = (ap+ai+ad);
+           
+           if (pid < 0){
+           pid=0;
+           } 
+           if (pid > 99){
+           pid=100;
+           } 
+           
+           wait(.5);
+           if(err >= 0){
+            lcd.locate(4,0);
+           lcd.printf(" ");
+           lcd.locate(3,0);
+           lcd.printf("%d",err);
+           }
+           if (err<0){
+               lcd.locate(3,0);
+           lcd.printf("%d",err);
+               }
+           lcd.locate(12,0);
+           lcd.printf(" ");
+           lcd.locate(11,0);
+           lcd.printf("%d",med);
+           lcd.locate(3,1);
+           lcd.printf("%d",sp);
+           
+           if(pid < 100){
+           lcd.locate(13,1);
+           lcd.printf(" ");
+           lcd.locate(11,1);
+           lcd.printf("%d",pid);}
+           
+           if(pid >= 100){
+           lcd.locate(11,1);
+           lcd.printf("%d",pid);}
+           
+           err_v = err;  
+           pidn=pid*0.01;//Normalizacion de la salida
+           Vout.write(pidn);//se envia el valor pid a puerto analogico de salida (D/A)
+           wait(0.005);  
+        goto cicloPID ;              
+  
+       
+}
\ No newline at end of file