![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
desarrollo de un controlador PID
Dependencies: Debounced TextLCD mbed
Fork of PID by
Diff: main.cpp
- Revision:
- 1:e7782774b135
- Parent:
- 0:f0eb5248ae8f
--- a/main.cpp Wed Apr 08 23:46:50 2015 +0000 +++ b/main.cpp Wed Oct 14 20:44:27 2015 +0000 @@ -1,39 +1,44 @@ #include "mbed.h" -#include "TextLCD.h" -#include "DebouncedIn.h" - +#include "TextLCD.h" // nos permite usar el lcd en nuestro comando +#include "DebouncedIn.h" // esta libreria es útil para podeer declarar todas las teclas o botones que se posean TextLCD lcd(PTE0, PTE1, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 Teclado -DebouncedIn button1(PTC12); //Botón Aumento -DebouncedIn button2(PTC13); //Botón Decremento -DebouncedIn button3(PTC16); //Botón de pasar -DebouncedIn button4(PTC17); //Botón para iniciar el PID - +//asignamos el puerto a cada interruptor + +DebouncedIn button1(PTC12); //Aumentar +DebouncedIn button2(PTC13); //Decrementar +DebouncedIn button3(PTC16); //Pasar +DebouncedIn button4(PTC17); //inicio + +// asignamos los pines a la salida y a la entrada (analógicas) + AnalogIn y(PTB1); // Salida de la planta AnalogOut u(PTE30); // Señal de control -DigitalOut led1(LED1); // Salidas para comprobar el funcionamiento del programa +//Salidas digitales utilziadas para la comprobación del funcionamiento + +DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); -Timer t; //Para cuantizar el tiempoque se deja undido un botón de aumento o decremento +Timer t;// nos permite saber cuanto tiempo permanecen presionados los botones asociados al aumento y al decremento -int C1=0x0F; // Codigo para escribir y matener el el LCD -int sp=0,kp=0,kd=0,ki=0,p=1; // Inicializacion de las variables para el controlador +int C1=0x0F; // inicializamos el lcd y el tipo de formato que este ultizará +int sp=0,kp=0,kd=0,ki=0,p=1; // condiciones iniciales de los parametros de controlador. NOTA: la variable p indica en que se parametro se desea intervenir (kp,ki,kd,sp, pasar e iniciar) float ap, ai, ad, err, med, err_v, pid=0; // int main() { lcd.writeCommand(C1); - lcd.printf(" CONTROL PID\n"); + lcd.printf(" Controlador PID\n"); wait(2); lcd.cls(); - lcd.printf(" EQUIPO1:\nJuan Jose Munoz"); + lcd.printf(" Equipo_5:\nEliana Mejia E."); wait(2); lcd.cls(); - lcd.printf("Carlos Arbelaez Rafael Barriento"); + lcd.printf("Sebastian Quintero Z. Sebastian Vergara P"); wait(2); lcd.cls(); - lcd.printf(" INGRESO DE\n PARAMETROS "); + lcd.printf(" Ingresar Parametros "); wait(2); retorno: //Cuando se presiona por segunda vez el botón 4 se retorna a la interfaz de parametros para modificarlos @@ -50,10 +55,12 @@ lcd.printf("Sp=%d", sp); while(1) { - if (button1.falling()) + if (button1.falling()) // se presiona el botón de aumento { - led1 =!led1; + led1 =!led1; // se utiliza para prender el led + + // sub menú para la constante sp if (p==1) { @@ -63,7 +70,7 @@ lcd.locate(3,0); lcd.printf("%d", sp); if(sp>=5){ - sp=5; //saturamos el setpoint hasta 5 segun la escala medida ya que trabajaremos entre 0V y 5V + sp=5; //El límite de la señal de saida se va a encontrar entre [0V;5V] lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); @@ -87,21 +94,23 @@ } + + // sub menú para la constante kp else if (p==2) { - ++kp; //Aumento unitario de la constante + ++kp; // representa un aumento unitario de la variable lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%d", kp); - while(button1==0){ //Verifica si el botón 1 se deja presionado - if(t==0){t.start();} //Inicia a contar el tiempo que se deja presionado + while(button1==0){ //se ejecuta esta instrucción, mientras el botón se encuentra presionado + if(t==0){t.start();} //se contabiliza el tiempo que se deja presionado if((t<7) && (t>=1)){ //Primera velocidad de incremento en el intervalo - wait(0.3); //Espera 0.3 segundos para volver a imprimir + wait(0.3); //Espera 0.3 segundos para volver a imprimir en el lcd ++kp; lcd.locate(11,0); lcd.printf(" "); @@ -110,25 +119,25 @@ } if((t>=7)&&(t<13)){ //Segunda velocidad de incremento - + //Aumento en un factor de 10 wait(0.3); - kp=10+kp; //ahora aumenta de 10 en 10 + kp=10+kp; lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%d", kp); } if((t>=13) && (t<19)){ //Tercera velocidad de incremento 100 - + //Aumento en un factor de 100 wait(0.3); - kp=100+kp; //Aumenta de 100 en 100 + kp=100+kp; lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%d", kp); } - if(kp>999){ //Saturación máxima de los parametos + if(kp>999){ //condición limite que poseen los parámetros kp=999; lcd.locate(11,0); lcd.printf(" "); @@ -138,6 +147,8 @@ } t.reset(); //Se reinicia el tiempo y vuelve a incrementar unitariamente } + + // sub menú para la constante ki else if (p==3) { ++ki; @@ -189,7 +200,8 @@ } - + + // sub menú para la constante kd else if (p==4) { ++kd; @@ -241,7 +253,7 @@ } } - + // accionamiento del botón asociado al decrecimeinto de las constantes if (button2.falling()) { led2 =!led2; @@ -357,7 +369,7 @@ } if (p==4) { - if (kd==0) // no mostrar nada + if (kd==0) // no se visualiza nada en el display { } else @@ -402,6 +414,7 @@ } } } + // accionamiento del botón pasar if (button3.falling()) { led3 =!led3; @@ -438,37 +451,44 @@ } } - + // accionamiento del botón asociado al inicio del programa realizado + if(button4.falling()){ p=1; - lcd.cls(); + lcd.cls();// limpia la pantalla y la localiza en (0,0) lcd.printf("Iniciando PID\n"); wait(1); - while(p==1){ //La segunda vez que se presiona es para volver a la interfaz para modificar parametros + while(p==1){ //si se presiona por segunda vez es para modificar los parámetros if(button4.falling()){ p=0; - goto retorno; + goto retorno; // se hace un llamado a la función retorno } - med=5*y.read(); - err=sp-med; + med=5*y.read(); // las constantes por la cuál se amplifica la señal dependen del sistema que se desee controlar y en donde lo deseamos limitar + err=sp-med; // error del sistema ap = kp*err; + // se verifica que la accion integral no sea muy grande + if(ai<5) { - ai =(ki*err)+ai; //calculo de la integral del error + ai =(ki*err)+ai; //calculo de la integral del error } - ad = kd*(err-err_v); //calculo de la accion derivativa + ad = kd*(err-err_v); //calculo de la acción derivativa pid = (ap+ai+ad); + // se verifica que pid sea positivo ************************************** if(pid<=0){pid=0;} - // se verifica que pid sea menor o igual la valor maximo ***************** + + // se verifica que pid sea menor o igual l valor maximo ***************** + if(pid>=5){pid=5;} - u.write(pid); + u.write(pid); // enviamos el valor de PID al puerto analógico de salida t.start(); + if(t>=1){ lcd.cls(); - lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD + lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD en este caso modulo 1 lcd.locate(8,0); lcd.printf("Err=%0.1f", err); lcd.locate(0,1);