PID Sencillo - Primera Prueba

Dependencies:   Debounced TextLCD1 mbed

main.cpp

Committer:
jmcallef
Date:
2013-11-14
Revision:
2:12dac32e2a8b
Parent:
1:ce04971eceb4

File content as of revision 2:12dac32e2a8b:

#include "mbed.h"
#include "DebouncedIn.h"
#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);
DigitalOut led4(LED4);
DebouncedIn button1(PTC12);     // Aumento
DebouncedIn button2(PTC13);     // Disminución
DebouncedIn button3(PTC16);     // Cambio de variable
DebouncedIn button4(PTC17);     // Reset

int C1=0x0E;                                                // solo muestra el curzor.
int C2=0x18;                                                // desplaza izquierda.
int C3=0x1A;                                                // desplaza derecha.
int C4=0x0C;                                                // quito cursor bajo.

int i;                                                      // Indice de la variable.
int j;                                                      // Controla cambio de posición.
int kp, ki, kd, sp, cont; 
int Error, Medida, Co, pid, ap, ai, ad, err_v;
// float pidn, err, med, sal;
int pidn, err, med, sal;

int main(){
    lcd.writeCommand(C1);                                   // Escribimos un comando segun el manual del modulo LCD
    lcd.cls();                                               // Borro toda la pantalla
    lcd.locate(0,0);                                         // Localizo donde se escribirá el siguiente comando.    
    lcd.printf("Sp %d",sp);                                  // Escribe Sp (aparecen desde el punto (0,0)
    lcd.locate(8,0);                                         // Localizo donde se escribirá el siguiente comando.
    lcd.printf("Kp %d",kp);                                  // Escribe Kp (aparecen desde el punto (8,0)
    lcd.locate(0,1);
    lcd.printf("Ki %d",ki);
    lcd.locate(8,1);
    lcd.printf("Kd %d",kd);
  
        
    while(1){
           led3 =1;
           if (button3.falling()){
              led3 =!led3;                                // Prendo el LED color rojo cada vez que pulso el boton 3 ya que pasa a valer 0 (encendido).              
               ++j;
                                 }                        // INCREMENTA POSICION DEL MENU CON BOTON 3
           if (j==0){
               lcd.locate(3,0);
               lcd.printf("%d",sp);
               wait(0.2);
                  
               led1 = 1;
               
               if(button1.falling()) { 
               led1 =!led1;                            // Prendo el LED color azul cada vez que pulso el boton 1 ya que pasa a valer 0 (encendido).        
               //++sp;                                 // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental.
               
               
               // Ahora comienza el incremental.               
               
                  if (!button1) {  
                  cont=0;
                  wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   
                     sp=sp+1; 
                     if (sp>1000){                     // Ponemos un tope incremental en 1.000
                     sp=1000;
                                 }       
                     lcd.locate(0,0); 
                     lcd.printf("Sp %d",sp); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }              
                     while(cont>=20 and cont<=40){ 
                     cont=cont+1;   
                     sp=sp+10;
                     if (sp>1000){                     // Ponemos un tope incremental en 10.000
                     sp=1000;
                               }  
                     lcd.locate(0,0); 
                     lcd.printf("Sp %d",sp); 
                                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     sp=sp+100;
                     if (sp>1000){                     // Ponemos un tope incremental en 10.000
                     sp=1000;
                               }  
                     lcd.locate(0,0); 
                     lcd.printf("Sp %d",sp); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }                                
                            }    
                            }
                            }
                            }
                            
        // Aqui termina el incremental.
                                      }

                                         
                  led2 =1;
                  if (button2.falling()) {  
                  led2 =!led2;                            // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).       
                  
                  //--sp;                                   // Reduce el valor al pulsar el botón.
                                         } 
                  
                                  
                  // Ahora comienza el decremental.               
               
                  if (!button2) {  
                  cont=0;
                  wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   
                     sp=sp-1; 
                     
                     if (sp<=0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     sp=0;
                              }
                     lcd.locate(3,0);
                     lcd.printf("     ");
                     lcd.locate(0,0);
                     lcd.printf("Sp %d",sp);
                                                                          
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }              
                      
                     while(cont>=20 and cont<=40){ 
                     cont=cont+1;   
                     sp=sp-10; 
                     if (sp<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     sp=0;
                              }
                     
                     lcd.locate(0,0); 
                     lcd.printf("Sp %d ",sp); 
                     
                                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     sp=sp-100; 
                     
                     if (sp<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     sp=0;
                              }
                     
                     lcd.locate(0,0); 
                     lcd.printf("Sp %d ",sp); 
                     
                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }                                
                            }    
                            }
                            }
                            }
                            
        // Aqui termina el decremental.
                  
                          
                    }
           if (j==1){
               lcd.locate(11,0);
               lcd.printf("%d",kp);
               wait(0.3);
                  led1 =1;
                  if (button1.falling()) {
                    led1 =!led1;
                    // ++kp;
                                         }

            // Ahora comienza el incremental.               
               
                     if (!button1) {  
                     cont=0;
                     wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   
                     kp=kp+1; 
                     if (kp>1000){                     // Ponemos un tope incremental en 10.000
                     kp=1000;
                               }       
                     lcd.locate(8,0); 
                     lcd.printf("Kp %d",kp); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }              
                     while(cont>=20){ 
                     cont=cont+1;   
                     kp=kp+10;
                     if (kp>1000){                     // Ponemos un tope incremental en 10.000
                     kp=1000;
                               }  
                     lcd.locate(8,0); 
                     lcd.printf("Kp %d",kp); 
                                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     kp=kp+100;
                     if (kp>1000){                     // Ponemos un tope incremental en 10.000
                     kp=1000;
                               }  
                     lcd.locate(8,0); 
                     lcd.printf("Kp %d",kp); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }                                
                            }    
                            }
                            }
                            }
                            
        // Aqui termina el incremental.
                                      }

                                         
                  led2 =1;
                  if (button2.falling()) {  
                  led2 =!led2;                            // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).       
                  
                  //--sp;                                   // Reduce el valor al pulsar el botón.
                                         } 
                  
                                  
                  // Ahora comienza el decremental.               
               
                  if (!button2) {  
                  cont=0;
                  wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   

                     kp=kp-1; 
                     
                     if (kp<=0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     kp=0;
                              }
                     
                     lcd.locate(8,0);
                     lcd.printf("     ");
                     lcd.locate(8,0);
                     lcd.printf("Kp %d",kp);
                                           
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }              
                      
                     while(cont>=20){ 
                     cont=cont+1;   
                     kp=kp-10; 
                     if (kp<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     kp=0;
                              }

                     lcd.locate(8,0);
                     lcd.printf("     ");
                     lcd.locate(8,0); 
                     lcd.printf("Kp %d ",kp); 
                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     kp=kp-100; 
                     
                     if (kp<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     kp=0;
                              }
                     lcd.locate(8,0);
                     lcd.printf("     ");
                     lcd.locate(8,0); 
                     lcd.printf("Kp %d ",kp); 
                     
                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }                                
                            }    
                            }
                            }
                            }



           if (j==2){
               lcd.locate(3,1);
               lcd.printf("%d",ki);
               wait(0.3);
                  led1 =1;
                  if (button1.falling()){
                    led1 =!led1;

               //++sp;                                 // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental.
               
               
               // Ahora comienza el incremental.               
               
                  if (!button1) {  
                  cont=0;
                  wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   
                     ki=ki+1; 
                     if (ki>1000){                     // Ponemos un tope incremental en 1.000
                     ki=1000;
                                 }       
                     lcd.locate(0,1); 
                     lcd.printf("Ki %d",ki); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }              
                     while(cont>=20 and cont<=40){ 
                     cont=cont+1;   
                     ki=ki+10;
                     if (ki>1000){                     // Ponemos un tope incremental en 10.000
                     ki=1000;
                               }  
                     lcd.locate(0,1); 
                     lcd.printf("Ki %d",ki); 
                                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     ki=ki+100;
                     if (ki>1000){                     // Ponemos un tope incremental en 10.000
                     ki=1000;
                               }  
                     lcd.locate(0,1); 
                     lcd.printf("Ki %d",ki); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }                                
                            }    
                            }
                            }
                            }
                            }
        // Aqui termina el incremental.
                                      }

                                         
                  led2 =1;
                  if (button2.falling()) {  
                  led2 =!led2;                            // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).       
                  
                  //--sp;                                   // Reduce el valor al pulsar el botón.
                                         } 
                  
                                  
                  // Ahora comienza el decremental.               
               
                  if (!button2) {  
                  cont=0;
                  wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   
                     ki=ki-1; 
                     
                     if (ki<=0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     ki=0;
                              }
                     lcd.locate(3,1);
                     lcd.printf("    ");
                     lcd.locate(0,1);
                     lcd.printf("Ki %d",ki);
                                                                          
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }              
                      
                     while(cont>=20 and cont<=40){ 
                     cont=cont+1;   
                     ki=ki-10; 
                     if (sp<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     ki=0;
                              }
                     
                     lcd.locate(3,1);
                     lcd.printf("    ");
                     lcd.locate(0,0); 
                     lcd.printf("Ki %d ",ki); 
                     
                                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     ki=ki-100; 
                     
                     if (ki<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     ki=0;
                              }
                     
                     lcd.locate(3,1);
                     lcd.printf("    ");
                     lcd.locate(0,0); 
                     lcd.printf("Ki %d ",ki); 
                     
                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }                                
                            }    
                            }
                            }
                            }
                            
        // Aqui termina el decremental.
           
           if (j==3){
               lcd.locate(11,1);
               lcd.printf("%d",kd);
               wait(0.3);
                  led1 =1;
                  if (button1.falling()){
                  led1 =!led1;
                  
                                 //++sp;                                 // Incrementa valor al pulsar el botón --> Ahora no lo usamos acá ya que necesitamos incremental.
               
               
               // Ahora comienza el incremental.               
               
                  if (!button1) {  
                  cont=0;
                  wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   
                     kd=kd+1; 
                     
                     if (kd>1000){                     // Ponemos un tope incremental en 1.000
                     kd=1000;
                                 }       
                     lcd.locate(8,1); 
                     lcd.printf("Kd %d",kd); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }              
                     while(cont>=20 and cont<=40){ 
                     cont=cont+1;   
                     kd=kd+10;
                     if (kd>1000){                     // Ponemos un tope incremental en 100
                     kd=1000;
                               }  
                     lcd.locate(8,1); 
                     lcd.printf("Kd %d",kd); 
                                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     kd=kd+100;
                     if (kd>1000){                     // Ponemos un tope incremental en 1000
                     kd=1000;
                               }  
                     lcd.locate(8,1); 
                     lcd.printf("Kd %d",kd); 
                     
                     wait(0.3); 
                     if(button1){ 
                     break; 
                                }                                
                            }    
                            }
                            }
                            }
                            }
        // Aqui termina el incremental.
                                      }

                                         
                  led2 =1;
                  if (button2.falling()) {  
                  led2 =!led2;                            // Prendo el LED color rojo cada vez que pulso el boton 2 ya que pasa a valer 0 (encendido).       
                  
                  //--sp;                                   // Reduce el valor al pulsar el botón.
                                         } 
                  
                                  
                  // Ahora comienza el decremental.               
               
                  if (!button2) {  
                  cont=0;
                  wait(0.2);
               
                     while(cont<20){ 
                     cont = cont + 1;   
                     kd=kd-1; 
                     
                     if (kd<=0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     kd=0;
                              }
                     lcd.locate(11,1);
                     lcd.printf("    ");
                     lcd.locate(8,1);
                     lcd.printf("Kd %d",kd);
                                                                          
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }              
                      
                     while(cont>=20 and cont<=40){ 
                     cont=cont+1;   
                     kd=kd-10; 
                     if (kd<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     kd=0;
                              }
                     
                     lcd.locate(11,1);
                     lcd.printf("    ");
                     lcd.locate(8,1); 
                     lcd.printf("Kd %d ",kd); 
                     
                                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }
                                
                     while(cont>40){ 
                     cont = cont + 1;   
                     kd=kd-100; 
                     
                     if (kd<0){                         // No permitimos valores negativos, definimos valor mínimo en 0.
                     kd=0;
                              }
                     
                     lcd.locate(11,1);
                     lcd.printf("    ");
                     lcd.locate(8,1); 
                     lcd.printf("Kd %d ",kd); 
                     
                     
                     wait(0.3); 
                     if(button2){ 
                     break; 
                                }   
                           
                            }    
                            }
                            }
                            }
                            
        // Aqui termina el decremental.               
    
                 if (button4.falling()){
                         break;     //sale del bucle si pisan suiche4
                                       }     
            }           
          
//**********************************************************************************
//*******************************************************************************************************          
          
          
          
           lcd.writeCommand(C4);      // Comando para quitar cursor bajo (segun el manual del modulo LCD).
           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("Err %d",err);
           lcd.locate(8,0);
           lcd.printf("Med %d",med);
           lcd.locate(0,1);
           lcd.printf("Sp %d",sp);
           lcd.locate(8,1);
           lcd.printf("Co %d",pid);
           wait(1);

        
           // CICLO PRINCIPAL CONTROLADOR PID
           
           while(1) {
           med=Vout*100;             // Se le asigna al puerto Análogo la variable med.
           err = (sp-med);
           
           // Verificamos que la accion integral no sea muy grande.
           
           if (ai < 1000){
           ai =(ki*err)+ai;     //Cálculo de la integral del error;
                         } 
              
           if (ap < 1000){
           ap = kp*err;        //Cálculo de la integral del error;
                         }
                      
           if (ad < 1000){
           ad = kd*(err-err_v);      //Cálculo de la integral del error;
                         } 
           
           pid = (ap+ai+ad);  // Calculo del PID
           
           if(pid<0){                
                pid=0;
                    }
           
           if (pid > 1000){
           pid=1000;
                          } 
          
           //Vout=pid/999;
           
           
           lcd.locate(4,0);
           lcd.printf("%d",err);
           lcd.locate(12,0);
           lcd.printf("%d",med);
           lcd.locate(3,1);
           lcd.printf("%d",sp);
           lcd.locate(12,1);
           lcd.printf("%d",pid);
           wait(0.2);
           
           // se actualizan las variables *******************************************
                  
           // se verifica que pid sea positivo **************************************
           if (pid < 0){
           pid=0;
           } 
           
           
           //  se envia el valor pid a puerto analogico de salida (D/A) **************

            Vout=pid;
            err_v = err;
    
           }          
           }