PID para el control de voltaje de un capacitor en un circuito RC
Dependencies: Debounced TextLCD mbed
Fork of pid_teclas by
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 }
Generated on Wed Jul 27 2022 07:58:01 by 1.7.2