programa para hacer control PID simple

Dependencies:   TextLCD mbed

Fork of DebouncedIn_HelloWorld by Chris Styles

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "DebouncedIn.h"
00003 #include "TextLCD.h"
00004 AnalogIn Vin(PTC2);
00005 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
00006 
00007 DigitalOut led1(LED1);
00008 DigitalOut led2(LED2);
00009 DebouncedIn button1(PTC12);
00010 DebouncedIn button2(PTC13);
00011 DebouncedIn button3(PTC16);
00012 DebouncedIn button4(PTC17);
00013 
00014 /*    codigos movimiento del curzor
00015       18 para izquierda
00016       1A para derecha
00017 */      
00018 
00019 
00020 int C1=0x0E; // solo muestra el curzor
00021 int C2=0x18; // desplaza izquierda
00022 int C3=0x1A; // desplaza derecha
00023 int C4=0x0C; // quito cursor bajo
00024 int i; // indice de la variable
00025 int j;
00026 int kp, ki, kd, sp, err, med, yr, pid, ap, ai, ad, err_v, cycle; 
00027 
00028 int main() {
00029     lcd.cls();
00030     lcd.printf("Sp%d",sp);
00031     lcd.locate(8,0);
00032     lcd.printf("Kp%d",kp);
00033     lcd.locate(0,1);
00034     lcd.printf("Ki%d",ki);
00035     lcd.locate(8,1);
00036     lcd.printf("Kd%d",kd);
00037     lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
00038     lcd.locate(0,0);
00039     lcd.printf("Sp%d",sp);
00040     
00041         
00042     while(1) {
00043            if (button3.falling()) {              
00044                ++j;
00045                }                                     //INCREMENTA POSICION DEL MENU COB BOTON 3
00046            if (j==0){
00047                lcd.locate(2,0);
00048                lcd.printf("%d",sp);
00049                   if (button1.falling()) {                            
00050                   ++sp; // ademas revisa boton 1 para incrementar
00051                                          }
00052                   if (button2.falling()) {                            
00053                   --sp; // ademas revisa boton 2 para decrementar
00054                                          } 
00055               }
00056            if (j==1) {
00057                lcd.locate(10,0);
00058                lcd.printf("%d",kp);
00059                   if (button1.falling()) {
00060                   ++kp;
00061                                          }
00062                   if (button2.falling()) {                            
00063                   --kp;
00064                                          }
00065               }
00066            if (j==2) {
00067                lcd.locate(2,1);
00068                lcd.printf("%d",ki);
00069                   if (button1.falling()){
00070                   ++ki;
00071                                         }
00072                   if (button2.falling()){                            
00073                   --ki;
00074                                         }               
00075               }
00076            if (j==3) {
00077                lcd.locate(10,1);
00078                lcd.printf("%d",kd);
00079                   if (button1.falling()){
00080                   ++kd;
00081                   }
00082                   if (button2.falling()){                            
00083                   --kd;
00084                   }
00085               } 
00086            if (j==4) {
00087                j=0;
00088                }                          
00089     
00090            if (button4.falling()){
00091            break;     //sale del bucle si pisan suiche4
00092                }
00093                         
00094                                         }
00095            lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
00096            lcd.cls(); //borra la pantalla
00097            lcd.printf("   GUARDADOS!"); 
00098            wait(2);
00099            lcd.cls();
00100            lcd.printf(" INICIA EL PID");
00101            wait(2);
00102            // se imprimen los parches del control  *****************************************
00103            lcd.cls();
00104            lcd.printf("Er%d",err);
00105            lcd.locate(8,0);
00106            lcd.printf("Me%d",med);
00107            lcd.locate(0,1);
00108            lcd.printf("Sp%d",sp);
00109            lcd.locate(8,1);
00110            lcd.printf("Co%d",pid);
00111            wait(5);
00112            
00113            // CICLO PRINCIPAL CONTROLADOR PID
00114            
00115            while(1) {
00116                               //leer puerto analogo y asignar a med
00117            err = (sp-med);
00118            ap = kp*err;
00119            ai =(ki*err)+ai;    //calculo de la integral del error
00120            // se verifica que la accion integral no sea muy grande
00121            ad = kd*(err-err_v); //calculo de la accion derivativa
00122            pid = (ap+ai+ad);
00123            //****se muestran las variables******************************************
00124            if (pid > 999){
00125            pid=1000;
00126            } 
00127            
00128            wait(.5);
00129            lcd.locate(2,0);
00130            lcd.printf("%d",err);
00131            lcd.locate(10,0);
00132            lcd.printf("%d",med);
00133            lcd.locate(2,1);
00134            lcd.printf("%d",sp);
00135            lcd.locate(10,1);
00136            lcd.printf("%d",pid);
00137            
00138            
00139            // se actualizan las variables *******************************************
00140            err_v = err;           
00141            // se verifica que pid sea positivo **************************************
00142            
00143            // se verifica que pid sea menor o igual la valor maximo *****************
00144            
00145            
00146            //  se envia el valor pid a puerto analogico de salida (D/A) **************
00147            //  se repite el ciclo
00148            }
00149 }