teclado+pid
Dependencies: tarea6 keypad mbed
main.cpp@0:bb0e37506ff0, 2013-12-12 (annotated)
- Committer:
- salvarear
- Date:
- Thu Dec 12 20:26:17 2013 +0000
- Revision:
- 0:bb0e37506ff0
teclado
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
salvarear | 0:bb0e37506ff0 | 1 | #include "mbed.h" |
salvarear | 0:bb0e37506ff0 | 2 | #include "keypad.h" |
salvarear | 0:bb0e37506ff0 | 3 | #include "TextLCD.h" |
salvarear | 0:bb0e37506ff0 | 4 | #include "stdlib.h" |
salvarear | 0:bb0e37506ff0 | 5 | |
salvarear | 0:bb0e37506ff0 | 6 | TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 |
salvarear | 0:bb0e37506ff0 | 7 | AnalogIn y(PTB0); |
salvarear | 0:bb0e37506ff0 | 8 | AnalogOut u(PTE30); |
salvarear | 0:bb0e37506ff0 | 9 | int C1=0x0F; // Cursor |
salvarear | 0:bb0e37506ff0 | 10 | int C4=0x0C; // quito cursor bajo |
salvarear | 0:bb0e37506ff0 | 11 | int spnro=0,kinro=0,kpnro=0,kdnro=0,posicion=1,tecla,flag1=1,numero=0; |
salvarear | 0:bb0e37506ff0 | 12 | float pid, err, ap, ai, yr,ad, err_v, spf,kif,kpf,kdf,medida,pidn; |
salvarear | 0:bb0e37506ff0 | 13 | int flagt=0,com=0; |
salvarear | 0:bb0e37506ff0 | 14 | Timer t; |
salvarear | 0:bb0e37506ff0 | 15 | char cadena[3]={' ',' ',' '}; |
salvarear | 0:bb0e37506ff0 | 16 | //int compl=0; //verificar que la entrada es de 3 numeros |
salvarear | 0:bb0e37506ff0 | 17 | |
salvarear | 0:bb0e37506ff0 | 18 | char Keytable[] = { '1', '2', '3', 'A', |
salvarear | 0:bb0e37506ff0 | 19 | '4', '5', '6', 'B', |
salvarear | 0:bb0e37506ff0 | 20 | '7', '8', '9', 'C', |
salvarear | 0:bb0e37506ff0 | 21 | '*', '0', '#', 'D' |
salvarear | 0:bb0e37506ff0 | 22 | }; |
salvarear | 0:bb0e37506ff0 | 23 | |
salvarear | 0:bb0e37506ff0 | 24 | uint32_t cbAfterInput(uint32_t index) { |
salvarear | 0:bb0e37506ff0 | 25 | tecla=index; |
salvarear | 0:bb0e37506ff0 | 26 | flag1=0; |
salvarear | 0:bb0e37506ff0 | 27 | return 0; |
salvarear | 0:bb0e37506ff0 | 28 | } |
salvarear | 0:bb0e37506ff0 | 29 | |
salvarear | 0:bb0e37506ff0 | 30 | |
salvarear | 0:bb0e37506ff0 | 31 | int main() { |
salvarear | 0:bb0e37506ff0 | 32 | Keypad keypad(PTA2, PTD4, PTD3, PTD7,PTA13, PTD5, PTD0, PTD2); |
salvarear | 0:bb0e37506ff0 | 33 | ini1: |
salvarear | 0:bb0e37506ff0 | 34 | err=0; medida=0; yr=0; pid=0; ap=0; ai=0; ad=0; err_v=0;pidn=0; |
salvarear | 0:bb0e37506ff0 | 35 | lcd.cls(); // Borrar Pantalla |
salvarear | 0:bb0e37506ff0 | 36 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD |
salvarear | 0:bb0e37506ff0 | 37 | |
salvarear | 0:bb0e37506ff0 | 38 | lcd.locate(7,0); |
salvarear | 0:bb0e37506ff0 | 39 | lcd.printf("Kp=%d",kpnro); |
salvarear | 0:bb0e37506ff0 | 40 | lcd.locate(0,1); |
salvarear | 0:bb0e37506ff0 | 41 | lcd.printf("Ki=%d",kinro); |
salvarear | 0:bb0e37506ff0 | 42 | lcd.locate(8,1); |
salvarear | 0:bb0e37506ff0 | 43 | lcd.printf("Kd=%d",kdnro); |
salvarear | 0:bb0e37506ff0 | 44 | lcd.locate(0,0); |
salvarear | 0:bb0e37506ff0 | 45 | lcd.printf("Sp=%d",spnro); |
salvarear | 0:bb0e37506ff0 | 46 | |
salvarear | 0:bb0e37506ff0 | 47 | ini2: |
salvarear | 0:bb0e37506ff0 | 48 | keypad.CallAfterInput(&cbAfterInput); |
salvarear | 0:bb0e37506ff0 | 49 | keypad.Start(); |
salvarear | 0:bb0e37506ff0 | 50 | if(flag1==0){ |
salvarear | 0:bb0e37506ff0 | 51 | if(Keytable[tecla]=='B'){ //incrementa |
salvarear | 0:bb0e37506ff0 | 52 | cadena[0]=' ';cadena[1]=' ';cadena[2]=' '; |
salvarear | 0:bb0e37506ff0 | 53 | com=0; |
salvarear | 0:bb0e37506ff0 | 54 | numero=0; |
salvarear | 0:bb0e37506ff0 | 55 | if(posicion==4){ |
salvarear | 0:bb0e37506ff0 | 56 | posicion=1;} |
salvarear | 0:bb0e37506ff0 | 57 | else { |
salvarear | 0:bb0e37506ff0 | 58 | posicion++;} |
salvarear | 0:bb0e37506ff0 | 59 | } |
salvarear | 0:bb0e37506ff0 | 60 | else if(Keytable[tecla]=='A'){ //decrementa |
salvarear | 0:bb0e37506ff0 | 61 | com--; |
salvarear | 0:bb0e37506ff0 | 62 | cadena[com]=' '; |
salvarear | 0:bb0e37506ff0 | 63 | numero=strtod(cadena,NULL); |
salvarear | 0:bb0e37506ff0 | 64 | } |
salvarear | 0:bb0e37506ff0 | 65 | else if((tecla==0)||(tecla==1)||(tecla==2)||(tecla==4)||(tecla==5)||(tecla==6)||(tecla==8)||(tecla==9)||(tecla==10)||(tecla==13)){ |
salvarear | 0:bb0e37506ff0 | 66 | if(com<3){ |
salvarear | 0:bb0e37506ff0 | 67 | cadena[com]=Keytable[tecla]; |
salvarear | 0:bb0e37506ff0 | 68 | numero=strtod(cadena,NULL); |
salvarear | 0:bb0e37506ff0 | 69 | com++;} |
salvarear | 0:bb0e37506ff0 | 70 | } |
salvarear | 0:bb0e37506ff0 | 71 | else if(Keytable[tecla]=='D'){ //ingresa datos para calcular |
salvarear | 0:bb0e37506ff0 | 72 | lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo |
salvarear | 0:bb0e37506ff0 | 73 | lcd.cls(); //borra la pantalla |
salvarear | 0:bb0e37506ff0 | 74 | lcd.printf(" Datos Guardados!"); |
salvarear | 0:bb0e37506ff0 | 75 | wait(1); |
salvarear | 0:bb0e37506ff0 | 76 | lcd.cls(); |
salvarear | 0:bb0e37506ff0 | 77 | lcd.printf(" INICIANDO PID"); |
salvarear | 0:bb0e37506ff0 | 78 | wait(1); |
salvarear | 0:bb0e37506ff0 | 79 | |
salvarear | 0:bb0e37506ff0 | 80 | lcd.cls(); |
salvarear | 0:bb0e37506ff0 | 81 | lcd.printf("Er=%d",err); |
salvarear | 0:bb0e37506ff0 | 82 | lcd.locate(8,0); |
salvarear | 0:bb0e37506ff0 | 83 | lcd.printf("Me=%d",medida); |
salvarear | 0:bb0e37506ff0 | 84 | lcd.locate(0,1); |
salvarear | 0:bb0e37506ff0 | 85 | lcd.printf("Sp=%d",spnro); |
salvarear | 0:bb0e37506ff0 | 86 | lcd.locate(8,1); |
salvarear | 0:bb0e37506ff0 | 87 | lcd.printf("Co=%d",pid); |
salvarear | 0:bb0e37506ff0 | 88 | wait(2); |
salvarear | 0:bb0e37506ff0 | 89 | cicloPID: |
salvarear | 0:bb0e37506ff0 | 90 | if(Keytable[tecla]=='C'){ |
salvarear | 0:bb0e37506ff0 | 91 | spnro=0;kinro=0;kpnro=0;kdnro=0;com=0;posicion=1;flag1=1; |
salvarear | 0:bb0e37506ff0 | 92 | cadena[0]=' ';cadena[1]=' ';cadena[2]=' '; |
salvarear | 0:bb0e37506ff0 | 93 | goto ini1;} |
salvarear | 0:bb0e37506ff0 | 94 | medida=999*y.read(); //le er puerto analogo y asignar a medida |
salvarear | 0:bb0e37506ff0 | 95 | err = (spnro-medida); //calcula el error en la medida |
salvarear | 0:bb0e37506ff0 | 96 | ap = kpnro*err; //s e calcula del proporcinal |
salvarear | 0:bb0e37506ff0 | 97 | if(ai<100){ // se verifica que integral para que no sea muy grande |
salvarear | 0:bb0e37506ff0 | 98 | ai =(kinro*err)+ai;} //calculo del integral con su error |
salvarear | 0:bb0e37506ff0 | 99 | ad = kdnro*(err-err_v); //calculo de la accion derivativa |
salvarear | 0:bb0e37506ff0 | 100 | pid = (ap+ai+ad); //calcula el valor del pid |
salvarear | 0:bb0e37506ff0 | 101 | if(pid<=0){ // se verifica que pid sea mayor a cero(no se permiten valores- |
salvarear | 0:bb0e37506ff0 | 102 | pid=0;} |
salvarear | 0:bb0e37506ff0 | 103 | if (pid > 999){ // se verifica que pid sea menor o igual la valor maximo |
salvarear | 0:bb0e37506ff0 | 104 | pid=999;} |
salvarear | 0:bb0e37506ff0 | 105 | err_v = err; // actualiza las variables de los errores |
salvarear | 0:bb0e37506ff0 | 106 | if(flagt==0){ // impreme las variables |
salvarear | 0:bb0e37506ff0 | 107 | t.start(); //inicia |
salvarear | 0:bb0e37506ff0 | 108 | flagt=1;} |
salvarear | 0:bb0e37506ff0 | 109 | if(t>=0.2){ |
salvarear | 0:bb0e37506ff0 | 110 | lcd.locate(3,0);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 111 | lcd.locate(3,0);lcd.printf("%d",err); |
salvarear | 0:bb0e37506ff0 | 112 | lcd.locate(11,0);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 113 | lcd.locate(11,0);lcd.printf("%d",medida); |
salvarear | 0:bb0e37506ff0 | 114 | lcd.locate(3,1);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 115 | lcd.locate(3,1);lcd.printf("%d",spnro); |
salvarear | 0:bb0e37506ff0 | 116 | lcd.locate(11,1);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 117 | lcd.locate(11,1);lcd.printf("%d",pid); |
salvarear | 0:bb0e37506ff0 | 118 | flagt=0; |
salvarear | 0:bb0e37506ff0 | 119 | t.reset(); |
salvarear | 0:bb0e37506ff0 | 120 | } |
salvarear | 0:bb0e37506ff0 | 121 | |
salvarear | 0:bb0e37506ff0 | 122 | |
salvarear | 0:bb0e37506ff0 | 123 | pidn=pid/999; //Normalizacion de la salida |
salvarear | 0:bb0e37506ff0 | 124 | u.write(pidn); //se envia el valor pid a puerto analogico de salida (D/A) |
salvarear | 0:bb0e37506ff0 | 125 | wait(0.01); |
salvarear | 0:bb0e37506ff0 | 126 | goto cicloPID; |
salvarear | 0:bb0e37506ff0 | 127 | } |
salvarear | 0:bb0e37506ff0 | 128 | if(posicion==1){ |
salvarear | 0:bb0e37506ff0 | 129 | spnro=numero; |
salvarear | 0:bb0e37506ff0 | 130 | lcd.locate(3,0);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 131 | lcd.locate(3,0);lcd.printf("%d",spnro); |
salvarear | 0:bb0e37506ff0 | 132 | } |
salvarear | 0:bb0e37506ff0 | 133 | else if(posicion==2){ |
salvarear | 0:bb0e37506ff0 | 134 | kpnro=numero; |
salvarear | 0:bb0e37506ff0 | 135 | lcd.locate(11,0);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 136 | lcd.locate(11,0);lcd.printf("%d",kpnro); |
salvarear | 0:bb0e37506ff0 | 137 | } |
salvarear | 0:bb0e37506ff0 | 138 | else if(posicion==3){ |
salvarear | 0:bb0e37506ff0 | 139 | kinro=numero; |
salvarear | 0:bb0e37506ff0 | 140 | lcd.locate(3,1);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 141 | lcd.locate(3,1);lcd.printf("%d",kinro); |
salvarear | 0:bb0e37506ff0 | 142 | } |
salvarear | 0:bb0e37506ff0 | 143 | else if(posicion==4){ |
salvarear | 0:bb0e37506ff0 | 144 | kdnro=numero; |
salvarear | 0:bb0e37506ff0 | 145 | lcd.locate(11,1);lcd.printf(" "); |
salvarear | 0:bb0e37506ff0 | 146 | lcd.locate(11,1);lcd.printf("%d",kdnro); |
salvarear | 0:bb0e37506ff0 | 147 | } |
salvarear | 0:bb0e37506ff0 | 148 | } |
salvarear | 0:bb0e37506ff0 | 149 | flag1=1; |
salvarear | 0:bb0e37506ff0 | 150 | goto ini2; |
salvarear | 0:bb0e37506ff0 | 151 | } |