JOSE RUIZ ORTEGA, SEBASTIAN PELAEZ LENTEJA // Programa que imprime en la pantalla LCD los valores digitados en el teclado, ademas genera un sonido al presionar cada tecla.

Dependencies:   FPointer TextLCD keypad mbed

Committer:
jaruiz
Date:
Thu Apr 03 03:46:11 2014 +0000
Revision:
2:4c3de5a37f24
Parent:
1:c1571c87c8ee
procesadorestarea2;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lcorralesc1 0:54e8dab91b77 1 //Programa para hacer control PID simple, ingresa parámetros con teclado 4x4. Imprime resultados en LCD 16x2
lcorralesc1 0:54e8dab91b77 2
lcorralesc1 0:54e8dab91b77 3 #include "mbed.h"
lcorralesc1 0:54e8dab91b77 4 #include "TextLCD.h"
lcorralesc1 0:54e8dab91b77 5 #include"keypad.h" //Librería del teclado 4x4
lcorralesc1 0:54e8dab91b77 6 #include"FPointer.h" //Librería complementaria para libreria keypad
lcorralesc1 0:54e8dab91b77 7
lcorralesc1 0:54e8dab91b77 8 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
jaruiz 2:4c3de5a37f24 9 Keypad keypad(PTA2,PTD4,PTD3,PTD7,PTA13,PTD5,PTD0,PTD2); //Entradas del teclado (4r,3r,2r,1r,8,7,6,5)
lcorralesc1 0:54e8dab91b77 10
lcorralesc1 0:54e8dab91b77 11 AnalogIn Vin(PTB0); //Voltaje de alimentación
lcorralesc1 0:54e8dab91b77 12 AnalogOut Vout(PTE30); //Marcar la salida analógica
lcorralesc1 0:54e8dab91b77 13
lcorralesc1 0:54e8dab91b77 14 //ASIGNACION DE VARIABLES
lcorralesc1 0:54e8dab91b77 15 Timer t;
lcorralesc1 0:54e8dab91b77 16 int cero;
lcorralesc1 0:54e8dab91b77 17 int flag;
lcorralesc1 0:54e8dab91b77 18 int q;
lcorralesc1 0:54e8dab91b77 19 int k;
lcorralesc1 0:54e8dab91b77 20 int C1=0x0E; //configurar el lcd para mostrar el guin bajo
lcorralesc1 0:54e8dab91b77 21 int C2=0x0C; //configurar el lcd para QUITAR el guion bajo
lcorralesc1 0:54e8dab91b77 22 float sp=0; //set point
lcorralesc1 0:54e8dab91b77 23 float kp=0; //ganancia proporcional
lcorralesc1 0:54e8dab91b77 24 float ki=0; //ganancia integral
lcorralesc1 0:54e8dab91b77 25 float kd=0; //ganancia derivativa
lcorralesc1 0:54e8dab91b77 26 int ind=0; //vector de caracteres.
lcorralesc1 0:54e8dab91b77 27 float err, med, yr, ap, ai, ad, err_v, cycle; //Variable de control PID
lcorralesc1 0:54e8dab91b77 28 float pid;
lcorralesc1 0:54e8dab91b77 29
lcorralesc1 0:54e8dab91b77 30 //MATRIZ DEL TECLADO
lcorralesc1 0:54e8dab91b77 31 float Keytable[] = {1,2,3,11,
lcorralesc1 0:54e8dab91b77 32 4,5,6,12,
lcorralesc1 0:54e8dab91b77 33 7,8,9,13,
lcorralesc1 0:54e8dab91b77 34 0,0,0,0};
lcorralesc1 0:54e8dab91b77 35
lcorralesc1 0:54e8dab91b77 36 //Se crea una función que incremente los valores
lcorralesc1 0:54e8dab91b77 37 void increment(int j){
lcorralesc1 0:54e8dab91b77 38 if(j==0){
lcorralesc1 0:54e8dab91b77 39 if (q!=1 && sp<10){
lcorralesc1 0:54e8dab91b77 40 sp=ind;
lcorralesc1 0:54e8dab91b77 41 q=1;
lcorralesc1 0:54e8dab91b77 42 }
jaruiz 1:c1571c87c8ee 43 else {
jaruiz 1:c1571c87c8ee 44 sp=10*sp+ind;
jaruiz 1:c1571c87c8ee 45 }
lcorralesc1 0:54e8dab91b77 46 if(sp>999)sp=999;
jaruiz 1:c1571c87c8ee 47
jaruiz 1:c1571c87c8ee 48
lcorralesc1 0:54e8dab91b77 49 lcd.locate(3,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 50 lcd.locate(3,0); lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 51
jaruiz 1:c1571c87c8ee 52 Vout=2.5;
jaruiz 2:4c3de5a37f24 53 wait(0.1);
jaruiz 1:c1571c87c8ee 54 Vout=0;
jaruiz 1:c1571c87c8ee 55 }
lcorralesc1 0:54e8dab91b77 56 else if(j==1){
lcorralesc1 0:54e8dab91b77 57 if (q!=1 && kp<10){
lcorralesc1 0:54e8dab91b77 58 kp=ind;
lcorralesc1 0:54e8dab91b77 59 q=1;
lcorralesc1 0:54e8dab91b77 60 }
lcorralesc1 0:54e8dab91b77 61 else{
lcorralesc1 0:54e8dab91b77 62 kp=10*kp+ind;
lcorralesc1 0:54e8dab91b77 63 }
lcorralesc1 0:54e8dab91b77 64 if(kp>999)kp=999;
lcorralesc1 0:54e8dab91b77 65 lcd.locate(11,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 66 lcd.locate(11,0); lcd.printf("%.0f",kp);
jaruiz 2:4c3de5a37f24 67 Vout=2.5;
jaruiz 2:4c3de5a37f24 68 wait(0.1);
jaruiz 2:4c3de5a37f24 69 Vout=0;
lcorralesc1 0:54e8dab91b77 70 }
lcorralesc1 0:54e8dab91b77 71 else if(j==2){
lcorralesc1 0:54e8dab91b77 72 if (q!=1 && ki<10){
lcorralesc1 0:54e8dab91b77 73 ki=ind;
lcorralesc1 0:54e8dab91b77 74 q=1;
lcorralesc1 0:54e8dab91b77 75 }
lcorralesc1 0:54e8dab91b77 76 else{
lcorralesc1 0:54e8dab91b77 77 ki=10*ki+ind;
lcorralesc1 0:54e8dab91b77 78 }
lcorralesc1 0:54e8dab91b77 79 if(ki>999)ki=999;
lcorralesc1 0:54e8dab91b77 80 lcd.locate(3,1); lcd.printf(" ");
jaruiz 2:4c3de5a37f24 81 lcd.locate(3,1); lcd.printf("%.0f",ki);
jaruiz 2:4c3de5a37f24 82 Vout=2.5;
jaruiz 2:4c3de5a37f24 83 wait(0.1);
jaruiz 2:4c3de5a37f24 84 Vout=0;
lcorralesc1 0:54e8dab91b77 85 }
lcorralesc1 0:54e8dab91b77 86 else{
lcorralesc1 0:54e8dab91b77 87 if (q!=1 && kd<10){
lcorralesc1 0:54e8dab91b77 88 kd=ind;
lcorralesc1 0:54e8dab91b77 89 q=1;
lcorralesc1 0:54e8dab91b77 90 }
lcorralesc1 0:54e8dab91b77 91 else{
lcorralesc1 0:54e8dab91b77 92 kd=10*kd+ind;
lcorralesc1 0:54e8dab91b77 93 }
lcorralesc1 0:54e8dab91b77 94 if(kd>999)kd=999;
lcorralesc1 0:54e8dab91b77 95 lcd.locate(11,1); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 96 lcd.locate(11,1); lcd.printf("%.0f",kd);
lcorralesc1 0:54e8dab91b77 97 }
lcorralesc1 0:54e8dab91b77 98 ind=0; cero=0;
jaruiz 2:4c3de5a37f24 99 Vout=2.5;
jaruiz 2:4c3de5a37f24 100 wait(0.1);
jaruiz 2:4c3de5a37f24 101 Vout=0;
lcorralesc1 0:54e8dab91b77 102 }
lcorralesc1 0:54e8dab91b77 103
lcorralesc1 0:54e8dab91b77 104 uint32_t cbAfterInput(uint32_t index) {
lcorralesc1 0:54e8dab91b77 105 ind=Keytable[index];
lcorralesc1 0:54e8dab91b77 106 cero=index;
lcorralesc1 0:54e8dab91b77 107 return 0;
lcorralesc1 0:54e8dab91b77 108 }
lcorralesc1 0:54e8dab91b77 109
lcorralesc1 0:54e8dab91b77 110 void def_posicion(int j){
lcorralesc1 0:54e8dab91b77 111 if (j==0){
lcorralesc1 0:54e8dab91b77 112 lcd.locate(3,0); lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 113 lcd.locate(3,0);
lcorralesc1 0:54e8dab91b77 114 }
lcorralesc1 0:54e8dab91b77 115 else if(j==1){
lcorralesc1 0:54e8dab91b77 116 lcd.locate(11,0); lcd.printf("%.0f",kp);
lcorralesc1 0:54e8dab91b77 117 lcd.locate(11,0);
lcorralesc1 0:54e8dab91b77 118 }
lcorralesc1 0:54e8dab91b77 119 else if (j==2){
lcorralesc1 0:54e8dab91b77 120 lcd.locate(3,1); lcd.printf("%.0f",ki);
lcorralesc1 0:54e8dab91b77 121 lcd.locate(3,1);
lcorralesc1 0:54e8dab91b77 122 }
lcorralesc1 0:54e8dab91b77 123 else {
lcorralesc1 0:54e8dab91b77 124 lcd.locate(11,1); lcd.printf("%.0f",kd);
lcorralesc1 0:54e8dab91b77 125 lcd.locate(11,1);
lcorralesc1 0:54e8dab91b77 126 }
lcorralesc1 0:54e8dab91b77 127 }
lcorralesc1 0:54e8dab91b77 128
lcorralesc1 0:54e8dab91b77 129 //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.
lcorralesc1 0:54e8dab91b77 130 void star_patch1(void){
lcorralesc1 0:54e8dab91b77 131 lcd.cls();
lcorralesc1 0:54e8dab91b77 132 lcd.locate(8,0);
lcorralesc1 0:54e8dab91b77 133 lcd.printf("Kp=%.0f",kp);
lcorralesc1 0:54e8dab91b77 134 lcd.locate(0,1);
lcorralesc1 0:54e8dab91b77 135 lcd.printf("Ki=%.0f",ki);
lcorralesc1 0:54e8dab91b77 136 lcd.locate(8,1);
lcorralesc1 0:54e8dab91b77 137 lcd.printf("Kd=%.0f",kd);
lcorralesc1 0:54e8dab91b77 138 lcd.writeCommand(C1); //cursor se vea y sea intermitente
lcorralesc1 0:54e8dab91b77 139 lcd.locate(0,0);
lcorralesc1 0:54e8dab91b77 140 lcd.printf("Sp=%.0f",sp);
lcorralesc1 0:54e8dab91b77 141 }
lcorralesc1 0:54e8dab91b77 142
lcorralesc1 0:54e8dab91b77 143 void star_patch2(void){ // uso nuevamente función que imprime los caracteres que no van a variar en el display
lcorralesc1 0:54e8dab91b77 144 lcd.writeCommand(C2);
lcorralesc1 0:54e8dab91b77 145 lcd.cls();
lcorralesc1 0:54e8dab91b77 146 lcd.printf("Iniciamos el PID |m|");
lcorralesc1 0:54e8dab91b77 147 wait(2);
lcorralesc1 0:54e8dab91b77 148 lcd.cls();
lcorralesc1 0:54e8dab91b77 149 lcd.printf("Er%=f",err);
lcorralesc1 0:54e8dab91b77 150 lcd.locate(8,0); lcd.printf("Me=%.0f",med);
lcorralesc1 0:54e8dab91b77 151 lcd.locate(0,1); lcd.printf("Sp=%.0f",sp);
lcorralesc1 0:54e8dab91b77 152 lcd.locate(8,1); lcd.printf("Co=%.0f",pid);
lcorralesc1 0:54e8dab91b77 153 wait(3);
lcorralesc1 0:54e8dab91b77 154 }
lcorralesc1 0:54e8dab91b77 155
lcorralesc1 0:54e8dab91b77 156 int main(){
lcorralesc1 0:54e8dab91b77 157 ini:
lcorralesc1 0:54e8dab91b77 158 ind=0;
lcorralesc1 0:54e8dab91b77 159 star_patch1();
lcorralesc1 0:54e8dab91b77 160 keypad.CallAfterInput(&cbAfterInput);
lcorralesc1 0:54e8dab91b77 161 keypad.Start();
lcorralesc1 0:54e8dab91b77 162 ini1:
lcorralesc1 0:54e8dab91b77 163 if(ind==12){
lcorralesc1 0:54e8dab91b77 164 if (k<3) k++;
lcorralesc1 0:54e8dab91b77 165 else k=0;
lcorralesc1 0:54e8dab91b77 166 def_posicion(k);
lcorralesc1 0:54e8dab91b77 167 ind=0;
lcorralesc1 0:54e8dab91b77 168 q=0;
jaruiz 1:c1571c87c8ee 169 Vout=2.5;
jaruiz 1:c1571c87c8ee 170 wait(0.1);
jaruiz 1:c1571c87c8ee 171 Vout=0;
jaruiz 1:c1571c87c8ee 172 wait(0.05);
jaruiz 1:c1571c87c8ee 173 Vout=2.5;
jaruiz 1:c1571c87c8ee 174 wait(0.1);
jaruiz 1:c1571c87c8ee 175 Vout=0;
lcorralesc1 0:54e8dab91b77 176 }
lcorralesc1 0:54e8dab91b77 177 if(ind==13){
jaruiz 1:c1571c87c8ee 178 Vout=2.5;
jaruiz 1:c1571c87c8ee 179 wait(0.07);
jaruiz 1:c1571c87c8ee 180 Vout=0;
jaruiz 1:c1571c87c8ee 181 wait(0.03);
jaruiz 1:c1571c87c8ee 182 Vout=2.5;
jaruiz 1:c1571c87c8ee 183 wait(0.07);
jaruiz 1:c1571c87c8ee 184 Vout=0;
jaruiz 1:c1571c87c8ee 185 wait(0.03);
jaruiz 1:c1571c87c8ee 186 Vout=2.5;
jaruiz 1:c1571c87c8ee 187 wait(0.07);
jaruiz 1:c1571c87c8ee 188 Vout=0;
lcorralesc1 0:54e8dab91b77 189 ind=0;
lcorralesc1 0:54e8dab91b77 190 goto PID;
jaruiz 1:c1571c87c8ee 191
lcorralesc1 0:54e8dab91b77 192 }
lcorralesc1 0:54e8dab91b77 193 if(ind==11){
jaruiz 1:c1571c87c8ee 194 Vout=2.5;
jaruiz 2:4c3de5a37f24 195 wait(0.01);
jaruiz 1:c1571c87c8ee 196 Vout=0;
jaruiz 2:4c3de5a37f24 197 wait(0.02);
jaruiz 2:4c3de5a37f24 198 Vout=3.3;
jaruiz 2:4c3de5a37f24 199 wait(0.3);
jaruiz 1:c1571c87c8ee 200 Vout=0;
lcorralesc1 0:54e8dab91b77 201 if (k==0){
lcorralesc1 0:54e8dab91b77 202 sp=0;
lcorralesc1 0:54e8dab91b77 203 lcd.locate(3,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 204 lcd.locate(3,0); lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 205 }
lcorralesc1 0:54e8dab91b77 206 else if(k==1){
lcorralesc1 0:54e8dab91b77 207 kp=0;
lcorralesc1 0:54e8dab91b77 208 lcd.locate(11,0); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 209 lcd.locate(11,0); lcd.printf("%.0f",kp);
lcorralesc1 0:54e8dab91b77 210 }
lcorralesc1 0:54e8dab91b77 211 else if (k==2){
lcorralesc1 0:54e8dab91b77 212 ki=0;
lcorralesc1 0:54e8dab91b77 213 lcd.locate(3,1); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 214 lcd.locate(3,1); lcd.printf("%.0f",ki);
lcorralesc1 0:54e8dab91b77 215 }
lcorralesc1 0:54e8dab91b77 216 else {
lcorralesc1 0:54e8dab91b77 217 kd=0;
lcorralesc1 0:54e8dab91b77 218 lcd.locate(11,1); lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 219 lcd.locate(11,1); lcd.printf("%.0f",kd);
lcorralesc1 0:54e8dab91b77 220 }
lcorralesc1 0:54e8dab91b77 221 q=0; ind=0;
lcorralesc1 0:54e8dab91b77 222 }
lcorralesc1 0:54e8dab91b77 223 if (ind!=0 && ind!=12 && ind!=13 && ind!=11 || cero==13 ){
lcorralesc1 0:54e8dab91b77 224 increment(k);
lcorralesc1 0:54e8dab91b77 225 }
lcorralesc1 0:54e8dab91b77 226 goto ini1;
lcorralesc1 0:54e8dab91b77 227
lcorralesc1 0:54e8dab91b77 228 PID:
lcorralesc1 0:54e8dab91b77 229 star_patch2();
lcorralesc1 0:54e8dab91b77 230
lcorralesc1 0:54e8dab91b77 231 while (1){
lcorralesc1 0:54e8dab91b77 232
lcorralesc1 0:54e8dab91b77 233 med=Vin.read()*1000;
lcorralesc1 0:54e8dab91b77 234 err =sp-med;
lcorralesc1 0:54e8dab91b77 235 ap = kp*err;
lcorralesc1 0:54e8dab91b77 236 ai =(ki*0.001*err)+ai; //calculo de la integral del error
lcorralesc1 0:54e8dab91b77 237 // VERIFICAMOS QUE LA ACCION INTEGRAL NO SEA MUY GRANDE!!!
lcorralesc1 0:54e8dab91b77 238 if(ai>0.5){
lcorralesc1 0:54e8dab91b77 239 ai=0.5;
lcorralesc1 0:54e8dab91b77 240 }
lcorralesc1 0:54e8dab91b77 241 ad = kd*(err-err_v); //calculo de la accion derivativa
lcorralesc1 0:54e8dab91b77 242 pid =(ap+ai+ad);
lcorralesc1 0:54e8dab91b77 243
lcorralesc1 0:54e8dab91b77 244 //MOSTRAMOS LAS VARIABLES
lcorralesc1 0:54e8dab91b77 245 if (pid > 999)pid=1000;
lcorralesc1 0:54e8dab91b77 246 if (pid<0)pid=0;
lcorralesc1 0:54e8dab91b77 247
lcorralesc1 0:54e8dab91b77 248
lcorralesc1 0:54e8dab91b77 249 Vout.write(pid/1000);
lcorralesc1 0:54e8dab91b77 250 if(flag==0){
lcorralesc1 0:54e8dab91b77 251 t.start();
lcorralesc1 0:54e8dab91b77 252 flag=1;
lcorralesc1 0:54e8dab91b77 253 }
lcorralesc1 0:54e8dab91b77 254 if (t>0.3){
lcorralesc1 0:54e8dab91b77 255 lcd.locate(3,0);
lcorralesc1 0:54e8dab91b77 256 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 257 lcd.locate(3,0);
lcorralesc1 0:54e8dab91b77 258 lcd.printf("%.0f",err);
lcorralesc1 0:54e8dab91b77 259 lcd.locate(11,0);
lcorralesc1 0:54e8dab91b77 260 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 261 lcd.locate(11,0);
lcorralesc1 0:54e8dab91b77 262 lcd.printf("%.0f",med);
lcorralesc1 0:54e8dab91b77 263 lcd.locate(3,1);
lcorralesc1 0:54e8dab91b77 264 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 265 lcd.locate(3,1);
lcorralesc1 0:54e8dab91b77 266 lcd.printf("%.0f",sp);
lcorralesc1 0:54e8dab91b77 267 lcd.locate(11,1);
lcorralesc1 0:54e8dab91b77 268 lcd.printf(" ");
lcorralesc1 0:54e8dab91b77 269 lcd.locate(11,1);
lcorralesc1 0:54e8dab91b77 270 lcd.printf("%.2f ",pid/1000);
lcorralesc1 0:54e8dab91b77 271 t.reset();
lcorralesc1 0:54e8dab91b77 272 flag=0;
lcorralesc1 0:54e8dab91b77 273 wait(.3);
lcorralesc1 0:54e8dab91b77 274 }
lcorralesc1 0:54e8dab91b77 275
lcorralesc1 0:54e8dab91b77 276 //ACTUALIZACION DE LAS VARIABLES
lcorralesc1 0:54e8dab91b77 277 err_v = err;
lcorralesc1 0:54e8dab91b77 278 if(ind==13)goto ini;
lcorralesc1 0:54e8dab91b77 279 }
lcorralesc1 0:54e8dab91b77 280 }