PID + Teclas + LCD
Dependencies: Debounced TextLCD mbed
Diff: main.cpp
- Revision:
- 0:fd20467a764b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Apr 10 03:14:07 2015 +0000 @@ -0,0 +1,306 @@ +// Tarea Tres - Procesadores - 01-2015 +// PID con opcion de incremento, decremento y cambio de posicion en LCD + +// Se incluyen las librerias correspondientes para el codigo + +#include "mbed.h" +#include "DebouncedIn.h" +#include "TextLCD.h" + +// Caracterizacion de Puertos + +AnalogIn Vin(PTC2); // Definicion de puerto para entrada analoga +AnalogOut Vout(PTE30); // Definicion del puerto para salida analoga +TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); + +DebouncedIn button1(PTC12); // Definicion del boton1 como boton para incrementar +DebouncedIn button4(PTC17); // Definicion del boton4 como boton de enter +DebouncedIn button3(PTC16); // Definicion del boton3 como boton de menu +DebouncedIn button2(PTC13); // Definicion del boton2 como boton para decrementar + + +int C1=0x0F; // Pone el cursor +int C4=0x0C; // Quito el cursor bajo + +// Deficion de las variables para el controlador PID + + +int ref=0; // Incluimos la variable de referencia +int Cint=0; // Incluimos la constante integral +int Cder=0; // Inlcuimos la constante derivativa +int Cpro=0; // Incluimos la constante proporcional +int pos=0; // Inlcuimos la variable de posicion en el LCD + +int med; // Medida de la señal +int er=0; // Error en la medida +int Apid; // Accion del PID +int Ai=0; // Accion Integral +int Ad; // Accion Derivativa +int Ap; // Accion Proporcional +int ev; // error viejo + +int Int; +int FactEsc; // Factor de Escalado +float pidn; + +// Inicio de la funcion principal + +int main() +{ + lcd.cls(); // Inicio el LCD y lo limpio por ahí derecho + lcd.writeCommand(C1); // Se escribe segun el modulo del LCD + lcd.locate(8,0); // Me ubico en el LCD donde deseo imprimir + lcd.printf("FactEsc =%d", FactEsc); // Se Presenta el factor de escalado(FactEsc) + lcd.locate(0,1); + lcd.printf("Pro =%d", Cpro); // Se presenta la contante proporcional(Cpro) + lcd.locate(6,1); + lcd.printf("Int =%d", Cint); // Se presenta la constante integrativa(Cint) + lcd.locate(11,1); + lcd.printf("Der =%d", Cder); // Se presenta la constante derivativa(Cder) + lcd.locate(0,0); + lcd.printf("Ref=%d", ref); // Se presenta el valor de la referencia (ref) + + while(1) + { + if (button1.falling()) // Boton de incremento + { + + if (pos==1) + { + ++ref; + lcd.locate(3,0); + lcd.printf(" "); + lcd.locate(3,0); + lcd.printf("%d", ref); + } + else if (pos==2) + { + ++Int; + if (Int==1){ + FactEsc =1;} + if (Int==2){ + FactEsc =10;} + if (Int==3){ + FactEsc =100; + Int=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", FactEsc); + } + else if (pos==3) + { + ++Cpro; + lcd.locate(2,1); + lcd.printf(" "); + lcd.locate(2,1); + lcd.printf("%d", Cpro); + } + else if (pos==4) + { + ++Cint; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%d", Cint); + } + else if (pos==5) + { + ++Cder; + lcd.locate(13,1); + lcd.printf(" "); + lcd.locate(13,1); + lcd.printf("%d", Cder); + } + } + + if (button2.falling()) // Boton de decremento + { + + if (pos==1) + { + if (ref==0) // no mostrar nada + { + } + else + { + --ref; + lcd.locate(3,0); + lcd.printf(" "); + lcd.locate(3,0); + lcd.printf("%d", ref); + } + } + + if (pos==3) + { + if (Cpro==0) // no mostrar nada + { + } + else + { + --Cpro; + lcd.locate(2,1); + lcd.printf(" "); + lcd.locate(2,1); + lcd.printf("%d", Cpro); + } + } + if (pos==4) + { + if (Cint==0) // no mostrar nada + { + } + else + { + --Cint; + lcd.locate(8,1); + lcd.printf(" "); + lcd.locate(8,1); + lcd.printf("%d", Cint); + } + } + if (pos==5) + { + if (Cder==0) // no mostrar nada + { + } + else + { + --Cder; + lcd.locate(13,1); + lcd.printf(" "); + lcd.locate(13,1); + lcd.printf("%d", Cder); + } + } + + + if (button3.falling()) // Boton de menu + { + if (pos==1) + { + ++pos; + lcd.locate(11,0); + lcd.printf("%d", FactEsc); + } + else if (pos==2) + { + ++pos; + lcd.locate(2,1); + lcd.printf("%d", Cpro); + lcd.locate(2,1); + } + else if (pos==3) + { + ++pos; + lcd.locate(8,1); + lcd.printf("%d", Cint); + } + else if (pos==4) + { + ++pos; + lcd.locate(13,1); + lcd.printf("%d", Cpro); + } + else if (pos==5) + { + pos=1; + lcd.locate(3,0); + lcd.printf("%d", ref); + } + + } + + + 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(" GRABADOS!"); + wait(1); + lcd.cls(); + lcd.printf(" EMPIEZA EL PID"); + wait(1); + // se imprimen los parches del control ***************************************** + lcd.cls(); + lcd.printf("Error=%d",er); // imprime el error de la medida(error) + lcd.locate(8,0); + lcd.printf("Med=%d",med); // imprime la medida de la señal(med) + lcd.locate(0,1); + lcd.printf("Ref=%d",ref); // imprime la referencia (ref) + lcd.locate(8,1); + lcd.printf("AC=%d",Apid); // imprime el la Accion de control del pid (AC) + wait(1); + + // CICLO PRINCIPAL CONTROLADOR PID + // DEFINIMOS LOS PARAMETROS Kp,Ki y Kd teniendo en cuenta la escala + + Cpro= Cpro*FactEsc; + Cint = Cint*FactEsc; + Cder= Cder*FactEsc; + + cicloPID : + + med=10*Vin.read(); //Lee el puerto analogo y asigna el valor leiro + er = (ref-med); // halla en error de entre la medida y la referencia + Ap= Cpro*er; // calculo de la accion proporcional + Ai=(Cint*er)+Ai; //calculo de la accion integral + Ad = Cder*(er-ev); //calculo de la accion derivativa + Apid = (Ap+Ai+Ad); // es la señal de control que nos da el PID + + if (Apid < 0){ // limite inferior de la accion de control + Apid=0; + } + if (Apid > 99){ // limite superiro de la accion de control + Apid=100; + } + + wait(.5); + if(error >= 0){ + lcd.locate(4,0); + lcd.printf(" "); + lcd.locate(3,0); + lcd.printf("%d",er); // Muestro el error + } + if (error<0){ + lcd.locate(3,0); + lcd.printf("%d",er); // Muestro el error + } + lcd.locate(12,0); + lcd.printf(" "); + lcd.locate(11,0); + lcd.printf("%d",med); // imprime el valor de la medición + lcd.locate(3,1); + lcd.printf("%d",ref); // imprime el valor de la referenica + + if(Apid < 100){ + lcd.locate(13,1); + lcd.printf(" "); + lcd.locate(11,1); + lcd.printf("%d",Apid);} // imprime el valor de la señal de control + + if(Apid >= 100){ + lcd.locate(11,1); + lcd.printf("%d",Apid);} // imprime el valor de la señal de control + + ev = er; + pidn=Apid*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 ; + + } + } + +