PID, donde las variaciones de SP, KP, KI y KD se producen por un encoder.

Dependencies:   Debounced QEI TextLCD11 mbed

main.cpp

Committer:
mandres7
Date:
2013-11-15
Revision:
0:b83ad526e653

File content as of revision 0:b83ad526e653:

#include "mbed.h"
#include "TextLCD.h"
#include "DebouncedIn.h"
#include "QEI.h"

TextLCD lcd(PTC10, PTC11, PTC12, PTC13, PTC16, PTC17);
DebouncedIn next(PTE5);
DebouncedIn menu(PTE4);
int C1=0x0E;
int C4=0x0C;
AnalogOut Aout(PTE30);
AnalogIn Ain(PTC2);
QEI leftQei(PTD6, PTD7, NC, 624);

int sp=0;
int kp=0;
int ki=0;
int kd=0;

int b;

int c=0;
int y=0;
float i; // set point
float j=0; // salida planta
float ji=0; //variable proceso interno
float spi=0; //variable proceso interno
float h=0; // entrada planta
float m=0; // Error
float mv=0;
float g=0;
float x=0;
float ap,ai,ad; 

//NECESITO COMPARACIÓN Y YA 
int pulsos (int x){

 
        if (leftQei.getPulses()>b){            
            x++;
            b=leftQei.getPulses();
             }      
        if (leftQei.getPulses()<b){            
            x--;
            b=leftQei.getPulses();
            if (x<0){
               x=0;
                    }
        }    
    return x;
} // Fin Int main función pulsos
 
 int main() {
    lcd.cls();
    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.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
    lcd.locate(0,0);
    lcd.printf("Sp: %d",sp);
 


 while(1) {
           if (next.falling()) {              
               ++c;
               }                                     //CAMBIO DE POSICIÓN ENCODER
           if (c==0){
               lcd.locate(3,0);
               lcd.putc(0xFE);           
               lcd.locate(4,0);
               lcd.printf("%d",sp);
                              
               sp=pulsos(sp);//revisar si puedo dejar sp
  
               //
           
                if(sp>999){
                sp=999;
                }
                
                //NEW !! (not zeros in -- process)
                if(sp<10){                
                lcd.locate(5,0);
                lcd.putc(0xFE);  
                        }
                        
                if(sp<100){                
                lcd.locate(6,0);
                lcd.putc(0xFE);  
                        }                             
                
                lcd.locate(4,0);
                lcd.printf("%d", sp);
                //wait(0.1);  
                 
               //    
                  
              }
           if (c==1) {
               lcd.locate(11,0);
               lcd.putc(0xFE);           
               lcd.locate(12,0);
               lcd.printf("%d",kp);
               kp=pulsos(kp); //revisar si puedo dejar kp
               
               //
           
                if(kp>999){
                kp=999;
                }
                
                //NEW !! (not zeros in -- process)
                if(kp<10){                
                lcd.locate(13,0);
                lcd.putc(0xFE);  
                        }
                        
                if(kp<100){                
                lcd.locate(14,0);
                lcd.putc(0xFE);  
                        }                             
                
                lcd.locate(12,0);
                lcd.printf("%d", kp);
                //wait(0.2);   
                 
               //    

              }
           if (c==2) {
               lcd.locate(3,1);
               lcd.putc(0xFE);               
               lcd.locate(4,1);
               lcd.printf("%d",ki);
               ki=pulsos(ki); //revisar si puedo dejar ki
               
               //
           
                if(ki>999){
                ki=999;
                }
                
                //NEW !! (not zeros in -- process)
                if(ki<10){                
                lcd.locate(5,1);
                lcd.putc(0xFE);  
                        }
                        
                if(ki<100){                
                lcd.locate(6,1);
                lcd.putc(0xFE);  
                        }                             
                
                lcd.locate(4,1);
                lcd.printf("%d", ki);
                //wait(0.2);   
                 
               //    
              
              }
           if (c==3) {
               lcd.locate(11,1);
               lcd.putc(0xFE);           
               lcd.locate(12,1);
               lcd.printf("%d",kd);
               kd=pulsos(kd); //revisar si puedo dejar kd
               
               //
           
                if(kd>999){
                kd=999;
                }
                
                //NEW !! (not zeros in -- process)
                if(kd<10){                
                lcd.locate(13,1);
                lcd.putc(0xFE);  
                        }
                        
                if(kd<100){                
                lcd.locate(14,1);
                lcd.putc(0xFE);  
                        }                             
                
                lcd.locate(12,1);
                lcd.printf("%d", kd);
                //wait(0.2);  
              } 
           if (c==4) {
               c=0;
               }                          
    
           if (menu.falling()){
                break;    
                              }
          } //While    

           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(2);
           lcd.cls();
           lcd.printf(" INICIA EL PID");
           wait(2);
           // se imprimen los parches del control  *****************************************
           
           i=sp/999;
           lcd.cls();
           lcd.printf("Er:%.2f",m);
           lcd.locate(8,0);
           lcd.printf("Me:%.2f",j);
           lcd.locate(0,1);
           lcd.printf("Sp:%d",sp);
           lcd.locate(8,1);
           lcd.printf("Co:%.1f",h);
           wait(2);
           
           //
        while(1) {
        
            spi=sp*(3.3/999);
            
        //wait(0.3);
              i=sp/999;
        if(i<=1){
       
        j=Ain;
        ji=j*3.3;
        m=(spi-ji);
        //n=m*100;
        ap=kp*m;
        ai=(ki*m)+ai;
        
        ad=kd*(m-mv);
        h=ap+ai+ad;
   
        if (h>999){
        h=999;
                   }
        if (h<0){
        h=0;
                   }
                              
        g=(h/999);
                                                       
        Aout=g;
        wait(0.22);
 
        
        lcd.cls();
        lcd.printf("Er:%.2f",m);
        lcd.locate(8,0);
        lcd.printf("Me:%.2f",j);
        lcd.locate(0,1);
        lcd.printf("Sp:%d",sp);
        lcd.locate(8,1);
        lcd.printf("Co:%.1f",h);
        }


        mv=m;
    } //While           
           //

          }//int main