Tarea 2-Procesadores 2016-2. Aldair Navarro
Dependencies: Pulse1 TextLCD mbed
Fork of irda_Sony by
Diff: main.cpp
- Revision:
- 5:6d9292b2d5e3
- Parent:
- 4:150bc6a5f5b4
diff -r 150bc6a5f5b4 -r 6d9292b2d5e3 main.cpp --- a/main.cpp Tue Apr 26 04:23:42 2016 +0000 +++ b/main.cpp Wed Nov 30 04:02:51 2016 +0000 @@ -1,35 +1,59 @@ #include "mbed.h" #include <Pulse1.h> +#include "TextLCD.h" #include "stdio.h" #include "math.h" -//control remoto sony disparo camara -//puede convertir la trama en un entero -//para cualquier tecla -PulseInOut irda(PTD5);// en este puerto se pone el sensor infrarrojo -Serial pc(USBTX, USBRX); -DigitalOut led(LED1); -DigitalOut led2(LED2); -int header =0; //tiempo de cabecera pulso abajo -const int head_H = 2976; //+10% medida con osciloscopio en microsegundos -const int head_L = 1984;//-10% medida con osciloscopio -int i=0, bin, potencia; -const int T_alto=1200;//ponga su tiempo de la prueba -const int T_bajo=639;//ponga su tiempo de la prueba -const int num_bits = 20;//ponga su numero de bits -int num[num_bits];//cadena para almacenar todos los tiempos que conforman los bits de datos -int dato; // tiempo de cada dato que se lee -int numero; + +//===============================================================================CONTROL REMOTO SONY + +PulseInOut irda(PTD4); //puerto para sensor infrarrojo +Serial pc(USBTX, USBRX); //Para Termite +DigitalOut led(LED1); DigitalOut led2(LED2); // Leds +TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // LCD +AnalogIn y(PTB3); //entrada analoga +AnalogOut u(PTE30); //salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer + //si se ignora se daña la FRDMKL25Z +int header =0; //tiempo de Bit de Inicio (4T) +int head_H = 2900; //20% tiempo de Bit de Inicio +int head_L= 1900; +int T_alto=1200; //Tiempo maximo de un bit 1 +int T_bajo=600; //Tiempo maximo de un bit 0 +int num_bits = 12; //Número de bits +int times[12]; //almacenador de tiempos de bits + +int dato=0; //Tiempo del Bit actual +int bin[12]; //Cadena de Bits +//int Serie[20]; //Serie 2^n +int numero=0; //Numero Decimal del botón +int boton=0; //boton que se undió + +int Sp=0, Kp=0, Ki=0, Kd=0, pos=1 , i=0 , j=0 , k=0, valPar=0 ; //Variables +float pid,ai,ad,ap,med,err,err_v; +//const int base[]={1,10,100}; +int C1=0x0F; int C4=0x0C; // cursor y cursor bajo int binM[20]; -int bin_max[20]; +//=============================================================================== Prototipo de Funciones +void PID (int Sp, int Kp, int Ki, int Kd); +void LCD1 (int col, int fil, int val ) ; +void LCD2 (int col, int fil, float val ) ; -int main(){ -while(1){ -ini1: fflush( stdin ); - header=0; - led2=1; - led=1; + +//================================================================================ Main - Configuración de Parámetros + int main(){ + lcd.locate(0,1); lcd.printf("**PID Control**"); + wait(2); lcd.cls(); lcd.writeCommand(C1); + + lcd.locate(0,0); lcd.printf("Sp=%d",Sp); + lcd.locate(8,0); lcd.printf("Kp=%d",Kp); + lcd.locate(0,1); lcd.printf("Ki=%d",Ki); + lcd.locate(8,1); lcd.printf("Kd=%d",Kd); + + while(1){ + ini1: fflush( stdin ); + header=0; + led2=0; led=1; header = irda.read_low_us(); //funcion para leer un pulso de caida o bajo en header if (header > head_L && header < head_H) goto seguir;//verificar que este en la tolerancia +-20% else goto ini1; @@ -40,48 +64,155 @@ led2=1; for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos dato = irda.read_low_us(); //leer un bit de datos que es pulso arriba en este control - num[i]=dato; - wait_us(400); - } + times[i]=dato; + wait_us(400); } + wait(0.5); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla - //pc.printf(",%d",header); - for(i=0;i<(num_bits-1);++i){ - //pc.printf(",%d",num[i]); - } - wait(0.1); //espero e imprimo en binario - //pc.printf("\n\n"); + + pc.printf("heder= ,%d\n",header); + + for(i=0;i<(num_bits-1);++i){pc.printf("%d,",times[i]); } + + wait(0.1); pc.printf("\n"); + for(i=0;i<(num_bits-1);++i){ - if(num[i] > ((T_alto+T_bajo)/2)){ - bin_max[i]=1; - } - else{ - bin_max[i]=0; - } - } - binM[0]=1; - for(i=1;i<(num_bits-1);++i){ - binM[i]=binM[i-1]*2; + if(times[i] > ((T_alto+T_bajo)/2)){ bin[i]=1; } + else{ bin[i]=0; } - } + pc.printf("%d ",bin[i]); } + + pc.printf("\n"); + + + binM[0]=1; + for(i=1;i<(num_bits-1);++i){ binM[i]=binM[i-1]*2; } + numero=0; - for(i=0;i<(num_bits-1);++i){ + for(i=0;i<(num_bits-1);++i){ numero=numero+(binM[i]*bin[i]);} + + + pc.printf("numero=%d\n",numero); - numero=numero+(binM[i]*bin_max[i]); - - } - pc.printf("numero=%d",numero); - if (numero==466221){ - led2=0; - wait(4); - led2=1; - goto ini1; - } - if (numero==466231){ - led=0; - wait(4); - led=1; - goto ini1; - } - } - } \ No newline at end of file + if (numero==128){ boton=1 ;} else if (numero==129){ boton=2 ;} //boton 1 a 0 normales +else if (numero==130){ boton=3 ;} else if (numero==131){ boton=4 ;} //boton 11 subir, chan+ +else if (numero==132){ boton=5 ;} else if (numero==133){ boton=6 ;} //boton 12 bajar, chan- +else if (numero==134){ boton=7 ;} else if (numero==135){ boton=8 ;} //boton 13 derecha, vol+ +else if (numero==136){ boton=9 ;} else if (numero==137){ boton=0 ;} //boton 14 derecha, vol+ +else if (numero==144){ boton=11;} else if (numero==145){ boton=12;} //boton 15 ir a PID, MUTE +else if (numero==146){ boton=13;} else if (numero==147){ boton=14;} +else if (numero==148){ boton=15;} else { boton=16;} + + //pc.printf("boton= %d\n",boton); + wait(0.2); + //=================================================================USAR FLECHAS + + switch (boton) { //Toca bajar al Parámetro //Llegó chan- + case 11: + if (pos==1) { + if (Sp!=999){ Sp++; LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);}} + if (pos==2) { + if (Kp!=999){ Kp++; LCD1(11,0,Kp);pc.printf("Kp=%d",Kp);}} + if (pos==3) { + if (Ki!=999){ Ki++; LCD1(3,1,Ki) ;pc.printf("Ki=%d",Ki);}} + if (pos==4 ){ + if (Kd!=999){ Kd++; LCD1(3,11,Kd);pc.printf("Kd=%d",Kd);}} + break; + + case 12: //Toca bajar al Parámetro //Llegó chan- + + if( pos==1 ){ + if (Sp!=0) { Sp--; LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);}} + if (pos==2) { + if (Kp!=0) { Kp--; LCD1(11,0,Kp); pc.printf("Kp=%d",Kp);}} + if (pos==3) { + if (Ki!=0) { Ki--; LCD1(3,1,Ki) ; pc.printf("Ki=%d",Ki);}} + if (pos==4) { + if (Kd!=0) { Kd--; LCD1(3,11,Kd); pc.printf("Kd=%d",Kd);}} + break; + + case 13: //Mover hacia derecha, llegó vol+ + j=0; valPar=0; + if(pos==4){ pos=1; LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);} + else if(pos==1){ pos++; LCD1(11,0,Kp) ;pc.printf("Kp=%d",Kp); } + else if(pos==2){ pos++; LCD1(3,1,Ki) ;pc.printf("Ki=%d",Ki); } + else if(pos==3){ pos++; LCD1(11,1,Kd) ; pc.printf("Kd=%d",Kd); } + break; + + case 14: //Mover hacia derecha, llegó vol- + j=0; valPar=0; + if(pos==1){ pos=4; LCD1(11,1,Kd) ; pc.printf("Sp=%d",Sp);} + else if(pos==4){ pos--; LCD1(3,1, Ki) ; pc.printf("Kp=%d",Kp);} + else if(pos==3){ pos--; LCD1(11,0,Kp) ; pc.printf("Ki=%d",Ki);} + else if(pos==2){ pos--; LCD1(3,0, Sp) ; pc.printf("Kd=%d",Kd);} + break; + + case 15: //ir al PID, llegó Mute + PID(Sp,Kp,Ki,Kd) ; break; + default: {}; } // cierra Switch + + +//=======================================================================Botones + if ((boton==0)||(boton==1)||(boton==2)||(boton==3)||(boton==4)||(boton==5)||(boton==6)||(boton==7)||(boton==8)||(boton==9)){ + if(j<3){ + valPar = 10*valPar + boton; + j++; + + if(pos==1){ Sp=valPar; LCD1(3,0, Sp) ; } + else if(pos==2){ Kp=valPar; LCD1(11,0,Kp) ; } + else if(pos==3){ Ki=valPar; LCD1(3,1, Ki) ; } + else if(pos==4){ Kd=valPar; LCD1(11,1, Kd) ; } + }} + + } // cierra while +} // cierran Main + + +//=================================================================================CICLO PID INFINITO +void PID (int Sp, int Kp, int Ki, int Kd) { + //======================================= Parches del control + lcd.writeCommand(C4); //quita cursor bajo + lcd.cls(); lcd.printf(" GUARDADOS!") ; wait(1); //borra la pantalla + lcd.cls(); lcd.printf(" INICIA EL PID"); wait(1); + lcd.cls(); + + lcd.printf("Er=%3.0f",err); + lcd.locate(8,0); lcd.printf("Me=%3.0f",med); + lcd.locate(0,1); lcd.printf("Sp=%3.0f",Sp); + lcd.locate(8,1); lcd.printf("Co=%3.0f",pid); + wait(1); + +while(1){ //=============================================================== CICLO PRINCIPAL CONTROLADOR PID + med = y.read()*999 ; + err = Sp-med ; //se calcula el error + ap = Kp*err*0.01f ; //se calcula la accion proporcinal + ai = (Ki*err*0.01f)+ai ; //calculo de la integral del error + ad = Kd*(err-err_v)*0.01f ; //calculo de la accion derivativa + pid = ap+ai+ad ; + + if(pid<=0) {pid=0 ;} // se verifica que pid sea positivo + if(pid > 999){pid=999;} // se verifica que pid sea menor a 1000 + + LCD2(3,0,err) ; // pc.putc(sprintf (mm,"ER%3.0f",err)); wait_ms(30); + LCD2(11,0,med); // pc.putc(sprintf(mm,"ME%3.0f",med)); wait_ms(30); + LCD2(3,1,Sp) ; + LCD2(11,1,med); // pc.putc(sprintf(mm,"ID%3.0f",pid)); wait_ms(30); + + err_v = err; // guarda error + u.write(pid/999); // se envia el valor pid (normalizado) a puerto analogico de salida (D/A) + + /* pc.printf("%3.0f\t",ER); pc.printf("%3.0f\t",ME); + pc.printf("%3.0f\t",SP); pc.printf("%3.0f\n",ID);*/ + wait_ms(300); + + } // cierra while + } // funtion + +//==============================================================================Funciones Mostrar en LCD +void LCD1 (int col, int fil, int val ){ + lcd.locate(col,fil); lcd.printf(" "); + lcd.locate(col,fil); lcd.printf("%d", val); } + +void LCD2 (int col, int fil, float val ){ + lcd.locate(col,fil); lcd.printf(" "); + lcd.locate(col,fil); lcd.printf("%3.0f", val); } \ No newline at end of file