se incrementa y decrementa parámetros con el encoder.

Dependencies:   QEI TextLCD mbed

Fork of TAREA_4_PROCESADORES by john lopez

Revision:
2:fba5e2ee8bee
Parent:
1:9ca362d07dd0
--- a/main.cpp	Tue Apr 08 19:02:44 2014 +0000
+++ b/main.cpp	Fri May 23 18:31:15 2014 +0000
@@ -5,268 +5,226 @@
  
 AnalogIn Vin(PTC2);
 AnalogOut Vout(PTE30);
-PwmOut sound(PTA12);
+PwmOut Pwm(PTA5);
+float p1 = 0.001;
+
+int PWMmodule(float p1)
+{
+    Pwm.period(p1);
+    Pwm.write(0.1);
+    wait(0.1);
+    Pwm.write(1);
+    wait(0.1);
+    Pwm.write(0.5);
+    wait(0.1);
+    Pwm.write(2);
+    wait(0.1);
+    Pwm.write(0.01);
+    wait(0.1);
+    Pwm.write(0.001);
+    wait(0.1);
+    Pwm.write(0);
+    return 0;
+}
 
 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); //Puertos LCD rs, e, d4, d5, d6, d7
-QEI Encoder (PTA1, PTA2, NC, 624);               //Puertos de la tarjeta asignados para el Encoder
+QEI encoder (PTD7, PTD6, NC, 624);               //Puertos de la tarjeta asignados para el Encoder
  
-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 (CONECTO ESTA ENTRADA A LA ULTIMA SALIDA DEL ENCONDER, ASI SE UTILIZARA EL BOTON DEL ENCODER)
-DebouncedIn bot4(PTC17);    //salida de bucle
+DigitalOut led1(LED1);      
+DigitalOut led2(LED2);      
+DigitalOut led3(LED3);      
+DebouncedIn boton_encoder(PTC5);    //cambiar la posición- EL BOTON DEL ENCODER
+
   
    //Códigos LCD
-int C1=0x0E;                // Muestra el cursor
-// 0x18;                // desplazamiento izquierda
-// 0x1A;                // desplazamiento derecha
-int C4=0x0C;
+int C2=0x18; // desplaza izquierda
+int C3=0x1A; // desplaza derecha
+int C4=0x0C; // quito cursor bajo
+int C1=0x0E; // Muestra el cursor
 
 
-int a, kp, ki, kd, sp, ciclo, valor, v; // indice de la variable
-float  med, sp0, pid, ap, err, ai, ad,err_v;
+
+int s, kp, ki, kd, sp, dato, spmax, kpmax, kimax, kdmax; // declaracion de variables
+
 
 
  
 int main() {
 
-    led1=led2=led3=1;
-    lcd.printf("Control PID");
-    wait(1.5);
+// Ubica e imprime nombre de los parámetros en del PID en la pantalla LCD
     lcd.cls();
-    
-    lcd.writeCommand(C1);   //comando para mostrar el cursor en el LCD
-                       
-    lcd.locate(0,0);        // Ubica e imprime nombre de los parámetros en del PID en la pantalla LCD
+    lcd.writeCommand(C1);   //comando para mostrar el cursor en el LCD                   
+    lcd.locate(2,0);        
     lcd.printf("Sp=");
-    lcd.locate(8,0);
+    lcd.locate(10,0);
     lcd.printf("Kp=");
-    lcd.locate(0,1);
+    lcd.locate(2,1);
     lcd.printf("Ki=");
-    lcd.locate(8,1);
+    lcd.locate(10,1);
     lcd.printf("Kd=");
     
    
      //Inicio del ciclo
      
      while(1) {
-           if (bot1.falling()) {            //----------------- Aumenta de posición el cursor a la primera línea de menu
+           if (boton_encoder.falling()) {            //Detecta el aumento y disminucion del valor del encoder
                
-            sound=1.0f;
-            wait(0.1);
-            sound=0;
-               
-               led1=0;
-               wait(.15); 
-               led1=1;
-               ++a;
+           PWMmodule(p1);
+             encoder.reset(); 
+               ++s;
+                     if (s>=3){
+                    s=0;
+                    }
                }
          
-                        valor = Encoder.getPulses();    //------------- Asigna el valor de los pulsos del encoder a una variable llamada "valor"                                                
-                       
-                        switch(a) {
+                        dato = encoder.getPulses();    //Asigna el valor de los pulsos del encoder a una variable                                                
+                        
+                        
+                        
+                        switch(s) {
             
                         case 0:
-                       
-                        sp = sp + valor;                //------------- Asigna el valor del encoder al parámetro sp y tiene en cuenta el valor anterior
-                        Encoder.reset();                //------------- Resetea el valor del encoder
-                        if (sp<0){
-                            sp=0;                       //------------- No se admite valores negativos
-                            }
+                        
+                        spmax=sp+dato;
                         
-                        lcd.locate(2,0);                //------------- Ubica e imprime el parámetro "sp" en la pantalla LCD
+                        if(spmax>=999){
+                            
+                        lcd.locate(4,0);                
                         lcd.printf("=    ",sp);
-                        lcd.locate(3,0);
+                        lcd.locate(5,0);
                         lcd.printf("%i",sp);
-                        wait(0.15);
-                        
-                            if (bot1.falling()) {       //--------------Aumenta de posición el cursor a la segunda línea de menu
+                        }
+                        else {   
+                            sp = sp + dato;                
+                            encoder.reset();                
+                            if (sp<0){
+                            sp=0;                       
+                            }
+                            lcd.locate(4,0);                
+                            lcd.printf("=    ",sp);
+                            lcd.locate(5,0);
+                            lcd.printf("%i",sp);
+                        }
+                        if (boton_encoder.falling()) {       
                             
-                            sound=1.0f;
-                            wait(0.1);
-                            sound=0;
+                            PWMmodule(p1);
                             
-                            a=1;
+                            s=1;
                             led1=0;
                             wait(.15); 
                             led1=1;
-                            Encoder.reset();            //------------- Resetea el valor del encoder
+                            encoder.reset();            
                             }
-                        break;                           
-                            
-                                case 1:
-                                
-                                kp = kp + valor;        //------------- Asigna el valor del encoder al parámetro kp y tiene en cuenta el valor anterior
-                                Encoder.reset();        //------------- Resetea el valor del encoder
-                                if (kp<0){
-                                kp=0;                   //------------- No se admite valores negativos
-                                }
+                        break; 
+                        
+                        case 1:
+                        
+                        kpmax=kp+dato;
                         
-                                lcd.locate(10,0);       //------------- Ubica e imprime el parámetro "sp" en la pantalla LCD
-                                lcd.printf("=    ",kp);
-                                lcd.locate(11,0);
-                                lcd.printf("%i",kp);                        
-                                wait(0.15);
-                                   
-                                    if (bot1.falling()) { //--------------Aumenta de posición el cursor a la tercera línea de menu    
-                                    
-                                    sound=1.0f;
-                                    wait(0.1);
-                                    sound=0;
-                                    
-                                    a=2;
-                                    led1=0;
-                                    wait(.15); 
-                                    led1=1;
-                                    Encoder.reset();      //------------- Resetea el valor del encoder
-                                    }
-                                break; 
+                        if(kpmax>=999){
+                            
+                        lcd.locate(12,0);                
+                        lcd.printf("=    ",kp);
+                        lcd.locate(13,0);
+                        lcd.printf("%i",kp);
+                        }
+                        else {   
+                       
+                        kp = kp + dato;                
+                        encoder.reset();                
+                        if (kp<0){
+                            kp=0;                       
+                            }
                         
-                                        case 2:
-                                        
-                                        ki = ki + valor;  //------------- Asigna el valor del encoder al parámetro ki y tiene en cuenta el valor anterior
-                                        Encoder.reset();  //------------- Resetea el valor del encoder
-                                        if (ki<0){
-                                        ki=0;             //------------- No se admite valores negativos
-                                        }
-                                        
-                                        lcd.locate(2,1);  //------------- Ubica e imprime el parámetro "sp" en la pantalla LCD
-                                        lcd.printf("=    ",ki);
-                                        lcd.locate(3,1);
-                                        lcd.printf("%i",ki);                                            
-                                        wait(0.15);
-                                        
-                                           if (bot1.falling()) { //--------------Aumenta de posición el cursor a la cuarta línea de menu         
-                                            
-                                            sound=1.0f;
-                                            wait(0.1);
-                                            sound=0;
-                                            
-                                            a=3;
-                                            led1=0;
-                                            wait(.15); 
-                                            led1=1;
-                                            Encoder.reset();    //------------- Resetea el valor del encoder
-                                            }
-                                        break;
+                        lcd.locate(12,0);                
+                        lcd.printf("=    ",kp);
+                        lcd.locate(13,0);
+                        lcd.printf("%i",kp);
+                      }  
+                        if (boton_encoder.falling()) {       
+                            
+                            PWMmodule(p1);
+                            
+                            s=2;
+                            led2=0;
+                            wait(.15); 
+                            led2=1;
+                            encoder.reset();           
+                            }
+                        break; 
+                        
+                        case 2:
+                       
+                         kimax=ki+dato;
                         
-                                                case 3:
-                                                kd = kd + valor; //------------- Asigna el valor del encoder al parámetro kd y tiene en cuenta el valor anterior
-                                                Encoder.reset(); //------------- Resetea el valor del encoder
-                                                if (kd<0){
-                                                kd=0;            //------------- No se admite valores negativos
-                                                }
-                                                lcd.locate(10,1);//------------- Ubica e imprime el parámetro "kd" en la pantalla LCD
-                                                lcd.printf("=    ",kd);
-                                                lcd.locate(11,1);
-                                                lcd.printf("%i",kd);
-                                                wait(0.15);
-                                                
-                                                    if (bot1.falling()) {  //--------------Aumenta de posición el cursor a la cuarta línea de menu    
-                                                    
-                                                    sound=1.0f;
-                                                    wait(0.1);
-                                                    sound=0;
-                                                    
-                                                    a=0;
-                                                    led1=0;
-                                                    wait(.15); 
-                                                    led1=1;
-                                                    Encoder.reset();       //------------- Resetea el valor del encoder
-                                                    }  
-                                                break;
-                                                
-                                                  }
-                                                                        
-                                                   if (bot4.falling()){
-                                                   led1=led2=led3=0;       //------------- Flash para salir del bucle
-                                                   wait(0.25);
-                                                   led1=led2=led3=1;
-                                                   break;                  //------------- sale del bucle de la pantalla
-                                             }
-                                         }
-                 
-//---------------------------------------------------------------------------------------------------------------------------------------------------
-           lcd.writeCommand(C4);                                   //Quita el cursor bajo de la pantalla 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);
-           
-           
-           while(1) {
+                        if(kimax>=999){
+                            
+                        lcd.locate(4,1);                
+                        lcd.printf("=    ",ki);
+                        lcd.locate(5,1);
+                        lcd.printf("%i",ki);
+                        }
+                        else {
+                        ki = ki + dato;                //Asigna el valor del encoder al parámetro y tiene en cuenta el valor anterior
+                        encoder.reset();                //Resetea el valor del encoder
+                        if (ki<0){
+                            ki=0;                       //No se muestran valores negativos
+                            }
+                        
+                        lcd.locate(4,1);                
+                        lcd.printf("=    ",ki);
+                        lcd.locate(5,1);
+                        lcd.printf("%i",ki);
+                    }
+                        if (boton_encoder.falling()) {       //Aumenta de posición el cursor a la siguiente parametro
+                            
+                            PWMmodule(p1);
+                            
+                            s=3;
+                            led3=0;
+                            wait(.15); 
+                            led3=1;
+                            encoder.reset();            //------------- Resetea el valor del encoder
+                            }
+                        break; 
+                        
+                        case 3:
+                       
+                       kdmax=kd+dato;
+                        
+                        if(kdmax>=999){
+                            
+                        lcd.locate(12,1);               
+                        lcd.printf("=    ",kd);
+                        lcd.locate(13,1);
+                        lcd.printf("%i",kd);
+                        }
+                        else {
+                        kd = kd + dato;               
+                        encoder.reset();               
+                        if (kd<0){
+                            kd=0;                       
+                            }
+                        
+                        lcd.locate(12,1);               
+                        lcd.printf("=    ",kd);
+                        lcd.locate(13,1);
+                        lcd.printf("%i",kd);
+                    }
+                        if (boton_encoder.falling()) {       
+                            
+                            PWMmodule(p1);
+                            
+                            s=4;
+                            led1=0;
+                            wait(.15); 
+                            led1=1;
+                            encoder.reset(); 
+                                     
+                            }
+                        break; 
+                    }     
+                }             
            
-           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