PID para el control de voltaje de un capacitor en un circuito RC

Dependencies:   Debounced TextLCD mbed

Fork of pid_teclas by Gustavo Ramirez

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "DebouncedIn.h"
00003 #include "TextLCD.h"
00004 
00005 AnalogIn MedidaAnaloga(PTC2);//Medida de tensión
00006 AnalogOut SalidaAnaloga(PTE30);//Salida analoga;
00007 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
00008 
00009 DigitalOut led1(LED1);
00010 DigitalOut led2(LED2);
00011 DigitalOut led3(LED3);
00012 DebouncedIn Incrementar(PTC17);//
00013 DebouncedIn Decrementar(PTC16);
00014 DebouncedIn Saltar(PTC13);
00015 DebouncedIn IniciarPID(PTC12);
00016 
00017 int C1=0x0F;//Inicializar el cursor;
00018 float sp=1;
00019 int kp=25,kd=0,ki=10,p=1; 
00020 float errormV = 0; //Variable en la que almacenaré la diferencia entre el set point  la medida real;
00021 float ek_1=0; //Error en el instante de tiempo anterior;
00022 float medidamV=0;//Variable en la que almacenaré la medida en mV;
00023 float PID;
00024 
00025 //Variables del PID
00026     float Proporcional;
00027     float Derivativo;
00028     float Integrativo;
00029 //Función del PID//
00030 void ControlPID()
00031 {
00032     
00033     Proporcional= kp*errormV;
00034     Integrativo= (ki*errormV) + Integrativo;
00035     if(Integrativo>999){Integrativo=999;}//Saturo la salida;
00036     Derivativo = kd*(errormV-ek_1);
00037     ek_1=errormV;//Almaceno el valor para el instante de tiempo sieguiente;
00038     PID = Proporcional + Integrativo + Derivativo;
00039     if (PID>999){PID=999;}//Saturo la salida;
00040     if (PID<0){PID=0;}//saturo la salida
00041     
00042  
00043     SalidaAnaloga = PID/999; //Escrino en la salida;
00044 }
00045 //Función lectura de botones
00046 void Botones()
00047 /*¡¡¡CÓDIGO RECICLADO!!!!, en este caso se debe considerar que se usarán pulsadores normalmente abiertos,
00048 por esta razón los evento a considerar son los flancos de subida, detectados mediante el la instrucción ".rising" */
00049 {
00050         if (Incrementar.rising())
00051         {
00052             led1 =!led1;
00053             if (p==1)
00054             {
00055                 sp=sp+0.1;
00056                 if(sp>3.3){sp=3.3;}//Limito el valor del Set Point;
00057                 lcd.locate(3,0);
00058                 lcd.printf("   ");
00059                 lcd.locate(3,0);
00060                 lcd.printf("%0.1f", sp);
00061             }
00062             else if (p==2)
00063             {
00064                 ++kp;
00065                 lcd.locate(11,0);
00066                 lcd.printf("   ");
00067                 lcd.locate(11,0);
00068                 lcd.printf("%d", kp);
00069             }
00070             else if (p==3)
00071             {
00072                 ++ki;
00073                 lcd.locate(3,1);
00074                 lcd.printf("   ");
00075                 lcd.locate(3,1);
00076                 lcd.printf("%d", ki);
00077             }
00078             else if (p==4)
00079             {
00080                 ++kd;
00081                 lcd.locate(11,1);
00082                 lcd.printf("   ");
00083                 lcd.locate(11,1);
00084                 lcd.printf("%d", kd);
00085             }
00086         }
00087         if (Decrementar.rising())
00088         {
00089             led2 =!led2;
00090             if (p==1)
00091             {
00092                 if (sp==0)  // no mostrar nada
00093                 {
00094                 }
00095                 else
00096                 {
00097                     sp=sp-0.1;
00098                     if(sp<0){sp=0;}//Limito el valor del Set Point
00099                     lcd.locate(3,0);
00100                     lcd.printf("   ");
00101                     lcd.locate(3,0);
00102                     lcd.printf("%.1f", sp);
00103                 }
00104             }
00105             if (p==2)
00106             {
00107                 if (kp==0)  // no mostrar nada
00108                 {
00109                 }
00110                 else
00111                 {
00112                     --kp;
00113                     lcd.locate(11,0);
00114                     lcd.printf("   ");
00115                     lcd.locate(11,0);
00116                     lcd.printf("%d", kp);
00117                 }
00118             }
00119             if (p==3)
00120             {
00121                 if (ki==0)  // no mostrar nada
00122                 {
00123                 }
00124                 else
00125                 {
00126                     --ki;
00127                     lcd.locate(3,1);
00128                     lcd.printf("   ");
00129                     lcd.locate(3,1);
00130                     lcd.printf("%d", ki);
00131                 }
00132             }
00133             if (p==4)
00134             {
00135                 if (kd==0)  // no mostrar nada
00136                 {
00137                 }
00138                 else
00139                 {
00140                     --kd;
00141                     lcd.locate(11,1);
00142                     lcd.printf("   ");
00143                     lcd.locate(11,1);
00144                     lcd.printf("%d", kd);
00145                 }
00146             }
00147         }
00148         if (Saltar.rising())
00149         {
00150             led3 =!led3;
00151             if (p==1)
00152             {
00153                 ++p;
00154                 lcd.locate(11,0);
00155                 lcd.printf("%d", kp);
00156                 
00157                 
00158             }
00159             else if (p==2)
00160             {
00161                 ++p;
00162                 lcd.locate(3,1);
00163                 lcd.printf("%d", ki);
00164                 lcd.locate(3,1);
00165                 
00166             }
00167             else if (p==3)
00168             {
00169                 ++p;
00170                 lcd.locate(11,1);
00171                 lcd.printf("%d", kd);
00172                 
00173                 
00174             }
00175             else if (p==4)
00176             {
00177                 p=1;
00178                 lcd.locate(3,0);
00179                 lcd.printf("%.1f", sp);
00180                 
00181                 
00182             }
00183         }    
00184     
00185     
00186 }//Botones
00187 
00188 
00189 
00190 //Inicio la función principal;
00191 int main()
00192 {   int contador=0;
00193     lcd.cls();
00194     lcd.writeCommand(C1);//Mando al LCD el comano que inicializa el cursor
00195     lcd.locate(8,0);
00196     lcd.printf("kp=%d", kp);
00197     lcd.locate(0,1);
00198     lcd.printf("Ki=%d", ki);
00199     lcd.locate(8,1);
00200     lcd.printf("Kd=%d", kd);
00201     lcd.locate(0,0);
00202     lcd.printf("Sp=%.1f", sp);
00203     SalidaAnaloga=0;
00204     
00205     while(1) //Iniciar Ciclo Infinito
00206     {
00207         Botones(); //Inicia la función que revisa el estado de los botones
00208         
00209         if(IniciarPID.rising()) //Se presiona el botón Iniciar PID
00210         {
00211            lcd.cls();//Borrar pantalla;
00212            lcd.locate(0,0);
00213            lcd.printf("PID...");
00214            wait(1);
00215            lcd.cls();//Borrar pantalla;
00216            break; // Termino el ciclo infinito;
00217         }//if
00218     }//while
00219     
00220     while(1)//ciclo infinito para el PID
00221     {
00222     medidamV=MedidaAnaloga*3300;//La medida es convertida a un valor en mV, siendo el máximo valor esperado 3300mV (3.3V)
00223     
00224     errormV= (sp*1000)- medidamV; //Estoy ingresando un valor en V, pero opero internamente en mV
00225     contador++; //Contador para actualizar la pantalla cada cierto número de ciclos;
00226     if(contador ==10)
00227     {
00228         lcd.cls();
00229         lcd.locate(0,0);
00230         lcd.printf("Sp:%.2fV", sp);//Muestro el set point;
00231         
00232         lcd.locate(0,1);
00233         lcd.printf("M:%.2fV", medidamV/1000);//Muestro la medida;
00234         
00235         lcd.locate(8,1);
00236         lcd.printf("E:%.2fV", errormV/1000);//Muestro el error;   
00237         
00238         lcd.locate(9,0);
00239         lcd.printf("U:%.1fV",PID*3.3/999); //Muestro el esfuerzo de control
00240         contador=0;//Reinicializo el contador;             
00241     }//if
00242     ControlPID();//Llamo la función PID;
00243     if(Incrementar.rising()){sp=sp+0.5;}
00244     if(sp>3.3){sp=3.3;}//Limito el valor del Set Point;
00245     if(Decrementar.rising()){sp=sp-0.5;}
00246     if(sp<0){sp=0;}//Limito el valor del Set Point;
00247     wait(0.05);//Espero un tiempo;
00248     }
00249 }