![](/media/cache/profiles/faaf2eb04638f2f0a77e0d1db2386c2d.jpg.50x50_q85.jpg)
Juan Salvador Payares Ernesto Guevara
Dependencies: DebouncedIn FPointer TextLCD keypad mbed
Diff: main.cpp
- Revision:
- 0:3111ed8ce85b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Apr 05 02:31:01 2014 +0000 @@ -0,0 +1,284 @@ +//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; + } \ No newline at end of file