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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }