teclado+pid

Dependencies:   tarea6 keypad mbed

Committer:
salvarear
Date:
Thu Dec 12 20:26:17 2013 +0000
Revision:
0:bb0e37506ff0
teclado

Who changed what in which revision?

UserRevisionLine numberNew contents of line
salvarear 0:bb0e37506ff0 1 #include "mbed.h"
salvarear 0:bb0e37506ff0 2 #include "keypad.h"
salvarear 0:bb0e37506ff0 3 #include "TextLCD.h"
salvarear 0:bb0e37506ff0 4 #include "stdlib.h"
salvarear 0:bb0e37506ff0 5
salvarear 0:bb0e37506ff0 6 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
salvarear 0:bb0e37506ff0 7 AnalogIn y(PTB0);
salvarear 0:bb0e37506ff0 8 AnalogOut u(PTE30);
salvarear 0:bb0e37506ff0 9 int C1=0x0F; // Cursor
salvarear 0:bb0e37506ff0 10 int C4=0x0C; // quito cursor bajo
salvarear 0:bb0e37506ff0 11 int spnro=0,kinro=0,kpnro=0,kdnro=0,posicion=1,tecla,flag1=1,numero=0;
salvarear 0:bb0e37506ff0 12 float pid, err, ap, ai, yr,ad, err_v, spf,kif,kpf,kdf,medida,pidn;
salvarear 0:bb0e37506ff0 13 int flagt=0,com=0;
salvarear 0:bb0e37506ff0 14 Timer t;
salvarear 0:bb0e37506ff0 15 char cadena[3]={' ',' ',' '};
salvarear 0:bb0e37506ff0 16 //int compl=0; //verificar que la entrada es de 3 numeros
salvarear 0:bb0e37506ff0 17
salvarear 0:bb0e37506ff0 18 char Keytable[] = { '1', '2', '3', 'A',
salvarear 0:bb0e37506ff0 19 '4', '5', '6', 'B',
salvarear 0:bb0e37506ff0 20 '7', '8', '9', 'C',
salvarear 0:bb0e37506ff0 21 '*', '0', '#', 'D'
salvarear 0:bb0e37506ff0 22 };
salvarear 0:bb0e37506ff0 23
salvarear 0:bb0e37506ff0 24 uint32_t cbAfterInput(uint32_t index) {
salvarear 0:bb0e37506ff0 25 tecla=index;
salvarear 0:bb0e37506ff0 26 flag1=0;
salvarear 0:bb0e37506ff0 27 return 0;
salvarear 0:bb0e37506ff0 28 }
salvarear 0:bb0e37506ff0 29
salvarear 0:bb0e37506ff0 30
salvarear 0:bb0e37506ff0 31 int main() {
salvarear 0:bb0e37506ff0 32 Keypad keypad(PTA2, PTD4, PTD3, PTD7,PTA13, PTD5, PTD0, PTD2);
salvarear 0:bb0e37506ff0 33 ini1:
salvarear 0:bb0e37506ff0 34 err=0; medida=0; yr=0; pid=0; ap=0; ai=0; ad=0; err_v=0;pidn=0;
salvarear 0:bb0e37506ff0 35 lcd.cls(); // Borrar Pantalla
salvarear 0:bb0e37506ff0 36 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
salvarear 0:bb0e37506ff0 37
salvarear 0:bb0e37506ff0 38 lcd.locate(7,0);
salvarear 0:bb0e37506ff0 39 lcd.printf("Kp=%d",kpnro);
salvarear 0:bb0e37506ff0 40 lcd.locate(0,1);
salvarear 0:bb0e37506ff0 41 lcd.printf("Ki=%d",kinro);
salvarear 0:bb0e37506ff0 42 lcd.locate(8,1);
salvarear 0:bb0e37506ff0 43 lcd.printf("Kd=%d",kdnro);
salvarear 0:bb0e37506ff0 44 lcd.locate(0,0);
salvarear 0:bb0e37506ff0 45 lcd.printf("Sp=%d",spnro);
salvarear 0:bb0e37506ff0 46
salvarear 0:bb0e37506ff0 47 ini2:
salvarear 0:bb0e37506ff0 48 keypad.CallAfterInput(&cbAfterInput);
salvarear 0:bb0e37506ff0 49 keypad.Start();
salvarear 0:bb0e37506ff0 50 if(flag1==0){
salvarear 0:bb0e37506ff0 51 if(Keytable[tecla]=='B'){ //incrementa
salvarear 0:bb0e37506ff0 52 cadena[0]=' ';cadena[1]=' ';cadena[2]=' ';
salvarear 0:bb0e37506ff0 53 com=0;
salvarear 0:bb0e37506ff0 54 numero=0;
salvarear 0:bb0e37506ff0 55 if(posicion==4){
salvarear 0:bb0e37506ff0 56 posicion=1;}
salvarear 0:bb0e37506ff0 57 else {
salvarear 0:bb0e37506ff0 58 posicion++;}
salvarear 0:bb0e37506ff0 59 }
salvarear 0:bb0e37506ff0 60 else if(Keytable[tecla]=='A'){ //decrementa
salvarear 0:bb0e37506ff0 61 com--;
salvarear 0:bb0e37506ff0 62 cadena[com]=' ';
salvarear 0:bb0e37506ff0 63 numero=strtod(cadena,NULL);
salvarear 0:bb0e37506ff0 64 }
salvarear 0:bb0e37506ff0 65 else if((tecla==0)||(tecla==1)||(tecla==2)||(tecla==4)||(tecla==5)||(tecla==6)||(tecla==8)||(tecla==9)||(tecla==10)||(tecla==13)){
salvarear 0:bb0e37506ff0 66 if(com<3){
salvarear 0:bb0e37506ff0 67 cadena[com]=Keytable[tecla];
salvarear 0:bb0e37506ff0 68 numero=strtod(cadena,NULL);
salvarear 0:bb0e37506ff0 69 com++;}
salvarear 0:bb0e37506ff0 70 }
salvarear 0:bb0e37506ff0 71 else if(Keytable[tecla]=='D'){ //ingresa datos para calcular
salvarear 0:bb0e37506ff0 72 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
salvarear 0:bb0e37506ff0 73 lcd.cls(); //borra la pantalla
salvarear 0:bb0e37506ff0 74 lcd.printf(" Datos Guardados!");
salvarear 0:bb0e37506ff0 75 wait(1);
salvarear 0:bb0e37506ff0 76 lcd.cls();
salvarear 0:bb0e37506ff0 77 lcd.printf(" INICIANDO PID");
salvarear 0:bb0e37506ff0 78 wait(1);
salvarear 0:bb0e37506ff0 79
salvarear 0:bb0e37506ff0 80 lcd.cls();
salvarear 0:bb0e37506ff0 81 lcd.printf("Er=%d",err);
salvarear 0:bb0e37506ff0 82 lcd.locate(8,0);
salvarear 0:bb0e37506ff0 83 lcd.printf("Me=%d",medida);
salvarear 0:bb0e37506ff0 84 lcd.locate(0,1);
salvarear 0:bb0e37506ff0 85 lcd.printf("Sp=%d",spnro);
salvarear 0:bb0e37506ff0 86 lcd.locate(8,1);
salvarear 0:bb0e37506ff0 87 lcd.printf("Co=%d",pid);
salvarear 0:bb0e37506ff0 88 wait(2);
salvarear 0:bb0e37506ff0 89 cicloPID:
salvarear 0:bb0e37506ff0 90 if(Keytable[tecla]=='C'){
salvarear 0:bb0e37506ff0 91 spnro=0;kinro=0;kpnro=0;kdnro=0;com=0;posicion=1;flag1=1;
salvarear 0:bb0e37506ff0 92 cadena[0]=' ';cadena[1]=' ';cadena[2]=' ';
salvarear 0:bb0e37506ff0 93 goto ini1;}
salvarear 0:bb0e37506ff0 94 medida=999*y.read(); //le er puerto analogo y asignar a medida
salvarear 0:bb0e37506ff0 95 err = (spnro-medida); //calcula el error en la medida
salvarear 0:bb0e37506ff0 96 ap = kpnro*err; //s e calcula del proporcinal
salvarear 0:bb0e37506ff0 97 if(ai<100){ // se verifica que integral para que no sea muy grande
salvarear 0:bb0e37506ff0 98 ai =(kinro*err)+ai;} //calculo del integral con su error
salvarear 0:bb0e37506ff0 99 ad = kdnro*(err-err_v); //calculo de la accion derivativa
salvarear 0:bb0e37506ff0 100 pid = (ap+ai+ad); //calcula el valor del pid
salvarear 0:bb0e37506ff0 101 if(pid<=0){ // se verifica que pid sea mayor a cero(no se permiten valores-
salvarear 0:bb0e37506ff0 102 pid=0;}
salvarear 0:bb0e37506ff0 103 if (pid > 999){ // se verifica que pid sea menor o igual la valor maximo
salvarear 0:bb0e37506ff0 104 pid=999;}
salvarear 0:bb0e37506ff0 105 err_v = err; // actualiza las variables de los errores
salvarear 0:bb0e37506ff0 106 if(flagt==0){ // impreme las variables
salvarear 0:bb0e37506ff0 107 t.start(); //inicia
salvarear 0:bb0e37506ff0 108 flagt=1;}
salvarear 0:bb0e37506ff0 109 if(t>=0.2){
salvarear 0:bb0e37506ff0 110 lcd.locate(3,0);lcd.printf(" ");
salvarear 0:bb0e37506ff0 111 lcd.locate(3,0);lcd.printf("%d",err);
salvarear 0:bb0e37506ff0 112 lcd.locate(11,0);lcd.printf(" ");
salvarear 0:bb0e37506ff0 113 lcd.locate(11,0);lcd.printf("%d",medida);
salvarear 0:bb0e37506ff0 114 lcd.locate(3,1);lcd.printf(" ");
salvarear 0:bb0e37506ff0 115 lcd.locate(3,1);lcd.printf("%d",spnro);
salvarear 0:bb0e37506ff0 116 lcd.locate(11,1);lcd.printf(" ");
salvarear 0:bb0e37506ff0 117 lcd.locate(11,1);lcd.printf("%d",pid);
salvarear 0:bb0e37506ff0 118 flagt=0;
salvarear 0:bb0e37506ff0 119 t.reset();
salvarear 0:bb0e37506ff0 120 }
salvarear 0:bb0e37506ff0 121
salvarear 0:bb0e37506ff0 122
salvarear 0:bb0e37506ff0 123 pidn=pid/999; //Normalizacion de la salida
salvarear 0:bb0e37506ff0 124 u.write(pidn); //se envia el valor pid a puerto analogico de salida (D/A)
salvarear 0:bb0e37506ff0 125 wait(0.01);
salvarear 0:bb0e37506ff0 126 goto cicloPID;
salvarear 0:bb0e37506ff0 127 }
salvarear 0:bb0e37506ff0 128 if(posicion==1){
salvarear 0:bb0e37506ff0 129 spnro=numero;
salvarear 0:bb0e37506ff0 130 lcd.locate(3,0);lcd.printf(" ");
salvarear 0:bb0e37506ff0 131 lcd.locate(3,0);lcd.printf("%d",spnro);
salvarear 0:bb0e37506ff0 132 }
salvarear 0:bb0e37506ff0 133 else if(posicion==2){
salvarear 0:bb0e37506ff0 134 kpnro=numero;
salvarear 0:bb0e37506ff0 135 lcd.locate(11,0);lcd.printf(" ");
salvarear 0:bb0e37506ff0 136 lcd.locate(11,0);lcd.printf("%d",kpnro);
salvarear 0:bb0e37506ff0 137 }
salvarear 0:bb0e37506ff0 138 else if(posicion==3){
salvarear 0:bb0e37506ff0 139 kinro=numero;
salvarear 0:bb0e37506ff0 140 lcd.locate(3,1);lcd.printf(" ");
salvarear 0:bb0e37506ff0 141 lcd.locate(3,1);lcd.printf("%d",kinro);
salvarear 0:bb0e37506ff0 142 }
salvarear 0:bb0e37506ff0 143 else if(posicion==4){
salvarear 0:bb0e37506ff0 144 kdnro=numero;
salvarear 0:bb0e37506ff0 145 lcd.locate(11,1);lcd.printf(" ");
salvarear 0:bb0e37506ff0 146 lcd.locate(11,1);lcd.printf("%d",kdnro);
salvarear 0:bb0e37506ff0 147 }
salvarear 0:bb0e37506ff0 148 }
salvarear 0:bb0e37506ff0 149 flag1=1;
salvarear 0:bb0e37506ff0 150 goto ini2;
salvarear 0:bb0e37506ff0 151 }