PROCESADORES - 2016-03. TAREA 2. PID+IrDA

Dependencies:   Pulse1 TextLCD mbed

Fork of PID_ENCODER_OK by Gustavo Ramirez

Tarea 2: IRDA + PID

PROCESADORES - 2016-03

Por:

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

    A partir del código de PID+ENCODER: https://developer.mbed.org/users/tony63/code/PID_ENCODER_OK/ , se adiciona un sensor IrDA (Infrared Data Association) para programar a través de este los parámetros del PID (spnum, kp, ki y kd) en la FRDM-KL25Z. Observar todos estos datos y configuraciones en una LCD. 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.
    IMÁGENES:

Files at this revision

API Documentation at this revision

Comitter:
tony63
Date:
Sun Apr 24 18:32:52 2016 +0000
Parent:
0:4e0dfcf0e7ce
Child:
2:fe2c4b1f132f
Commit message:
Control PID gen?rico que se parametriza con un encoder rotatorio. Todos los c?lculos se procesan en coma flotante. Se imprimen sin cifras significativas por dificultades de impresi?n en la LCD.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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;
 }