App PID

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
Cam53
Date:
Wed Jul 24 18:50:59 2019 +0000
Commit message:
App controlador PID

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 379fd298c42a main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jul 24 18:50:59 2019 +0000
@@ -0,0 +1,242 @@
+//PROGRAMA PARA CONTROLAR EL VOLTAJE DE UN CAPACITOR EN UN CIRCUITO RC DESDE DISPOSITIVO ANDROID
+//ENVIAR LOS VALORES SEPARADOS POR COMAS
+#include "mbed.h"              
+#include "stdio.h"
+#include "string.h"
+#include "stdlib.h"
+
+//Variables y parametros del control PID
+float Kp=0,Ki=0,Kd=0,x=0,anchop=0;
+float Sp=0;//set point
+float ai,ek,ad,ap,err_v,o,yT,uk=0,Ts=0.01;
+float duty=0,med=0,an=0;
+
+
+AnalogIn   Vc(PTB0);//voltaje condensador
+PwmOut  uc(PTE20); //accion de control
+AnalogOut  u(PTE30);
+Serial MR_ROBOT(PTE0,PTE1);  //puertos del xDM para el modulo BLUETOOTH
+Serial pc(USBTX,USBRX); //puertos del PC
+char buffer[60];// TAMAÑO DEL BUFER
+Timer t;   //VALOR DEL TIEMPO
+int count;
+int i = 0;
+int c=0;
+int num,ii,j,k;
+char r[]=""; 
+DigitalOut LedRojo(LED1);
+DigitalOut LedVerde(LED2);
+DigitalOut LedAzul(LED3);
+
+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 (MR_ROBOT.readable()) {
+            char c = MR_ROBOT.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() {
+    
+       LedVerde=1;
+       LedRojo=1;
+       LedAzul=1;
+       LedRojo=0;
+       wait(2);   //PRENDE EL LED ROJO POR 2 SEGUNDOS
+       LedRojo=1;
+       MR_ROBOT.baud(9600);
+       MR_ROBOT.format(8,Serial::None,1); 
+       
+           
+       pc.printf("Enviar los valores Kp,Ki,Kd,Sp          \n");  
+     
+     
+    DEF_CONST: 
+        
+        
+       if (MR_ROBOT.readable()) {
+          readBuffer(buffer,30);
+          pc.printf("Enviar los valores Kp,Ki,Kd,Sp          \n");
+          sscanf( buffer, "%f, %f, %f, %f, %f, %f",&x, &Kp, &Ki, &Kd, &Sp, &anchop);
+          pc.printf("%.1f, %.1f, %.1f, %.1f, %.1f, %.1f \n",x,Kp,Ki,Kd,Sp,anchop);
+          }
+     
+   if(Sp==0){
+        goto DEF_CONST;}    
+    if(x == 1){
+        goto PID;
+    }if(x == 2){
+        goto PWM;
+    }
+    if(x == 3){
+        goto ANALOG;
+    }
+    if(x==4){
+        goto DEF_CONST;} 
+     
+    
+       
+    PID: 
+    
+    
+    while(1){
+      
+      
+         
+    yT=Vc.read()*3.3;
+    ek=Sp-yT;
+     
+    ap = Kp*ek*0.01f;     //se calcula la accion proporcinal
+    ai =(Ki*ek*0.01f)+ai;    //calculo de la integral del error
+    ad = Kd*(ek-err_v)*0.01f; //calculo de la accion derivativa
+    uk = (ap+ai+ad);
+    
+    // se verifica que pid sea positivo **************
+        if(uk<=0)
+        {
+            uk=0;
+        }
+ 
+        // se verifica que pid sea menor o igual la valor maximo *******
+        if (uk > 3.3)
+        {
+            uk=3.3;
+        }
+     //Normalizacion de la salida
+        // se actualizan las variables ***************
+        err_v = ek;
+        o = uk/3.3;
+        u.write(o);
+        //  se envia el valor pid a puerto analogico de salida (D/A) ******
+        
+                     
+        //Mostrando error y salida actual
+       // wait_ms(500);
+  
+        pc.printf("Error= %.2f\t",ek);
+        pc.printf("Set Point= %.1f\t",Sp);
+        pc.printf("Voltaje Actual= %.1f\n",yT);
+        
+        
+               
+                       //leo puerto analogico
+       //  wait_ms(500);
+       num = yT*303;      //agrando el numero de cero a mil
+       if(num<256){           //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cixas)    
+           MR_ROBOT.putc(0);     //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
+           MR_ROBOT.putc(ii);     //luego la cixa menos significativa
+       }
+       if(num>255){          //pero si es mayor a 255 las cixas deben ser convertidas a un hex de dos bytes de la siguiente forma   
+           j=num/256;       //calculo la cixa mas significativa
+           k=num-j*256;     //calculo la cixa menos significativa
+           MR_ROBOT.putc(j);   //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
+           MR_ROBOT.putc(k);   //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
+       }
+       
+       readBuffer(buffer,30);
+        sscanf( buffer, "%f, %f, %f, %f, %f, %f",&x, &Kp, &Ki, &Kd, &Sp,&anchop);
+        
+        if(x == 4){
+        goto DEF_CONST;
+    }
+              
+        }
+        
+        PWM:
+        while(1){
+        yT=Vc.read()*3.3;
+        
+        duty=(anchop/4);
+        uc.period_ms(200);
+        uc.pulsewidth_ms(duty);
+        
+        //wait_ms(500);
+        
+        pc.printf("Ancho de pulso PWM(T=2000ms)= %.1f\t",duty);
+        pc.printf("Voltaje Actual= %.1f\n",yT);
+        
+        // se repite el ciclo
+        //wait_ms(500);
+            
+            num = yT*303; 
+            if(num<256){           //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cixas)    
+           MR_ROBOT.putc(0);     //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
+           MR_ROBOT.putc(ii);     //luego la cixa menos significativa
+       }
+       if(num>255){          //pero si es mayor a 255 las cixas deben ser convertidas a un hex de dos bytes de la siguiente forma   
+           j=num/256;       //calculo la cixa mas significativa
+           k=num-j*256;     //calculo la cixa menos significativa
+           MR_ROBOT.putc(j);   //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
+           MR_ROBOT.putc(k);   //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
+       }
+           
+        readBuffer(buffer,30);
+        sscanf( buffer, "%f, %f, %f, %f, %f, %f",&x, &Kp, &Ki, &Kd, &Sp,&anchop);
+        
+        if(x == 4){
+        goto DEF_CONST;
+    }
+    
+            }
+            
+ANALOG:
+    while(1){
+    yT=Vc.read()*3.3;
+    o = Sp/3.3;
+    u.write(o);
+        //  se envia el valor pid a puerto analogico de salida (D/A) **
+        
+        //  se repite el ciclo
+     //wait_ms(500);
+              
+        //Mostrando error y salida actual
+  
+        pc.printf("Set Point= %.1f\t",Sp);
+        pc.printf("Voltaje Actual= %.1f\n",yT);
+        
+        // se repite el ciclo
+        //wait_ms(500);
+            
+            num = yT*303; 
+            if(num<256){           //debo generar dos casos a APP inventor solo me recibe hex asi: 0xhhhh (4 cixas)    
+           MR_ROBOT.putc(0);     //si el numero es hasta 255 se le ponen dos ceros adelante a la secuencia de bits
+           MR_ROBOT.putc(ii);     //luego la cixa menos significativa
+       }
+       if(num>255){          //pero si es mayor a 255 las cixas deben ser convertidas a un hex de dos bytes de la siguiente forma   
+           j=num/256;       //calculo la cixa mas significativa
+           k=num-j*256;     //calculo la cixa menos significativa
+           MR_ROBOT.putc(j);   //las envio a la usart para que se las ponga al modulo bluetooth y la lleve al android
+           MR_ROBOT.putc(k);   //mas significativa primero, menos despues si no no funciona!!! y con la orden PUTC solo asi le envia binarios
+       }
+           
+        readBuffer(buffer,30);
+        sscanf( buffer, "%f, %f, %f, %f, %f, %f",&x, &Kp, &Ki, &Kd, &Sp,&anchop);
+        
+        if(x == 4){
+        goto DEF_CONST;
+    }
+    
+            
+             
+}    
+   
+ }
\ No newline at end of file
diff -r 000000000000 -r 379fd298c42a mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Jul 24 18:50:59 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file