PID + Teclas + LCD

Dependencies:   Debounced TextLCD mbed

main.cpp

Committer:
Equipo3JohnAndresx2
Date:
2015-04-10
Revision:
0:fd20467a764b

File content as of revision 0:fd20467a764b:

// Tarea Tres - Procesadores - 01-2015
// PID con opcion de incremento, decremento y cambio de posicion en LCD

// Se incluyen las librerias correspondientes para el codigo

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

// Caracterizacion de Puertos

AnalogIn Vin(PTC2);                                // Definicion de puerto para entrada analoga
AnalogOut Vout(PTE30);                             // Definicion del puerto para salida analoga
TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); 

DebouncedIn button1(PTC12);                        // Definicion del boton1 como boton para incrementar
DebouncedIn button4(PTC17);                        // Definicion del boton4 como boton de enter
DebouncedIn button3(PTC16);                        // Definicion del boton3 como boton de menu
DebouncedIn button2(PTC13);                        // Definicion del boton2 como boton para decrementar


int C1=0x0F;                                       // Pone el cursor 
int C4=0x0C;                                       // Quito el cursor bajo

// Deficion de las variables para el controlador PID


int ref=0;    // Incluimos la variable de referencia
int Cint=0;   // Incluimos la constante integral 
int Cder=0;   // Inlcuimos la constante derivativa
int Cpro=0;   // Incluimos la constante proporcional
int pos=0;   // Inlcuimos la variable de posicion en el LCD

int med;         // Medida de la señal
int er=0;      // Error en la medida
int Apid;       // Accion del PID
int Ai=0;         // Accion Integral
int Ad;         // Accion Derivativa
int Ap;         // Accion Proporcional
int ev;         // error viejo

int Int;
int FactEsc;    // Factor de Escalado
float pidn;

// Inicio de la funcion principal

int main()
{
    lcd.cls();                       // Inicio el LCD y lo limpio por ahí derecho
    lcd.writeCommand(C1);            // Se escribe segun el modulo del LCD
    lcd.locate(8,0);                // Me ubico en el LCD donde deseo imprimir
    lcd.printf("FactEsc =%d", FactEsc);    // Se Presenta el factor de escalado(FactEsc)
    lcd.locate(0,1);
    lcd.printf("Pro =%d", Cpro);     // Se presenta la contante proporcional(Cpro)
    lcd.locate(6,1);
    lcd.printf("Int =%d", Cint);     // Se presenta la constante integrativa(Cint)
    lcd.locate(11,1);
    lcd.printf("Der =%d", Cder);     // Se presenta la constante derivativa(Cder)
    lcd.locate(0,0);
    lcd.printf("Ref=%d", ref);      // Se presenta el valor de la referencia (ref)

    while(1)
    {
        if (button1.falling())    // Boton de incremento
        {
            
            if (pos==1)
            {
                ++ref;
                lcd.locate(3,0);
                lcd.printf("   ");
                lcd.locate(3,0);
                lcd.printf("%d", ref);
            }
            else if (pos==2)
            {
                ++Int;
                if (Int==1){
                 FactEsc =1;}
                if (Int==2){
                 FactEsc =10;}
                if (Int==3){
                 FactEsc =100;
                 Int=0;} 
                
                lcd.locate(11,0);
                lcd.printf("   ");
                lcd.locate(12,0);
                lcd.printf("   "); 
                lcd.locate(13,0);
                lcd.printf("   ");
               
                 
                lcd.locate(11,0);
                lcd.printf("%d", FactEsc);
            }
            else if (pos==3)
            {
                ++Cpro;
                lcd.locate(2,1);
                lcd.printf("   ");
                lcd.locate(2,1);
                lcd.printf("%d", Cpro);
            }
            else if (pos==4)
            {
                ++Cint;
                lcd.locate(8,1);
                lcd.printf("   ");
                lcd.locate(8,1);
                lcd.printf("%d", Cint);
            }
             else if (pos==5)
            {
                ++Cder;
                lcd.locate(13,1);
                lcd.printf("   ");
                lcd.locate(13,1);
                lcd.printf("%d", Cder);
            }
        }
        
        if (button2.falling())         // Boton de decremento
        {
            
            if (pos==1)
            {
                if (ref==0)  // no mostrar nada
                {
                }
                else
                {
                    --ref;
                    lcd.locate(3,0);
                    lcd.printf("   ");
                    lcd.locate(3,0);
                    lcd.printf("%d", ref);
                }
            }
         
            if (pos==3)
            {
                if (Cpro==0)  // no mostrar nada
                {
                }
                else
                {
                    --Cpro;
                    lcd.locate(2,1);
                    lcd.printf("   ");
                    lcd.locate(2,1);
                    lcd.printf("%d", Cpro);
                }
            }
            if (pos==4)
            {
                if (Cint==0)  // no mostrar nada
                {
                }
                else
                {
                    --Cint;
                    lcd.locate(8,1);
                    lcd.printf("   ");
                    lcd.locate(8,1);
                    lcd.printf("%d", Cint);
                }
            }
             if (pos==5)
            {
                if (Cder==0)  // no mostrar nada
                {
                }
                else
                {
                    --Cder;
                    lcd.locate(13,1);
                    lcd.printf("   ");
                    lcd.locate(13,1);
                    lcd.printf("%d", Cder);
                }
            }
        
        
        if (button3.falling())   // Boton de menu 
        {         
            if (pos==1)
            {
                ++pos;
                lcd.locate(11,0);
                lcd.printf("%d", FactEsc);       
            }
            else if (pos==2)
            {
                ++pos;
                lcd.locate(2,1);
                lcd.printf("%d", Cpro);
                lcd.locate(2,1);               
            }
            else if (pos==3)
            {
                ++pos;
                lcd.locate(8,1);
                lcd.printf("%d", Cint);               
            }
            else if (pos==4)
            {
                ++pos;
                lcd.locate(13,1);
                lcd.printf("%d", Cpro);              
            }
             else if (pos==5)
            {
                pos=1;
                lcd.locate(3,0);
                lcd.printf("%d", ref);                            
            }
          
        }
      

        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("  GRABADOS!"); 
           wait(1);
           lcd.cls();
           lcd.printf(" EMPIEZA EL PID");
           wait(1);
           // se imprimen los parches del control  *****************************************
           lcd.cls();
           lcd.printf("Error=%d",er);   // imprime el error de la medida(error)
           lcd.locate(8,0);
           lcd.printf("Med=%d",med);   // imprime la medida de la señal(med)
           lcd.locate(0,1);
           lcd.printf("Ref=%d",ref);    // imprime la referencia (ref)
           lcd.locate(8,1);
           lcd.printf("AC=%d",Apid);   // imprime el la Accion de control del pid (AC)
           wait(1);
           
           // CICLO PRINCIPAL CONTROLADOR PID
            // DEFINIMOS LOS PARAMETROS Kp,Ki y Kd teniendo en cuenta la escala 
            
           Cpro= Cpro*FactEsc;
           Cint = Cint*FactEsc;
           Cder= Cder*FactEsc;
           
           cicloPID :
           
           med=10*Vin.read();                  //Lee el puerto analogo y asigna el valor leiro
           er = (ref-med);                     // halla en error de entre la medida y la referencia
           Ap= Cpro*er;                        // calculo de la accion proporcional
           Ai=(Cint*er)+Ai;                      //calculo de la accion  integral
           Ad = Cder*(er-ev);                 //calculo de la accion derivativa
           Apid = (Ap+Ai+Ad);                   // es la señal de control que nos da el PID
           
           if (Apid < 0){            // limite inferior de la accion de control
           Apid=0;
           } 
           if (Apid > 99){          // limite superiro de la accion de control
           Apid=100;
           } 
           
           wait(.5);
           if(error >= 0){
            lcd.locate(4,0);
           lcd.printf(" ");
           lcd.locate(3,0);
           lcd.printf("%d",er);      // Muestro el error
           }
           if (error<0){
               lcd.locate(3,0);
           lcd.printf("%d",er);  // Muestro el error
               }
           lcd.locate(12,0);
           lcd.printf(" ");
           lcd.locate(11,0);
           lcd.printf("%d",med); // imprime el valor de la medición 
           lcd.locate(3,1);
           lcd.printf("%d",ref);  // imprime el valor de la referenica
           
           if(Apid < 100){
           lcd.locate(13,1);
           lcd.printf(" ");
           lcd.locate(11,1);
           lcd.printf("%d",Apid);}   // imprime el valor de la señal de control
           
           if(Apid >= 100){
           lcd.locate(11,1);
           lcd.printf("%d",Apid);}   // imprime el valor de la señal de control
           
           ev = er;  
           pidn=Apid*0.01;           //Normalizacion de la salida
           Vout.write(pidn);        //se envia el valor pid a puerto analogico de salida (D/A)
           wait(0.005);  
        goto cicloPID ;              
  
    }   
    }