PID simple

Dependencies:   DebouncedIn TextLCD2 mbed

main.cpp

Committer:
JuanC
Date:
2013-12-13
Revision:
0:535d93f18f39

File content as of revision 0:535d93f18f39:

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

AnalogIn AI(PTC2);
AnalogOut AO(PTE30);
TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // Rs, E, D4-D7

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DebouncedIn button1(PTC12);
DebouncedIn button2(PTC13);
DebouncedIn button3(PTA1);
DebouncedIn button4(PTC16);

Timer t;
int flag;


/* Definiendo variables Globales */

int C1=0x0E; // solo muestra el curzor
int C2=0x18; // desplaza izquierda
int C3=0x1A; // desplaza derecha
int C4=0x0C;    // Quita cursor bajo
int i;         // índice de la variable
int j;
int kp, ki, kd, sp, cycle;
int ap, ai, ad, err, PV, pid, err_v;
/* Programa fundamental*/


int main()
{
    /* Imprimir en Pantalla Los labels y valores=? de
     * los parametros del PID
     */

    lcd.cls();      //Borra la Pantalla
    lcd.printf("Sp%d",sp);
    lcd.locate(8,0);    //sistema coordenado para posicionar en pantalla
    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
    /*  No me cuadra muy bien la
     *  lectura de los valores (consultar en las otras tareas)
     */
    lcd.locate(0,0);
    lcd.printf("Sp%d",sp);

    /* Ciclo while para alterar los valores de los parametros*/
    while (1)
    {
        if (button3.falling()) //Boton con flanco de caida
        {
            ++j;
        }
        if (j==0)  //Este if realiza dos revisiones y actua solo en este valor (SP)
        {
            lcd.locate(2,0);
            lcd.printf("%d",sp); //sigo con la inquietud del write lectura
            if (button1.falling())
            {
                ++sp;
            }
            if (button2.falling())
            {
                --sp;
            }
        }
        if (j==1)  //Verificar si estos if son mas efectivos quetus Whiles Tarea1
        {
            lcd.locate(10,0);
            lcd.printf("%d",kp);
            if (button1.falling())
            {
                ++kp;
            }
            if (button2.falling())
            {
                --kp;
            }
        }
        if (j==2)
        {
            lcd.locate(2,1);
            lcd.printf("%d",ki);
            if (button1.falling())
            {
                ++ki;
            }
            if (button2.falling())
            {
                --ki;
            }
        }
        if (j==3)
        {
            lcd.locate(10,1);
            lcd.printf("%d",kd);
            if (button1.falling())
            {
                ++kd;
            }
            if (button2.falling())
            {
                --kd;
            }
        }
        if (j==4)  //Este if realiza dos revisiones y actua solo en este valor (SP)
        {
            j=0;
        }
        if (button4.falling())
        {
            break;     //Salir de este ciclo while
        }
    }
    /* Interaccion y avisos al usuario de sistema listo!!*/
    lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
    lcd.cls();
    lcd.printf("DATOS GUARDADOS");
    wait(2);
    lcd.cls();
    lcd.printf("INICIA EL PID");
    wait(2);
    lcd.cls();
    /* Imprimir los labels de algunas variables y parametros  de Control en Ejecucion */
    lcd.printf("Er%g",err);
    lcd.locate(8,0);
    lcd.printf("Me%g",PV);
    lcd.locate(0,1);
    lcd.printf("SP%d",sp);
    lcd.locate(8,1);
    lcd.printf("Co%g",pid);
    /*Ziegler–Nichols_method*/
    /*kp=((kp*3.3)/(kp*4.5));
    ki=2*kp;
    kd=kp/8*/;
    wait(.5);
    
    /* Ciclo while contiene el codigo especifico rutiona del PID*/
    while (1)
    {
        /* pilas con leer el puerto analogo y asignarlo a med*/
        PV = AI.read();
        PV =PV*1000;
        err =sp-PV;
        err=err/100;
        ap=kp*err;  //Proporcional incremento en funcion del error Parte P
        ai=(ki*err)+ai; //Acumula los errores Parte I
        ad=kd*(err-err_v); // tiene en cuenta el delta del error Parte D
        pid=ap+ai+ad; // comentar esta y ponerla despues de comentar los ifs
        if (ai>999)
        {
            ai=1000;
        }
        else if (pid<0)
        {
            pid=0;
        }
        AO.write(pid/1000);
        if(flag==0)
        {
            t.start();
            flag=1;
        }
        
        //AO=pid;
        if (t>0.3)
        {
        /* Imprimir algunas variables y parametros  de Control en Ejecucion */
            lcd.locate(2,0);
            printf("%g",err);
            lcd.locate(2,1);
            printf("%d",sp);
            lcd.locate(10,0);
            printf("%g",PV);
            lcd.locate(10,1);
            printf("%g",pid);
            t.reset();
            flag=0;
            wait(.3);
         }
     
        err_v = err;
       
        
    }


}