Controlador PID Digital para una planta de Primer Orden RC, con comunicación serial para ingreso de parámetros del controlador y actualización de las variables del sistema.

Dependencies:   mbed

main.cpp

Committer:
Giovani_Cardona
Date:
2019-06-12
Revision:
0:87552d9a8512

File content as of revision 0:87552d9a8512:

#include "mbed.h"
#include "string.h"

AnalogIn y(PTB3);//entrada analoga
AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer
//si se ignora esto se arruina la FRDMKL25Z
Serial pc(USBTX, USBRX, "pc");
Serial HC06(PTE0,PTE1);

char buffer[128];
int readptr = 0;
int Kp, Ki, Kd, Sp;
float pid,o,ai,ad,ap,med,err;
float err_v;
int checker1, checker2, checker3, checker4;

int main(){
    char c;
    
// Bluetooth
    HC06.baud(9600);
    HC06.printf("CONTROLADOR PID BLUETOOTH\n");

// Interfaz para el pc
    pc.printf("***********************************************\n");
    pc.printf("CONTROLADOR PID \n");
    pc.printf("***********************************************\n");
    pc.printf("* Menu para los parametros del controlador PID: \n\n");
    pc.printf("* Kp - Ingresar valor de la consotante proporcional \n");
    pc.printf("* Ki - Ingresar valor de la consotante integral \n");
    pc.printf("* Kd - Ingresar valor de la consotante derivativa \n");
    pc.printf("* Sp - Ingresar valor del Set-Point \n\n");
        
    while(1){
        
        // Analizamos lo que ingresa el usuario
        while( (c = pc.getc()) != '\n') {
            buffer[readptr++] = c;
        }
        buffer[readptr++] = 0;
        
        //pc.printf("buffer= %s\n\r ",buffer);  //imprime el bufer
        //pc.printf("buffer= %c  %c\n\r ",buffer[0],buffer[1]);//imprime el cero y el uno
        
        //////////////////////////////////////////
        
        if (strncmp(buffer, "Kp", 2) == 0) {
            //Se lee el valor para Kp
            pc.printf("Ingrese el valor para Kp: ");
            pc.scanf("%d", &Kp);
            checker1=1;
        }
        else if (strncmp(buffer, "Ki", 2) == 0) {
            //Se lee el valor para Ki
            pc.printf("Ingrese el valor para Ki: ");
            pc.scanf("%d", &Ki);
            checker2=1;
        }
        else if (strncmp(buffer, "Kd", 2) == 0) {
            //Se lee el valor para Kd
            pc.printf("Ingrese el valor para Kd: ");
            pc.scanf("%d", &Kd);
            checker3=1;
        }
        else if (strncmp(buffer, "Sp", 2) == 0) {
            //Se lee el valor para Sp
            pc.printf("Ingrese el valor para Sp: ");
            pc.scanf("%d", &Sp);
            if(Sp<=0){Sp=0;}
            if(Sp > 999){Sp=999;}
            checker4=1;
        }
        else {
            pc.printf("Syntax error \n");       
        }
        readptr = 0;
        
        if (checker1 == 1 && checker2 == 1 && checker3 == 1 && checker4 == 1 ){
            pc.printf("Parametros listos para iniciar \n");
            pc.printf("*************************************\n");
            pc.printf("Iniciar ahora (Si/No) \n");
            
            //Se lee la elección del usuario
           while(1){
                while( (c = pc.getc()) != '\n') {
                    buffer[readptr++] = c;
                }
                buffer[readptr++] = 0;
                
                if (strncmp(buffer, "Si", 2) == 0){
                    pc.printf("* Ingrese 'P' si desea cambiar el Set Ponit  \n\n");
                    pc.printf("Iniciando... \n\n");
                    wait_ms(1000);
                    break;
                }  
                else{
                    pc.printf("Iniciar ahora (Si/No) \n");
                }
            readptr = 0;
            }
            break;
        }else{
            pc.printf("*************************************\n");
            pc.printf("Ingrese los valores restantes \n");
            pc.printf("*************************************\n");
            }
        pc.printf("\n");
    }
    
    // CICLO PRINCIPAL CONTROLADOR PID
    
    lop1:  
        med = y.read()*999;
        err = (Sp-med);  //se calcula el error
        ap = Kp*err*0.01f;     //se calcula la accion proporcinal
        ai =(Ki*err*0.01f)+ai;    //calculo de la integral del error
        ad = Kd*(err-err_v)*0.01f; //calculo de la accion derivativa
        pid = (ap+ai+ad);
        // se verifica que pid sea positivo **************************************
        if(pid<=0)
        {
            pid=0;
        }

        // se verifica que pid sea menor o igual al valor maximo *****************
        if (pid > 999)
        {
            pid=999;
        }
        
        //Normalizacion de la salida
        // se actualizan las variables *******************************************
        err_v = err;
        o = pid/999;
        u.write(o); //  se envia el valor pid a puerto analogico de salida (D/A) **************
        
        pc.printf("SetPoint\tEntrada\t\tError\t\tSalida\n");
        pc.printf("%d\t\t%0.2f\t\t%0.2f\t\t%0.2f\n",Sp,med,err,pid);
        pc.printf("%0.2fV\t\t%0.2fV\t\t%0.2fV\t\t%0.2fV\n\n",((Sp*3.3)/1000),((med*3.3)/1000),((err*3.3)/1000),((pid*3.3)/1000));
        
        HC06.printf("SetPoint: %d       %0.2fV\n\r",Sp,((Sp*3.3)/1000));
        HC06.printf("Entrada:  %0.2f    %0.2fV\n\r",med,((med*3.3)/1000));
        HC06.printf("Error:    %0.2f    %0.2fV\n\r",err,((err*3.3)/1000));
        HC06.printf("Salida:   %0.2f    %0.2fV\n\r",pid,((pid*3.3)/1000));
        HC06.printf("\n\r");
        
        ////-----------------------Nuevo Setpoint-------------------------------------------
        if(pc.readable()){
            if ((c = pc.getc()) == 'P') {
                buffer[readptr++] = c;
            }
            buffer[readptr++] = 0;
            //pc.printf("buffer= %s\n\r ",buffer);  //imprime el bufer
            //pc.printf("buffer= %c  %c\n\r ",buffer[0],buffer[1]);//imprime el cero y el uno
        }
        if (strncmp(buffer, "P", 1) == 0){
            buffer[0]='\0';
            pc.printf("* Ingrese el nuevo SetPoint: ");
            pc.scanf("%d", &Sp);
            if(Sp<=0){Sp=0;}
            if(Sp > 999){Sp=999;}
            pc.printf("Iniciando... \n\n");
            wait_ms(1000);
        }  

        readptr = 0;
        /////------------------------------------------------------------------
        
        //  se repite el ciclo
        wait_ms(500);
        goto lop1;
}