pid teclas tarea 3

Dependencies:   Debounced TextLCD mbed

Fork of pid_teclas by Gustavo Ramirez

Committer:
procesadores_FAC
Date:
Fri Apr 10 02:26:50 2015 +0000
Revision:
1:0978505fcc1b
Parent:
0:9aa80672eb3d
pid teclado

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lcorralesc1 0:9aa80672eb3d 1 #include "mbed.h"
lcorralesc1 0:9aa80672eb3d 2 #include "DebouncedIn.h"
lcorralesc1 0:9aa80672eb3d 3 #include "TextLCD.h"
lcorralesc1 0:9aa80672eb3d 4
lcorralesc1 0:9aa80672eb3d 5 AnalogIn Vin(PTC2);
procesadores_FAC 1:0978505fcc1b 6 AnalogOut Vout(PTE30);
lcorralesc1 0:9aa80672eb3d 7 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
lcorralesc1 0:9aa80672eb3d 8
procesadores_FAC 1:0978505fcc1b 9
lcorralesc1 0:9aa80672eb3d 10 DebouncedIn button1(PTC12);
lcorralesc1 0:9aa80672eb3d 11 DebouncedIn button2(PTC13);
lcorralesc1 0:9aa80672eb3d 12 DebouncedIn button3(PTC16);
procesadores_FAC 1:0978505fcc1b 13 DebouncedIn button4(PTC17);
lcorralesc1 0:9aa80672eb3d 14
lcorralesc1 0:9aa80672eb3d 15 int C1=0x0F;
procesadores_FAC 1:0978505fcc1b 16 int C4=0x0C; // quito cursor bajo
lcorralesc1 0:9aa80672eb3d 17 int sp=0,kp=0,kd=0,ki=0,p=1;
procesadores_FAC 1:0978505fcc1b 18 int med,err,pid,ap,ai=0,ai1,ad,err_v;
procesadores_FAC 1:0978505fcc1b 19 int i;
procesadores_FAC 1:0978505fcc1b 20 int fe;
procesadores_FAC 1:0978505fcc1b 21 float pidn;
procesadores_FAC 1:0978505fcc1b 22
procesadores_FAC 1:0978505fcc1b 23
lcorralesc1 0:9aa80672eb3d 24 int main()
lcorralesc1 0:9aa80672eb3d 25 {
lcorralesc1 0:9aa80672eb3d 26 lcd.cls();
lcorralesc1 0:9aa80672eb3d 27 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
lcorralesc1 0:9aa80672eb3d 28 lcd.locate(8,0);
procesadores_FAC 1:0978505fcc1b 29 lcd.printf("Fe=%d", fe);
lcorralesc1 0:9aa80672eb3d 30 lcd.locate(0,1);
procesadores_FAC 1:0978505fcc1b 31 lcd.printf("P=%d", kp);
procesadores_FAC 1:0978505fcc1b 32 lcd.locate(6,1);
procesadores_FAC 1:0978505fcc1b 33 lcd.printf("I=%d", ki);
procesadores_FAC 1:0978505fcc1b 34 lcd.locate(11,1);
procesadores_FAC 1:0978505fcc1b 35 lcd.printf("D=%d", kd);
lcorralesc1 0:9aa80672eb3d 36 lcd.locate(0,0);
lcorralesc1 0:9aa80672eb3d 37 lcd.printf("Sp=%d", sp);
lcorralesc1 0:9aa80672eb3d 38
lcorralesc1 0:9aa80672eb3d 39 while(1)
lcorralesc1 0:9aa80672eb3d 40 {
lcorralesc1 0:9aa80672eb3d 41 if (button1.falling())
lcorralesc1 0:9aa80672eb3d 42 {
procesadores_FAC 1:0978505fcc1b 43
lcorralesc1 0:9aa80672eb3d 44 if (p==1)
lcorralesc1 0:9aa80672eb3d 45 {
lcorralesc1 0:9aa80672eb3d 46 ++sp;
lcorralesc1 0:9aa80672eb3d 47 lcd.locate(3,0);
lcorralesc1 0:9aa80672eb3d 48 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 49 lcd.locate(3,0);
lcorralesc1 0:9aa80672eb3d 50 lcd.printf("%d", sp);
lcorralesc1 0:9aa80672eb3d 51 }
lcorralesc1 0:9aa80672eb3d 52 else if (p==2)
lcorralesc1 0:9aa80672eb3d 53 {
procesadores_FAC 1:0978505fcc1b 54 ++i;
procesadores_FAC 1:0978505fcc1b 55 if (i==1){
procesadores_FAC 1:0978505fcc1b 56 fe =1;}
procesadores_FAC 1:0978505fcc1b 57 if (i==2){
procesadores_FAC 1:0978505fcc1b 58 fe =10;}
procesadores_FAC 1:0978505fcc1b 59 if (i==3){
procesadores_FAC 1:0978505fcc1b 60 fe =100;
procesadores_FAC 1:0978505fcc1b 61 i=0;}
procesadores_FAC 1:0978505fcc1b 62
lcorralesc1 0:9aa80672eb3d 63 lcd.locate(11,0);
lcorralesc1 0:9aa80672eb3d 64 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 65 lcd.locate(12,0);
procesadores_FAC 1:0978505fcc1b 66 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 67 lcd.locate(13,0);
procesadores_FAC 1:0978505fcc1b 68 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 69
procesadores_FAC 1:0978505fcc1b 70
lcorralesc1 0:9aa80672eb3d 71 lcd.locate(11,0);
procesadores_FAC 1:0978505fcc1b 72 lcd.printf("%d", fe);
lcorralesc1 0:9aa80672eb3d 73 }
lcorralesc1 0:9aa80672eb3d 74 else if (p==3)
lcorralesc1 0:9aa80672eb3d 75 {
procesadores_FAC 1:0978505fcc1b 76 ++kp;
procesadores_FAC 1:0978505fcc1b 77 lcd.locate(2,1);
lcorralesc1 0:9aa80672eb3d 78 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 79 lcd.locate(2,1);
procesadores_FAC 1:0978505fcc1b 80 lcd.printf("%d", kp);
lcorralesc1 0:9aa80672eb3d 81 }
lcorralesc1 0:9aa80672eb3d 82 else if (p==4)
lcorralesc1 0:9aa80672eb3d 83 {
procesadores_FAC 1:0978505fcc1b 84 ++ki;
procesadores_FAC 1:0978505fcc1b 85 lcd.locate(8,1);
procesadores_FAC 1:0978505fcc1b 86 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 87 lcd.locate(8,1);
procesadores_FAC 1:0978505fcc1b 88 lcd.printf("%d", ki);
procesadores_FAC 1:0978505fcc1b 89 }
procesadores_FAC 1:0978505fcc1b 90 else if (p==5)
procesadores_FAC 1:0978505fcc1b 91 {
lcorralesc1 0:9aa80672eb3d 92 ++kd;
procesadores_FAC 1:0978505fcc1b 93 lcd.locate(13,1);
lcorralesc1 0:9aa80672eb3d 94 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 95 lcd.locate(13,1);
lcorralesc1 0:9aa80672eb3d 96 lcd.printf("%d", kd);
lcorralesc1 0:9aa80672eb3d 97 }
lcorralesc1 0:9aa80672eb3d 98 }
lcorralesc1 0:9aa80672eb3d 99 if (button2.falling())
lcorralesc1 0:9aa80672eb3d 100 {
procesadores_FAC 1:0978505fcc1b 101
lcorralesc1 0:9aa80672eb3d 102 if (p==1)
lcorralesc1 0:9aa80672eb3d 103 {
lcorralesc1 0:9aa80672eb3d 104 if (sp==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 105 {
lcorralesc1 0:9aa80672eb3d 106 }
lcorralesc1 0:9aa80672eb3d 107 else
lcorralesc1 0:9aa80672eb3d 108 {
lcorralesc1 0:9aa80672eb3d 109 --sp;
lcorralesc1 0:9aa80672eb3d 110 lcd.locate(3,0);
lcorralesc1 0:9aa80672eb3d 111 lcd.printf(" ");
lcorralesc1 0:9aa80672eb3d 112 lcd.locate(3,0);
lcorralesc1 0:9aa80672eb3d 113 lcd.printf("%d", sp);
lcorralesc1 0:9aa80672eb3d 114 }
lcorralesc1 0:9aa80672eb3d 115 }
procesadores_FAC 1:0978505fcc1b 116
procesadores_FAC 1:0978505fcc1b 117 if (p==3)
lcorralesc1 0:9aa80672eb3d 118 {
lcorralesc1 0:9aa80672eb3d 119 if (kp==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 120 {
lcorralesc1 0:9aa80672eb3d 121 }
lcorralesc1 0:9aa80672eb3d 122 else
lcorralesc1 0:9aa80672eb3d 123 {
lcorralesc1 0:9aa80672eb3d 124 --kp;
procesadores_FAC 1:0978505fcc1b 125 lcd.locate(2,1);
lcorralesc1 0:9aa80672eb3d 126 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 127 lcd.locate(2,1);
lcorralesc1 0:9aa80672eb3d 128 lcd.printf("%d", kp);
lcorralesc1 0:9aa80672eb3d 129 }
lcorralesc1 0:9aa80672eb3d 130 }
procesadores_FAC 1:0978505fcc1b 131 if (p==4)
lcorralesc1 0:9aa80672eb3d 132 {
lcorralesc1 0:9aa80672eb3d 133 if (ki==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 134 {
lcorralesc1 0:9aa80672eb3d 135 }
lcorralesc1 0:9aa80672eb3d 136 else
lcorralesc1 0:9aa80672eb3d 137 {
lcorralesc1 0:9aa80672eb3d 138 --ki;
procesadores_FAC 1:0978505fcc1b 139 lcd.locate(8,1);
lcorralesc1 0:9aa80672eb3d 140 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 141 lcd.locate(8,1);
lcorralesc1 0:9aa80672eb3d 142 lcd.printf("%d", ki);
lcorralesc1 0:9aa80672eb3d 143 }
lcorralesc1 0:9aa80672eb3d 144 }
procesadores_FAC 1:0978505fcc1b 145 if (p==5)
lcorralesc1 0:9aa80672eb3d 146 {
lcorralesc1 0:9aa80672eb3d 147 if (kd==0) // no mostrar nada
lcorralesc1 0:9aa80672eb3d 148 {
lcorralesc1 0:9aa80672eb3d 149 }
lcorralesc1 0:9aa80672eb3d 150 else
lcorralesc1 0:9aa80672eb3d 151 {
lcorralesc1 0:9aa80672eb3d 152 --kd;
procesadores_FAC 1:0978505fcc1b 153 lcd.locate(13,1);
lcorralesc1 0:9aa80672eb3d 154 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 155 lcd.locate(13,1);
lcorralesc1 0:9aa80672eb3d 156 lcd.printf("%d", kd);
lcorralesc1 0:9aa80672eb3d 157 }
lcorralesc1 0:9aa80672eb3d 158 }
lcorralesc1 0:9aa80672eb3d 159 }
procesadores_FAC 1:0978505fcc1b 160
procesadores_FAC 1:0978505fcc1b 161 if (button3.falling())
procesadores_FAC 1:0978505fcc1b 162 {
lcorralesc1 0:9aa80672eb3d 163 if (p==1)
lcorralesc1 0:9aa80672eb3d 164 {
lcorralesc1 0:9aa80672eb3d 165 ++p;
lcorralesc1 0:9aa80672eb3d 166 lcd.locate(11,0);
procesadores_FAC 1:0978505fcc1b 167 lcd.printf("%d", fe);
lcorralesc1 0:9aa80672eb3d 168 }
lcorralesc1 0:9aa80672eb3d 169 else if (p==2)
lcorralesc1 0:9aa80672eb3d 170 {
lcorralesc1 0:9aa80672eb3d 171 ++p;
procesadores_FAC 1:0978505fcc1b 172 lcd.locate(2,1);
procesadores_FAC 1:0978505fcc1b 173 lcd.printf("%d", kp);
procesadores_FAC 1:0978505fcc1b 174 lcd.locate(2,1);
lcorralesc1 0:9aa80672eb3d 175 }
lcorralesc1 0:9aa80672eb3d 176 else if (p==3)
lcorralesc1 0:9aa80672eb3d 177 {
lcorralesc1 0:9aa80672eb3d 178 ++p;
procesadores_FAC 1:0978505fcc1b 179 lcd.locate(8,1);
procesadores_FAC 1:0978505fcc1b 180 lcd.printf("%d", ki);
lcorralesc1 0:9aa80672eb3d 181 }
lcorralesc1 0:9aa80672eb3d 182 else if (p==4)
lcorralesc1 0:9aa80672eb3d 183 {
procesadores_FAC 1:0978505fcc1b 184 ++p;
procesadores_FAC 1:0978505fcc1b 185 lcd.locate(13,1);
procesadores_FAC 1:0978505fcc1b 186 lcd.printf("%d", kd);
procesadores_FAC 1:0978505fcc1b 187 }
procesadores_FAC 1:0978505fcc1b 188 else if (p==5)
procesadores_FAC 1:0978505fcc1b 189 {
lcorralesc1 0:9aa80672eb3d 190 p=1;
lcorralesc1 0:9aa80672eb3d 191 lcd.locate(3,0);
procesadores_FAC 1:0978505fcc1b 192 lcd.printf("%d", sp);
lcorralesc1 0:9aa80672eb3d 193 }
procesadores_FAC 1:0978505fcc1b 194
lcorralesc1 0:9aa80672eb3d 195 }
procesadores_FAC 1:0978505fcc1b 196
procesadores_FAC 1:0978505fcc1b 197 if (button4.falling()){
procesadores_FAC 1:0978505fcc1b 198 break; //sale del bucle si pisan suiche4
procesadores_FAC 1:0978505fcc1b 199 }
procesadores_FAC 1:0978505fcc1b 200
procesadores_FAC 1:0978505fcc1b 201 }
procesadores_FAC 1:0978505fcc1b 202 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
procesadores_FAC 1:0978505fcc1b 203 lcd.cls(); //borra la pantalla
procesadores_FAC 1:0978505fcc1b 204 lcd.printf(" GUARDADOS!");
procesadores_FAC 1:0978505fcc1b 205 wait(1);
procesadores_FAC 1:0978505fcc1b 206 lcd.cls();
procesadores_FAC 1:0978505fcc1b 207 lcd.printf(" INICIA EL PID");
procesadores_FAC 1:0978505fcc1b 208 wait(1);
procesadores_FAC 1:0978505fcc1b 209 // se imprimen los parches del control *****************************************
procesadores_FAC 1:0978505fcc1b 210 lcd.cls();
procesadores_FAC 1:0978505fcc1b 211 lcd.printf("Er=%d",err);
procesadores_FAC 1:0978505fcc1b 212 lcd.locate(8,0);
procesadores_FAC 1:0978505fcc1b 213 lcd.printf("Me=%d",med);
procesadores_FAC 1:0978505fcc1b 214 lcd.locate(0,1);
procesadores_FAC 1:0978505fcc1b 215 lcd.printf("Sp=%d",sp);
procesadores_FAC 1:0978505fcc1b 216 lcd.locate(8,1);
procesadores_FAC 1:0978505fcc1b 217 lcd.printf("SC=%d",pid);
procesadores_FAC 1:0978505fcc1b 218 wait(1);
procesadores_FAC 1:0978505fcc1b 219
procesadores_FAC 1:0978505fcc1b 220 // CICLO PRINCIPAL CONTROLADOR PID
procesadores_FAC 1:0978505fcc1b 221 // DEFINIMOS LOS PARAMETROS Kp,Ki y Kd teniendo en cuenta la escala
procesadores_FAC 1:0978505fcc1b 222
procesadores_FAC 1:0978505fcc1b 223 kp= kp*fe;
procesadores_FAC 1:0978505fcc1b 224 ki = ki*fe;
procesadores_FAC 1:0978505fcc1b 225 kd= kd*fe;
procesadores_FAC 1:0978505fcc1b 226
procesadores_FAC 1:0978505fcc1b 227 cicloPID :
procesadores_FAC 1:0978505fcc1b 228
procesadores_FAC 1:0978505fcc1b 229 med=10*Vin.read(); //leer puerto analogo y asignar a med
procesadores_FAC 1:0978505fcc1b 230 err = (sp-med);
procesadores_FAC 1:0978505fcc1b 231 ap = kp*err;
procesadores_FAC 1:0978505fcc1b 232
procesadores_FAC 1:0978505fcc1b 233 ai=(ki*err)+ai;
procesadores_FAC 1:0978505fcc1b 234 //calculo de la integral del error
procesadores_FAC 1:0978505fcc1b 235
procesadores_FAC 1:0978505fcc1b 236 ad = kd*(err-err_v); //calculo de la accion derivativa
procesadores_FAC 1:0978505fcc1b 237 pid = (ap+ai+ad);
procesadores_FAC 1:0978505fcc1b 238
procesadores_FAC 1:0978505fcc1b 239 if (pid < 0){
procesadores_FAC 1:0978505fcc1b 240 pid=0;
procesadores_FAC 1:0978505fcc1b 241 }
procesadores_FAC 1:0978505fcc1b 242 if (pid > 99){
procesadores_FAC 1:0978505fcc1b 243 pid=100;
procesadores_FAC 1:0978505fcc1b 244 }
procesadores_FAC 1:0978505fcc1b 245
procesadores_FAC 1:0978505fcc1b 246 wait(.5);
procesadores_FAC 1:0978505fcc1b 247 if(err >= 0){
procesadores_FAC 1:0978505fcc1b 248 lcd.locate(4,0);
procesadores_FAC 1:0978505fcc1b 249 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 250 lcd.locate(3,0);
procesadores_FAC 1:0978505fcc1b 251 lcd.printf("%d",err);
procesadores_FAC 1:0978505fcc1b 252 }
procesadores_FAC 1:0978505fcc1b 253 if (err<0){
procesadores_FAC 1:0978505fcc1b 254 lcd.locate(3,0);
procesadores_FAC 1:0978505fcc1b 255 lcd.printf("%d",err);
procesadores_FAC 1:0978505fcc1b 256 }
procesadores_FAC 1:0978505fcc1b 257 lcd.locate(12,0);
procesadores_FAC 1:0978505fcc1b 258 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 259 lcd.locate(11,0);
procesadores_FAC 1:0978505fcc1b 260 lcd.printf("%d",med);
procesadores_FAC 1:0978505fcc1b 261 lcd.locate(3,1);
procesadores_FAC 1:0978505fcc1b 262 lcd.printf("%d",sp);
procesadores_FAC 1:0978505fcc1b 263
procesadores_FAC 1:0978505fcc1b 264 if(pid < 100){
procesadores_FAC 1:0978505fcc1b 265 lcd.locate(13,1);
procesadores_FAC 1:0978505fcc1b 266 lcd.printf(" ");
procesadores_FAC 1:0978505fcc1b 267 lcd.locate(11,1);
procesadores_FAC 1:0978505fcc1b 268 lcd.printf("%d",pid);}
procesadores_FAC 1:0978505fcc1b 269
procesadores_FAC 1:0978505fcc1b 270 if(pid >= 100){
procesadores_FAC 1:0978505fcc1b 271 lcd.locate(11,1);
procesadores_FAC 1:0978505fcc1b 272 lcd.printf("%d",pid);}
procesadores_FAC 1:0978505fcc1b 273
procesadores_FAC 1:0978505fcc1b 274 err_v = err;
procesadores_FAC 1:0978505fcc1b 275 pidn=pid*0.01;//Normalizacion de la salida
procesadores_FAC 1:0978505fcc1b 276 Vout.write(pidn);//se envia el valor pid a puerto analogico de salida (D/A)
procesadores_FAC 1:0978505fcc1b 277 wait(0.005);
procesadores_FAC 1:0978505fcc1b 278 goto cicloPID ;
procesadores_FAC 1:0978505fcc1b 279
procesadores_FAC 1:0978505fcc1b 280
procesadores_FAC 1:0978505fcc1b 281 }