PID con android

Dependencies:   mbed

main.cpp

Committer:
dsuranr
Date:
2019-07-24
Revision:
0:d890d56973d1
Child:
1:e076d163a730

File content as of revision 0:d890d56973d1:

#include "mbed.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"


Serial GSM(PTE0,PTE1);  //puertos del FRDM para el modem
Serial pc(USBTX,USBRX); //puertos del PC

float pid,o,ai,ad,ap,med,err,pwm;
float err_v;
float KPNII,KDNII,kdnum=0;
float kpnum=0,kinum=0,ok=0;
float spnum=0.0;
float AP=1;
float h=0;
char P;

char buffer[21];// TAMAÑO DEL BUFER
char bufferB[5];
char KPC[4],KDC[4];
char KPCII[4],KDCII[4];
char *cadena = "";
char r[]="";

Timer t;   //VALOR DEL TIEMPO
int count;
int i = 0;
int c=0;


DigitalOut LedRojo(LED1);
DigitalOut LedVerde(LED2);
DigitalOut LedAzul(LED3);
//PwmOut led(PTA13);

AnalogIn y(PTB3);//entrada analoga

//PwmOut u(PTE30);
PwmOut led(PTA13);




int readBuffer(char *buffer,int count)   //esta funcion lee un bufer de datos
{
    int i=0;
    t.start();    //CUENTA EL TIEMPO DE CONEXION E INICIA
    while(1) {
        while (GSM.readable()) {
            char c = GSM.getc();

            if (c == '\r' || c == '\n') c = '$';//si se envia fin de linea o de caracter inserta $
            buffer[i++] = c;//mete al bufer el caracter leido
            if(i > count)break;//sale del loop si ya detecto terminacion
        }
        if(i > count)break;
        if(t.read() > 1) {  //MAS DE UN SEGUNDO DE ESPERA SE SALE Y REINICA EL RELOJ Y SE SALE
            t.stop();
            t.reset();
            break;
        }
    }
    return 0;
}

void cleanBuffer(char *buffer, int count)  //esta funcion limpia el bufer
{
    for(int i=0; i < count; i++) {
        buffer[i] = '\0';
    }
}


int main(void)
{
LL:
    AP=0;
    LedVerde=1;
    LedRojo=1;
    LedAzul=1;
    LedVerde=0;
    wait(2);   //PRENDE EL LED VERDE POR 2 SEGUNDOS
    LedVerde=1;

    led.period(0.005f);      // 4 second period
    led.write(0.40f);      // 50% duty cycle, relative to period

    pc.printf("SI VOLVI");
    while(1) {

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////
        LedAzul=0;
        /*pc.printf(" \n");
        pc.printf("CONTROLADOR PID (pc) \n");
        pc.printf("Ingrese el parametro a modificar KP , KD, KI, SP(SetPoint) ) \n" );
        pc.printf("Escriba M para mirar los parametros del PID \n");
        pc.printf("Escriba OK para Iniciar PID \n");
        pc.printf(" \n");
        ///////////////////////////////////////////////////////////////////////////////////////////////////
          */
pc:
        if (GSM.readable()) {
            readBuffer(buffer,25);



            GSM.scanf("%f, %f, %f , %f , %f, %f, %f ", &spnum, &kpnum, &kdnum,&kinum,&AP,&pwm,&h);
            //GSM.scanf("%f ", &spnum);
            // pc.printf("buffer= %C  %c\n\r ",buffer);//imprime el cero y el uno
            pc.printf("buffer= %s  ",buffer);//imprime el cero y el uno
            //    pc.printf("buffer= %d , %d , %d  ",buffer[0]+buffer[1]+buffer[2]);//imprime el cero y el uno

            pc.printf("\n SP = %f \n", spnum);
            pc.printf("\n KP = %f \n", kpnum);
            pc.printf("\n KD = %f \n", kdnum);
            pc.printf("\n Ki = %f \n", kinum);
            pc.printf("\n AP = %f \n", AP);
            pc.printf("\n pwm = %f \n", pwm);
            pc.printf("\n h = %f \n", h);
            //cleanBuffer(buffer,15);


            pc.printf("ESTOY ACA");
            //if(ok==1){
lop1:
            //cleanBuffer(buffer,15);
            LedAzul=1;
            wait(1);
            LedAzul=0;


            med = y.read()*3.3;
            err = (spnum-med);  //se calcula el error
            ap = kpnum*err*0.01f;     //se calcula la accion proporcinal
            ai =(kinum*err*0.01f)+ai;    //calculo de la integral del error
            ad = kdnum*(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 la valor maximo *****************
            if (pid > 3.3) {
                pid=3.3;

            }




            pc.printf("ERROR=   %0.01f  ",err);
            pc.printf("    ");
            pc.printf("MEDICION=   %0.01f ",med);
            pc.printf("    ");
            pc.printf("SETPOINT= %0.01f  ",spnum);
            pc.printf("    ");
            pc.printf("PID=  %0.01f \r\n ",pid);
            pc.printf("    ");
            pc.printf("pwm= %0.01f  ",pwm);
            pc.printf("    ");


            //Normalizacion de la salida
            // se actualizan las variables *******************************************
            err_v = err;
            o = pid/3.3;


            if(AP==1) {
                AnalogOut u(PTE30);
                u.write(o);
                pc.printf("analogo");

            } else if(AP==2) {
                PwmOut u1(PTE20);
                u1.write(pwm);
                pc.printf("digital");

            }


            int med2=med*100;

            int p, q, r;
            if(med2<3.3) {          //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras)
                GSM.putc(0);     //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
                GSM.putc(p);     //luego la cifra menos significativa
            }
            if(med2>3.3) {         //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma
                q=med2/3.3;       //calculo la cifra mas significativa
                r=med2-q*3.3;     //calculo la cifra menos significativa
                GSM.putc(q);   //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
                GSM.putc(r);   //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
            }

            //goto lop1;
              
            if (GSM.readable()) {
                readBuffer(buffer,25);
                if (strncmp(buffer, "F", 1) == 0) {

                    ok=0;
                    goto LL;

                    //goto pc;
                    //cleanBufferB(bufferB,5);
                //} else if(strncmp(buffer, "P", 1) == 0) {
                    } else if(h==1) {
                // pc.printf("%s buffer", buffer);
                 //GSM.scanf(" %f, %f , %f , %f, %f ,%f,", &spnum, &kpnum, &kdnum,&kinum,&AP,&pwm);
                  
pw:
           

                    if(AP==1) {
                        AnalogOut u(PTE30);
                        u.write(o);
                        pc.printf("analogo");

                    } else if(AP==2) {
                        PwmOut u1(PTE20);
                        u1.write(pwm);
                        pc.printf("digital");

                    }


                    //int med2=med*100;
                    float med2=med;
                    float med3;
                   // med3 = y.read();
                    med3=pwm;
                    int p, q, r;
                    if(med3<3.3) {          //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cifras)
                        GSM.putc(0);     //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
                        GSM.putc(p);     //luego la cifra menos significativa
                    }
                    if(med3>3.3) {         //pero si es mayor a 255 las cifras deben ser convertidas a un hex de dos bytes de la siguiente forma
                        //q=med2/3.3;       //calculo la cifra mas significativa
                        //r=med2-q*3.3;     //calculo la cifra menos significativa
                        q=med3 ;      //calculo la cifra mas significativa
                        r=med3-q*3.3;
                        GSM.putc(q);   //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
                        GSM.putc(r);   //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
                    }


                    pc.printf("MEDICION=   %0.01f \n",med3);
                    pc.printf("    ");
                    pc.printf("pwm= %0.01f  \n",pwm);
                    pc.printf("    ");
                    pc.printf("buffer= %s  ",buffer);//imprime el cero y el uno
                     wait_ms(600);

                   if (GSM.readable()) {
                readBuffer(buffer,25);
                if (strncmp(buffer, "F", 1) == 0) {

                    ok=0;
                    goto LL;


                   }
                   } 



                //}
                goto pw;
               wait_ms(300);
                
            } else {
                wait_ms(300);
                goto lop1;
            }
        } else {
            wait_ms(300);
            goto lop1;
        }

        //  se envia el valor pid a puerto analogico de salida (D/A) **************

        //  se repite el ciclo


        // } // DEL IF OK
        goto pc;
    } // del if DE LOS DATOS
    //goto pc;



    // cleanBuffer(buffer,10);


} //WHILE



}//INT