al oprimir cualquier tecla del teclado matricial 4x4 se genera un sonido.

Dependencies:   FPointer TextLCD keypad mbed

Fork of Tarea6 by Alexander Vallejo

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

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