se incrementa y decrementa parámetros con el encoder.
Dependencies: QEI TextLCD mbed
Fork of TAREA_4_PROCESADORES by
Revision 2:fba5e2ee8bee, committed 2014-05-23
- Comitter:
- jana
- Date:
- Fri May 23 18:31:15 2014 +0000
- Parent:
- 1:9ca362d07dd0
- Commit message:
- encoder_procesadores
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 9ca362d07dd0 -r fba5e2ee8bee main.cpp --- a/main.cpp Tue Apr 08 19:02:44 2014 +0000 +++ b/main.cpp Fri May 23 18:31:15 2014 +0000 @@ -5,268 +5,226 @@ AnalogIn Vin(PTC2); AnalogOut Vout(PTE30); -PwmOut sound(PTA12); +PwmOut Pwm(PTA5); +float p1 = 0.001; + +int PWMmodule(float p1) +{ + Pwm.period(p1); + Pwm.write(0.1); + wait(0.1); + Pwm.write(1); + wait(0.1); + Pwm.write(0.5); + wait(0.1); + Pwm.write(2); + wait(0.1); + Pwm.write(0.01); + wait(0.1); + Pwm.write(0.001); + wait(0.1); + Pwm.write(0); + return 0; +} TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); //Puertos LCD rs, e, d4, d5, d6, d7 -QEI Encoder (PTA1, PTA2, NC, 624); //Puertos de la tarjeta asignados para el Encoder +QEI encoder (PTD7, PTD6, NC, 624); //Puertos de la tarjeta asignados para el Encoder -DigitalOut led1(LED1); //led de cambio de posición -DigitalOut led2(LED2); //led incremento de parámetros -DigitalOut led3(LED3); //led decremento de parámetros -DebouncedIn bot1(PTC12); //cambiar la posición (CONECTO ESTA ENTRADA A LA ULTIMA SALIDA DEL ENCONDER, ASI SE UTILIZARA EL BOTON DEL ENCODER) -DebouncedIn bot4(PTC17); //salida de bucle +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DebouncedIn boton_encoder(PTC5); //cambiar la posición- EL BOTON DEL ENCODER + //Códigos LCD -int C1=0x0E; // Muestra el cursor -// 0x18; // desplazamiento izquierda -// 0x1A; // desplazamiento derecha -int C4=0x0C; +int C2=0x18; // desplaza izquierda +int C3=0x1A; // desplaza derecha +int C4=0x0C; // quito cursor bajo +int C1=0x0E; // Muestra el cursor -int a, kp, ki, kd, sp, ciclo, valor, v; // indice de la variable -float med, sp0, pid, ap, err, ai, ad,err_v; + +int s, kp, ki, kd, sp, dato, spmax, kpmax, kimax, kdmax; // declaracion de variables + int main() { - led1=led2=led3=1; - lcd.printf("Control PID"); - wait(1.5); +// Ubica e imprime nombre de los parámetros en del PID en la pantalla LCD lcd.cls(); - - lcd.writeCommand(C1); //comando para mostrar el cursor en el LCD - - lcd.locate(0,0); // Ubica e imprime nombre de los parámetros en del PID en la pantalla LCD + lcd.writeCommand(C1); //comando para mostrar el cursor en el LCD + lcd.locate(2,0); lcd.printf("Sp="); - lcd.locate(8,0); + lcd.locate(10,0); lcd.printf("Kp="); - lcd.locate(0,1); + lcd.locate(2,1); lcd.printf("Ki="); - lcd.locate(8,1); + lcd.locate(10,1); lcd.printf("Kd="); //Inicio del ciclo while(1) { - if (bot1.falling()) { //----------------- Aumenta de posición el cursor a la primera línea de menu + if (boton_encoder.falling()) { //Detecta el aumento y disminucion del valor del encoder - sound=1.0f; - wait(0.1); - sound=0; - - led1=0; - wait(.15); - led1=1; - ++a; + PWMmodule(p1); + encoder.reset(); + ++s; + if (s>=3){ + s=0; + } } - valor = Encoder.getPulses(); //------------- Asigna el valor de los pulsos del encoder a una variable llamada "valor" - - switch(a) { + dato = encoder.getPulses(); //Asigna el valor de los pulsos del encoder a una variable + + + + switch(s) { case 0: - - sp = sp + valor; //------------- Asigna el valor del encoder al parámetro sp y tiene en cuenta el valor anterior - Encoder.reset(); //------------- Resetea el valor del encoder - if (sp<0){ - sp=0; //------------- No se admite valores negativos - } + + spmax=sp+dato; - lcd.locate(2,0); //------------- Ubica e imprime el parámetro "sp" en la pantalla LCD + if(spmax>=999){ + + lcd.locate(4,0); lcd.printf("= ",sp); - lcd.locate(3,0); + lcd.locate(5,0); lcd.printf("%i",sp); - wait(0.15); - - if (bot1.falling()) { //--------------Aumenta de posición el cursor a la segunda línea de menu + } + else { + sp = sp + dato; + encoder.reset(); + if (sp<0){ + sp=0; + } + lcd.locate(4,0); + lcd.printf("= ",sp); + lcd.locate(5,0); + lcd.printf("%i",sp); + } + if (boton_encoder.falling()) { - sound=1.0f; - wait(0.1); - sound=0; + PWMmodule(p1); - a=1; + s=1; led1=0; wait(.15); led1=1; - Encoder.reset(); //------------- Resetea el valor del encoder + encoder.reset(); } - break; - - case 1: - - kp = kp + valor; //------------- Asigna el valor del encoder al parámetro kp y tiene en cuenta el valor anterior - Encoder.reset(); //------------- Resetea el valor del encoder - if (kp<0){ - kp=0; //------------- No se admite valores negativos - } + break; + + case 1: + + kpmax=kp+dato; - lcd.locate(10,0); //------------- Ubica e imprime el parámetro "sp" en la pantalla LCD - lcd.printf("= ",kp); - lcd.locate(11,0); - lcd.printf("%i",kp); - wait(0.15); - - if (bot1.falling()) { //--------------Aumenta de posición el cursor a la tercera línea de menu - - sound=1.0f; - wait(0.1); - sound=0; - - a=2; - led1=0; - wait(.15); - led1=1; - Encoder.reset(); //------------- Resetea el valor del encoder - } - break; + if(kpmax>=999){ + + lcd.locate(12,0); + lcd.printf("= ",kp); + lcd.locate(13,0); + lcd.printf("%i",kp); + } + else { + + kp = kp + dato; + encoder.reset(); + if (kp<0){ + kp=0; + } - case 2: - - ki = ki + valor; //------------- Asigna el valor del encoder al parámetro ki y tiene en cuenta el valor anterior - Encoder.reset(); //------------- Resetea el valor del encoder - if (ki<0){ - ki=0; //------------- No se admite valores negativos - } - - lcd.locate(2,1); //------------- Ubica e imprime el parámetro "sp" en la pantalla LCD - lcd.printf("= ",ki); - lcd.locate(3,1); - lcd.printf("%i",ki); - wait(0.15); - - if (bot1.falling()) { //--------------Aumenta de posición el cursor a la cuarta línea de menu - - sound=1.0f; - wait(0.1); - sound=0; - - a=3; - led1=0; - wait(.15); - led1=1; - Encoder.reset(); //------------- Resetea el valor del encoder - } - break; + lcd.locate(12,0); + lcd.printf("= ",kp); + lcd.locate(13,0); + lcd.printf("%i",kp); + } + if (boton_encoder.falling()) { + + PWMmodule(p1); + + s=2; + led2=0; + wait(.15); + led2=1; + encoder.reset(); + } + break; + + case 2: + + kimax=ki+dato; - case 3: - kd = kd + valor; //------------- Asigna el valor del encoder al parámetro kd y tiene en cuenta el valor anterior - Encoder.reset(); //------------- Resetea el valor del encoder - if (kd<0){ - kd=0; //------------- No se admite valores negativos - } - lcd.locate(10,1);//------------- Ubica e imprime el parámetro "kd" en la pantalla LCD - lcd.printf("= ",kd); - lcd.locate(11,1); - lcd.printf("%i",kd); - wait(0.15); - - if (bot1.falling()) { //--------------Aumenta de posición el cursor a la cuarta línea de menu - - sound=1.0f; - wait(0.1); - sound=0; - - a=0; - led1=0; - wait(.15); - led1=1; - Encoder.reset(); //------------- Resetea el valor del encoder - } - break; - - } - - if (bot4.falling()){ - led1=led2=led3=0; //------------- Flash para salir del bucle - wait(0.25); - led1=led2=led3=1; - break; //------------- sale del bucle de la pantalla - } - } - -//--------------------------------------------------------------------------------------------------------------------------------------------------- - lcd.writeCommand(C4); //Quita el cursor bajo de la pantalla LCD - lcd.cls(); //borra la pantalla - lcd.printf("GUARDADOS!"); - wait(2); - lcd.cls(); - lcd.printf("INICIA EL PID"); - wait(2); - // 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",sp0); - lcd.locate(8,1); - lcd.printf("Pid%d",pid); - - - while(1) { + if(kimax>=999){ + + lcd.locate(4,1); + lcd.printf("= ",ki); + lcd.locate(5,1); + lcd.printf("%i",ki); + } + else { + ki = ki + dato; //Asigna el valor del encoder al parámetro y tiene en cuenta el valor anterior + encoder.reset(); //Resetea el valor del encoder + if (ki<0){ + ki=0; //No se muestran valores negativos + } + + lcd.locate(4,1); + lcd.printf("= ",ki); + lcd.locate(5,1); + lcd.printf("%i",ki); + } + if (boton_encoder.falling()) { //Aumenta de posición el cursor a la siguiente parametro + + PWMmodule(p1); + + s=3; + led3=0; + wait(.15); + led3=1; + encoder.reset(); //------------- Resetea el valor del encoder + } + break; + + case 3: + + kdmax=kd+dato; + + if(kdmax>=999){ + + lcd.locate(12,1); + lcd.printf("= ",kd); + lcd.locate(13,1); + lcd.printf("%i",kd); + } + else { + kd = kd + dato; + encoder.reset(); + if (kd<0){ + kd=0; + } + + lcd.locate(12,1); + lcd.printf("= ",kd); + lcd.locate(13,1); + lcd.printf("%i",kd); + } + if (boton_encoder.falling()) { + + PWMmodule(p1); + + s=4; + led1=0; + wait(.15); + led1=1; + encoder.reset(); + + } + break; + } + } - wait(0.001); - //leer puerto analogo y asignar a med - - - med = (Vin*3.27); - sp0 = sp*0.0327; - err = (sp0-med); - float kp0; - kp0 = kp*0.001; - ap = kp0*err; - float ki0; - ki0 = ki*0.001; - ai = (ki0*err)+ai; //calculo de la integral del error - float kd0; - kd0 = kd*0.0001; - ad = kd0*(err-err_v); //calculo de la accion derivativa - pid = (ap+ai+ad); - - - // se verifica que pid sea menor o igual la valor maximo ***************** - if (pid > 0.999){ - pid=1; - } - - // se verifica que pid sea positivo ************************************** - if (pid < 0){ - pid=0; - } - - // se verifica que la accion integral no sea muy grande - if (ai > 999){ - ai=1000; - } - - Vout=pid; - //Mostrar resultados PID - if(ciclo>700) { - lcd.locate(2,0); - lcd.printf(" "); - lcd.locate(0,0); - lcd.printf("Er%2.1f",err); - lcd.locate(10,0); - lcd.printf(" "); - lcd.locate(8,0); - lcd.printf("Me%4.2f",med); - lcd.locate(2,1); - lcd.printf(" "); - lcd.locate(0,1); - lcd.printf("Sp%4.2f",sp0); - lcd.locate(10,1); - lcd.printf(" "); - lcd.locate(8,1); - lcd.printf("Pid%4.3f",pid); - ciclo=0; - } - else - ciclo++; - err_v = err; //guarda el error - } // Envía parámetro pid al puerto analogico de salida (D/A) y se repite el ciclo } \ No newline at end of file