Entrega numero 2 del curso procesadores 2019-2

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
diavad
Date:
Fri Jun 14 20:50:38 2019 +0000
Commit message:
Entrega numero 2 procesadores 20191

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 55be7cc4ef10 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jun 14 20:50:38 2019 +0000
@@ -0,0 +1,248 @@
+#include "mbed.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define BT_RX PTE1
+#define BT_TX PTE0
+
+/*Alvaro Javier Vargas Miranda
+Guillermo Luna Rozo
+Santiago Yepes Montoya
+Juan David Cordoba Giraldo
+Susana Buriticá Mejía*/
+
+DigitalOut lRed(LED1);
+DigitalOut lGrn(LED2);
+DigitalOut lBlu(LED3);
+
+AnalogIn AnInput(PTB0);
+AnalogOut  AnOut(PTE30);
+PwmOut pwmOut(PTE20);
+
+Serial PC(USBTX, USBRX); // tx, rx
+Serial BT(BT_TX, BT_RX); // Serial para el Bluetooth
+
+/* Variables Globales */
+// Parametros del PID sintonizado
+float cKp=1.432f;
+float cKi=25.95f;
+float cKd=0.0f;
+float cRf=1.0f;
+float out,ai,ad,ap,med,err,err_v,uPID;
+int Ts=250;
+bool continuo = true;
+
+char buffer[5]; //Buffer para almacenar los msjs del usuario
+char dbg[100]="";
+
+void cleanBuffer(char *buffer)
+{
+    for(int i=0; i< 5; i++) {
+        buffer[i]='\0';
+    }
+}
+
+void printMenuBT(void)
+{
+    char Menu1[] =   "|********** CONTROLADOR PID ***********|\n";
+    char Menu2[] =   "|*                                    *|\n";
+    char Menu3[] =   "|( P ) -- Ingresar parametros del PID *|\n";
+    char Menu4[] =   "|( I ) -- PID con DCA                 *|\n";
+    char Menu5[] =   "|( W ) -- PID con PWM                 *|\n";
+    char Menu6[] =   "|( S ) -- Apagar la salida            *|\n";
+    char Menu7[] =   "|*                                    *|\n";
+    char Menu8[] =   "|**************************************|\n";
+
+    //Impresion del Menu
+
+    BT.printf("\n%s",Menu1);
+    BT.printf("%s",Menu2);
+    BT.printf("%s",Menu3);
+    BT.printf("%s",Menu4);
+    BT.printf("%s",Menu5);
+    BT.printf("%s",Menu6);
+    BT.printf("%s",Menu7);
+    BT.printf("%s",Menu8);
+}
+
+void enterPIDParameters(void)
+{   
+    bool ready=false;
+    float kp,ki,kd;
+    float ref;
+    char ans[5];
+
+    BT.printf("Ingrese los parametros del controlador.\n\r");
+    while(ready == false) 
+    {
+        BT.printf("PID valores actuales\nKp=%1.4f ki=%1.4f kd=%1.4f Ref=%1.4f\n",cKp,cKi,cKd,cRf);
+        BT.printf("Kp >> ");
+        BT.scanf("%f",&kp);
+        BT.printf("Ki >> ");
+        BT.scanf("%f",&ki);
+        BT.printf("Kd >> ");
+        BT.scanf("%f",&kd);
+        BT.printf("Ref [0 - 3.3]>> ");
+        BT.scanf("%f",&ref);
+
+        BT.printf("Nuevos Valores\nKp=%1.4f Ki=%1.4f Kd=%1.4f Ref=%1.4f\n",kp,ki,kd,ref);
+        BT.printf("Desea continuar? (S/n), (Q) para salir ");
+        BT.scanf("%s",ans);
+        PC.printf("Llego %s \n",ans);
+        
+        if(strncmp(ans,"S",1)==0 || strncmp(ans,"s",1)==0 || strncmp(ans,"q",1)==0 ||strncmp(ans,"Q",1)==0) {
+            PC.printf("Entre\n");
+            ready = true;
+        }
+    }
+    if(strncmp(ans,"S",1)==0 || strncmp(ans,"s",1)==0){
+        cKp = kp;
+        cKi = ki;
+        cKd = kd;
+        cRf = ref;
+        lRed=0;
+        lGrn=0;
+        BT.printf("PID valores\nKp=%1.2f ki=%1.2f kd=%1.2f Ref=%1.2f\n",cKp,cKi,cKd,cRf);
+    }
+    
+}
+
+// CICLO PRINCIPAL CONTROLADOR PID
+
+void controlPID(){
+    med = AnInput.read()*999;   //Medicion de la salida
+    err = cRf*(999/3.3f) - med; //calculo del error
+    ap = err*cKp*0.01f;         //Calculo accion proporcional
+    ai = ai+(err*cKi*0.01f);    //Calculo accion integral
+    ad = (err-err_v)*(cKd)*0.01f;//Calculo   de la accion derivativa 
+    uPID=ap+ai+ad;              //Calculo de la accion de control
+    if(uPID<=0){uPID=0;}        //Saturador inferior
+    if(uPID>=999){uPID=999;}    //Saturador superior
+    err_v = err;                //Actualizacion de error
+    out=uPID*(3.3f/999);        //Conversion de voltaje a accion de control
+    AnOut.write(out);           //Escritura de accion de control
+    BT.printf("Ref=%fv Error=%fv Ucontrol=%fv\n\r",cRf,err/999,out);
+}
+
+void controlPIDpwm(){
+    med = AnInput.read()*999;   //Medicion de la salida
+    err = cRf*(999/3.3f) - med; //calculo del error
+    ap = err*cKp*0.01f;         //Calculo accion proporcional
+    ai = ai+(err*cKi*0.01f);    //Calculo accion integral
+    ad = (err-err_v)*(cKd)*0.01f;//Calculo   de la accion derivativa 
+    uPID=ap+ai+ad;              //Calculo de la accion de control
+    if(uPID<=0){uPID=0;}        //Saturador inferior
+    if(uPID>=999){uPID=999;}    //Saturador superior
+    err_v = err;                //Actualizacion de error
+    out=uPID*(3.3f/999);        //Conversion de voltaje a accion de control
+    pwmOut.write(out);           //Escritura de accion de control
+    BT.printf("Ref=%fv Error=%fv Ucontrol=%fv\n\r",cRf,err/999,out);
+}
+
+
+void LeerBuffer(char *buffer)
+{
+    int i= 0;
+    while (BT.readable()) {
+        char c = BT.getc();
+        if (c == '\r' || c == '\n' || c == '\t') c = '$';//si se envia fin de linea o de caracter inserta $
+        buffer[i++] = c;//mete al bufer el caracter leido
+    }
+}
+
+
+void executePIDControl()
+{
+    PC.printf("Entre al PID\n");
+    //Capturamos los parametros del controlador
+    bool run=true;
+    out=0;ai=0;ad=0;ap=0;med=0;err=0;err_v=0;uPID=0;
+    while(run == true) {
+        lRed=1;
+        lGrn=0;
+        if(continuo){controlPID();}
+        else{controlPIDpwm();}
+        wait_ms(Ts);
+        LeerBuffer(buffer);
+        if(buffer[0]=='d' || buffer[0]=='D' || buffer[1]=='d' || buffer[1]=='D') {
+            run = false;
+        }
+        cleanBuffer(buffer);
+    }
+}
+
+
+int main()
+{
+    BT.baud(9600);
+    AnOut.write(0.0f);
+    pwmOut.write(0.0f);
+    lRed = 1;
+    lBlu = 1;
+    for(int i = 0; i<3; i++) {
+        /* Parpadeo de LEDS para indicar el inicio*/
+        lGrn = 0;
+        wait(0.25);
+        lGrn = 1;
+        wait(0.25);
+    }
+    PC.printf("\nProgram Start!\n");
+
+    /*Led en naranja para indicar que esta listo para recibir parametros*/
+    lRed = 0;
+    lGrn = 1;
+    enterPIDParameters();
+
+    while(1) {
+        printMenuBT();
+        BT.printf("\nIngrese una opcion >> ");
+        BT.scanf("%s",buffer);
+        PC.printf("\n Se recibio: %s \n",buffer);
+
+        char msg[10];
+        int mIdx = 0;
+        for (int m = 0; m < 10; m++) {
+            if (buffer[m] != '\n' && buffer[m] != '\r' && buffer[m] != ' ') {
+                msg[mIdx] = buffer[m]; //Guardar los caracteres validos en el mensaje
+                mIdx++;  //Corremos el indice del array de chars
+            }
+        }
+        
+        PC.printf("Msg[1] es <%s> \n",msg);
+        if(strncmp(msg,"P",1)==0 || strncmp(msg,"p",1)==0){
+            enterPIDParameters();
+            BT.printf("Se han ingreso los parametros del PID\n"); 
+        }
+        else if(strncmp(msg,"i",1)==0 || strncmp(msg,"I",1)==0){
+            PC.printf("Llame al PID continuo\n");
+            continuo=true;
+            pwmOut.write(0.0f);
+            executePIDControl();
+            lRed=0;
+            lGrn=0;
+            //BT.printf("Se han ingreso los parametros del PID\n"); 
+        }
+        else if(strncmp(msg,"w",1)==0 || strncmp(msg,"W",1)==0){
+            PC.printf("Llame al PID pwm\n");
+            continuo=false;
+            AnOut.write(0.0f);
+            executePIDControl();
+            lRed=0;
+            lGrn=0;
+            //BT.printf("Se han ingreso los parametros del PID\n"); 
+        }
+        else if(strncmp(msg,"s",1)==0 || strncmp(msg,"S",1)==0){
+            PC.printf("Salida en Bajo\n");
+            lRed=0;
+            lGrn=1;
+            pwmOut.write(0.0f);
+            AnOut.write(0.0f);
+
+            //BT.printf("Se han ingreso los parametros del PID\n"); 
+        }
+        else{
+            BT.printf("El parametro ingresado no es correcto\n");   
+        }
+    }
+}
diff -r 000000000000 -r 55be7cc4ef10 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Jun 14 20:50:38 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file