Tarea 2-Procesadores 2016-2. Aldair Navarro

Dependencies:   Pulse1 TextLCD mbed

Fork of irda_Sony by Gustavo Ramirez

Committer:
LaVerga_A
Date:
Wed Nov 30 04:02:51 2016 +0000
Revision:
5:6d9292b2d5e3
Parent:
4:150bc6a5f5b4
Tarea 2-Procesadores 2016-2. Aldair Navarro

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tony63 0:74d57f8ae247 1 #include "mbed.h"
tony63 0:74d57f8ae247 2 #include <Pulse1.h>
LaVerga_A 5:6d9292b2d5e3 3 #include "TextLCD.h"
tony63 4:150bc6a5f5b4 4 #include "stdio.h"
tony63 4:150bc6a5f5b4 5 #include "math.h"
LaVerga_A 5:6d9292b2d5e3 6
LaVerga_A 5:6d9292b2d5e3 7 //===============================================================================CONTROL REMOTO SONY
LaVerga_A 5:6d9292b2d5e3 8
LaVerga_A 5:6d9292b2d5e3 9 PulseInOut irda(PTD4); //puerto para sensor infrarrojo
LaVerga_A 5:6d9292b2d5e3 10 Serial pc(USBTX, USBRX); //Para Termite
LaVerga_A 5:6d9292b2d5e3 11 DigitalOut led(LED1); DigitalOut led2(LED2); // Leds
LaVerga_A 5:6d9292b2d5e3 12 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // LCD
LaVerga_A 5:6d9292b2d5e3 13 AnalogIn y(PTB3); //entrada analoga
LaVerga_A 5:6d9292b2d5e3 14 AnalogOut u(PTE30); //salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer
LaVerga_A 5:6d9292b2d5e3 15 //si se ignora se daña la FRDMKL25Z
LaVerga_A 5:6d9292b2d5e3 16 int header =0; //tiempo de Bit de Inicio (4T)
LaVerga_A 5:6d9292b2d5e3 17 int head_H = 2900; //20% tiempo de Bit de Inicio
LaVerga_A 5:6d9292b2d5e3 18 int head_L= 1900;
LaVerga_A 5:6d9292b2d5e3 19 int T_alto=1200; //Tiempo maximo de un bit 1
LaVerga_A 5:6d9292b2d5e3 20 int T_bajo=600; //Tiempo maximo de un bit 0
LaVerga_A 5:6d9292b2d5e3 21 int num_bits = 12; //Número de bits
LaVerga_A 5:6d9292b2d5e3 22 int times[12]; //almacenador de tiempos de bits
LaVerga_A 5:6d9292b2d5e3 23
LaVerga_A 5:6d9292b2d5e3 24 int dato=0; //Tiempo del Bit actual
LaVerga_A 5:6d9292b2d5e3 25 int bin[12]; //Cadena de Bits
LaVerga_A 5:6d9292b2d5e3 26 //int Serie[20]; //Serie 2^n
LaVerga_A 5:6d9292b2d5e3 27 int numero=0; //Numero Decimal del botón
LaVerga_A 5:6d9292b2d5e3 28 int boton=0; //boton que se undió
LaVerga_A 5:6d9292b2d5e3 29
LaVerga_A 5:6d9292b2d5e3 30 int Sp=0, Kp=0, Ki=0, Kd=0, pos=1 , i=0 , j=0 , k=0, valPar=0 ; //Variables
LaVerga_A 5:6d9292b2d5e3 31 float pid,ai,ad,ap,med,err,err_v;
LaVerga_A 5:6d9292b2d5e3 32 //const int base[]={1,10,100};
LaVerga_A 5:6d9292b2d5e3 33 int C1=0x0F; int C4=0x0C; // cursor y cursor bajo
tony63 4:150bc6a5f5b4 34 int binM[20];
tony63 4:150bc6a5f5b4 35
tony63 4:150bc6a5f5b4 36
LaVerga_A 5:6d9292b2d5e3 37 //=============================================================================== Prototipo de Funciones
LaVerga_A 5:6d9292b2d5e3 38 void PID (int Sp, int Kp, int Ki, int Kd);
LaVerga_A 5:6d9292b2d5e3 39 void LCD1 (int col, int fil, int val ) ;
LaVerga_A 5:6d9292b2d5e3 40 void LCD2 (int col, int fil, float val ) ;
tony63 4:150bc6a5f5b4 41
LaVerga_A 5:6d9292b2d5e3 42
LaVerga_A 5:6d9292b2d5e3 43 //================================================================================ Main - Configuración de Parámetros
LaVerga_A 5:6d9292b2d5e3 44 int main(){
LaVerga_A 5:6d9292b2d5e3 45 lcd.locate(0,1); lcd.printf("**PID Control**");
LaVerga_A 5:6d9292b2d5e3 46 wait(2); lcd.cls(); lcd.writeCommand(C1);
LaVerga_A 5:6d9292b2d5e3 47
LaVerga_A 5:6d9292b2d5e3 48 lcd.locate(0,0); lcd.printf("Sp=%d",Sp);
LaVerga_A 5:6d9292b2d5e3 49 lcd.locate(8,0); lcd.printf("Kp=%d",Kp);
LaVerga_A 5:6d9292b2d5e3 50 lcd.locate(0,1); lcd.printf("Ki=%d",Ki);
LaVerga_A 5:6d9292b2d5e3 51 lcd.locate(8,1); lcd.printf("Kd=%d",Kd);
LaVerga_A 5:6d9292b2d5e3 52
LaVerga_A 5:6d9292b2d5e3 53 while(1){
LaVerga_A 5:6d9292b2d5e3 54 ini1: fflush( stdin );
LaVerga_A 5:6d9292b2d5e3 55 header=0;
LaVerga_A 5:6d9292b2d5e3 56 led2=0; led=1;
tony63 3:82bebaf2a06a 57 header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo en header
tony63 2:6a15ab0305c8 58 if (header > head_L && header < head_H) goto seguir;//verificar que este en la tolerancia +-20%
tony63 2:6a15ab0305c8 59 else goto ini1;
tony63 0:74d57f8ae247 60
tony63 2:6a15ab0305c8 61 seguir:
tony63 2:6a15ab0305c8 62 //leo los datos de la trama y se meten a un arreglo
tony63 4:150bc6a5f5b4 63 wait_us(400);// ES EL TIEMPO DE HEADER QUE NO SE Lee O EL ALTO
tony63 4:150bc6a5f5b4 64 led2=1;
tony63 2:6a15ab0305c8 65 for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos
tony63 4:150bc6a5f5b4 66 dato = irda.read_low_us(); //leer un bit de datos que es pulso arriba en este control
LaVerga_A 5:6d9292b2d5e3 67 times[i]=dato;
LaVerga_A 5:6d9292b2d5e3 68 wait_us(400); }
LaVerga_A 5:6d9292b2d5e3 69
tony63 3:82bebaf2a06a 70 wait(0.5); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla
LaVerga_A 5:6d9292b2d5e3 71
LaVerga_A 5:6d9292b2d5e3 72 pc.printf("heder= ,%d\n",header);
LaVerga_A 5:6d9292b2d5e3 73
LaVerga_A 5:6d9292b2d5e3 74 for(i=0;i<(num_bits-1);++i){pc.printf("%d,",times[i]); }
LaVerga_A 5:6d9292b2d5e3 75
LaVerga_A 5:6d9292b2d5e3 76 wait(0.1); pc.printf("\n");
LaVerga_A 5:6d9292b2d5e3 77
tony63 2:6a15ab0305c8 78 for(i=0;i<(num_bits-1);++i){
tony63 4:150bc6a5f5b4 79
LaVerga_A 5:6d9292b2d5e3 80 if(times[i] > ((T_alto+T_bajo)/2)){ bin[i]=1; }
LaVerga_A 5:6d9292b2d5e3 81 else{ bin[i]=0; }
tony63 4:150bc6a5f5b4 82
LaVerga_A 5:6d9292b2d5e3 83 pc.printf("%d ",bin[i]); }
LaVerga_A 5:6d9292b2d5e3 84
LaVerga_A 5:6d9292b2d5e3 85 pc.printf("\n");
LaVerga_A 5:6d9292b2d5e3 86
LaVerga_A 5:6d9292b2d5e3 87
LaVerga_A 5:6d9292b2d5e3 88 binM[0]=1;
LaVerga_A 5:6d9292b2d5e3 89 for(i=1;i<(num_bits-1);++i){ binM[i]=binM[i-1]*2; }
LaVerga_A 5:6d9292b2d5e3 90
tony63 4:150bc6a5f5b4 91 numero=0;
LaVerga_A 5:6d9292b2d5e3 92 for(i=0;i<(num_bits-1);++i){ numero=numero+(binM[i]*bin[i]);}
LaVerga_A 5:6d9292b2d5e3 93
LaVerga_A 5:6d9292b2d5e3 94
LaVerga_A 5:6d9292b2d5e3 95 pc.printf("numero=%d\n",numero);
tony63 4:150bc6a5f5b4 96
LaVerga_A 5:6d9292b2d5e3 97 if (numero==128){ boton=1 ;} else if (numero==129){ boton=2 ;} //boton 1 a 0 normales
LaVerga_A 5:6d9292b2d5e3 98 else if (numero==130){ boton=3 ;} else if (numero==131){ boton=4 ;} //boton 11 subir, chan+
LaVerga_A 5:6d9292b2d5e3 99 else if (numero==132){ boton=5 ;} else if (numero==133){ boton=6 ;} //boton 12 bajar, chan-
LaVerga_A 5:6d9292b2d5e3 100 else if (numero==134){ boton=7 ;} else if (numero==135){ boton=8 ;} //boton 13 derecha, vol+
LaVerga_A 5:6d9292b2d5e3 101 else if (numero==136){ boton=9 ;} else if (numero==137){ boton=0 ;} //boton 14 derecha, vol+
LaVerga_A 5:6d9292b2d5e3 102 else if (numero==144){ boton=11;} else if (numero==145){ boton=12;} //boton 15 ir a PID, MUTE
LaVerga_A 5:6d9292b2d5e3 103 else if (numero==146){ boton=13;} else if (numero==147){ boton=14;}
LaVerga_A 5:6d9292b2d5e3 104 else if (numero==148){ boton=15;} else { boton=16;}
LaVerga_A 5:6d9292b2d5e3 105
LaVerga_A 5:6d9292b2d5e3 106 //pc.printf("boton= %d\n",boton);
LaVerga_A 5:6d9292b2d5e3 107 wait(0.2);
LaVerga_A 5:6d9292b2d5e3 108 //=================================================================USAR FLECHAS
LaVerga_A 5:6d9292b2d5e3 109
LaVerga_A 5:6d9292b2d5e3 110 switch (boton) { //Toca bajar al Parámetro //Llegó chan-
LaVerga_A 5:6d9292b2d5e3 111 case 11:
LaVerga_A 5:6d9292b2d5e3 112 if (pos==1) {
LaVerga_A 5:6d9292b2d5e3 113 if (Sp!=999){ Sp++; LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);}}
LaVerga_A 5:6d9292b2d5e3 114 if (pos==2) {
LaVerga_A 5:6d9292b2d5e3 115 if (Kp!=999){ Kp++; LCD1(11,0,Kp);pc.printf("Kp=%d",Kp);}}
LaVerga_A 5:6d9292b2d5e3 116 if (pos==3) {
LaVerga_A 5:6d9292b2d5e3 117 if (Ki!=999){ Ki++; LCD1(3,1,Ki) ;pc.printf("Ki=%d",Ki);}}
LaVerga_A 5:6d9292b2d5e3 118 if (pos==4 ){
LaVerga_A 5:6d9292b2d5e3 119 if (Kd!=999){ Kd++; LCD1(3,11,Kd);pc.printf("Kd=%d",Kd);}}
LaVerga_A 5:6d9292b2d5e3 120 break;
LaVerga_A 5:6d9292b2d5e3 121
LaVerga_A 5:6d9292b2d5e3 122 case 12: //Toca bajar al Parámetro //Llegó chan-
LaVerga_A 5:6d9292b2d5e3 123
LaVerga_A 5:6d9292b2d5e3 124 if( pos==1 ){
LaVerga_A 5:6d9292b2d5e3 125 if (Sp!=0) { Sp--; LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);}}
LaVerga_A 5:6d9292b2d5e3 126 if (pos==2) {
LaVerga_A 5:6d9292b2d5e3 127 if (Kp!=0) { Kp--; LCD1(11,0,Kp); pc.printf("Kp=%d",Kp);}}
LaVerga_A 5:6d9292b2d5e3 128 if (pos==3) {
LaVerga_A 5:6d9292b2d5e3 129 if (Ki!=0) { Ki--; LCD1(3,1,Ki) ; pc.printf("Ki=%d",Ki);}}
LaVerga_A 5:6d9292b2d5e3 130 if (pos==4) {
LaVerga_A 5:6d9292b2d5e3 131 if (Kd!=0) { Kd--; LCD1(3,11,Kd); pc.printf("Kd=%d",Kd);}}
LaVerga_A 5:6d9292b2d5e3 132 break;
LaVerga_A 5:6d9292b2d5e3 133
LaVerga_A 5:6d9292b2d5e3 134 case 13: //Mover hacia derecha, llegó vol+
LaVerga_A 5:6d9292b2d5e3 135 j=0; valPar=0;
LaVerga_A 5:6d9292b2d5e3 136 if(pos==4){ pos=1; LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);}
LaVerga_A 5:6d9292b2d5e3 137 else if(pos==1){ pos++; LCD1(11,0,Kp) ;pc.printf("Kp=%d",Kp); }
LaVerga_A 5:6d9292b2d5e3 138 else if(pos==2){ pos++; LCD1(3,1,Ki) ;pc.printf("Ki=%d",Ki); }
LaVerga_A 5:6d9292b2d5e3 139 else if(pos==3){ pos++; LCD1(11,1,Kd) ; pc.printf("Kd=%d",Kd); }
LaVerga_A 5:6d9292b2d5e3 140 break;
LaVerga_A 5:6d9292b2d5e3 141
LaVerga_A 5:6d9292b2d5e3 142 case 14: //Mover hacia derecha, llegó vol-
LaVerga_A 5:6d9292b2d5e3 143 j=0; valPar=0;
LaVerga_A 5:6d9292b2d5e3 144 if(pos==1){ pos=4; LCD1(11,1,Kd) ; pc.printf("Sp=%d",Sp);}
LaVerga_A 5:6d9292b2d5e3 145 else if(pos==4){ pos--; LCD1(3,1, Ki) ; pc.printf("Kp=%d",Kp);}
LaVerga_A 5:6d9292b2d5e3 146 else if(pos==3){ pos--; LCD1(11,0,Kp) ; pc.printf("Ki=%d",Ki);}
LaVerga_A 5:6d9292b2d5e3 147 else if(pos==2){ pos--; LCD1(3,0, Sp) ; pc.printf("Kd=%d",Kd);}
LaVerga_A 5:6d9292b2d5e3 148 break;
LaVerga_A 5:6d9292b2d5e3 149
LaVerga_A 5:6d9292b2d5e3 150 case 15: //ir al PID, llegó Mute
LaVerga_A 5:6d9292b2d5e3 151 PID(Sp,Kp,Ki,Kd) ; break;
LaVerga_A 5:6d9292b2d5e3 152 default: {}; } // cierra Switch
LaVerga_A 5:6d9292b2d5e3 153
LaVerga_A 5:6d9292b2d5e3 154
LaVerga_A 5:6d9292b2d5e3 155 //=======================================================================Botones
LaVerga_A 5:6d9292b2d5e3 156 if ((boton==0)||(boton==1)||(boton==2)||(boton==3)||(boton==4)||(boton==5)||(boton==6)||(boton==7)||(boton==8)||(boton==9)){
LaVerga_A 5:6d9292b2d5e3 157 if(j<3){
LaVerga_A 5:6d9292b2d5e3 158 valPar = 10*valPar + boton;
LaVerga_A 5:6d9292b2d5e3 159 j++;
LaVerga_A 5:6d9292b2d5e3 160
LaVerga_A 5:6d9292b2d5e3 161 if(pos==1){ Sp=valPar; LCD1(3,0, Sp) ; }
LaVerga_A 5:6d9292b2d5e3 162 else if(pos==2){ Kp=valPar; LCD1(11,0,Kp) ; }
LaVerga_A 5:6d9292b2d5e3 163 else if(pos==3){ Ki=valPar; LCD1(3,1, Ki) ; }
LaVerga_A 5:6d9292b2d5e3 164 else if(pos==4){ Kd=valPar; LCD1(11,1, Kd) ; }
LaVerga_A 5:6d9292b2d5e3 165 }}
LaVerga_A 5:6d9292b2d5e3 166
LaVerga_A 5:6d9292b2d5e3 167 } // cierra while
LaVerga_A 5:6d9292b2d5e3 168 } // cierran Main
LaVerga_A 5:6d9292b2d5e3 169
LaVerga_A 5:6d9292b2d5e3 170
LaVerga_A 5:6d9292b2d5e3 171 //=================================================================================CICLO PID INFINITO
LaVerga_A 5:6d9292b2d5e3 172 void PID (int Sp, int Kp, int Ki, int Kd) {
LaVerga_A 5:6d9292b2d5e3 173 //======================================= Parches del control
LaVerga_A 5:6d9292b2d5e3 174 lcd.writeCommand(C4); //quita cursor bajo
LaVerga_A 5:6d9292b2d5e3 175 lcd.cls(); lcd.printf(" GUARDADOS!") ; wait(1); //borra la pantalla
LaVerga_A 5:6d9292b2d5e3 176 lcd.cls(); lcd.printf(" INICIA EL PID"); wait(1);
LaVerga_A 5:6d9292b2d5e3 177 lcd.cls();
LaVerga_A 5:6d9292b2d5e3 178
LaVerga_A 5:6d9292b2d5e3 179 lcd.printf("Er=%3.0f",err);
LaVerga_A 5:6d9292b2d5e3 180 lcd.locate(8,0); lcd.printf("Me=%3.0f",med);
LaVerga_A 5:6d9292b2d5e3 181 lcd.locate(0,1); lcd.printf("Sp=%3.0f",Sp);
LaVerga_A 5:6d9292b2d5e3 182 lcd.locate(8,1); lcd.printf("Co=%3.0f",pid);
LaVerga_A 5:6d9292b2d5e3 183 wait(1);
LaVerga_A 5:6d9292b2d5e3 184
LaVerga_A 5:6d9292b2d5e3 185 while(1){ //=============================================================== CICLO PRINCIPAL CONTROLADOR PID
LaVerga_A 5:6d9292b2d5e3 186 med = y.read()*999 ;
LaVerga_A 5:6d9292b2d5e3 187 err = Sp-med ; //se calcula el error
LaVerga_A 5:6d9292b2d5e3 188 ap = Kp*err*0.01f ; //se calcula la accion proporcinal
LaVerga_A 5:6d9292b2d5e3 189 ai = (Ki*err*0.01f)+ai ; //calculo de la integral del error
LaVerga_A 5:6d9292b2d5e3 190 ad = Kd*(err-err_v)*0.01f ; //calculo de la accion derivativa
LaVerga_A 5:6d9292b2d5e3 191 pid = ap+ai+ad ;
LaVerga_A 5:6d9292b2d5e3 192
LaVerga_A 5:6d9292b2d5e3 193 if(pid<=0) {pid=0 ;} // se verifica que pid sea positivo
LaVerga_A 5:6d9292b2d5e3 194 if(pid > 999){pid=999;} // se verifica que pid sea menor a 1000
LaVerga_A 5:6d9292b2d5e3 195
LaVerga_A 5:6d9292b2d5e3 196 LCD2(3,0,err) ; // pc.putc(sprintf (mm,"ER%3.0f",err)); wait_ms(30);
LaVerga_A 5:6d9292b2d5e3 197 LCD2(11,0,med); // pc.putc(sprintf(mm,"ME%3.0f",med)); wait_ms(30);
LaVerga_A 5:6d9292b2d5e3 198 LCD2(3,1,Sp) ;
LaVerga_A 5:6d9292b2d5e3 199 LCD2(11,1,med); // pc.putc(sprintf(mm,"ID%3.0f",pid)); wait_ms(30);
LaVerga_A 5:6d9292b2d5e3 200
LaVerga_A 5:6d9292b2d5e3 201 err_v = err; // guarda error
LaVerga_A 5:6d9292b2d5e3 202 u.write(pid/999); // se envia el valor pid (normalizado) a puerto analogico de salida (D/A)
LaVerga_A 5:6d9292b2d5e3 203
LaVerga_A 5:6d9292b2d5e3 204 /* pc.printf("%3.0f\t",ER); pc.printf("%3.0f\t",ME);
LaVerga_A 5:6d9292b2d5e3 205 pc.printf("%3.0f\t",SP); pc.printf("%3.0f\n",ID);*/
LaVerga_A 5:6d9292b2d5e3 206 wait_ms(300);
LaVerga_A 5:6d9292b2d5e3 207
LaVerga_A 5:6d9292b2d5e3 208 } // cierra while
LaVerga_A 5:6d9292b2d5e3 209 } // funtion
LaVerga_A 5:6d9292b2d5e3 210
LaVerga_A 5:6d9292b2d5e3 211 //==============================================================================Funciones Mostrar en LCD
LaVerga_A 5:6d9292b2d5e3 212 void LCD1 (int col, int fil, int val ){
LaVerga_A 5:6d9292b2d5e3 213 lcd.locate(col,fil); lcd.printf(" ");
LaVerga_A 5:6d9292b2d5e3 214 lcd.locate(col,fil); lcd.printf("%d", val); }
LaVerga_A 5:6d9292b2d5e3 215
LaVerga_A 5:6d9292b2d5e3 216 void LCD2 (int col, int fil, float val ){
LaVerga_A 5:6d9292b2d5e3 217 lcd.locate(col,fil); lcd.printf(" ");
LaVerga_A 5:6d9292b2d5e3 218 lcd.locate(col,fil); lcd.printf("%3.0f", val); }