PID Sencillo - Primera Prueba
Dependencies: Debounced TextLCD1 mbed
Diff: main.cpp
- Revision:
- 2:12dac32e2a8b
- Parent:
- 1:ce04971eceb4
--- a/main.cpp Fri Nov 01 00:51:04 2013 +0000 +++ b/main.cpp Thu Nov 14 07:07:48 2013 +0000 @@ -3,6 +3,7 @@ #include "TextLCD.h" AnalogIn Vin(PTC2); +AnalogOut Vout(PTE30); TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 DigitalOut led1(LED1); @@ -22,7 +23,9 @@ int i; // Indice de la variable. int j; // Controla cambio de posición. int kp, ki, kd, sp, cont; -int med, pid, err, ap, ai, ad, err_v; +int Error, Medida, Co, pid, ap, ai, ad, err_v; +// float pidn, err, med, sal; +int pidn, err, med, sal; int main(){ lcd.writeCommand(C1); // Escribimos un comando segun el manual del modulo LCD @@ -594,7 +597,8 @@ wait(0.3); if(button2){ break; - } + } + } } } @@ -612,63 +616,82 @@ - lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo - lcd.cls(); //borra la pantalla + lcd.writeCommand(C4); // Comando para quitar cursor bajo (segun el manual del modulo LCD). + lcd.cls(); // Borra la pantalla lcd.printf(" GUARDADOS!"); - wait(2); + wait(1); lcd.cls(); lcd.printf(" INICIA EL PID"); - wait(2); - // se imprimen los parches del control ***************************************** + wait(1); + + // Se imprimen los parches del control. + lcd.cls(); - lcd.printf("Error%d",err); + lcd.printf("Err %d",err); lcd.locate(8,0); - lcd.printf("Medida%d",med); + lcd.printf("Med %d",med); lcd.locate(0,1); - lcd.printf("Sp%d",sp); + lcd.printf("Sp %d",sp); lcd.locate(8,1); - lcd.printf("Co%d",pid); - wait(5); - + lcd.printf("Co %d",pid); + wait(1); + + // CICLO PRINCIPAL CONTROLADOR PID while(1) { - med=Vin; - //leer puerto analogo y asignar a med + med=Vout*100; // Se le asigna al puerto Análogo la variable med. err = (sp-med); - ap = kp*err; - ai =(ki*err)+ai; //calculo de la integral del error - // se verifica que la accion integral no sea muy grande - ad = kd*(err-err_v); //calculo de la accion derivativa - pid = (ap+ai+ad); - //****se muestran las variables****************************************** - if (pid > 999){ + + // Verificamos que la accion integral no sea muy grande. + + if (ai < 1000){ + ai =(ki*err)+ai; //Cálculo de la integral del error; + } + + if (ap < 1000){ + ap = kp*err; //Cálculo de la integral del error; + } + + if (ad < 1000){ + ad = kd*(err-err_v); //Cálculo de la integral del error; + } + + pid = (ap+ai+ad); // Calculo del PID + + if(pid<0){ + pid=0; + } + + if (pid > 1000){ pid=1000; - } - - wait(.5); - lcd.locate(5,0); - lcd.printf("%d",err); - lcd.locate(14,0); - lcd.printf("%d",med); - lcd.locate(2,1); - lcd.printf("%d",sp); - lcd.locate(10,1); - lcd.printf("%d",pid); + } + + //Vout=pid/999; + lcd.locate(4,0); + lcd.printf("%d",err); + lcd.locate(12,0); + lcd.printf("%d",med); + lcd.locate(3,1); + lcd.printf("%d",sp); + lcd.locate(12,1); + lcd.printf("%d",pid); + wait(0.2); // se actualizan las variables ******************************************* - err_v = err; + // se verifica que pid sea positivo ************************************** - - // se verifica que pid sea menor o igual la valor maximo ***************** + if (pid < 0){ + pid=0; + } // se envia el valor pid a puerto analogico de salida (D/A) ************** - // se repite el ciclo + + Vout=pid; + err_v = err; + } - - - - } \ No newline at end of file + } \ No newline at end of file