PROCESADORES - 2016-03. TAREA 1. PID+ANDROID+BLUETOOTH

Dependencies:   DebouncedIn QEI TextLCD mbed

Fork of PID_ENCODER_OK by Gustavo Ramirez

Tarea 1: PID + Android + Bluetooth

PROCESADORES - 2016-03

Por:

  • Jaime Alonso Osorio Palacio
  • David Fuertes Chaguezac
  • Wilson Anibal Ortega Andrade
  • John Wilmer Ruiz López

    Recibe por medio de un módulo Bluetooth HC-05 ZS-040 desde un dispositivo Android los parámetros SP, KP, KI y KD. Crea un PID que se prueba sobre una planta de primer orden RC conformado por una resistencia R=11kOhm y un capacitor C=22uF cuya salida y realimentación se conectan por los puertos analógicos determinados en la FRDM KL25Z. Para más información:
  • https://developer.mbed.org/users/tony63/code/PID_ENCODER_OK/
    Reenvía continuamente el error, la medida, el SP y la acción de control hacia el dispositivo Android. Estos también son mostrados en una LCD 16x2.
    Posee depuración via USB en una terminal (se usó Termite 3.2.) para conocer los estados en los que se encuentra el programa y verificar los datos.
    La aplicación para Android se realizó en APP Inventor y se puede descargar en:
  • https://www.dropbox.com/s/gfhh003rq3nknmp/PID_ANDRIOD_ENTEROS.aia?dl=0

    IMÁGENES:
Revision:
1:058b8f5c135d
Parent:
0:4e0dfcf0e7ce
Child:
2:278af91e46ff
--- a/main.cpp	Fri Apr 22 23:11:38 2016 +0000
+++ b/main.cpp	Sun Apr 24 18:32:52 2016 +0000
@@ -4,8 +4,7 @@
 
 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
 QEI encoder (PTA13, PTD5, NC, 624);
-
-AnalogIn y(PTB0);//entrada analoga
+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
 DigitalOut led1(LED1);
@@ -24,11 +23,10 @@
 int C4=0x0C; // quito cursor bajo
 
 int C1=0x0F;
-int err, med, yr, pid, ap, ai, ad, err_v, cambio=0, diferencia=0;
-float pidn;
+int cambio=0, diferencia=0;
+float pid,o,ai,ad,ap,med,err;
+float err_v;
 int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1;
-int flagt=0;
-Timer t;
 
 int main()
 {
@@ -64,9 +62,9 @@
         {
             if(pos==1)
             {
-                if(spnum+diferencia>=9999)
+                if(spnum+diferencia>=999)
                 {
-                    spnum=9999;
+                    spnum=999;
                     lcd.locate(3,0);
                     lcd.printf("    ");
                     lcd.locate(3,0);
@@ -81,9 +79,9 @@
             }
             else if(pos==2)
             {
-                if(kpnum+diferencia>=9999)
+                if(kpnum+diferencia>=999)
                 {
-                    kpnum=9999;
+                    kpnum=999;
                     lcd.locate(11,0);
                     lcd.printf("    ");
                     lcd.locate(11,0);
@@ -98,9 +96,9 @@
             }
             else if(pos==3)
             {
-                if(kinum+diferencia>=9999)
+                if(kinum+diferencia>=999)
                 {
-                    kinum=9999;
+                    kinum=999;
                     lcd.locate(3,1);
                     lcd.printf("    ");
                     lcd.locate(3,1);
@@ -115,9 +113,9 @@
             }
             else if(pos==4)
             {
-                if(kdnum+diferencia>=9999)
+                if(kdnum+diferencia>=999)
                 {
-                    kdnum=9999;
+                    kdnum=999;
                     lcd.locate(11,1);
                     lcd.printf("    ");
                     lcd.locate(11,1);
@@ -245,34 +243,22 @@
     wait(1);
 // se imprimen los parches del control  *****************************************
     lcd.cls();
-    lcd.printf("Er=%d",err);
+    lcd.printf("Er=%3.0f",err);
     lcd.locate(8,0);
-    lcd.printf("Me=%d",med);
+    lcd.printf("Me=%3.0f",med);
     lcd.locate(0,1);
-    lcd.printf("Sp=%d",spnum);
+    lcd.printf("Sp=%3.0f",spnum);
     lcd.locate(8,1);
-    lcd.printf("Co=%d",pid);
-    wait(2);
+    lcd.printf("Co=%3.0f",pid);
+    wait(1);
 
 // CICLO PRINCIPAL CONTROLADOR PID
-    flagt=0;
-    while(1)
-    {
-        med=999*y.read();   //leer puerto analogo y asignar a med
+ lop1:  med = y.read()*999;
         err = (spnum-med);  //se calcula el error
-
-        ap = kpnum*err;     //se calcula la accion proporcinal
-
-        // se verifica que la accion integral no sea muy grande
-        if(ai<100)
-        {
-            ai =(kinum*err)+ai;    //calculo de la integral del error
-        }
-
-        ad = kdnum*(err-err_v); //calculo de la accion derivativa
-
+        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)
         {
@@ -285,42 +271,36 @@
             pid=999;
         }
 
-        // se actualizan las variables *******************************************
-        err_v = err;
-
+       
         //se muestran las variables******************************************
-        if(flagt==0)
-        {
-            t.start();
-            flagt=1;
-        }
-        if(t>=0.3)
-        {
             lcd.locate(3,0);
             lcd.printf("    ");
             lcd.locate(3,0);
-            lcd.printf("%d",err);
+            lcd.printf("%3.0f",err);
             lcd.locate(11,0);
-            lcd.printf("    ");
+            lcd.printf("   ");
             lcd.locate(11,0);
-            lcd.printf("%d",med);
+            lcd.printf("%3.0f",med);
             lcd.locate(3,1);
-            lcd.printf("    ");
+            lcd.printf("   ");
             lcd.locate(3,1);
             lcd.printf("%d",spnum);
             lcd.locate(11,1);
-            lcd.printf("    ");
+            lcd.printf("   ");
             lcd.locate(11,1);
-            lcd.printf("%d",pid);
-            flagt=0;
-            t.reset();
-        }
+            lcd.printf("%3.0f",pid);
+           
+            
+        
 
         //Normalizacion de la salida
-        pidn=pid/999;
+        // 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) **************
-        u.write(pidn);
+        
         //  se repite el ciclo
-        wait(0.005);
-    }
+        wait_ms(300);
+        goto lop1;
 }