Este programa corre un control PID donde los parámetros se ingresan con un teclado 4x4

Dependencies:   FPointer TextLCD keypad mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /* Este programa corre un control PID donde los parametros se ingresan con un teclado 4x4
00002 */
00003 
00004 #include "mbed.h"
00005 #include "keypad.h"
00006 #include "TextLCD.h"
00007 #include "stdlib.h"
00008 
00009 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
00010 AnalogIn y(PTB0);
00011 AnalogOut u(PTE30);
00012 int C1=0x0F; // Cursor
00013 int C4=0x0C; // quito cursor bajo
00014 int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1,tecla,flag1=1,num=0;
00015 float med, err, pid, ap, ad, ai, yr, err_v;
00016 float pidn;
00017 int flagt=0;
00018 Timer t;
00019 char cadena[3]={' ',' ',' '};
00020 int llena=0; //verificar que la entrada es de 3 numeros
00021 // Define your own keypad values
00022 char Keytable[] = { '1', '2', '3', 'A',
00023                     '4', '5', '6', 'B',
00024                     '7', '8', '9', 'C',
00025                     '*', '0', '#', 'D'
00026                   };
00027 
00028 uint32_t cbAfterInput(uint32_t index) {
00029     tecla=index;
00030     flag1=0;
00031     return 0;
00032 }
00033 
00034 int main() {
00035     //             f0    f1    f2    f3   c0     c1    c2    c3
00036     Keypad keypad(PTA2, PTD4, PTD3, PTD7,PTA13, PTD5, PTD0, PTD2);
00037     ini1:
00038     err=0; med=0; yr=0; pid=0; ap=0; ai=0; ad=0; err_v=0;pidn=0;
00039     lcd.cls(); // Borrar Pantalla
00040     lcd.locate(0,0);
00041     lcd.printf("**PID-TECLADO**");
00042     wait(1);
00043     lcd.cls();
00044     lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
00045 
00046     lcd.locate(8,0);
00047     lcd.printf("Kp=%d",kpnum);
00048     lcd.locate(0,1);
00049     lcd.printf("Ki=%d",kinum);
00050     lcd.locate(8,1);
00051     lcd.printf("Kd=%d",kdnum);
00052     lcd.locate(0,0);
00053     lcd.printf("Sp=%d",spnum);
00054     
00055     ini2:
00056     keypad.CallAfterInput(&cbAfterInput);
00057     keypad.Start();
00058     if(flag1==0){
00059         if(Keytable[tecla]=='B'){
00060             cadena[0]=' ';cadena[1]=' ';cadena[2]=' ';
00061             llena=0;
00062             num=0;
00063             if(pos==4){
00064                 pos=1;}
00065             else {
00066                 pos++;}
00067         }
00068         else if(Keytable[tecla]=='A'){
00069             llena--;
00070             cadena[llena]=' ';
00071             num=strtod(cadena,NULL);
00072         }
00073         else if((tecla==0)||(tecla==1)||(tecla==2)||(tecla==4)||(tecla==5)||(tecla==6)||(tecla==8)||(tecla==9)||(tecla==10)||(tecla==13)){
00074             if(llena<3){
00075                 cadena[llena]=Keytable[tecla];
00076                 num=strtod(cadena,NULL);
00077                 llena++;}
00078         }
00079         else if(Keytable[tecla]=='D'){
00080             lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
00081             lcd.cls(); //borra la pantalla
00082             lcd.printf("   GUARDADOS!");
00083             wait(1);  
00084             lcd.cls();
00085             lcd.printf(" INICIA EL PID");
00086             wait(1);
00087             // se imprimen los parches del control  *****************************************
00088             lcd.cls();
00089             lcd.printf("Er=%3.0f",err);
00090             lcd.locate(8,0);
00091             lcd.printf("Me=%3.0f",med);
00092             lcd.locate(0,1);
00093             lcd.printf("Sp=%d",spnum);
00094             lcd.locate(8,1);
00095             lcd.printf("Co=%3.0f",pid);
00096             wait(2);
00097             cicloPID:
00098                 if(Keytable[tecla]=='C'){
00099                     spnum=0;kinum=0;kpnum=0;kdnum=0;llena=0;pos=1;flag1=1;
00100                     cadena[0]=' ';cadena[1]=' ';cadena[2]=' ';
00101                     goto ini1;}
00102                 med=y.read()*999;   //leer puerto analogo y asignar a med
00103                 err = (spnum-med);  //se calcula el error        
00104                 ap = kpnum*err;     //se calcula la accion proporcinal        
00105                 if(ai<300){// se verifica que la accion integral no sea muy grande
00106                     ai =(kinum*err)+ai;}    //calculo de la integral del error
00107                 ad = kdnum*(err-err_v); //calculo de la accion derivativa
00108                 pid = (ap+ai+ad);
00109                 if(pid<=0){// se verifica que pid sea positivo
00110                     pid=0;}
00111                 if (pid > 999){// se verifica que pid sea menor o igual la valor maximo
00112                     pid=999;}
00113                 
00114                 if(flagt==0){//se muestran las variables
00115                     t.start();
00116                     flagt=1;}
00117                 if(t>=0.3){
00118                     lcd.locate(3,0);lcd.printf("    ");
00119                     lcd.locate(3,0);lcd.printf("%3.0f",err);
00120                     lcd.locate(11,0);lcd.printf("    ");
00121                     lcd.locate(11,0);lcd.printf("%3.0f",med);
00122                     lcd.locate(3,1);lcd.printf("    ");
00123                     lcd.locate(3,1);lcd.printf("%d",spnum);
00124                     lcd.locate(11,1);lcd.printf("    ");
00125                     lcd.locate(11,1);lcd.printf("%3.0f",pid);
00126                     flagt=0;
00127                     t.reset();
00128                 }
00129         
00130                 pidn=pid/999;//Normalizacion de la salida
00131                 u.write(pidn);//se envia el valor pid a puerto analogico de salida (D/A)
00132                 wait_ms(100);
00133                 err_v = err;// se actualizan las variables
00134                 goto cicloPID;
00135         }            
00136         if(pos==1){
00137             spnum=num;
00138             lcd.locate(3,0);lcd.printf("    ");
00139             lcd.locate(3,0);lcd.printf("%d",spnum);
00140         }
00141         else if(pos==2){
00142             kpnum=num;
00143             lcd.locate(11,0);lcd.printf("    ");
00144             lcd.locate(11,0);lcd.printf("%d",kpnum);
00145         }
00146         else if(pos==3){
00147             kinum=num;
00148             lcd.locate(3,1);lcd.printf("    ");
00149             lcd.locate(3,1);lcd.printf("%d",kinum);
00150         }
00151         else if(pos==4){
00152             kdnum=num;
00153             lcd.locate(11,1);lcd.printf("    ");
00154             lcd.locate(11,1);lcd.printf("%d",kdnum);
00155         }
00156     }
00157     flag1=1;
00158     goto ini2;        
00159 }