se ingresan las constantes kp, ki y kd, y ademas, los tiempos de subida, sostenido y bajada de la planta
Dependencies: QEI RTC-DS1307 TextLCD mbed
main.cpp
00001 #include "mbed.h" 00002 #include "QEI.h" 00003 #include "TextLCD.h" 00004 #include "Rtc_Ds1307.h" 00005 00006 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 00007 QEI encoder (PTA13, PTD5, NC, 624); 00008 Rtc_Ds1307 rtc(PTE0, PTE1); 00009 AnalogIn y(PTB3);//entrada analoga 00010 AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer 00011 //si se ignora esto se arruina la FRDMKL25Z 00012 DigitalOut led1(LED1); 00013 DigitalOut led2(LED2); 00014 DigitalOut led3(LED3); 00015 00016 DigitalIn button3(PTC16);//cambia ingreso de los 4 parametros 00017 DigitalIn button4(PTC17);//termina y consolida valores de 4 parametros y sale del loop 00018 00019 00020 //codigos movimiento del curzor 00021 00022 //int C1=0x0E; // solo muestra el curzor 00023 int C2=0x18; // desplaza izquierda 00024 int C3=0x1A; // desplaza derecha 00025 int C4=0x0C; // quito cursor bajo 00026 00027 int C1=0x0F; 00028 int cambio=0, diferencia=0; 00029 float pid,o,ai,ad,ap,med,err; 00030 float err_v; 00031 int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1; 00032 int sub=0,sost=0,baj=0,pos1=1; 00033 int t1,t2,t3; 00034 float f; 00035 int i=0; 00036 int c,c1=0; 00037 int n=60; 00038 float ref; 00039 00040 int main() 00041 { 00042 lcd.locate(0,1); 00043 lcd.printf("**Control PID**"); 00044 wait(2); 00045 lcd.cls(); // Borrar Pantalla 00046 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD 00047 00048 lcd.locate(8,0); 00049 lcd.printf("Kp=%d",kpnum); 00050 lcd.locate(0,1); 00051 lcd.printf("Ki=%d",kinum); 00052 lcd.locate(8,1); 00053 lcd.printf("Kd=%d",kdnum); 00054 lcd.locate(0,0); 00055 lcd.printf("Sp=%d",spnum); 00056 00057 while(1) 00058 { 00059 //lcd.locate(8,0); 00060 //lcd.printf("Kp=%d",encoder.getPulses()); 00061 //wait(.5); 00062 00063 diferencia=encoder.getPulses()-cambio; 00064 cambio=encoder.getPulses(); 00065 00066 if (diferencia==0) 00067 { 00068 //nada 00069 } 00070 else if(diferencia>0) 00071 { 00072 if(pos==1) 00073 { 00074 if(spnum+diferencia>=999) 00075 { 00076 spnum=999; 00077 lcd.locate(3,0); 00078 lcd.printf(" "); 00079 lcd.locate(3,0); 00080 lcd.printf("%d", spnum); 00081 } 00082 else 00083 { 00084 spnum+=diferencia; 00085 lcd.locate(3,0); 00086 lcd.printf("%d", spnum); 00087 } 00088 } 00089 else if(pos==2) 00090 { 00091 if(kpnum+diferencia>=999) 00092 { 00093 kpnum=999; 00094 lcd.locate(11,0); 00095 lcd.printf(" "); 00096 lcd.locate(11,0); 00097 lcd.printf("%d", kpnum); 00098 } 00099 else 00100 { 00101 kpnum+=diferencia; 00102 lcd.locate(11,0); 00103 lcd.printf("%d", kpnum); 00104 } 00105 } 00106 else if(pos==3) 00107 { 00108 if(kinum+diferencia>=999) 00109 { 00110 kinum=999; 00111 lcd.locate(3,1); 00112 lcd.printf(" "); 00113 lcd.locate(3,1); 00114 lcd.printf("%d", kinum); 00115 } 00116 else 00117 { 00118 kinum+=diferencia; 00119 lcd.locate(3,1); 00120 lcd.printf("%d", kinum); 00121 } 00122 } 00123 else if(pos==4) 00124 { 00125 if(kdnum+diferencia>=999) 00126 { 00127 kdnum=999; 00128 lcd.locate(11,1); 00129 lcd.printf(" "); 00130 lcd.locate(11,1); 00131 lcd.printf("%d", kdnum); 00132 } 00133 else 00134 { 00135 kdnum+=diferencia; 00136 lcd.locate(11,1); 00137 lcd.printf("%d", kdnum); 00138 } 00139 } 00140 } 00141 00142 else if(diferencia<0) 00143 { 00144 if(pos==1) 00145 { 00146 if(spnum+diferencia<0) 00147 { 00148 //No ocurre nada 00149 } 00150 else 00151 { 00152 spnum+=diferencia; 00153 lcd.locate(3,0); 00154 lcd.printf(" "); 00155 lcd.locate(3,0); 00156 lcd.printf("%d", spnum); 00157 } 00158 } 00159 else if(pos==2) 00160 { 00161 if(kpnum+diferencia<0) 00162 { 00163 //No ocurre nada 00164 } 00165 else 00166 { 00167 kpnum+=diferencia; 00168 lcd.locate(11,0); 00169 lcd.printf(" "); 00170 lcd.locate(11,0); 00171 lcd.printf("%d", kpnum); 00172 } 00173 } 00174 else if(pos==3) 00175 { 00176 if(kinum+diferencia<0) 00177 { 00178 //No ocurre nada 00179 } 00180 else 00181 { 00182 kinum+=diferencia; 00183 lcd.locate(3,1); 00184 lcd.printf(" "); 00185 lcd.locate(3,1); 00186 lcd.printf("%d", kinum); 00187 } 00188 } 00189 else if(pos==4) 00190 { 00191 if(kdnum+diferencia<0) 00192 { 00193 //No ocurre nada 00194 } 00195 else 00196 { 00197 kdnum+=diferencia; 00198 lcd.locate(11,1); 00199 lcd.printf(" "); 00200 lcd.locate(11,1); 00201 lcd.printf("%d", kdnum); 00202 } 00203 } 00204 } 00205 00206 if (!button3) //cambia la posicion de ingreso de parametros 00207 { 00208 led3 =!led3; 00209 if(pos==4) 00210 { 00211 pos=1; 00212 lcd.locate(3,0); 00213 lcd.printf("%d", spnum); 00214 } 00215 else if (pos==1) 00216 { 00217 pos++; 00218 lcd.locate(11,0); 00219 lcd.printf("%d", kpnum); 00220 } 00221 else if(pos==2) 00222 { 00223 pos++; 00224 lcd.locate(3,1); 00225 lcd.printf("%d", kinum); 00226 } 00227 else if(pos==3) 00228 { 00229 pos++; 00230 lcd.locate(11,1); 00231 lcd.printf("%d", kdnum); 00232 } 00233 wait(0.25); 00234 00235 } 00236 00237 if (!button4) 00238 { 00239 break; //sale del bucle si pisan suiche4 00240 } 00241 wait(0.1); 00242 } 00243 lcd.cls(); 00244 lcd.locate(8,0); 00245 lcd.printf("so=%d",sost); 00246 lcd.locate(0,1); 00247 lcd.printf("ba=%d",baj); 00248 lcd.locate(0,0); 00249 lcd.printf("su=%d",sub); 00250 wait(3); 00251 while (0.1) 00252 { 00253 diferencia=encoder.getPulses()-cambio; 00254 cambio=encoder.getPulses(); 00255 00256 if (diferencia==0) 00257 { 00258 //nada 00259 } 00260 else if(diferencia>0) 00261 { 00262 if(pos1==1) 00263 { 00264 if(sub+diferencia>=59) 00265 { 00266 sub=59; 00267 lcd.locate(3,0); 00268 lcd.printf(" "); 00269 lcd.locate(3,0); 00270 lcd.printf("%d", sub); 00271 } 00272 else 00273 { 00274 sub+=diferencia; 00275 lcd.locate(3,0); 00276 lcd.printf("%d", sub); 00277 } 00278 } 00279 else if(pos1==2) 00280 { 00281 if(sost+diferencia>=59) 00282 { 00283 sost=59; 00284 lcd.locate(11,0); 00285 lcd.printf(" "); 00286 lcd.locate(11,0); 00287 lcd.printf("%d", sost); 00288 } 00289 else 00290 { 00291 sost+=diferencia; 00292 lcd.locate(11,0); 00293 lcd.printf("%d", sost); 00294 } 00295 } 00296 else if(pos1==3) 00297 { 00298 if(baj+diferencia>=59) 00299 { 00300 baj=59; 00301 lcd.locate(3,1); 00302 lcd.printf(" "); 00303 lcd.locate(3,1); 00304 lcd.printf("%d", baj); 00305 } 00306 else 00307 { 00308 baj+=diferencia; 00309 lcd.locate(3,1); 00310 lcd.printf("%d", baj); 00311 } 00312 } 00313 } 00314 00315 else if(diferencia<0) 00316 { 00317 if(pos1==1) 00318 { 00319 if(sub+diferencia<0) 00320 { 00321 //No ocurre nada 00322 } 00323 else 00324 { 00325 sub+=diferencia; 00326 lcd.locate(3,0); 00327 lcd.printf(" "); 00328 lcd.locate(3,0); 00329 lcd.printf("%d", sub); 00330 } 00331 } 00332 else if(pos1==2) 00333 { 00334 if(sost+diferencia<0) 00335 { 00336 //No ocurre nada 00337 } 00338 else 00339 { 00340 sost+=diferencia; 00341 lcd.locate(11,0); 00342 lcd.printf(" "); 00343 lcd.locate(11,0); 00344 lcd.printf("%d", sost); 00345 } 00346 } 00347 else if(pos1==3) 00348 { 00349 if(baj+diferencia<0) 00350 { 00351 //No ocurre nada 00352 } 00353 else 00354 { 00355 baj+=diferencia; 00356 lcd.locate(3,1); 00357 lcd.printf(" "); 00358 lcd.locate(3,1); 00359 lcd.printf("%d", baj); 00360 } 00361 } 00362 00363 } 00364 00365 if (!button3) //cambia la posicion de ingreso de parametros 00366 { 00367 led3 =!led3; 00368 if(pos1==3) 00369 { 00370 pos1=1; 00371 lcd.locate(3,0); 00372 lcd.printf("%d", sub); 00373 } 00374 else if (pos1==1) 00375 { 00376 pos1++; 00377 lcd.locate(11,0); 00378 lcd.printf("%d", sost); 00379 } 00380 else if(pos1==2) 00381 { 00382 pos1++; 00383 lcd.locate(3,1); 00384 lcd.printf("%d", baj); 00385 } 00386 wait(0.25); 00387 00388 } 00389 00390 if (!button4) 00391 { 00392 break; //sale del bucle si pisan suiche4 00393 } 00394 wait(0.1); 00395 } 00396 00397 //Transicion 00398 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo 00399 lcd.cls(); //borra la pantalla 00400 lcd.printf(" GUARDADOS!"); 00401 Rtc_Ds1307::Time_rtc tm = {}; 00402 tm.min=0; 00403 tm.sec=0; 00404 t1=sub*60; 00405 t2=(sost+sub)*60; 00406 t3=(sub+sost+baj)*60; 00407 rtc.setTime(tm, false, false); 00408 wait(1); 00409 lcd.cls(); 00410 lcd.printf(" INICIA EL PID"); 00411 wait(1); 00412 rtc.startClock(); 00413 // se imprimen los parches del control ***************************************** 00414 lcd.cls(); 00415 lcd.printf("Er=%3.0f",err); 00416 lcd.locate(8,0); 00417 lcd.printf("Me=%3.0f",med); 00418 lcd.locate(0,1); 00419 lcd.printf("Sp=%3.0f",spnum); 00420 lcd.locate(8,1); 00421 lcd.printf("tm=%02d",tm.min); 00422 lcd.printf(":%02d",tm.sec); 00423 wait(1); 00424 00425 // CICLO PRINCIPAL CONTROLADOR PID 00426 lop1: 00427 rtc.getTime(tm); 00428 if(c1<t1) 00429 { 00430 f=spnum/float(sub*60); 00431 ref=f*float(c1); 00432 } 00433 if((c1>=t1)&&(c1<t2)) 00434 { 00435 ref=spnum; 00436 } 00437 if((c1>=t2)&&(c1<t3)) 00438 { 00439 f=-spnum/float(baj*60); 00440 ref=f*float(c1-t2)+spnum; 00441 } 00442 if (c1>=t3) 00443 { 00444 ref=0; 00445 } 00446 med = y.read()*999; 00447 err = (ref-med); //se calcula el error 00448 ap = kpnum*err*0.01f; //se calcula la accion proporcinal 00449 ai =(kinum*err*0.01f)+ai; //calculo de la integral del error 00450 ad = kdnum*(err-err_v)*0.01f; //calculo de la accion derivativa 00451 pid = (ap+ai+ad); 00452 // se verifica que pid sea positivo ************************************** 00453 if(pid<=0) 00454 { 00455 pid=0; 00456 } 00457 00458 // se verifica que pid sea menor o igual la valor maximo ***************** 00459 if (pid > 999) 00460 { 00461 pid=999; 00462 } 00463 //contador 00464 if ((tm.sec==0)&&(tm.min!=0)) 00465 { 00466 n=n+60; 00467 wait(1); 00468 } 00469 c1=n+tm.sec-60; 00470 //se muestran las variables****************************************** 00471 lcd.locate(3,0); 00472 lcd.printf(" "); 00473 lcd.locate(3,0); 00474 lcd.printf("%3.0f",err); 00475 lcd.locate(11,0); 00476 lcd.printf(" "); 00477 lcd.locate(11,0); 00478 lcd.printf("%3.0f",med); 00479 lcd.locate(3,1); 00480 lcd.printf(" "); 00481 lcd.locate(3,1); 00482 lcd.printf("%3.0f",ref); 00483 lcd.locate(11,1); 00484 lcd.printf(" "); 00485 lcd.locate(11,1); 00486 lcd.printf("%02d",tm.min); 00487 lcd.printf(":%02d",tm.sec); 00488 00489 00490 00491 00492 //Normalizacion de la salida 00493 // se actualizan las variables ******************************************* 00494 err_v = err; 00495 o = pid/999; 00496 u.write(o); 00497 // se envia el valor pid a puerto analogico de salida (D/A) ************** 00498 wait(0.1); 00499 // se repite el ciclo 00500 goto lop1; 00501 }
Generated on Mon Aug 8 2022 06:12:39 by
1.7.2