Este programa corre un control PID donde los parámetros se ingresan con un teclado 4x4
Dependencies: FPointer TextLCD keypad mbed
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 }
Generated on Sun Jul 17 2022 14:53:30 by 1.7.2