PID + Teclas + LCD
Dependencies: Debounced TextLCD mbed
main.cpp
- Committer:
- Equipo3JohnAndresx2
- Date:
- 2015-04-10
- Revision:
- 0:fd20467a764b
File content as of revision 0:fd20467a764b:
// 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 ; } }