![](/media/cache/profiles/faaf2eb04638f2f0a77e0d1db2386c2d.jpg.50x50_q85.jpg)
Juan Salvador Payares Ernesto Guevara
Dependencies: DebouncedIn FPointer TextLCD keypad mbed
main.cpp
- Committer:
- payarito32
- Date:
- 2014-04-05
- Revision:
- 0:3111ed8ce85b
File content as of revision 0:3111ed8ce85b:
//Programa para hacer control PID simple, ingresa parámetros con teclado 4x4. Imprime resultados en LCD 16x2 #include "mbed.h" #include "TextLCD.h" #include"keypad.h" //Librería del teclado 4x4 #include"FPointer.h" //Librería complementaria para libreria keypad TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 Keypad keypad(PTA2,PTD4,PTD3,PTD7,PTA13,PTD5,PTD0,PTD2); //Entradas del teclado(4r,3r,2r,1r,8,7,6,5) AnalogIn Vin(PTB0); //Voltaje de alimentación DigitalOut sound(PTC5); //Salida de Audio Digital AnalogOut Vout(PTE30); //Marcar la salida analógica //ASIGNACION DE VARIABLES Timer t; int cero; int flag; int q; int k; int C1=0x0E; //configurar el lcd para mostrar el guin bajo int C2=0x0C; //configurar el lcd para QUITAR el guion bajo float sp=0; //set point float kp=0; //ganancia proporcional float ki=0; //ganancia integral float kd=0; //ganancia derivativa int ind=0; //vector de caracteres. float err, med, yr, ap, ai, ad, err_v, cycle; //Variable de control PID float pid; int i; //MATRIZ DEL TECLADO float Keytable[] = {1,2,3,11, 4,5,6,12, 7,8,9,13, 15,0,16,14}; //Se crea una función que incremente los valores void increment(int j){ if(j==0){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } if (q!=1 && sp<10){ sp=ind; q=1; } else{ sp=10*sp+ind; } if(sp>999)sp=999; lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); lcd.printf("%.0f",sp); } else if(j==1){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } if (q!=1 && kp<10){ kp=ind; q=1; } else{ kp=10*kp+ind; } if(kp>999)kp=999; lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%.0f",kp); } else if(j==2){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } if (q!=1 && ki<10){ ki=ind; q=1; } else{ ki=10*ki+ind; } if(ki>999)ki=999; lcd.locate(3,1); lcd.printf(" "); lcd.locate(3,1); lcd.printf("%.0f",ki); } else{ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } if (q!=1 && kd<10){ kd=ind; q=1; } else{ kd=10*kd+ind; } if(kd>999)kd=999; lcd.locate(11,1); lcd.printf(" "); lcd.locate(11,1); lcd.printf("%.0f",kd); } ind=0; cero=0; } uint32_t cbAfterInput(uint32_t index) { ind=Keytable[index]; cero=index; return 0; } void def_posicion(int j){ if (j==0){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } lcd.locate(3,0); lcd.printf("%.0f",sp); lcd.locate(3,0); } else if(j==1){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } lcd.locate(11,0); lcd.printf("%.0f",kp); lcd.locate(11,0); } else if (j==2){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } lcd.locate(3,1); lcd.printf("%.0f",ki); lcd.locate(3,1); } else { for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } lcd.locate(11,1); lcd.printf("%.0f",kd); lcd.locate(11,1); } } //Dado que hay parámetros que no varía en el display en esta parte del código, se crea una función que los mantenga. void star_patch1(void){ lcd.cls(); lcd.locate(8,0); lcd.printf("Kp=%.0f",kp); lcd.locate(0,1); lcd.printf("Ki=%.0f",ki); lcd.locate(8,1); lcd.printf("Kd=%.0f",kd); lcd.writeCommand(C1); //cursor se vea y sea intermitente lcd.locate(0,0); lcd.printf("Sp=%.0f",sp); } void star_patch2(void){ // uso nuevamente función que imprime los caracteres que no van a variar en el display lcd.writeCommand(C2); lcd.cls(); lcd.printf("Iniciamos el PID |m|"); wait(2); lcd.cls(); lcd.printf("Er%=f",err); lcd.locate(8,0); lcd.printf("Me=%.0f",med); lcd.locate(0,1); lcd.printf("Sp=%.0f",sp); lcd.locate(8,1); lcd.printf("Co=%.0f",pid); wait(3); } int main(){ //ini: ind=0; star_patch1(); keypad.CallAfterInput(&cbAfterInput); keypad.Start(); ini1: if(ind==12){ if (k<3) k++; else k=0; def_posicion(k); ind=0; q=0; } if(ind==13){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } ind=0; //goto PID; } if(ind==14){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } ind=0; } if(ind==15){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } ind=0; } if(ind==16){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } ind=0; } if(ind==11){ for(i=1; i<= 100; ++i){ //ONDA CUADRADA, OSCILACIONES A 10 KHZ.... A VER SI FUNCIONA sound = 0; wait(0.00015); // Medio ciclo de dureza Arriba sound=1; wait(0.0005); // Medio ciclo Abajo } if (k==0){ sp=0; lcd.locate(3,0); lcd.printf(" "); lcd.locate(3,0); lcd.printf("%.0f",sp); } else if(k==1){ kp=0; lcd.locate(11,0); lcd.printf(" "); lcd.locate(11,0); lcd.printf("%.0f",kp); } else if (k==2){ ki=0; lcd.locate(3,1); lcd.printf(" "); lcd.locate(3,1); lcd.printf("%.0f",ki); } else { kd=0; lcd.locate(11,1); lcd.printf(" "); lcd.locate(11,1); lcd.printf("%.0f",kd); } q=0; ind=0; } if (ind!=0 && ind!=12 && ind!=13 && ind!=11 || cero==13 ){ increment(k); } goto ini1; }