
PROCESADORES - 2016-03. TAREA 2. PID+IrDA
Dependencies: Pulse1 TextLCD mbed
Fork of PID_ENCODER_OK by
Tarea 2: IRDA + PID
PROCESADORES - 2016-03
Por:
- Jaime Alonso Osorio Palacio
- David Fuertes Chaguezac
- Wilson Anibal Ortega Andrade
- John Wilmer Ruiz López
A partir del código de PID+ENCODER: https://developer.mbed.org/users/tony63/code/PID_ENCODER_OK/ , se adiciona un sensor IrDA (Infrared Data Association) para programar a través de este los parámetros del PID (spnum, kp, ki y kd) en la FRDM-KL25Z. Observar todos estos datos y configuraciones en una LCD. Posee depuración via USB en una terminal (se usó Termite 3.2.) para conocer los estados en los que se encuentra el programa y verificar los datos.
IMÁGENES:
Revision 1:058b8f5c135d, committed 2016-04-24
- Comitter:
- tony63
- Date:
- Sun Apr 24 18:32:52 2016 +0000
- Parent:
- 0:4e0dfcf0e7ce
- Child:
- 2:fe2c4b1f132f
- Commit message:
- Control PID gen?rico que se parametriza con un encoder rotatorio. Todos los c?lculos se procesan en coma flotante. Se imprimen sin cifras significativas por dificultades de impresi?n en la LCD.
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Fri Apr 22 23:11:38 2016 +0000 +++ b/main.cpp Sun Apr 24 18:32:52 2016 +0000 @@ -4,8 +4,7 @@ TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 QEI encoder (PTA13, PTD5, NC, 624); - -AnalogIn y(PTB0);//entrada analoga +AnalogIn y(PTB3);//entrada analoga AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer //si se ignora esto se arruina la FRDMKL25Z DigitalOut led1(LED1); @@ -24,11 +23,10 @@ int C4=0x0C; // quito cursor bajo int C1=0x0F; -int err, med, yr, pid, ap, ai, ad, err_v, cambio=0, diferencia=0; -float pidn; +int cambio=0, diferencia=0; +float pid,o,ai,ad,ap,med,err; +float err_v; int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1; -int flagt=0; -Timer t; int main() { @@ -64,9 +62,9 @@ { if(pos==1) { - if(spnum+diferencia>=9999) + if(spnum+diferencia>=999) { - spnum=9999; + spnum=999; lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); @@ -81,9 +79,9 @@ } else if(pos==2) { - if(kpnum+diferencia>=9999) + if(kpnum+diferencia>=999) { - kpnum=9999; + kpnum=999; lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); @@ -98,9 +96,9 @@ } else if(pos==3) { - if(kinum+diferencia>=9999) + if(kinum+diferencia>=999) { - kinum=9999; + kinum=999; lcd.locate(3,1); lcd.printf(" "); lcd.locate(3,1); @@ -115,9 +113,9 @@ } else if(pos==4) { - if(kdnum+diferencia>=9999) + if(kdnum+diferencia>=999) { - kdnum=9999; + kdnum=999; lcd.locate(11,1); lcd.printf(" "); lcd.locate(11,1); @@ -245,34 +243,22 @@ wait(1); // se imprimen los parches del control ***************************************** lcd.cls(); - lcd.printf("Er=%d",err); + lcd.printf("Er=%3.0f",err); lcd.locate(8,0); - lcd.printf("Me=%d",med); + lcd.printf("Me=%3.0f",med); lcd.locate(0,1); - lcd.printf("Sp=%d",spnum); + lcd.printf("Sp=%3.0f",spnum); lcd.locate(8,1); - lcd.printf("Co=%d",pid); - wait(2); + lcd.printf("Co=%3.0f",pid); + wait(1); // CICLO PRINCIPAL CONTROLADOR PID - flagt=0; - while(1) - { - med=999*y.read(); //leer puerto analogo y asignar a med + lop1: med = y.read()*999; err = (spnum-med); //se calcula el error - - ap = kpnum*err; //se calcula la accion proporcinal - - // se verifica que la accion integral no sea muy grande - if(ai<100) - { - ai =(kinum*err)+ai; //calculo de la integral del error - } - - ad = kdnum*(err-err_v); //calculo de la accion derivativa - + ap = kpnum*err*0.01f; //se calcula la accion proporcinal + ai =(kinum*err*0.01f)+ai; //calculo de la integral del error + ad = kdnum*(err-err_v)*0.01f; //calculo de la accion derivativa pid = (ap+ai+ad); - // se verifica que pid sea positivo ************************************** if(pid<=0) { @@ -285,42 +271,36 @@ pid=999; } - // se actualizan las variables ******************************************* - err_v = err; - + //se muestran las variables****************************************** - if(flagt==0) - { - t.start(); - flagt=1; - } - if(t>=0.3) - { lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); - lcd.printf("%d",err); + lcd.printf("%3.0f",err); lcd.locate(11,0); - lcd.printf(" "); + lcd.printf(" "); lcd.locate(11,0); - lcd.printf("%d",med); + lcd.printf("%3.0f",med); lcd.locate(3,1); - lcd.printf(" "); + lcd.printf(" "); lcd.locate(3,1); lcd.printf("%d",spnum); lcd.locate(11,1); - lcd.printf(" "); + lcd.printf(" "); lcd.locate(11,1); - lcd.printf("%d",pid); - flagt=0; - t.reset(); - } + lcd.printf("%3.0f",pid); + + + //Normalizacion de la salida - pidn=pid/999; + // se actualizan las variables ******************************************* + err_v = err; + o = pid/999; + u.write(o); // se envia el valor pid a puerto analogico de salida (D/A) ************** - u.write(pidn); + // se repite el ciclo - wait(0.005); - } + wait_ms(300); + goto lop1; }