PID + Teclas + LCD

Dependencies:   Debounced TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
Equipo3JohnAndresx2
Date:
Fri Apr 10 03:14:07 2015 +0000
Commit message:
Tarea tres de Procesadores de la Universidad Nacional de Colombia sede Medellin

Changed in this revision

Debounced.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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Debounced.lib	Fri Apr 10 03:14:07 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/WarwickRacing/code/Debounced/#8992c13bbb9b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Fri Apr 10 03:14:07 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/lcorralesc1/code/TextLCD/#0e0132807662
--- /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 ;              
+  
+    }   
+    }
+     
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Apr 10 03:14:07 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/487b796308b0
\ No newline at end of file