PROCESADORES - 2016-03. TAREA 2. PID+IrDA

Dependencies:   Pulse1 TextLCD mbed

Fork of PID_ENCODER_OK by Gustavo Ramirez

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:
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?

UserRevisionLine numberNew 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 }