PID_TECLAS

Dependencies:   DebouncedIn TextLCD mbed

Fork of PID_Encoder by Gustavo Ramirez

Revision:
5:a582c64fce81
Parent:
4:d42fe3777735
--- a/main.cpp	Sat May 24 15:05:40 2014 +0000
+++ b/main.cpp	Fri Apr 10 02:37:11 2015 +0000
@@ -1,248 +1,347 @@
 #include "mbed.h"
 #include "DebouncedIn.h"
 #include "TextLCD.h"
-#include "QEI.h" 
-
+AnalogIn Vin(PTC2);
+AnalogOut u(PTE30);
 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
-QEI wheel (PTD5, PTD0, NC, 100);
-AnalogIn y(PTB1);
-AnalogOut u(PTE30);
 DigitalOut led1(LED1);
 DigitalOut led2(LED2);
-DigitalOut led3(LED3);
 DebouncedIn button1(PTC12);
 DebouncedIn button2(PTC13);
 DebouncedIn button3(PTC16);
 DebouncedIn button4(PTC17);
-
-      //codigos movimiento del curzor
-      //18 para izquierda
-      //1A para derecha
-
-//int C1=0x0E; // solo muestra el curzor
+Timer t; //se define la función del timer interno que ofrece la plataforma mbed
+ 
+/*    codigos movimiento del curzor
+      18 para izquierda
+      1A para derecha
+*/      
+ 
+ 
+int C1=0x0E; // solo muestra el curzor
 int C2=0x18; // desplaza izquierda
 int C3=0x1A; // desplaza derecha
 int C4=0x0C; // quito cursor bajo
-int C1=0x0F;
-
 int i; // indice de la variable
-int j; //variable controla cambio 4 posiciones
-int kp, ki, kd, sp;
-float yr, ap, ai, ad, err, med, err_v, cycle, pid; 
-int b=0; 
-float pidn;
-Timer t;
-
+int j;
+int kp,ki,kd,sp;
+float med,pid,pidn,ap,ai,ad,err,err_v,err_v2;
+int count; 
+int esc=1;
 int main() {
     lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("Sp=%d",sp);
+    lcd.locate(6,0);
+    lcd.printf("Kp=%d",kp);
+    lcd.locate(0,1);
+    lcd.printf("Ki=%d",ki);
+    lcd.locate(6,1);
+    lcd.printf("Kd=%d",kd);  
+    lcd.locate(12,1);
+    lcd.printf("E%d",esc);
     lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
     lcd.locate(0,0);
-    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);
-          
+    lcd.printf("Sp=%d",sp);
+           
     while(1) {
-    
-              led3 =1;
-           if (button3.falling()) {   //INCREMENTA POSICION DEL MENU CON BOTON 3 (Switche encoder)
-              led3 =!led3;              
+           if (button3.falling()) {              
                ++j;
-               }    
-                                                
-           if (j==0){      
-               sp=sp+wheel.getPulses();
-               wheel.reset();
-                 if (sp>999){
-                       sp=999;
-                            } 
-                 if (sp<0){
-                       sp=0;
-                          }   
-               lcd.locate(2,0);
-               lcd.printf("     ",sp);
-               lcd.locate(2,0);
+               }                                     //INCREMENTA POSICION DEL MENU CON BOTON 3
+           if (j==0){
+               lcd.locate(3,0);
+               lcd.printf("%d",sp);
+                
+               if (button1.falling()) { 
+                  t.stop();
+                      t.reset(); 
+                      t.start();
+                 while (button1==0){
+                      
+                                  
+                  if (sp<999){
+                  if (t<=2){++sp;}
+                  wait(0.2);
+                  if (t>2&&t<=5){sp=sp+5;}
+                  wait(0.2);
+                  if (t>5&&t<=10){sp=sp+10;}
+                  wait(0.2);
+                  if (t>10){sp=sp+100;}
+                  wait(0.2);
+                  if (sp>999){sp=999;}
+                  lcd.locate(3,0);
+                  lcd.printf("   ");
+                  lcd.locate(3,0);
                lcd.printf("%d",sp);
-               wait(0.2);
+                
+                  }
+                               }   
+                               }  
+                  if (button2.falling()) {  
+                t.stop();
+                t.reset(); 
+                t.start();
+                  while (button2==0)
+                
+                  if (sp>0){
+                  if (t<=2){--sp;}
+                  wait(0.2);
+                  if (t>2&&t<=5){sp=sp-5;}
+                  wait(0.2);
+                  if (t>5&&t<=10){sp=sp-10;}
+                  wait(0.2);
+                  if (t>10){sp=sp-100;}
+                  wait(0.2);
+                  if (sp<0){sp=0;}
+                  lcd.locate(3,0);
+                  lcd.printf("   ");
+                  lcd.locate(3,0);
+               lcd.printf("%d",sp);
+            } 
+            }
+            }
+           if (j==1) {
                
-               if(button3.falling()){
-                 j=1;
-                 led3=0;
-                 wait(0.3);
-                 wheel.reset();   
-                                    }   
-                   
-                     }
-              
-           if (j==1) {
-               kp=kp+wheel.getPulses();
-               wheel.reset();
-                 if (kp>999){
-                     kp=999;
-                          }              
-                 if (kp<0){
-                     kp=0;
-                          }   
-               lcd.locate(10,0);
-               lcd.printf("     ");
-               lcd.locate(10,0);
+                  if (button1.falling()) {  
+                   t.stop();
+                      t.reset(); 
+                      t.start();
+                   while (button1==0){
+                  
+                  if (kp<1000){
+                  if (t<=2){++kp;}
+                  wait(0.2);
+                  if (t>2&&t<=5){kp=kp+5;}
+                  wait(0.2);
+                  if (t>5&&t<=10){kp=kp+10;}
+                  wait(0.2);
+                  if (t>10){kp=kp+100;}
+                  wait(0.2);
+                  if (kp>999){kp=999;}
+                  lcd.locate(9,0);
+                  lcd.printf("   ");
+                  lcd.locate(9,0);
                lcd.printf("%d",kp);
-               wait(0.2);
-               
-               if(button3.falling()){
-                 j=2;
-                 led3=0;
-                 wait(0.3);
-                 wheel.reset();    
-                                    }
-                                           
-                      }
-              
+
+                  }
+                               }   
+                               }  
+                  if (button2.falling()) {
+                    t.stop();
+                      t.reset(); 
+                      t.start();  
+                   while (button2==0){
+                  if (kp>=0){
+                  if (t<=2){--kp;}
+                  wait(0.2);
+                  if (t>2&&t<=5){kp=kp-5;}
+                  wait(0.2);
+                  if (t>5&&t<=10){kp=kp-10;}
+                  wait(0.2);
+                  if (t>10){kp=kp-100;}
+                  wait(0.2);
+                  if(kp<0){kp=0;}
+                  lcd.locate(9,0);
+                  lcd.printf("   ");
+                  lcd.locate(9,0);
+               lcd.printf("%d",kp);
+                  }
+              } 
+              }
+              }
            if (j==2) {
-               ki=ki+wheel.getPulses();
-               wheel.reset();
-                 if (ki>999){
-                     ki=999;
-                          }              
-                 if (ki<0){
-                     ki=0;
-                          }   
-               lcd.locate(2,1);
-               lcd.printf("     ");
-               lcd.locate(2,1);
+                  if (button1.falling()) {
+                    t.stop();
+                  t.reset();
+                  t.start();   
+                   while (button1==0){
+                 
+                  
+                  if (ki<1000){
+                  if (t<=2){++ki;}
+                  wait(0.2);
+                  if (t>2&&t<=5){ki=ki+5;}
+                  wait(0.2);
+                  if (t>5&&t<=10){ki=ki+10;}
+                  wait(0.2);
+                  if (t>10){ki=ki+100;}
+                  wait(0.2);
+                  if (ki>999){ki=999;}
+                  lcd.locate(3,1);
+               lcd.printf("   ");
+               lcd.locate(3,1);
                lcd.printf("%d",ki);
-               wait(0.2);
-               
-               if(button3.falling()){
-                 j=3;
-                 led3=0;
-                 wait(0.3);
-                 wheel.reset();
-                                    }
-                                    
-                     }
-                     
+                 
+                  }
+                               }   
+                               }  
+                  if (button2.falling()) {
+                t.stop();
+                  t.reset();
+                  t.start();    
+                   while (button2==0){
+                  
+                  if (ki>=0){
+                  if (t<=2){--ki;}
+                  wait(0.2);
+                  if (t>2&&t<=5){ki=ki-5;}
+                  wait(0.2);
+                  if (t>5&&t<=10){ki=ki-10;}
+                  wait(0.2);
+                  if (t>10){ki=ki-100;}
+                  wait(0.2);
+                  if (ki<0){ki=0;}
+                  lcd.locate(3,1);
+                  lcd.printf("   ");
+                  lcd.locate(3,1);
+               lcd.printf("%d",ki);
+
+                }           
+                } 
+                } 
+                }               
+              
            if (j==3) {
-               kd=kd+wheel.getPulses();
-               wheel.reset();
-                 if (kd>999){
-                     kd=999;
-                            }              
-                 if (kd<0){
-                     kd=0;
-                          }   
-               lcd.locate(10,1);
-               lcd.printf("     ");
-               lcd.locate(10,1);
+                 if (button1.falling()) {
+                 t.stop();
+                  t.reset();
+                  t.start();   
+                  while (button1==0){
+                  
+                  
+                  if (kd<1000){
+                  if (t<=2){++kd;}
+                  wait(0.2);
+                  if (t>2&&t<=5){kd=kd+5;}
+                  wait(0.2);
+                  if (t>5&&t<=10){kd=kd+10;}
+                  wait(0.2);
+                  if (t>10){kd=kd+100;}
+                  wait(0.2);
+                  if (kd>999){kd=999;}
+                  lcd.locate(9,1);
+               lcd.printf("   ");
+               lcd.locate(9,1);
                lcd.printf("%d",kd);
-               wait(0.2);
+ 
+                  }
+                               }   
+                               }  
+                  if (button2.falling()) {
+                   
+                  t.stop();
+                  t.reset();    
+                  t.start();
+                   while (button2==0){
+                  if (kd>=0){
+                  if (t<=2){--kd;}
+                  wait(0.2);
+                  
+                  if (t>2&&t<=5){kd=kd-5;}
+                  
+                  wait(0.2);
+                  if (t>5&&t<=10){kd=kd-10;}
+                  wait(0.2);
+                  if (t>10){kd=kd-100;}
+                  wait(0.2);
+                  if (kd<0){kd=0;}
+                  lcd.locate(9,1);
+                  lcd.printf("   ");
+                  lcd.locate(9,1);
+               lcd.printf("%d",kd);
+              } 
+              }
+              } 
+              } 
+            if (j==4) {
                
-               if(button3.falling()){
-                 j=0;
-                 led3=0;
-                 wait(0.3);
-                 wheel.reset();
-                                    }
-                                            
-                       } 
-            
-           if (j==4) {
+                  if (button1.falling()){
+                   if (esc<1000){
+                    esc=esc*10;
+                    lcd.locate(13,1);
+               lcd.printf("    ");
+               lcd.locate(13,1);
+               lcd.printf("%d",esc);
+                   }
+                  }
+                  if (button2.falling()){                            
+                    if (esc>1){
+                     esc=esc/10;
+                     lcd.locate(13,1);
+               lcd.printf("    ");
+               lcd.locate(13,1);
+               lcd.printf("%d",esc);
+                    }
+                  }
+              } 
+           if (j==5) {
                j=0;
-                     }                          
-                     
-           if (!button4){
-           break;        //sale del bucle si pisan suiche4
-                        }                  
-              }          //cierro while(1)
-//%---------------------------------------------------------------------              
-              
-              
-          lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
+               }                          
+           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("GUARDAMOS \nVALORES |m|"); 
+           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.cls();
+           lcd.printf("Er%01.3f",err);
            lcd.locate(8,0);
-           lcd.printf("Me%d",med);
+           lcd.printf("Me%01.3f",med);
            lcd.locate(0,1);
            lcd.printf("Sp%d",sp);
            lcd.locate(8,1);
-           lcd.printf("Co%d",pid);
-           wait(1); 
-           
+           lcd.printf("Co%01.3f",pid);
+           wait(5);
            
            // CICLO PRINCIPAL CONTROLADOR PID
-           b=0;
+           
            while(1) {
-           med=1000*y.read();                   //leer puerto analogo y asignar a med
+           med=Vin.read()/esc;                   //leer puerto analogo y asignar a med
            err = (sp-med);
-           ap = kp*err;
-           
-           // se verifica que la accion integral no sea muy grande
+           ap = kp*(err-err_v2);
            if(ai<100)
            {
-              ai =(ki*err)+ai;    //calculo de la integral del error
+              ai =(ki*(err-err_v))+ai;    //calculo de la integral del error
            }
-           //else{
-                //Dejo de sumar la accion integral
-             //  }
-                      
-           ad = kd*(err-err_v); //calculo de la accion derivativa
+           // se verifica que la accion integral no sea muy grande
+           ad = kd*(err-(2*err_v)+err_v2); //calculo de la accion 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 *****************
-           if(pid>=1000){pid=1000;}
-                      
-           // se actualizan las variables *******************************************
-           err_v = err;         
-           
-           //se muestran las variables******************************************
-           
-           if (b==0)
-           {
-            t.start();
-            b=1;
-           }
-        if(t>=0.01)
-        {
-           wait(0.2);
+           //****se muestran las variables******************************************
+           if (pid > 999){
+           pid=1000;
+           } 
+           if (pid < 0){
+           pid=0;
+           } 
+           wait(.5);
            lcd.locate(2,0);
-           lcd.printf("    ");
-           lcd.locate(2,0);
-           lcd.printf("%d",err);
-           lcd.locate(10,0);
-           lcd.printf("    ");
+           lcd.printf("%01.3f",err);
            lcd.locate(10,0);
-           lcd.printf("%d",med);
-           lcd.locate(2,1);
-           lcd.printf("    ");
+           lcd.printf("%01.3f",med);
            lcd.locate(2,1);
-           lcd.printf("%d",sp);
-           lcd.locate(10,1);
-           lcd.printf("    ");
+           lcd.printf("%01.3f",sp);
            lcd.locate(10,1);
-           lcd.printf("%d",pid);
-        }  
+           lcd.printf("%01.3f",pid);
+           
            
-           //Normalizacion de la salida
-           pidn=pid/1000;
-           //  se envia el valor pid a puerto analogico de salida (D/A) **************
+           // se actualizan las variables *******************************************
+           err_v2=err_v;     
+           err_v = err;    
+           pidn=pid/esc;
+           // se verifica que pid sea positivo **************************************
            u.write(pidn);
-          
+           // se verifica que pid sea menor o igual la valor maximo *****************
+           
+           
+           //  se envia el valor pid a puerto analogico de salida (D/A) **************
            //  se repite el ciclo
-           wait(0.1);
            }
-           
-                      
-        }
-        
\ No newline at end of file
+}
\ No newline at end of file