This program makes a PID control and the values por control action are entered by quadrature encoder.

Dependencies:   DebouncedIn QEI TextLCD mbed

main.cpp

Committer:
lcorralesc1
Date:
2013-12-15
Revision:
0:8e9ddfd2cbe2

File content as of revision 0:8e9ddfd2cbe2:

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


TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
QEI wheel (PTA1, PTA2, NC, 50);

AnalogIn y(PTC2);
AnalogOut u(PTE30);

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DebouncedIn button1(PTC7);
DebouncedIn button2(PTC13);
DebouncedIn button3(PTC0);
DebouncedIn button4(PTC17);

      //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, med2, yr, cycle, c; 
float pid, med, ap, ai, ad, err, err_v;

int main() {
    lcd.cls();
    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);
  
        
    while(1) {
    
              led3 =1;
           if (button3.falling()) {   //INCREMENTA POSICION DEL MENU CON BOTON 3 (Switche encoder)
              led3 =!led3;              
               ++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);
               lcd.printf("%d",sp);
               wait(0.2);
               
               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);
               lcd.printf("%d",kp);
               wait(0.2);
               
               if(button3.falling()){
                 j=2;
                 led3=0;
                 wait(0.3);
                 wheel.reset();    
                                    }
                                           
                      }
              
           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);
               lcd.printf("%d",ki);
               wait(0.2);
               
               if(button3.falling()){
                 j=3;
                 led3=0;
                 wait(0.3);
                 wheel.reset();
                                    }
                                    
                     }
                     
           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);
               lcd.printf("%d",kd);
               wait(0.2);
               
               if(button3.falling()){
                 j=0;
                 led3=0;
                 wait(0.3);
                 wheel.reset();
                                    }
                                            
                       } 
            
           if (j==4) {
               j=0;
                     }                          
                     
           if (!button4){
           break;        //sale del bucle si pisan suiche4
                        }                  
              }          //cierro while(1)
//%---------------------------------------------------------------------              
              
              
           lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
           lcd.cls(); //borra la pantalla
           lcd.printf("GUARDAMOS \nVALORES |m|"); 
           wait(2);
           lcd.cls();
           lcd.printf(" INICIA EL PID");
           wait(2);
           lcd.cls();
           
           // se imprimen los parches del control  *****************************************
           lcd.locate(0,0);
           lcd.printf("Er%d",err);
           lcd.locate(8,0);
           lcd.printf("Me%d",med2);
           lcd.locate(0,1);
           lcd.printf("Sp%d",sp);
           lcd.locate(8,1);
           lcd.printf("Con%d",pid);
           //wait(3); 
           
           
           // CICLO PRINCIPAL CONTROLADOR PID
           
           while(1) {
           //leer puerto analogo y asignar a med
           med=y.read();       
           med2=med*100;                   
           err=(sp-med2);
           
           float kpf;
           kpf=kp*0.001;
           ap = kpf*err;
           float kif;
           kif=ki*0.001;
           ai =(kif*err)+ai;
           float kdf;
           kdf=kd*0.0001;
           ad = kdf*(err-err_v);
           err_v=err;
           pid = (ap+ai+ad);
           
           // se verifica que pid sea menor o igual la valor maximo *****************
           if (pid > .99999){
             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>0.5){
             ai =0.5;    
                     }
           
           u=pid;
           
           //****se muestran las variables******************************************
          if(c>600){           
           lcd.locate(2,0);
           lcd.printf("      "); 
           lcd.locate(0,0);
           lcd.printf("Er%2.2f",err);
           lcd.locate(10,0);
           lcd.printf("      ");
           lcd.locate(8,0);
           lcd.printf("Me%d",med2);
           lcd.locate(2,1);
           lcd.printf("      ");
           lcd.locate(0,1);
           lcd.printf("Sp%d",sp);
           lcd.locate(10,1);
           lcd.printf("      ");
           lcd.locate(8,1);
           lcd.printf("Con%4.3f",pid);
           c=0;
           }
           else 
           c++;          
           
           }
           
           
            
}