PROCESADORES - 2016-03. TAREA 2. PID+IrDA
Dependencies: Pulse1 TextLCD mbed
Fork of PID_ENCODER_OK by
Tarea 2: IRDA + PID
PROCESADORES - 2016-03
Por:
- Jaime Alonso Osorio Palacio
- David Fuertes Chaguezac
- Wilson Anibal Ortega Andrade
- John Wilmer Ruiz López
A partir del código de PID+ENCODER: https://developer.mbed.org/users/tony63/code/PID_ENCODER_OK/ , se adiciona un sensor IrDA (Infrared Data Association) para programar a través de este los parámetros del PID (spnum, kp, ki y kd) en la FRDM-KL25Z. Observar todos estos datos y configuraciones en una LCD. Posee depuración via USB en una terminal (se usó Termite 3.2.) para conocer los estados en los que se encuentra el programa y verificar los datos.
IMÁGENES:
main.cpp@2:fe2c4b1f132f, 2016-11-23 (annotated)
- Committer:
- jaosoriop
- Date:
- Wed Nov 23 00:49:51 2016 +0000
- Revision:
- 2:fe2c4b1f132f
- Parent:
- 1:058b8f5c135d
PID + IRDA
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jaosoriop | 2:fe2c4b1f132f | 1 | /* |
jaosoriop | 2:fe2c4b1f132f | 2 | PROCESADORES - 2016-03 |
jaosoriop | 2:fe2c4b1f132f | 3 | TAREA 2. |
jaosoriop | 2:fe2c4b1f132f | 4 | A partir del código de PID+TECLADO, utilizar un sensor IRDA para programar los |
jaosoriop | 2:fe2c4b1f132f | 5 | parámetros del PID (spnum, kp, ki y kd) en la FRDM-KL25Z. Observar todos estos |
jaosoriop | 2:fe2c4b1f132f | 6 | datos y configuraciones en una LCD |
jaosoriop | 2:fe2c4b1f132f | 7 | PRESENTADO POR: |
jaosoriop | 2:fe2c4b1f132f | 8 | Jaime Alonso Osorio Palacio |
jaosoriop | 2:fe2c4b1f132f | 9 | David Fuertes Chaguezac |
jaosoriop | 2:fe2c4b1f132f | 10 | Wilson Anibal Ortega Andrade |
jaosoriop | 2:fe2c4b1f132f | 11 | John Wilmer Ruiz López |
jaosoriop | 2:fe2c4b1f132f | 12 | */ |
jaosoriop | 2:fe2c4b1f132f | 13 | |
jaosoriop | 2:fe2c4b1f132f | 14 | #include "mbed.h" |
jaosoriop | 2:fe2c4b1f132f | 15 | #include "TextLCD.h" // LCD |
jaosoriop | 2:fe2c4b1f132f | 16 | #include <Pulse1.h> |
jaosoriop | 2:fe2c4b1f132f | 17 | #include "math.h" |
jaosoriop | 2:fe2c4b1f132f | 18 | #include "stdio.h" //printf, etc |
jaosoriop | 2:fe2c4b1f132f | 19 | #include "string.h" |
jaosoriop | 2:fe2c4b1f132f | 20 | #include "stdlib.h" // atoi |
jaosoriop | 2:fe2c4b1f132f | 21 | #include "stdint.h" |
jaosoriop | 2:fe2c4b1f132f | 22 | #include <assert.h> |
jaosoriop | 2:fe2c4b1f132f | 23 | |
jaosoriop | 2:fe2c4b1f132f | 24 | //****************** CONFIGURACIÓN DE PUERTOS DE COMUNICACIÓN ****************** |
jaosoriop | 2:fe2c4b1f132f | 25 | |
jaosoriop | 2:fe2c4b1f132f | 26 | PulseInOut irda(PTD0);// en este puerto se pone el sensor infrarrojo |
jaosoriop | 2:fe2c4b1f132f | 27 | Serial pc(USBTX, USBRX); //configuro puerto serial |
tony63 | 0:4e0dfcf0e7ce | 28 | |
tony63 | 0:4e0dfcf0e7ce | 29 | TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 |
tony63 | 1:058b8f5c135d | 30 | AnalogIn y(PTB3);//entrada analoga |
tony63 | 0:4e0dfcf0e7ce | 31 | AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer |
tony63 | 0:4e0dfcf0e7ce | 32 | //si se ignora esto se arruina la FRDMKL25Z |
tony63 | 0:4e0dfcf0e7ce | 33 | DigitalOut led1(LED1); |
tony63 | 0:4e0dfcf0e7ce | 34 | DigitalOut led2(LED2); |
tony63 | 0:4e0dfcf0e7ce | 35 | DigitalOut led3(LED3); |
tony63 | 0:4e0dfcf0e7ce | 36 | |
jaosoriop | 2:fe2c4b1f132f | 37 | //********************************* PARÁMETROS ********************************* |
tony63 | 0:4e0dfcf0e7ce | 38 | |
jaosoriop | 2:fe2c4b1f132f | 39 | //codigos movimiento del cursor |
tony63 | 0:4e0dfcf0e7ce | 40 | //int C1=0x0E; // solo muestra el curzor |
tony63 | 0:4e0dfcf0e7ce | 41 | int C2=0x18; // desplaza izquierda |
tony63 | 0:4e0dfcf0e7ce | 42 | int C3=0x1A; // desplaza derecha |
tony63 | 0:4e0dfcf0e7ce | 43 | int C4=0x0C; // quito cursor bajo |
tony63 | 0:4e0dfcf0e7ce | 44 | int C1=0x0F; |
tony63 | 1:058b8f5c135d | 45 | int cambio=0, diferencia=0; |
tony63 | 1:058b8f5c135d | 46 | float pid,o,ai,ad,ap,med,err; |
tony63 | 1:058b8f5c135d | 47 | float err_v; |
tony63 | 0:4e0dfcf0e7ce | 48 | int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1; |
jaosoriop | 2:fe2c4b1f132f | 49 | int i=0,ii=0; |
jaosoriop | 2:fe2c4b1f132f | 50 | int numero; |
jaosoriop | 2:fe2c4b1f132f | 51 | char tecla1[1], tecla2[1],tecla3[1]; |
jaosoriop | 2:fe2c4b1f132f | 52 | int valor1=0, valor2=0, valor3=0; |
jaosoriop | 2:fe2c4b1f132f | 53 | int valornum=0; |
jaosoriop | 2:fe2c4b1f132f | 54 | int flag1=0, flag2=0, flag3=0; |
jaosoriop | 2:fe2c4b1f132f | 55 | int conteo=0; |
tony63 | 0:4e0dfcf0e7ce | 56 | |
jaosoriop | 2:fe2c4b1f132f | 57 | //****************************** DATOS CONTROL IR ****************************** |
jaosoriop | 2:fe2c4b1f132f | 58 | |
jaosoriop | 2:fe2c4b1f132f | 59 | const int head_H = 2880; //+20% medida con osciloscopio en microsegundos |
jaosoriop | 2:fe2c4b1f132f | 60 | const int head_L = 1920; //-20% medida con osciloscopio |
jaosoriop | 2:fe2c4b1f132f | 61 | const int T_alto=567; //ponga su tiempo de la prueba |
jaosoriop | 2:fe2c4b1f132f | 62 | const int T_bajo=1170; //ponga su tiempo de la prueba |
jaosoriop | 2:fe2c4b1f132f | 63 | const int num_bits = 21; //ponga su numero de bits |
jaosoriop | 2:fe2c4b1f132f | 64 | int header =0; //tiempo de cabecera pulso abajo |
jaosoriop | 2:fe2c4b1f132f | 65 | int num[num_bits]; //cadena para almacenar todos los tiempos que conforman los bits de datos |
jaosoriop | 2:fe2c4b1f132f | 66 | int aux[21]; //variable donde se concatenarán la trama de "bits" |
jaosoriop | 2:fe2c4b1f132f | 67 | int binM[20]; // arreglo para dar valor a cada bit en decimal |
jaosoriop | 2:fe2c4b1f132f | 68 | int dato; //tiempo de cada dato que se lee |
jaosoriop | 2:fe2c4b1f132f | 69 | |
jaosoriop | 2:fe2c4b1f132f | 70 | // DATOS DE PRUEBA CONTROL SONY RM-Y173 (SIRVE PARA SONY TRINITRON KV-21ME42/8) |
jaosoriop | 2:fe2c4b1f132f | 71 | int uno=4224; int UNO[] ={0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 72 | int dos=12417; int DOS[] ={1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 73 | int tres=20610; int TRES[] ={0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 74 | int cuatro=28803; int CUATRO[]={0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 75 | int cinco=36996; int CINCO[] ={0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 76 | int seis=45189; int SEIS[] ={1,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 77 | int siete=53382; int SIETE[] ={0,1,1,0,0,0,0,1,0,0,0,0,1,0,1,1,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 78 | int ocho=61575; int OCHO[] ={1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 79 | int nueve=69768; int NUEVE[] ={0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 80 | int cero=77961; int CERO[] ={1,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 81 | int power=176277; int POWER[] ={1,0,1,0,1,0,0,1,0,0,0,0,1,1,0,1,0,1,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 82 | int enter=94347; int ENTER[] ={1,1,0,1,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0,0}; |
jaosoriop | 2:fe2c4b1f132f | 83 | |
jaosoriop | 2:fe2c4b1f132f | 84 | //****************************************************************************** |
jaosoriop | 2:fe2c4b1f132f | 85 | //******************************* CICLO PRINCIPAL ****************************** |
jaosoriop | 2:fe2c4b1f132f | 86 | //****************************************************************************** |
jaosoriop | 2:fe2c4b1f132f | 87 | |
jaosoriop | 2:fe2c4b1f132f | 88 | int main(){ |
tony63 | 0:4e0dfcf0e7ce | 89 | lcd.locate(0,1); |
tony63 | 0:4e0dfcf0e7ce | 90 | lcd.printf("**Control PID**"); |
tony63 | 0:4e0dfcf0e7ce | 91 | wait(2); |
tony63 | 0:4e0dfcf0e7ce | 92 | lcd.cls(); // Borrar Pantalla |
tony63 | 0:4e0dfcf0e7ce | 93 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD |
tony63 | 0:4e0dfcf0e7ce | 94 | |
jaosoriop | 2:fe2c4b1f132f | 95 | lcd.locate(8,0); // necesariamente (columna, fila) |
tony63 | 0:4e0dfcf0e7ce | 96 | lcd.printf("Kp=%d",kpnum); |
tony63 | 0:4e0dfcf0e7ce | 97 | lcd.locate(0,1); |
tony63 | 0:4e0dfcf0e7ce | 98 | lcd.printf("Ki=%d",kinum); |
tony63 | 0:4e0dfcf0e7ce | 99 | lcd.locate(8,1); |
tony63 | 0:4e0dfcf0e7ce | 100 | lcd.printf("Kd=%d",kdnum); |
tony63 | 0:4e0dfcf0e7ce | 101 | lcd.locate(0,0); |
tony63 | 0:4e0dfcf0e7ce | 102 | lcd.printf("Sp=%d",spnum); |
jaosoriop | 2:fe2c4b1f132f | 103 | |
jaosoriop | 2:fe2c4b1f132f | 104 | binM[0]=1; // se crea un arreglo con los valores de cada bit en decimal |
jaosoriop | 2:fe2c4b1f132f | 105 | for(i=1;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 106 | binM[i]=binM[i-1]*2; } // printf("%i",aux[i]); |
jaosoriop | 2:fe2c4b1f132f | 107 | |
jaosoriop | 2:fe2c4b1f132f | 108 | while(1) { |
jaosoriop | 2:fe2c4b1f132f | 109 | diferencia=0, conteo=0; valor1=0, valor2=0, valor3=0; |
jaosoriop | 2:fe2c4b1f132f | 110 | char valor[10] = {0}; strcpy(tecla1, ""); strcpy(tecla2, ""); strcpy(tecla3, ""); |
jaosoriop | 2:fe2c4b1f132f | 111 | ini1: |
jaosoriop | 2:fe2c4b1f132f | 112 | int header=0; |
jaosoriop | 2:fe2c4b1f132f | 113 | led2=1; |
jaosoriop | 2:fe2c4b1f132f | 114 | led1=1; |
jaosoriop | 2:fe2c4b1f132f | 115 | header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo |
jaosoriop | 2:fe2c4b1f132f | 116 | if (header > head_L && header < head_H) goto seguir1;//verificar que este en la tolerancia +-20% |
jaosoriop | 2:fe2c4b1f132f | 117 | else goto ini1; |
jaosoriop | 2:fe2c4b1f132f | 118 | seguir1: |
jaosoriop | 2:fe2c4b1f132f | 119 | wait_us(333); //duración aproximada de tiempo muerto antes de comenzar la trama |
jaosoriop | 2:fe2c4b1f132f | 120 | led2=0; //enciendo un LED para indicar que pasó el header y ya se van a recibir datos |
jaosoriop | 2:fe2c4b1f132f | 121 | for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos |
jaosoriop | 2:fe2c4b1f132f | 122 | dato = irda.read_low_us(); //leer un bit de datos que es pulso bajo en este control |
jaosoriop | 2:fe2c4b1f132f | 123 | num[i]=dato; //guarda cada dato en el arreglo num |
jaosoriop | 2:fe2c4b1f132f | 124 | wait_us(333); |
jaosoriop | 2:fe2c4b1f132f | 125 | } |
jaosoriop | 2:fe2c4b1f132f | 126 | |
jaosoriop | 2:fe2c4b1f132f | 127 | /* |
jaosoriop | 2:fe2c4b1f132f | 128 | wait(0.1); //espero un poquito antes de leer todo el arreglo y ponerlo en pantalla |
jaosoriop | 2:fe2c4b1f132f | 129 | pc.printf("Duracion de cabecera = %d\n", header); |
jaosoriop | 2:fe2c4b1f132f | 130 | pc.printf("Duracion de cada bit de llegada="); |
jaosoriop | 2:fe2c4b1f132f | 131 | for(i=0;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 132 | pc.printf("%d,",num[i]); |
jaosoriop | 2:fe2c4b1f132f | 133 | } |
jaosoriop | 2:fe2c4b1f132f | 134 | wait(0.1); //espero e imprimo en binario |
jaosoriop | 2:fe2c4b1f132f | 135 | pc.printf("\n"); |
jaosoriop | 2:fe2c4b1f132f | 136 | pc.printf("En binario ="); |
jaosoriop | 2:fe2c4b1f132f | 137 | */ |
jaosoriop | 2:fe2c4b1f132f | 138 | for(i=0;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 139 | if(num[i] > ((T_alto+T_bajo)/2)){ |
jaosoriop | 2:fe2c4b1f132f | 140 | pc.printf("1"); |
jaosoriop | 2:fe2c4b1f132f | 141 | aux[i]=1; |
jaosoriop | 2:fe2c4b1f132f | 142 | } |
jaosoriop | 2:fe2c4b1f132f | 143 | else{ |
jaosoriop | 2:fe2c4b1f132f | 144 | pc.printf("0"); |
jaosoriop | 2:fe2c4b1f132f | 145 | aux[i]=0; |
jaosoriop | 2:fe2c4b1f132f | 146 | } |
jaosoriop | 2:fe2c4b1f132f | 147 | } |
jaosoriop | 2:fe2c4b1f132f | 148 | // strcpy(tecla, ""); |
jaosoriop | 2:fe2c4b1f132f | 149 | // printf("\t\t\t Tecla presionada: %s\n",tecla); |
jaosoriop | 2:fe2c4b1f132f | 150 | |
jaosoriop | 2:fe2c4b1f132f | 151 | // convierto a decimal la tecla presionada |
jaosoriop | 2:fe2c4b1f132f | 152 | numero=0; |
jaosoriop | 2:fe2c4b1f132f | 153 | for(i=0;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 154 | numero=numero+(binM[i]*aux[i]); |
jaosoriop | 2:fe2c4b1f132f | 155 | } |
jaosoriop | 2:fe2c4b1f132f | 156 | // printf("\n"); |
jaosoriop | 2:fe2c4b1f132f | 157 | // printf("Convertido a decimal=%d \n",numero); |
tony63 | 0:4e0dfcf0e7ce | 158 | |
jaosoriop | 2:fe2c4b1f132f | 159 | if (numero==uno) {strcpy(tecla1, "1");} |
jaosoriop | 2:fe2c4b1f132f | 160 | else if (numero==dos) {strcpy(tecla1, "2");} |
jaosoriop | 2:fe2c4b1f132f | 161 | else if (numero==tres) {strcpy(tecla1, "3");} |
jaosoriop | 2:fe2c4b1f132f | 162 | else if (numero==cuatro){strcpy(tecla1, "4");} |
jaosoriop | 2:fe2c4b1f132f | 163 | else if (numero==cinco) {strcpy(tecla1, "5");} |
jaosoriop | 2:fe2c4b1f132f | 164 | else if (numero==seis) {strcpy(tecla1, "6");} |
jaosoriop | 2:fe2c4b1f132f | 165 | else if (numero==siete) {strcpy(tecla1, "7");} |
jaosoriop | 2:fe2c4b1f132f | 166 | else if (numero==ocho) {strcpy(tecla1, "8");} |
jaosoriop | 2:fe2c4b1f132f | 167 | else if (numero==nueve) {strcpy(tecla1, "9");} |
jaosoriop | 2:fe2c4b1f132f | 168 | else if (numero==cero) {strcpy(tecla1, "0");} |
jaosoriop | 2:fe2c4b1f132f | 169 | else if (numero==power) {strcpy(tecla1, "P");} |
jaosoriop | 2:fe2c4b1f132f | 170 | else if (numero==enter) {strcpy(tecla1, "E");} |
jaosoriop | 2:fe2c4b1f132f | 171 | else {goto ini1;} |
jaosoriop | 2:fe2c4b1f132f | 172 | pc.printf("\t\t\t Tecla presionada: %s\n",tecla1); |
jaosoriop | 2:fe2c4b1f132f | 173 | valor1=100*atoi(tecla1); |
jaosoriop | 2:fe2c4b1f132f | 174 | |
jaosoriop | 2:fe2c4b1f132f | 175 | CONTEO: |
jaosoriop | 2:fe2c4b1f132f | 176 | conteo++; |
jaosoriop | 2:fe2c4b1f132f | 177 | |
jaosoriop | 2:fe2c4b1f132f | 178 | if (conteo == 1) { |
jaosoriop | 2:fe2c4b1f132f | 179 | if (strcmp(tecla1, "P")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 180 | if (strcmp(tecla1, "E")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 181 | // strcpy(valor,tecla1); |
jaosoriop | 2:fe2c4b1f132f | 182 | pc.printf("VALOR en conteo=1 es %s \n",valor); |
jaosoriop | 2:fe2c4b1f132f | 183 | ini2: header=0; led2=1; led1=1; |
jaosoriop | 2:fe2c4b1f132f | 184 | header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo |
jaosoriop | 2:fe2c4b1f132f | 185 | if (header > head_L && header < head_H) goto seguir2;//verificar que este en la tolerancia +-20% |
jaosoriop | 2:fe2c4b1f132f | 186 | else goto ini2; |
jaosoriop | 2:fe2c4b1f132f | 187 | seguir2: wait_us(333); //duración aproximada de tiempo muerto antes de comenzar la trama |
jaosoriop | 2:fe2c4b1f132f | 188 | led2=0; //enciendo un LED para indicar que pasó el header y ya se van a recibir datos |
jaosoriop | 2:fe2c4b1f132f | 189 | for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos |
jaosoriop | 2:fe2c4b1f132f | 190 | dato = irda.read_low_us(); //leer un bit de datos que es pulso bajo en este control |
jaosoriop | 2:fe2c4b1f132f | 191 | num[i]=dato; //guarda cada dato en el arreglo num |
jaosoriop | 2:fe2c4b1f132f | 192 | wait_us(333); |
jaosoriop | 2:fe2c4b1f132f | 193 | } |
jaosoriop | 2:fe2c4b1f132f | 194 | |
jaosoriop | 2:fe2c4b1f132f | 195 | for(i=0;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 196 | if(num[i] > ((T_alto+T_bajo)/2)){ |
jaosoriop | 2:fe2c4b1f132f | 197 | pc.printf("1"); |
jaosoriop | 2:fe2c4b1f132f | 198 | aux[i]=1; |
jaosoriop | 2:fe2c4b1f132f | 199 | } |
jaosoriop | 2:fe2c4b1f132f | 200 | else{ |
jaosoriop | 2:fe2c4b1f132f | 201 | pc.printf("0"); |
jaosoriop | 2:fe2c4b1f132f | 202 | aux[i]=0; |
jaosoriop | 2:fe2c4b1f132f | 203 | } |
jaosoriop | 2:fe2c4b1f132f | 204 | } |
jaosoriop | 2:fe2c4b1f132f | 205 | |
jaosoriop | 2:fe2c4b1f132f | 206 | // convierto a decimal la tecla presionada |
jaosoriop | 2:fe2c4b1f132f | 207 | numero=0; |
jaosoriop | 2:fe2c4b1f132f | 208 | for(i=0;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 209 | numero=numero+(binM[i]*aux[i]); |
jaosoriop | 2:fe2c4b1f132f | 210 | } |
jaosoriop | 2:fe2c4b1f132f | 211 | // printf("\n"); |
jaosoriop | 2:fe2c4b1f132f | 212 | // printf("Convertido a decimal=%d \n",numero); |
jaosoriop | 2:fe2c4b1f132f | 213 | |
jaosoriop | 2:fe2c4b1f132f | 214 | if (numero==uno) {strcpy(tecla2, "1");} |
jaosoriop | 2:fe2c4b1f132f | 215 | else if (numero==dos) {strcpy(tecla2, "2");} |
jaosoriop | 2:fe2c4b1f132f | 216 | else if (numero==tres) {strcpy(tecla2, "3");} |
jaosoriop | 2:fe2c4b1f132f | 217 | else if (numero==cuatro){strcpy(tecla2, "4");} |
jaosoriop | 2:fe2c4b1f132f | 218 | else if (numero==cinco) {strcpy(tecla2, "5");} |
jaosoriop | 2:fe2c4b1f132f | 219 | else if (numero==seis) {strcpy(tecla2, "6");} |
jaosoriop | 2:fe2c4b1f132f | 220 | else if (numero==siete) {strcpy(tecla2, "7");} |
jaosoriop | 2:fe2c4b1f132f | 221 | else if (numero==ocho) {strcpy(tecla2, "8");} |
jaosoriop | 2:fe2c4b1f132f | 222 | else if (numero==nueve) {strcpy(tecla2, "9");} |
jaosoriop | 2:fe2c4b1f132f | 223 | else if (numero==cero) {strcpy(tecla2, "0");} |
jaosoriop | 2:fe2c4b1f132f | 224 | else if (numero==power) {strcpy(tecla2, "P");} |
jaosoriop | 2:fe2c4b1f132f | 225 | else if (numero==enter) {strcpy(tecla2, "E");} |
jaosoriop | 2:fe2c4b1f132f | 226 | else {goto ini2;} |
jaosoriop | 2:fe2c4b1f132f | 227 | pc.printf("\t\t\t Tecla presionada: %s\n",tecla2); |
jaosoriop | 2:fe2c4b1f132f | 228 | valor2=10*atoi(tecla2); |
jaosoriop | 2:fe2c4b1f132f | 229 | goto CONTEO; |
jaosoriop | 2:fe2c4b1f132f | 230 | |
jaosoriop | 2:fe2c4b1f132f | 231 | } //if (strcmp(tecla1, "E")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 232 | else if(strcmp(tecla1, "E")==0){ |
jaosoriop | 2:fe2c4b1f132f | 233 | {diferencia = valor1; goto siguiente;} |
jaosoriop | 2:fe2c4b1f132f | 234 | } |
jaosoriop | 2:fe2c4b1f132f | 235 | } //if (strcmp(tecla1, "P")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 236 | } //if (conteo == 1) { |
jaosoriop | 2:fe2c4b1f132f | 237 | //////////////////////////////////////////////////////////////////////////////// |
jaosoriop | 2:fe2c4b1f132f | 238 | if (conteo == 2) { |
jaosoriop | 2:fe2c4b1f132f | 239 | if (strcmp(tecla2, "P")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 240 | if (strcmp(tecla2, "E")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 241 | // strcpy(valor,tecla2); |
jaosoriop | 2:fe2c4b1f132f | 242 | ini3: header=0; led2=1; led1=1; |
jaosoriop | 2:fe2c4b1f132f | 243 | header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo |
jaosoriop | 2:fe2c4b1f132f | 244 | if (header > head_L && header < head_H) goto seguir3;//verificar que este en la tolerancia +-20% |
jaosoriop | 2:fe2c4b1f132f | 245 | else goto ini3; |
jaosoriop | 2:fe2c4b1f132f | 246 | seguir3: wait_us(333); //duración aproximada de tiempo muerto antes de comenzar la trama |
jaosoriop | 2:fe2c4b1f132f | 247 | led2=0; //enciendo un LED para indicar que pasó el header y ya se van a recibir datos |
jaosoriop | 2:fe2c4b1f132f | 248 | for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos |
jaosoriop | 2:fe2c4b1f132f | 249 | dato = irda.read_low_us(); //leer un bit de datos que es pulso bajo en este control |
jaosoriop | 2:fe2c4b1f132f | 250 | num[i]=dato; //guarda cada dato en el arreglo num |
jaosoriop | 2:fe2c4b1f132f | 251 | wait_us(333); |
jaosoriop | 2:fe2c4b1f132f | 252 | } |
jaosoriop | 2:fe2c4b1f132f | 253 | |
jaosoriop | 2:fe2c4b1f132f | 254 | for(i=0;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 255 | if(num[i] > ((T_alto+T_bajo)/2)){ |
jaosoriop | 2:fe2c4b1f132f | 256 | pc.printf("1"); |
jaosoriop | 2:fe2c4b1f132f | 257 | aux[i]=1; |
jaosoriop | 2:fe2c4b1f132f | 258 | } |
jaosoriop | 2:fe2c4b1f132f | 259 | else{ |
jaosoriop | 2:fe2c4b1f132f | 260 | pc.printf("0"); |
jaosoriop | 2:fe2c4b1f132f | 261 | aux[i]=0; |
jaosoriop | 2:fe2c4b1f132f | 262 | } |
jaosoriop | 2:fe2c4b1f132f | 263 | } |
jaosoriop | 2:fe2c4b1f132f | 264 | |
jaosoriop | 2:fe2c4b1f132f | 265 | // convierto a decimal la tecla presionada |
jaosoriop | 2:fe2c4b1f132f | 266 | numero=0; |
jaosoriop | 2:fe2c4b1f132f | 267 | for(i=0;i<(num_bits-1);++i){ |
jaosoriop | 2:fe2c4b1f132f | 268 | numero=numero+(binM[i]*aux[i]); |
jaosoriop | 2:fe2c4b1f132f | 269 | } |
jaosoriop | 2:fe2c4b1f132f | 270 | // printf("\n"); |
jaosoriop | 2:fe2c4b1f132f | 271 | // printf("Convertido a decimal=%d \n",numero); |
jaosoriop | 2:fe2c4b1f132f | 272 | |
jaosoriop | 2:fe2c4b1f132f | 273 | if (numero==uno) {strcpy(tecla3, "1");} |
jaosoriop | 2:fe2c4b1f132f | 274 | else if (numero==dos) {strcpy(tecla3, "2");} |
jaosoriop | 2:fe2c4b1f132f | 275 | else if (numero==tres) {strcpy(tecla3, "3");} |
jaosoriop | 2:fe2c4b1f132f | 276 | else if (numero==cuatro){strcpy(tecla3, "4");} |
jaosoriop | 2:fe2c4b1f132f | 277 | else if (numero==cinco) {strcpy(tecla3, "5");} |
jaosoriop | 2:fe2c4b1f132f | 278 | else if (numero==seis) {strcpy(tecla3, "6");} |
jaosoriop | 2:fe2c4b1f132f | 279 | else if (numero==siete) {strcpy(tecla3, "7");} |
jaosoriop | 2:fe2c4b1f132f | 280 | else if (numero==ocho) {strcpy(tecla3, "8");} |
jaosoriop | 2:fe2c4b1f132f | 281 | else if (numero==nueve) {strcpy(tecla3, "9");} |
jaosoriop | 2:fe2c4b1f132f | 282 | else if (numero==cero) {strcpy(tecla3, "0");} |
jaosoriop | 2:fe2c4b1f132f | 283 | else if (numero==power) {strcpy(tecla3, "P");} |
jaosoriop | 2:fe2c4b1f132f | 284 | else if (numero==enter) {strcpy(tecla3, "E");} |
jaosoriop | 2:fe2c4b1f132f | 285 | else {goto ini3;} |
jaosoriop | 2:fe2c4b1f132f | 286 | pc.printf("\t\t\t Tecla presionada: %s\n",tecla3); |
jaosoriop | 2:fe2c4b1f132f | 287 | valor3=1*atoi(tecla3); |
jaosoriop | 2:fe2c4b1f132f | 288 | goto CONTEO; |
jaosoriop | 2:fe2c4b1f132f | 289 | } //if (strcmp(tecla2, "E")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 290 | else if(strcmp(tecla2, "E")==0){ |
jaosoriop | 2:fe2c4b1f132f | 291 | {goto siguiente;} |
jaosoriop | 2:fe2c4b1f132f | 292 | } |
jaosoriop | 2:fe2c4b1f132f | 293 | } //if (strcmp(tecla1, "P")!=0){ |
jaosoriop | 2:fe2c4b1f132f | 294 | } //if (conteo == 1) { |
jaosoriop | 2:fe2c4b1f132f | 295 | //////////////////////////////////////////////////////////////////////////////// |
jaosoriop | 2:fe2c4b1f132f | 296 | if (conteo == 3){ |
jaosoriop | 2:fe2c4b1f132f | 297 | goto siguiente; |
jaosoriop | 2:fe2c4b1f132f | 298 | } |
jaosoriop | 2:fe2c4b1f132f | 299 | |
jaosoriop | 2:fe2c4b1f132f | 300 | siguiente: |
jaosoriop | 2:fe2c4b1f132f | 301 | |
jaosoriop | 2:fe2c4b1f132f | 302 | // diferencia=encoder.getPulses()-cambio; |
jaosoriop | 2:fe2c4b1f132f | 303 | // cambio=encoder.getPulses(); |
jaosoriop | 2:fe2c4b1f132f | 304 | |
jaosoriop | 2:fe2c4b1f132f | 305 | diferencia=valor1+valor2+valor3; |
jaosoriop | 2:fe2c4b1f132f | 306 | |
jaosoriop | 2:fe2c4b1f132f | 307 | if (strcmp(tecla1, "P")==0) |
jaosoriop | 2:fe2c4b1f132f | 308 | { |
jaosoriop | 2:fe2c4b1f132f | 309 | pc.printf("Comienza el PID por presionar POWER"); |
jaosoriop | 2:fe2c4b1f132f | 310 | break; // si se presiona el botón POWER se sale de la configuración y comienza el PID |
jaosoriop | 2:fe2c4b1f132f | 311 | } |
jaosoriop | 2:fe2c4b1f132f | 312 | |
tony63 | 0:4e0dfcf0e7ce | 313 | if (diferencia==0) |
tony63 | 0:4e0dfcf0e7ce | 314 | { |
tony63 | 0:4e0dfcf0e7ce | 315 | //nada |
tony63 | 0:4e0dfcf0e7ce | 316 | } |
tony63 | 0:4e0dfcf0e7ce | 317 | else if(diferencia>0) |
tony63 | 0:4e0dfcf0e7ce | 318 | { |
tony63 | 0:4e0dfcf0e7ce | 319 | if(pos==1) |
tony63 | 0:4e0dfcf0e7ce | 320 | { |
jaosoriop | 2:fe2c4b1f132f | 321 | if(diferencia>=999) |
tony63 | 0:4e0dfcf0e7ce | 322 | { |
tony63 | 1:058b8f5c135d | 323 | spnum=999; |
tony63 | 0:4e0dfcf0e7ce | 324 | lcd.locate(3,0); |
tony63 | 0:4e0dfcf0e7ce | 325 | lcd.printf(" "); |
tony63 | 0:4e0dfcf0e7ce | 326 | lcd.locate(3,0); |
tony63 | 0:4e0dfcf0e7ce | 327 | lcd.printf("%d", spnum); |
tony63 | 0:4e0dfcf0e7ce | 328 | } |
tony63 | 0:4e0dfcf0e7ce | 329 | else |
tony63 | 0:4e0dfcf0e7ce | 330 | { |
jaosoriop | 2:fe2c4b1f132f | 331 | spnum=diferencia; |
tony63 | 0:4e0dfcf0e7ce | 332 | lcd.locate(3,0); |
tony63 | 0:4e0dfcf0e7ce | 333 | lcd.printf("%d", spnum); |
tony63 | 0:4e0dfcf0e7ce | 334 | } |
jaosoriop | 2:fe2c4b1f132f | 335 | } //else if(pos==1) |
tony63 | 0:4e0dfcf0e7ce | 336 | else if(pos==2) |
tony63 | 0:4e0dfcf0e7ce | 337 | { |
jaosoriop | 2:fe2c4b1f132f | 338 | if(diferencia>=999) |
tony63 | 0:4e0dfcf0e7ce | 339 | { |
tony63 | 1:058b8f5c135d | 340 | kpnum=999; |
tony63 | 0:4e0dfcf0e7ce | 341 | lcd.locate(11,0); |
tony63 | 0:4e0dfcf0e7ce | 342 | lcd.printf(" "); |
tony63 | 0:4e0dfcf0e7ce | 343 | lcd.locate(11,0); |
tony63 | 0:4e0dfcf0e7ce | 344 | lcd.printf("%d", kpnum); |
tony63 | 0:4e0dfcf0e7ce | 345 | } |
tony63 | 0:4e0dfcf0e7ce | 346 | else |
tony63 | 0:4e0dfcf0e7ce | 347 | { |
jaosoriop | 2:fe2c4b1f132f | 348 | kpnum=diferencia; |
tony63 | 0:4e0dfcf0e7ce | 349 | lcd.locate(11,0); |
tony63 | 0:4e0dfcf0e7ce | 350 | lcd.printf("%d", kpnum); |
tony63 | 0:4e0dfcf0e7ce | 351 | } |
jaosoriop | 2:fe2c4b1f132f | 352 | } //else if(pos==2) |
tony63 | 0:4e0dfcf0e7ce | 353 | else if(pos==3) |
tony63 | 0:4e0dfcf0e7ce | 354 | { |
jaosoriop | 2:fe2c4b1f132f | 355 | if(diferencia>=999) |
tony63 | 0:4e0dfcf0e7ce | 356 | { |
tony63 | 1:058b8f5c135d | 357 | kinum=999; |
tony63 | 0:4e0dfcf0e7ce | 358 | lcd.locate(3,1); |
tony63 | 0:4e0dfcf0e7ce | 359 | lcd.printf(" "); |
tony63 | 0:4e0dfcf0e7ce | 360 | lcd.locate(3,1); |
tony63 | 0:4e0dfcf0e7ce | 361 | lcd.printf("%d", kinum); |
tony63 | 0:4e0dfcf0e7ce | 362 | } |
tony63 | 0:4e0dfcf0e7ce | 363 | else |
tony63 | 0:4e0dfcf0e7ce | 364 | { |
jaosoriop | 2:fe2c4b1f132f | 365 | kinum=diferencia; |
tony63 | 0:4e0dfcf0e7ce | 366 | lcd.locate(3,1); |
tony63 | 0:4e0dfcf0e7ce | 367 | lcd.printf("%d", kinum); |
tony63 | 0:4e0dfcf0e7ce | 368 | } |
jaosoriop | 2:fe2c4b1f132f | 369 | } //else if(pos==3) |
tony63 | 0:4e0dfcf0e7ce | 370 | else if(pos==4) |
tony63 | 0:4e0dfcf0e7ce | 371 | { |
jaosoriop | 2:fe2c4b1f132f | 372 | if(diferencia>=999) |
tony63 | 0:4e0dfcf0e7ce | 373 | { |
tony63 | 1:058b8f5c135d | 374 | kdnum=999; |
tony63 | 0:4e0dfcf0e7ce | 375 | lcd.locate(11,1); |
tony63 | 0:4e0dfcf0e7ce | 376 | lcd.printf(" "); |
tony63 | 0:4e0dfcf0e7ce | 377 | lcd.locate(11,1); |
tony63 | 0:4e0dfcf0e7ce | 378 | lcd.printf("%d", kdnum); |
tony63 | 0:4e0dfcf0e7ce | 379 | } |
tony63 | 0:4e0dfcf0e7ce | 380 | else |
tony63 | 0:4e0dfcf0e7ce | 381 | { |
jaosoriop | 2:fe2c4b1f132f | 382 | kdnum=diferencia; |
tony63 | 0:4e0dfcf0e7ce | 383 | lcd.locate(11,1); |
tony63 | 0:4e0dfcf0e7ce | 384 | lcd.printf("%d", kdnum); |
tony63 | 0:4e0dfcf0e7ce | 385 | } |
jaosoriop | 2:fe2c4b1f132f | 386 | } //else if(pos==4) |
jaosoriop | 2:fe2c4b1f132f | 387 | } // else if(diferencia>0) |
tony63 | 0:4e0dfcf0e7ce | 388 | |
jaosoriop | 2:fe2c4b1f132f | 389 | |
jaosoriop | 2:fe2c4b1f132f | 390 | if (strcmp(tecla1, "E")==0) //cambia la posicion de ingreso de parametros si se presiona en botón ENTER |
tony63 | 0:4e0dfcf0e7ce | 391 | { |
jaosoriop | 2:fe2c4b1f132f | 392 | pc.printf("Cambio de posicion por presionar ENTER"); |
tony63 | 0:4e0dfcf0e7ce | 393 | led3 =!led3; |
tony63 | 0:4e0dfcf0e7ce | 394 | if(pos==4) |
tony63 | 0:4e0dfcf0e7ce | 395 | { |
tony63 | 0:4e0dfcf0e7ce | 396 | pos=1; |
tony63 | 0:4e0dfcf0e7ce | 397 | lcd.locate(3,0); |
tony63 | 0:4e0dfcf0e7ce | 398 | lcd.printf("%d", spnum); |
tony63 | 0:4e0dfcf0e7ce | 399 | } |
tony63 | 0:4e0dfcf0e7ce | 400 | else if (pos==1) |
tony63 | 0:4e0dfcf0e7ce | 401 | { |
tony63 | 0:4e0dfcf0e7ce | 402 | pos++; |
tony63 | 0:4e0dfcf0e7ce | 403 | lcd.locate(11,0); |
tony63 | 0:4e0dfcf0e7ce | 404 | lcd.printf("%d", kpnum); |
tony63 | 0:4e0dfcf0e7ce | 405 | } |
tony63 | 0:4e0dfcf0e7ce | 406 | else if(pos==2) |
tony63 | 0:4e0dfcf0e7ce | 407 | { |
tony63 | 0:4e0dfcf0e7ce | 408 | pos++; |
tony63 | 0:4e0dfcf0e7ce | 409 | lcd.locate(3,1); |
tony63 | 0:4e0dfcf0e7ce | 410 | lcd.printf("%d", kinum); |
tony63 | 0:4e0dfcf0e7ce | 411 | } |
tony63 | 0:4e0dfcf0e7ce | 412 | else if(pos==3) |
tony63 | 0:4e0dfcf0e7ce | 413 | { |
tony63 | 0:4e0dfcf0e7ce | 414 | pos++; |
tony63 | 0:4e0dfcf0e7ce | 415 | lcd.locate(11,1); |
tony63 | 0:4e0dfcf0e7ce | 416 | lcd.printf("%d", kdnum); |
tony63 | 0:4e0dfcf0e7ce | 417 | } |
tony63 | 0:4e0dfcf0e7ce | 418 | wait(0.25); |
tony63 | 0:4e0dfcf0e7ce | 419 | |
jaosoriop | 2:fe2c4b1f132f | 420 | } //if (strcpy(tecla, "E")==0) |
tony63 | 0:4e0dfcf0e7ce | 421 | |
jaosoriop | 2:fe2c4b1f132f | 422 | |
tony63 | 0:4e0dfcf0e7ce | 423 | wait(0.1); |
tony63 | 0:4e0dfcf0e7ce | 424 | } |
tony63 | 0:4e0dfcf0e7ce | 425 | |
tony63 | 0:4e0dfcf0e7ce | 426 | |
tony63 | 0:4e0dfcf0e7ce | 427 | //Transicion |
tony63 | 0:4e0dfcf0e7ce | 428 | lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo |
tony63 | 0:4e0dfcf0e7ce | 429 | lcd.cls(); //borra la pantalla |
tony63 | 0:4e0dfcf0e7ce | 430 | lcd.printf(" GUARDADOS!"); |
tony63 | 0:4e0dfcf0e7ce | 431 | wait(1); |
tony63 | 0:4e0dfcf0e7ce | 432 | lcd.cls(); |
tony63 | 0:4e0dfcf0e7ce | 433 | lcd.printf(" INICIA EL PID"); |
tony63 | 0:4e0dfcf0e7ce | 434 | wait(1); |
tony63 | 0:4e0dfcf0e7ce | 435 | // se imprimen los parches del control ***************************************** |
tony63 | 0:4e0dfcf0e7ce | 436 | lcd.cls(); |
tony63 | 1:058b8f5c135d | 437 | lcd.printf("Er=%3.0f",err); |
tony63 | 0:4e0dfcf0e7ce | 438 | lcd.locate(8,0); |
tony63 | 1:058b8f5c135d | 439 | lcd.printf("Me=%3.0f",med); |
tony63 | 0:4e0dfcf0e7ce | 440 | lcd.locate(0,1); |
tony63 | 1:058b8f5c135d | 441 | lcd.printf("Sp=%3.0f",spnum); |
tony63 | 0:4e0dfcf0e7ce | 442 | lcd.locate(8,1); |
tony63 | 1:058b8f5c135d | 443 | lcd.printf("Co=%3.0f",pid); |
tony63 | 1:058b8f5c135d | 444 | wait(1); |
tony63 | 0:4e0dfcf0e7ce | 445 | |
tony63 | 0:4e0dfcf0e7ce | 446 | // CICLO PRINCIPAL CONTROLADOR PID |
tony63 | 1:058b8f5c135d | 447 | lop1: med = y.read()*999; |
tony63 | 0:4e0dfcf0e7ce | 448 | err = (spnum-med); //se calcula el error |
tony63 | 1:058b8f5c135d | 449 | ap = kpnum*err*0.01f; //se calcula la accion proporcinal |
tony63 | 1:058b8f5c135d | 450 | ai =(kinum*err*0.01f)+ai; //calculo de la integral del error |
tony63 | 1:058b8f5c135d | 451 | ad = kdnum*(err-err_v)*0.01f; //calculo de la accion derivativa |
tony63 | 0:4e0dfcf0e7ce | 452 | pid = (ap+ai+ad); |
tony63 | 0:4e0dfcf0e7ce | 453 | // se verifica que pid sea positivo ************************************** |
jaosoriop | 2:fe2c4b1f132f | 454 | if(pid<=0) { |
jaosoriop | 2:fe2c4b1f132f | 455 | pid=0; } |
tony63 | 0:4e0dfcf0e7ce | 456 | // se verifica que pid sea menor o igual la valor maximo ***************** |
jaosoriop | 2:fe2c4b1f132f | 457 | if (pid > 999) { |
jaosoriop | 2:fe2c4b1f132f | 458 | pid=999; } |
tony63 | 0:4e0dfcf0e7ce | 459 | //se muestran las variables****************************************** |
jaosoriop | 2:fe2c4b1f132f | 460 | lcd.locate(3,0); lcd.printf(" "); |
jaosoriop | 2:fe2c4b1f132f | 461 | lcd.locate(3,0); lcd.printf("%3.0f",err); |
jaosoriop | 2:fe2c4b1f132f | 462 | lcd.locate(11,0); lcd.printf(" "); |
jaosoriop | 2:fe2c4b1f132f | 463 | lcd.locate(11,0); lcd.printf("%3.0f",med); |
jaosoriop | 2:fe2c4b1f132f | 464 | lcd.locate(3,1); lcd.printf(" "); |
jaosoriop | 2:fe2c4b1f132f | 465 | lcd.locate(3,1); lcd.printf("%d",spnum); |
jaosoriop | 2:fe2c4b1f132f | 466 | lcd.locate(11,1); lcd.printf(" "); |
jaosoriop | 2:fe2c4b1f132f | 467 | lcd.locate(11,1); lcd.printf("%3.0f",pid); |
tony63 | 1:058b8f5c135d | 468 | |
tony63 | 0:4e0dfcf0e7ce | 469 | //Normalizacion de la salida |
tony63 | 1:058b8f5c135d | 470 | // se actualizan las variables ******************************************* |
tony63 | 1:058b8f5c135d | 471 | err_v = err; |
tony63 | 1:058b8f5c135d | 472 | o = pid/999; |
jaosoriop | 2:fe2c4b1f132f | 473 | u.write(o); // se envia el valor pid a puerto analogico de salida (D/A) ************** |
tony63 | 1:058b8f5c135d | 474 | |
tony63 | 0:4e0dfcf0e7ce | 475 | // se repite el ciclo |
tony63 | 1:058b8f5c135d | 476 | wait_ms(300); |
tony63 | 1:058b8f5c135d | 477 | goto lop1; |
tony63 | 0:4e0dfcf0e7ce | 478 | } |