al oprimir cualquier tecla del teclado matricial 4x4 se genera un sonido.
Dependencies: FPointer TextLCD keypad mbed
Fork of Tarea6 by
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 }
Generated on Mon Jul 18 2022 23:55:58 by 1.7.2