controlpid por control remoto

Dependencies:   Pulse1 QEI TextLCD mbed

Fork of irda1 by Gustavo Ramirez

Files at this revision

API Documentation at this revision

Comitter:
deiwidricaurte
Date:
Thu Nov 24 01:06:46 2016 +0000
Parent:
2:6a15ab0305c8
Commit message:
controlpid con controlremoto;

Changed in this revision

QEI.lib Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 6a15ab0305c8 -r 786400a8fd7c QEI.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QEI.lib	Thu Nov 24 01:06:46 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/aberk/code/QEI/#5c2ad81551aa
diff -r 6a15ab0305c8 -r 786400a8fd7c TextLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Thu Nov 24 01:06:46 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/avallejopo/code/TextLCD/#aba8ab3dde9d
diff -r 6a15ab0305c8 -r 786400a8fd7c main.cpp
--- a/main.cpp	Fri Nov 08 07:40:04 2013 +0000
+++ b/main.cpp	Thu Nov 24 01:06:46 2016 +0000
@@ -1,6 +1,12 @@
 #include "mbed.h"
 #include <Pulse1.h>
+#include "QEI.h"
+#include "TextLCD.h"
 
+
+TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
+AnalogIn y(PTB2);//entrada analoga
+AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer
 PulseInOut irda(PTD5);// en este puerto se pone el sensor infrarrojo
 Serial pc(USBTX, USBRX);
 DigitalOut led(LED1);
@@ -13,36 +19,405 @@
 const int T_bajo=526;//ponga su tiempo de la prueba
 const int num_bits = 32;//ponga su numero de bits
 int num[num_bits];//cadena para almacenar todos los tiempos que conforman los bits de datos
+int num1[num_bits];
+int arriba[]={1,1,1,0,0,0,0,1,0,1,1,1,1,0,1,0,1,1,0,1,0,0,0,0,0,0,1,0,1,1,1};
+int abajo[]={1,1,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,1};
+int derecha[]={1,1,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,1};
+int ok[]={1,1,1,0,0,0,0,1,0,1,1,1,1,0,1,0,1,0,1,0,1,0,0,0,0,1,0,1,0,1,1};
 int dato; // tiempo de cada dato que se lee
-  
+int a=0;
+int b=0;
+int c=0;
+int d=0;
+
+
+int C2=0x18; // desplaza izquierda
+int C3=0x1A; // desplaza derecha
+int C4=0x0C; // quito cursor bajo
+
+int C1=0x0F;
+int cambio=0, diferencia=0;
+float pid,o,ai,ad,ap,med,err;
+float err_v;
+int sp=0,ki=0,kp=0,kd=0,pos=1;
+
+
 int main(){
+lcd.locate(0,1);
+lcd.printf("**Control PID**");
+wait(2);
+lcd.cls(); // Borrar Pantalla
+lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
+
+lcd.locate(8,0);
+lcd.printf("Kp=%d",kp);
+lcd.locate(0,1);
+lcd.printf("Ki=%d",ki);
+lcd.locate(8,1);
+lcd.printf("Kd=%d",kd);
+lcd.locate(0,0);
+lcd.printf("Sp=%d",sp);
+    
 while(1){
-ini1: header=0;
+    ini1: header=0;
+      a=0;
+      b=0;
+      c=0;
+      d=0;
       led2=1;
       led=1;
       header = irda.read_low_us();    //funcion para leer un pulso de caida o bajo
       if (header > head_L && header < head_H) goto seguir;//verificar que este en la tolerancia +-20%
       else goto ini1;
       
-seguir:
+    seguir:
        //leo los datos de la trama y se meten a un arreglo
       wait_us(5000);
       led2=0;
-      for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos
-      dato = irda.read_high_us(); //leer un bit de datos que es pulso arriba en este control
-      num[i]=dato;
-      wait_us(300);   
-      }
+      for(i=0;i<(num_bits-1);++i)
+        { // POR OSCILOSCOPIO se determina que llegan (num_bits),datos
+            dato = irda.read_high_us(); //leer un bit de datos que es pulso arriba en este control
+            num[i]=dato;
+            wait_us(300);   
+        }
       wait(0.5); //espero un poquito antes de leer todo el arreglo y ponerlo en pantalla 
       pc.printf(",%d",header);
-      for(i=0;i<(num_bits-1);++i){  
-      pc.printf(",%d",num[i]);
-      }
+      for(i=0;i<(num_bits-1);++i)
+        {  
+            pc.printf(",%d",num[i]);
+        }
       wait(0.1);  //espero e imprimo en binario 
       pc.printf("\n\n");
-      for(i=0;i<(num_bits-1);++i){  
-      if(num[i] > ((T_alto+T_bajo)/2)) pc.printf("1");
-      else pc.printf("0");
-      }
-      }
-      }
\ No newline at end of file
+      for(i=0;i<(num_bits-1);++i)
+        {
+            
+            if(num[i] > ((T_alto+T_bajo)/2))
+                {
+                    pc.printf("1");
+                    num1[i]=1;
+                    if(num1[i]==arriba[i]){
+                       a=a+1;
+             
+                       }
+                    if(num1[i]==abajo[i]){
+                       b=b+1;
+        
+                       }
+                    if(num1[i]==derecha[i]){
+                       c=c+1;
+        
+                       }
+                    if(num1[i]==ok[i]){
+                       d=d+1;
+                       
+                       }
+                }
+                else
+                    {
+                        pc.printf("0");
+                        num1[i]=0;
+                        if(num1[i]==arriba[i]){
+                           a=a+1;
+                           }
+                        if(num1[i]==abajo[i]){
+                           b=b+1;
+                           }
+                        if(num1[i]==derecha[i]){
+                           c=c+1;
+                           }
+                        if(num1[i]==ok[i]){
+                           d=d+1;
+                           }
+                    }
+        }
+      if(a==31)
+        {
+            a=0;
+            b=0;
+            c=0;
+            d=0;
+            if(pos==1)
+                {
+                    
+                    if(sp+1>=999)
+                    {
+                        sp=999;
+                        lcd.locate(3,0);
+                        lcd.printf("    ");
+                        lcd.locate(3,0);
+                        lcd.printf("%d", sp);                        
+                    }
+                    else
+                    {
+                        sp+=1;
+                        lcd.locate(3,0);
+                        lcd.printf("%d", sp);   
+                        
+                    }
+                }
+            else if(pos==2)
+                {
+                    
+                    if(kp+1>=999)
+                    {
+                        kp=999;
+                        lcd.locate(11,0);
+                        lcd.printf("    ");
+                        lcd.locate(11,0);
+                        lcd.printf("%d", kp);                        
+                    }
+                    else
+                    {
+                        kp+=1;
+                        lcd.locate(11,0);
+                        lcd.printf("%d", kp);   
+                        
+                    }
+                }
+            else if(pos==3)
+                {
+                    
+                    if(ki+1>=999)
+                    {
+                        sp=999;
+                        lcd.locate(3,1);
+                        lcd.printf("    ");
+                        lcd.locate(3,1);
+                        lcd.printf("%d", ki);                        
+                    }
+                    else
+                    {
+                        ki+=1;
+                        lcd.locate(3,1);
+                        lcd.printf("%d", ki);   
+                        
+                    }
+                }
+            else if(pos==4)
+                {
+                    
+                    if(kd+1>=999)
+                    {
+                        sp=999;
+                        lcd.locate(11,1);
+                        lcd.printf("    ");
+                        lcd.locate(11,1);
+                        lcd.printf("%d", kd);                        
+                    }
+                    else
+                    {
+                        kd+=1;
+                        lcd.locate(11,1);
+                        lcd.printf("%d", kd);   
+                        
+                    }
+                }
+        }
+      
+      else if(b==31)
+        {
+            a=0;
+            b=0;
+            c=0;
+            d=0;
+            if(pos==1)
+                {
+                    
+                    if(sp-1<=0)
+                    {
+                        sp=0;
+                        lcd.locate(3,0);
+                        lcd.printf("    ");
+                        lcd.locate(3,0);
+                        lcd.printf("%d", sp);                        
+                    }
+                    else
+                    {
+                        sp-=1;
+                        lcd.locate(3,0);
+                        lcd.printf("%d", sp);   
+                        
+                    }
+                }
+            else if(pos==2)
+                {
+                    
+                    if(kp-1<=0)
+                    {
+                        kp=0;
+                        lcd.locate(11,0);
+                        lcd.printf("    ");
+                        lcd.locate(11,0);
+                        lcd.printf("%d", kp);                        
+                    }
+                    else
+                    {
+                        kp-=1;
+                        lcd.locate(11,0);
+                        lcd.printf("%d", kp);   
+                        
+                    }
+                }
+            else if(pos==3)
+                {
+                    
+                    if(ki-1<=0)
+                    {
+                        sp=0;
+                        lcd.locate(3,1);
+                        lcd.printf("    ");
+                        lcd.locate(3,1);
+                        lcd.printf("%d", ki);                        
+                    }
+                    else
+                    {
+                        ki-=1;
+                        lcd.locate(3,1);
+                        lcd.printf("%d", ki);   
+                        
+                    }
+                }
+            else if(pos==4)
+                {
+                    
+                    if(kd-1<=0)
+                    {
+                        sp=0;
+                        lcd.locate(11,1);
+                        lcd.printf("    ");
+                        lcd.locate(11,1);
+                        lcd.printf("%d", kd);                        
+                    }
+                    else
+                    {
+                        kd-=1;
+                        lcd.locate(11,1);
+                        lcd.printf("%d", kd);   
+                        
+                    }
+                }
+        }
+      
+      if(c==31)
+        {
+                a=0;
+                b=0;
+                c=0;
+                d=0;
+                led2 =!led2;
+                if(pos==4)
+                {
+                    pos=1;
+                    lcd.locate(3,0);
+                    lcd.printf("%d", sp);  
+                }
+                else if (pos==1)
+                {
+                    pos++;
+                    lcd.locate(11,0);
+                    lcd.printf("%d", kp); 
+                }
+                else if(pos==2)
+                {
+                    pos++;
+                    lcd.locate(3,1);
+                    lcd.printf("%d", ki); 
+                }
+                else if(pos==3)
+                {
+                    pos++;
+                    lcd.locate(11,1);
+                    lcd.printf("%d", kd);  
+                }
+                wait(0.25);
+        }
+    
+      if(d==31)
+        {
+                a=0;
+                b=0;
+                c=0;
+                d=0;
+                break;     //sale del bucle si pulsan ok
+        }
+      else
+        {
+            a=0;
+            b=0;
+            c=0;
+            d=0;
+        }
+    goto ini1;
+      
+        
+    }
+//Transicion
+    lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
+    lcd.cls(); //borra la pantalla
+    lcd.printf("   GUARDADOS!");
+    wait(1);
+    lcd.cls();
+    lcd.printf(" INICIA EL PID");
+    wait(1);
+// se imprimen los parches del control  *****************************************
+    lcd.cls();
+    lcd.printf("Er=%3.0f",err);
+    lcd.locate(8,0);
+    lcd.printf("Me=%3.0f",med);
+    lcd.locate(0,1);
+    lcd.printf("Sp=%3.0f",sp);
+    lcd.locate(8,1);
+    lcd.printf("Co=%3.0f",pid);
+    wait(1);
+
+// CICLO PRINCIPAL CONTROLADOR PID
+ lop1:  med = y.read()*999;
+        err = (sp-med);  //se calcula el error
+        ap = kp*err*0.01f;     //se calcula la accion proporcinal
+        ai =(ki*err*0.01f)+ai;    //calculo de la integral del error
+        ad = kd*(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 > 999)
+        {
+            pid=999;
+        }
+
+       
+        //se muestran las variables******************************************
+            lcd.locate(3,0);
+            lcd.printf("    ");
+            lcd.locate(3,0);
+            lcd.printf("%3.0f",err);
+            lcd.locate(11,0);
+            lcd.printf("   ");
+            lcd.locate(11,0);
+            lcd.printf("%3.0f",med);
+            lcd.locate(3,1);
+            lcd.printf("   ");
+            lcd.locate(3,1);
+            lcd.printf("%d",sp);
+            lcd.locate(11,1);
+            lcd.printf("   ");
+            lcd.locate(11,1);
+            lcd.printf("%3.0f",pid);
+           
+            
+        
+
+        //Normalizacion de la salida
+        // se actualizan las variables *******************************************
+        err_v = err;
+
+        o = pid/999;
+        u.write(o);
+        
+        wait_ms(300);
+        goto lop1;     
+}
\ No newline at end of file