PID + Teclas + LCD

Dependencies:   Debounced TextLCD mbed

Revision:
0:fd20467a764b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Apr 10 03:14:07 2015 +0000
@@ -0,0 +1,306 @@
+// Tarea Tres - Procesadores - 01-2015
+// PID con opcion de incremento, decremento y cambio de posicion en LCD
+
+// Se incluyen las librerias correspondientes para el codigo
+
+#include "mbed.h"
+#include "DebouncedIn.h"
+#include "TextLCD.h"
+
+// Caracterizacion de Puertos
+
+AnalogIn Vin(PTC2);                                // Definicion de puerto para entrada analoga
+AnalogOut Vout(PTE30);                             // Definicion del puerto para salida analoga
+TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); 
+
+DebouncedIn button1(PTC12);                        // Definicion del boton1 como boton para incrementar
+DebouncedIn button4(PTC17);                        // Definicion del boton4 como boton de enter
+DebouncedIn button3(PTC16);                        // Definicion del boton3 como boton de menu
+DebouncedIn button2(PTC13);                        // Definicion del boton2 como boton para decrementar
+
+
+int C1=0x0F;                                       // Pone el cursor 
+int C4=0x0C;                                       // Quito el cursor bajo
+
+// Deficion de las variables para el controlador PID
+
+
+int ref=0;    // Incluimos la variable de referencia
+int Cint=0;   // Incluimos la constante integral 
+int Cder=0;   // Inlcuimos la constante derivativa
+int Cpro=0;   // Incluimos la constante proporcional
+int pos=0;   // Inlcuimos la variable de posicion en el LCD
+
+int med;         // Medida de la señal
+int er=0;      // Error en la medida
+int Apid;       // Accion del PID
+int Ai=0;         // Accion Integral
+int Ad;         // Accion Derivativa
+int Ap;         // Accion Proporcional
+int ev;         // error viejo
+
+int Int;
+int FactEsc;    // Factor de Escalado
+float pidn;
+
+// Inicio de la funcion principal
+
+int main()
+{
+    lcd.cls();                       // Inicio el LCD y lo limpio por ahí derecho
+    lcd.writeCommand(C1);            // Se escribe segun el modulo del LCD
+    lcd.locate(8,0);                // Me ubico en el LCD donde deseo imprimir
+    lcd.printf("FactEsc =%d", FactEsc);    // Se Presenta el factor de escalado(FactEsc)
+    lcd.locate(0,1);
+    lcd.printf("Pro =%d", Cpro);     // Se presenta la contante proporcional(Cpro)
+    lcd.locate(6,1);
+    lcd.printf("Int =%d", Cint);     // Se presenta la constante integrativa(Cint)
+    lcd.locate(11,1);
+    lcd.printf("Der =%d", Cder);     // Se presenta la constante derivativa(Cder)
+    lcd.locate(0,0);
+    lcd.printf("Ref=%d", ref);      // Se presenta el valor de la referencia (ref)
+
+    while(1)
+    {
+        if (button1.falling())    // Boton de incremento
+        {
+            
+            if (pos==1)
+            {
+                ++ref;
+                lcd.locate(3,0);
+                lcd.printf("   ");
+                lcd.locate(3,0);
+                lcd.printf("%d", ref);
+            }
+            else if (pos==2)
+            {
+                ++Int;
+                if (Int==1){
+                 FactEsc =1;}
+                if (Int==2){
+                 FactEsc =10;}
+                if (Int==3){
+                 FactEsc =100;
+                 Int=0;} 
+                
+                lcd.locate(11,0);
+                lcd.printf("   ");
+                lcd.locate(12,0);
+                lcd.printf("   "); 
+                lcd.locate(13,0);
+                lcd.printf("   ");
+               
+                 
+                lcd.locate(11,0);
+                lcd.printf("%d", FactEsc);
+            }
+            else if (pos==3)
+            {
+                ++Cpro;
+                lcd.locate(2,1);
+                lcd.printf("   ");
+                lcd.locate(2,1);
+                lcd.printf("%d", Cpro);
+            }
+            else if (pos==4)
+            {
+                ++Cint;
+                lcd.locate(8,1);
+                lcd.printf("   ");
+                lcd.locate(8,1);
+                lcd.printf("%d", Cint);
+            }
+             else if (pos==5)
+            {
+                ++Cder;
+                lcd.locate(13,1);
+                lcd.printf("   ");
+                lcd.locate(13,1);
+                lcd.printf("%d", Cder);
+            }
+        }
+        
+        if (button2.falling())         // Boton de decremento
+        {
+            
+            if (pos==1)
+            {
+                if (ref==0)  // no mostrar nada
+                {
+                }
+                else
+                {
+                    --ref;
+                    lcd.locate(3,0);
+                    lcd.printf("   ");
+                    lcd.locate(3,0);
+                    lcd.printf("%d", ref);
+                }
+            }
+         
+            if (pos==3)
+            {
+                if (Cpro==0)  // no mostrar nada
+                {
+                }
+                else
+                {
+                    --Cpro;
+                    lcd.locate(2,1);
+                    lcd.printf("   ");
+                    lcd.locate(2,1);
+                    lcd.printf("%d", Cpro);
+                }
+            }
+            if (pos==4)
+            {
+                if (Cint==0)  // no mostrar nada
+                {
+                }
+                else
+                {
+                    --Cint;
+                    lcd.locate(8,1);
+                    lcd.printf("   ");
+                    lcd.locate(8,1);
+                    lcd.printf("%d", Cint);
+                }
+            }
+             if (pos==5)
+            {
+                if (Cder==0)  // no mostrar nada
+                {
+                }
+                else
+                {
+                    --Cder;
+                    lcd.locate(13,1);
+                    lcd.printf("   ");
+                    lcd.locate(13,1);
+                    lcd.printf("%d", Cder);
+                }
+            }
+        
+        
+        if (button3.falling())   // Boton de menu 
+        {         
+            if (pos==1)
+            {
+                ++pos;
+                lcd.locate(11,0);
+                lcd.printf("%d", FactEsc);       
+            }
+            else if (pos==2)
+            {
+                ++pos;
+                lcd.locate(2,1);
+                lcd.printf("%d", Cpro);
+                lcd.locate(2,1);               
+            }
+            else if (pos==3)
+            {
+                ++pos;
+                lcd.locate(8,1);
+                lcd.printf("%d", Cint);               
+            }
+            else if (pos==4)
+            {
+                ++pos;
+                lcd.locate(13,1);
+                lcd.printf("%d", Cpro);              
+            }
+             else if (pos==5)
+            {
+                pos=1;
+                lcd.locate(3,0);
+                lcd.printf("%d", ref);                            
+            }
+          
+        }
+      
+
+        if (button4.falling()){
+           break;     //sale del bucle si pisan suiche4
+               }
+                        
+      }                                
+           lcd.writeCommand(C4);    //escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
+           lcd.cls();               //borra la pantalla
+           lcd.printf("  GRABADOS!"); 
+           wait(1);
+           lcd.cls();
+           lcd.printf(" EMPIEZA EL PID");
+           wait(1);
+           // se imprimen los parches del control  *****************************************
+           lcd.cls();
+           lcd.printf("Error=%d",er);   // imprime el error de la medida(error)
+           lcd.locate(8,0);
+           lcd.printf("Med=%d",med);   // imprime la medida de la señal(med)
+           lcd.locate(0,1);
+           lcd.printf("Ref=%d",ref);    // imprime la referencia (ref)
+           lcd.locate(8,1);
+           lcd.printf("AC=%d",Apid);   // imprime el la Accion de control del pid (AC)
+           wait(1);
+           
+           // CICLO PRINCIPAL CONTROLADOR PID
+            // DEFINIMOS LOS PARAMETROS Kp,Ki y Kd teniendo en cuenta la escala 
+            
+           Cpro= Cpro*FactEsc;
+           Cint = Cint*FactEsc;
+           Cder= Cder*FactEsc;
+           
+           cicloPID :
+           
+           med=10*Vin.read();                  //Lee el puerto analogo y asigna el valor leiro
+           er = (ref-med);                     // halla en error de entre la medida y la referencia
+           Ap= Cpro*er;                        // calculo de la accion proporcional
+           Ai=(Cint*er)+Ai;                      //calculo de la accion  integral
+           Ad = Cder*(er-ev);                 //calculo de la accion derivativa
+           Apid = (Ap+Ai+Ad);                   // es la señal de control que nos da el PID
+           
+           if (Apid < 0){            // limite inferior de la accion de control
+           Apid=0;
+           } 
+           if (Apid > 99){          // limite superiro de la accion de control
+           Apid=100;
+           } 
+           
+           wait(.5);
+           if(error >= 0){
+            lcd.locate(4,0);
+           lcd.printf(" ");
+           lcd.locate(3,0);
+           lcd.printf("%d",er);      // Muestro el error
+           }
+           if (error<0){
+               lcd.locate(3,0);
+           lcd.printf("%d",er);  // Muestro el error
+               }
+           lcd.locate(12,0);
+           lcd.printf(" ");
+           lcd.locate(11,0);
+           lcd.printf("%d",med); // imprime el valor de la medición 
+           lcd.locate(3,1);
+           lcd.printf("%d",ref);  // imprime el valor de la referenica
+           
+           if(Apid < 100){
+           lcd.locate(13,1);
+           lcd.printf(" ");
+           lcd.locate(11,1);
+           lcd.printf("%d",Apid);}   // imprime el valor de la señal de control
+           
+           if(Apid >= 100){
+           lcd.locate(11,1);
+           lcd.printf("%d",Apid);}   // imprime el valor de la señal de control
+           
+           ev = er;  
+           pidn=Apid*0.01;           //Normalizacion de la salida
+           Vout.write(pidn);        //se envia el valor pid a puerto analogico de salida (D/A)
+           wait(0.005);  
+        goto cicloPID ;              
+  
+    }   
+    }
+     
+