pid teclas tarea 3
Dependencies: Debounced TextLCD mbed
Fork of pid_teclas by
Revision 1:0978505fcc1b, committed 2015-04-10
- Comitter:
- procesadores_FAC
- Date:
- Fri Apr 10 02:26:50 2015 +0000
- Parent:
- 0:9aa80672eb3d
- Commit message:
- pid teclado
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 9aa80672eb3d -r 0978505fcc1b main.cpp --- a/main.cpp Wed Oct 16 17:10:11 2013 +0000 +++ b/main.cpp Fri Apr 10 02:26:50 2015 +0000 @@ -3,27 +3,36 @@ #include "TextLCD.h" AnalogIn Vin(PTC2); +AnalogOut Vout(PTE30); TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 -DigitalOut led1(LED1); -DigitalOut led2(LED2); -DigitalOut led3(LED3); + DebouncedIn button1(PTC12); DebouncedIn button2(PTC13); DebouncedIn button3(PTC16); +DebouncedIn button4(PTC17); int C1=0x0F; +int C4=0x0C; // quito cursor bajo int sp=0,kp=0,kd=0,ki=0,p=1; +int med,err,pid,ap,ai=0,ai1,ad,err_v; +int i; +int fe; +float pidn; + + int main() { lcd.cls(); lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD lcd.locate(8,0); - lcd.printf("kp=%d", kp); + lcd.printf("Fe=%d", fe); lcd.locate(0,1); - lcd.printf("Ki=%d", ki); - lcd.locate(8,1); - lcd.printf("Kd=%d", kd); + lcd.printf("P=%d", kp); + lcd.locate(6,1); + lcd.printf("I=%d", ki); + lcd.locate(11,1); + lcd.printf("D=%d", kd); lcd.locate(0,0); lcd.printf("Sp=%d", sp); @@ -31,7 +40,7 @@ { if (button1.falling()) { - led1 =!led1; + if (p==1) { ++sp; @@ -42,32 +51,54 @@ } else if (p==2) { - ++kp; + ++i; + if (i==1){ + fe =1;} + if (i==2){ + fe =10;} + if (i==3){ + fe =100; + i=0;} + lcd.locate(11,0); lcd.printf(" "); + lcd.locate(12,0); + lcd.printf(" "); + lcd.locate(13,0); + lcd.printf(" "); + + lcd.locate(11,0); - lcd.printf("%d", kp); + lcd.printf("%d", fe); } else if (p==3) { - ++ki; - lcd.locate(3,1); + ++kp; + lcd.locate(2,1); lcd.printf(" "); - lcd.locate(3,1); - lcd.printf("%d", ki); + lcd.locate(2,1); + lcd.printf("%d", kp); } else if (p==4) { + ++ki; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%d", ki); + } + else if (p==5) + { ++kd; - lcd.locate(11,1); + lcd.locate(13,1); lcd.printf(" "); - lcd.locate(11,1); + lcd.locate(13,1); lcd.printf("%d", kd); } } if (button2.falling()) { - led2 =!led2; + if (p==1) { if (sp==0) // no mostrar nada @@ -82,7 +113,8 @@ lcd.printf("%d", sp); } } - if (p==2) + + if (p==3) { if (kp==0) // no mostrar nada { @@ -90,13 +122,13 @@ else { --kp; - lcd.locate(11,0); + lcd.locate(2,1); lcd.printf(" "); - lcd.locate(11,0); + lcd.locate(2,1); lcd.printf("%d", kp); } } - if (p==3) + if (p==4) { if (ki==0) // no mostrar nada { @@ -104,13 +136,13 @@ else { --ki; - lcd.locate(3,1); + lcd.locate(8,1); lcd.printf(" "); - lcd.locate(3,1); + lcd.locate(8,1); lcd.printf("%d", ki); } } - if (p==4) + if (p==5) { if (kd==0) // no mostrar nada { @@ -118,48 +150,132 @@ else { --kd; - lcd.locate(11,1); + lcd.locate(13,1); lcd.printf(" "); - lcd.locate(11,1); + lcd.locate(13,1); lcd.printf("%d", kd); } } } - if (button3.falling()) - { - led3 =!led3; + + if (button3.falling()) + { if (p==1) { ++p; lcd.locate(11,0); - lcd.printf("%d", kp); - - + lcd.printf("%d", fe); } else if (p==2) { ++p; - lcd.locate(3,1); - lcd.printf("%d", ki); - lcd.locate(3,1); - + lcd.locate(2,1); + lcd.printf("%d", kp); + lcd.locate(2,1); } else if (p==3) { ++p; - lcd.locate(11,1); - lcd.printf("%d", kd); - - + lcd.locate(8,1); + lcd.printf("%d", ki); } else if (p==4) { + ++p; + lcd.locate(13,1); + lcd.printf("%d", kd); + } + else if (p==5) + { p=1; lcd.locate(3,0); - lcd.printf("%d", sp); - - + lcd.printf("%d", sp); } + } - } -} + + if (button4.falling()){ + break; //sale del bucle si pisan suiche4 + } + + } + lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo + lcd.cls(); //borra la pantalla + lcd.printf(" GUARDADOS!"); + wait(1); + lcd.cls(); + lcd.printf(" INICIA EL PID"); + wait(1); + // se imprimen los parches del control ***************************************** + lcd.cls(); + lcd.printf("Er=%d",err); + lcd.locate(8,0); + lcd.printf("Me=%d",med); + lcd.locate(0,1); + lcd.printf("Sp=%d",sp); + lcd.locate(8,1); + lcd.printf("SC=%d",pid); + wait(1); + + // CICLO PRINCIPAL CONTROLADOR PID + // DEFINIMOS LOS PARAMETROS Kp,Ki y Kd teniendo en cuenta la escala + + kp= kp*fe; + ki = ki*fe; + kd= kd*fe; + + cicloPID : + + med=10*Vin.read(); //leer puerto analogo y asignar a med + err = (sp-med); + ap = kp*err; + + ai=(ki*err)+ai; + //calculo de la integral del error + + ad = kd*(err-err_v); //calculo de la accion derivativa + pid = (ap+ai+ad); + + if (pid < 0){ + pid=0; + } + if (pid > 99){ + pid=100; + } + + wait(.5); + if(err >= 0){ + lcd.locate(4,0); + lcd.printf(" "); + lcd.locate(3,0); + lcd.printf("%d",err); + } + if (err<0){ + lcd.locate(3,0); + lcd.printf("%d",err); + } + lcd.locate(12,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%d",med); + lcd.locate(3,1); + lcd.printf("%d",sp); + + if(pid < 100){ + lcd.locate(13,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%d",pid);} + + if(pid >= 100){ + lcd.locate(11,1); + lcd.printf("%d",pid);} + + err_v = err; + pidn=pid*0.01;//Normalizacion de la salida + Vout.write(pidn);//se envia el valor pid a puerto analogico de salida (D/A) + wait(0.005); + goto cicloPID ; + + +} \ No newline at end of file