PID con pulsadores para circuito RC

Dependencies:   Debounced TextLCD mbed

Committer:
Meli
Date:
Tue Oct 13 22:10:20 2015 +0000
Revision:
2:c4dc480057f6
Parent:
1:744ee5bf7b7c
PID con pulsadores

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Meli 0:96212ecff217 1 #include "mbed.h"
Meli 0:96212ecff217 2 #include "DebouncedIn.h"
Meli 0:96212ecff217 3 #include "TextLCD.h"
Meli 0:96212ecff217 4
Meli 2:c4dc480057f6 5
Meli 0:96212ecff217 6 AnalogIn Vin(PTC2); // entrada analoga
Meli 0:96212ecff217 7 AnalogOut Vout(PTE30); // salida analoga
Meli 0:96212ecff217 8
Meli 0:96212ecff217 9 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
Meli 0:96212ecff217 10 int presionado_incremento(int columna,int fila,int constante);//funcion creada para incrementar el valor con el boton hundido
Meli 0:96212ecff217 11 int presionado_decremento(int columna,int fila,int constante);//funcion entrada para decrementar el valor con el boton hundido
Meli 0:96212ecff217 12 DigitalOut led1(LED1);
Meli 0:96212ecff217 13 DigitalOut led2(LED2);
Meli 0:96212ecff217 14 DigitalOut led3(LED3);
Meli 0:96212ecff217 15 DebouncedIn button1(PTC12); //incrementar
Meli 0:96212ecff217 16 DebouncedIn button2(PTC13);//decrementar
Meli 0:96212ecff217 17 DebouncedIn button3(PTC16);//cambiar
Meli 0:96212ecff217 18 DebouncedIn button4(PTC17); //enter
Meli 0:96212ecff217 19 int C1=0x0F;
Meli 0:96212ecff217 20 int sp=0,kp=0,kd=0,ki=0,p=1,bandera = 0;
Meli 0:96212ecff217 21 float error=0,pwmset,eInteg,pGain,ePrev,iGain,dGain,x;
Meli 0:96212ecff217 22 int main()
Meli 0:96212ecff217 23 {
Meli 0:96212ecff217 24 lcd.cls();
Meli 0:96212ecff217 25 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
Meli 0:96212ecff217 26 lcd.locate(8,0);
Meli 0:96212ecff217 27 lcd.printf("kp=%d",kp);
Meli 0:96212ecff217 28 lcd.locate(0,1);
Meli 0:96212ecff217 29 lcd.printf("Ki=%d", ki);
Meli 0:96212ecff217 30 lcd.locate(8,1);
Meli 0:96212ecff217 31 lcd.printf("Kd=%d", kd);
Meli 0:96212ecff217 32 lcd.locate(0,0);
Meli 0:96212ecff217 33 lcd.printf("Sp=%d", sp);
Meli 0:96212ecff217 34
Meli 0:96212ecff217 35 while(1)
Meli 0:96212ecff217 36 {
Meli 0:96212ecff217 37
Meli 0:96212ecff217 38 if (button1.falling())//se cuenta en el flanco de caida para el boton 1
Meli 0:96212ecff217 39 {
Meli 0:96212ecff217 40 led1 =!led1;
Meli 0:96212ecff217 41
Meli 0:96212ecff217 42 if (p==1)// posicion 1 en el LCD
Meli 0:96212ecff217 43 {
Meli 0:96212ecff217 44 ++sp;//incrementa de a uno
Meli 1:744ee5bf7b7c 45 if (sp>=5) // se limita sp porque el mayor valor que toma es 5
Meli 0:96212ecff217 46 {sp=5;
Meli 0:96212ecff217 47 }
Meli 0:96212ecff217 48 lcd.locate(3,0);
Meli 0:96212ecff217 49 lcd.printf(" ");//borra el valor anterior
Meli 0:96212ecff217 50 lcd.locate(3,0);
Meli 0:96212ecff217 51 lcd.printf("%d", sp);//decimal
Meli 0:96212ecff217 52 wait (0.5); //para evitar un error al hundir el boton, y que el programa no lo tome como si se hubiera dejado hundido el boton
Meli 0:96212ecff217 53
Meli 0:96212ecff217 54 }
Meli 0:96212ecff217 55 else if (p==2) // cambia a posicion 2
Meli 0:96212ecff217 56 {
Meli 0:96212ecff217 57 kp = kp+1;
Meli 0:96212ecff217 58 if (kp>=999)//se limita hasta 999
Meli 0:96212ecff217 59 {
Meli 0:96212ecff217 60 kp= 999;
Meli 0:96212ecff217 61 }
Meli 0:96212ecff217 62 lcd.locate(11,0);
Meli 0:96212ecff217 63 lcd.printf(" ");
Meli 0:96212ecff217 64 lcd.locate(11,0);
Meli 0:96212ecff217 65 lcd.printf("%d", kp);
Meli 0:96212ecff217 66 wait (0.5); //para evitar un error al hundir el boton, y que el programa no lo tome como si se hubiera dejado hundido el boton
Meli 0:96212ecff217 67
Meli 0:96212ecff217 68 kp=presionado_incremento(11,0,kp); //se llama la funcion de incremento para kp
Meli 0:96212ecff217 69
Meli 0:96212ecff217 70 }
Meli 0:96212ecff217 71 else if (p==3) //cambia de posicion
Meli 0:96212ecff217 72 {
Meli 0:96212ecff217 73 ++ki;
Meli 0:96212ecff217 74 if (ki>=999)
Meli 0:96212ecff217 75 {
Meli 0:96212ecff217 76 ki= 999;
Meli 0:96212ecff217 77 }
Meli 0:96212ecff217 78 lcd.locate(3,1);
Meli 0:96212ecff217 79 lcd.printf(" ");
Meli 0:96212ecff217 80 lcd.locate(3,1);
Meli 0:96212ecff217 81 lcd.printf("%d", ki);
Meli 0:96212ecff217 82 wait (0.5);
Meli 0:96212ecff217 83 ki = presionado_incremento(3,1,ki); //se llama la funcion de incremento para ki
Meli 0:96212ecff217 84 }
Meli 0:96212ecff217 85 else if (p==4)//cambia de posicion
Meli 0:96212ecff217 86 {
Meli 0:96212ecff217 87 ++kd;
Meli 0:96212ecff217 88 if (kd>=999)
Meli 0:96212ecff217 89 {
Meli 0:96212ecff217 90 kd = 999;
Meli 0:96212ecff217 91 }
Meli 0:96212ecff217 92 lcd.locate(11,1);
Meli 0:96212ecff217 93 lcd.printf(" ");
Meli 0:96212ecff217 94 lcd.locate(11,1);
Meli 0:96212ecff217 95 lcd.printf("%d", kd);
Meli 0:96212ecff217 96 wait (0.5);
Meli 0:96212ecff217 97 kd = presionado_incremento(11,1,kd); //se llama la funcion de incremento para kd
Meli 0:96212ecff217 98 }
Meli 0:96212ecff217 99 }
Meli 0:96212ecff217 100 if (button2.falling())//se cuenta en el flanco de caida para el boton 2 decrementar
Meli 0:96212ecff217 101 {
Meli 0:96212ecff217 102 led2 =!led2;
Meli 0:96212ecff217 103 if (p==1)
Meli 0:96212ecff217 104 {
Meli 0:96212ecff217 105 if (sp==0) // no mostrar nada evita valores negativos
Meli 0:96212ecff217 106 {
Meli 0:96212ecff217 107 }
Meli 0:96212ecff217 108 else
Meli 0:96212ecff217 109 {
Meli 0:96212ecff217 110 --sp;
Meli 0:96212ecff217 111 lcd.locate(3,0);
Meli 1:744ee5bf7b7c 112 lcd.printf(" ");
Meli 0:96212ecff217 113 lcd.locate(3,0);
Meli 0:96212ecff217 114 lcd.printf("%d", sp);
Meli 0:96212ecff217 115 wait(0.5);
Meli 1:744ee5bf7b7c 116 //sp = presionado_decremento(3,0,sp); //se utiliza la funcion decremento
Meli 0:96212ecff217 117 }
Meli 0:96212ecff217 118 }
Meli 0:96212ecff217 119 if (p==2)
Meli 0:96212ecff217 120 {
Meli 0:96212ecff217 121 if (kp==0) // no mostrar nada
Meli 0:96212ecff217 122 {
Meli 0:96212ecff217 123 }
Meli 0:96212ecff217 124 else
Meli 0:96212ecff217 125 {
Meli 0:96212ecff217 126 --kp;
Meli 0:96212ecff217 127 lcd.locate(11,0);
Meli 0:96212ecff217 128 lcd.printf(" ");
Meli 0:96212ecff217 129 lcd.locate(11,0);
Meli 0:96212ecff217 130 lcd.printf("%d", kp);
Meli 0:96212ecff217 131 wait(0.5);
Meli 1:744ee5bf7b7c 132 // kp = presionado_decremento(11,0,kp);
Meli 0:96212ecff217 133 }
Meli 0:96212ecff217 134 }
Meli 0:96212ecff217 135 if (p==3)
Meli 0:96212ecff217 136 {
Meli 0:96212ecff217 137 if (ki==0) // no mostrar nada
Meli 0:96212ecff217 138 {
Meli 0:96212ecff217 139 }
Meli 0:96212ecff217 140 else
Meli 0:96212ecff217 141 {
Meli 0:96212ecff217 142 --ki;
Meli 0:96212ecff217 143 lcd.locate(3,1);
Meli 0:96212ecff217 144 lcd.printf(" ");
Meli 0:96212ecff217 145 lcd.locate(3,1);
Meli 0:96212ecff217 146 lcd.printf("%d", ki);
Meli 0:96212ecff217 147 wait(0.5);
Meli 1:744ee5bf7b7c 148 //ki = presionado_decremento(3,1,ki);
Meli 0:96212ecff217 149 }
Meli 0:96212ecff217 150 }
Meli 0:96212ecff217 151 if (p==4)
Meli 0:96212ecff217 152 {
Meli 0:96212ecff217 153 if (kd==0) // no mostrar nada
Meli 0:96212ecff217 154 {
Meli 0:96212ecff217 155 }
Meli 0:96212ecff217 156 else
Meli 0:96212ecff217 157 {
Meli 0:96212ecff217 158 --kd;
Meli 0:96212ecff217 159 lcd.locate(11,1);
Meli 0:96212ecff217 160 lcd.printf(" ");
Meli 0:96212ecff217 161 lcd.locate(11,1);
Meli 0:96212ecff217 162 lcd.printf("%d", kd);
Meli 0:96212ecff217 163 wait(0.5);
Meli 1:744ee5bf7b7c 164 // kd = presionado_decremento(11,1,kd);
Meli 0:96212ecff217 165 }
Meli 0:96212ecff217 166 }
Meli 0:96212ecff217 167 }
Meli 0:96212ecff217 168
Meli 0:96212ecff217 169
Meli 0:96212ecff217 170
Meli 0:96212ecff217 171
Meli 0:96212ecff217 172 if (button3.falling())//para el cambio de posicion
Meli 0:96212ecff217 173 {
Meli 0:96212ecff217 174 led3 =!led3;
Meli 0:96212ecff217 175 if (p==1)
Meli 0:96212ecff217 176 {
Meli 0:96212ecff217 177 ++p;
Meli 0:96212ecff217 178 lcd.locate(11,0);
Meli 0:96212ecff217 179 lcd.printf("%d", kp);
Meli 0:96212ecff217 180
Meli 0:96212ecff217 181
Meli 0:96212ecff217 182 }
Meli 0:96212ecff217 183 else if (p==2)
Meli 0:96212ecff217 184 {
Meli 0:96212ecff217 185 ++p;
Meli 0:96212ecff217 186 lcd.locate(3,1);
Meli 0:96212ecff217 187 lcd.printf("%d", ki);
Meli 0:96212ecff217 188 lcd.locate(3,1);
Meli 0:96212ecff217 189
Meli 0:96212ecff217 190 }
Meli 0:96212ecff217 191 else if (p==3)
Meli 0:96212ecff217 192 {
Meli 0:96212ecff217 193 ++p;
Meli 0:96212ecff217 194 lcd.locate(11,1);
Meli 0:96212ecff217 195 lcd.printf("%d", kd);
Meli 0:96212ecff217 196
Meli 0:96212ecff217 197
Meli 0:96212ecff217 198 }
Meli 0:96212ecff217 199 else if (p==4)
Meli 0:96212ecff217 200 {
Meli 0:96212ecff217 201 p=1;
Meli 0:96212ecff217 202 lcd.locate(3,0);
Meli 0:96212ecff217 203 lcd.printf("%d", sp);
Meli 0:96212ecff217 204
Meli 0:96212ecff217 205
Meli 0:96212ecff217 206 }
Meli 0:96212ecff217 207 }
Meli 0:96212ecff217 208
Meli 0:96212ecff217 209
Meli 0:96212ecff217 210
Meli 0:96212ecff217 211
Meli 0:96212ecff217 212 //enter
Meli 0:96212ecff217 213 if(button4.falling())
Meli 0:96212ecff217 214 {
Meli 0:96212ecff217 215 lcd.cls(); // al undir el boton 4 se borra la pantalla
Meli 0:96212ecff217 216 //for (int h=0;h<100;h++)
Meli 0:96212ecff217 217 //Vout= Vout+0.01;
Meli 0:96212ecff217 218 while(bandera==0)
Meli 0:96212ecff217 219 {
Meli 0:96212ecff217 220 wait(0.2);
Meli 0:96212ecff217 221 x=Vout.read(); // lee el voltaje de salida que nuestra analoga pero en porcentaje
Meli 2:c4dc480057f6 222
Meli 0:96212ecff217 223 //}
Meli 0:96212ecff217 224 //pid
Meli 0:96212ecff217 225 error = sp-x; // Calcula el error
Meli 0:96212ecff217 226 pwmset = kp* error+ki * eInteg +kd* (error - ePrev); // ecuacion para el PID
Meli 2:c4dc480057f6 227 pwmset=(0.976801/5)*pwmset; // como el voltaje calculado fue un porcentaje se realiza una conversion respectiva al valor de salida
Meli 0:96212ecff217 228 Vout=pwmset;
Meli 0:96212ecff217 229 eInteg =eInteg+ error; // integral
Meli 0:96212ecff217 230 ePrev = error;
Meli 0:96212ecff217 231 lcd.locate(0,1);
Meli 0:96212ecff217 232 lcd.printf("error=%f",error);
Meli 0:96212ecff217 233 lcd.locate(1,0);
Meli 0:96212ecff217 234 lcd.printf("salida=%f",x);
Meli 0:96212ecff217 235 if (button4.falling())
Meli 0:96212ecff217 236 { bandera=1;
Meli 0:96212ecff217 237 lcd.cls();
Meli 0:96212ecff217 238 p=1;
Meli 0:96212ecff217 239 lcd.locate(8,0);
Meli 0:96212ecff217 240 lcd.printf("kp=%d",kp);
Meli 0:96212ecff217 241 lcd.locate(0,1);
Meli 0:96212ecff217 242 lcd.printf("Ki=%d", ki);
Meli 0:96212ecff217 243 lcd.locate(8,1);
Meli 0:96212ecff217 244 lcd.printf("Kd=%d", kd);
Meli 0:96212ecff217 245 lcd.locate(0,0);
Meli 0:96212ecff217 246 lcd.printf("Sp=%d", sp);
Meli 0:96212ecff217 247
Meli 0:96212ecff217 248 }
Meli 0:96212ecff217 249
Meli 0:96212ecff217 250
Meli 0:96212ecff217 251 }
Meli 0:96212ecff217 252 bandera = 0;
Meli 0:96212ecff217 253 }
Meli 0:96212ecff217 254
Meli 0:96212ecff217 255
Meli 0:96212ecff217 256
Meli 0:96212ecff217 257 }
Meli 0:96212ecff217 258 }
Meli 0:96212ecff217 259
Meli 0:96212ecff217 260
Meli 0:96212ecff217 261 int presionado_incremento(int columna,int fila,int constante)
Meli 0:96212ecff217 262 {
Meli 0:96212ecff217 263 int marc=0,i=0;
Meli 0:96212ecff217 264
Meli 0:96212ecff217 265 while(button1==0) // Cuando el boton 1 esta presionado
Meli 0:96212ecff217 266 {
Meli 0:96212ecff217 267 i=1;
Meli 0:96212ecff217 268 wait (0.5);
Meli 0:96212ecff217 269
Meli 0:96212ecff217 270
Meli 0:96212ecff217 271 if ((marc==2)&(i==1)) // entra cuando el modulo de la constante dividido 100 y el residuo es 0
Meli 0:96212ecff217 272 {
Meli 0:96212ecff217 273 constante = constante+100;
Meli 0:96212ecff217 274 if (constante>=999)
Meli 0:96212ecff217 275 {
Meli 0:96212ecff217 276 constante = 999;
Meli 0:96212ecff217 277 }
Meli 0:96212ecff217 278
Meli 0:96212ecff217 279 lcd.locate(columna,fila);
Meli 0:96212ecff217 280 lcd.printf(" ");
Meli 0:96212ecff217 281 lcd.locate(columna,fila);
Meli 0:96212ecff217 282 lcd.printf("%d", constante);
Meli 0:96212ecff217 283 i=0;
Meli 0:96212ecff217 284
Meli 0:96212ecff217 285 }
Meli 0:96212ecff217 286 if ((marc==1)&(i==1))
Meli 0:96212ecff217 287 {
Meli 0:96212ecff217 288 constante=constante+10;
Meli 0:96212ecff217 289 if(constante%100==0){marc=2;} // si el residuo de la constante dividido 100, la bandera es igual a dos
Meli 0:96212ecff217 290 if (constante>= 999)
Meli 0:96212ecff217 291 {
Meli 0:96212ecff217 292 constante = 999;
Meli 0:96212ecff217 293 }
Meli 0:96212ecff217 294
Meli 0:96212ecff217 295
Meli 0:96212ecff217 296 lcd.locate(columna,fila);
Meli 0:96212ecff217 297 lcd.printf(" ");
Meli 0:96212ecff217 298 lcd.locate(columna,fila);
Meli 0:96212ecff217 299 lcd.printf("%d", constante);
Meli 0:96212ecff217 300 i=0; }
Meli 0:96212ecff217 301
Meli 0:96212ecff217 302 if ((marc==0)&(i==1))
Meli 0:96212ecff217 303 {
Meli 0:96212ecff217 304 ++constante;
Meli 0:96212ecff217 305 if(constante%10==0){marc=1;}
Meli 0:96212ecff217 306 if (constante>= 999)
Meli 0:96212ecff217 307 {
Meli 0:96212ecff217 308 constante = 999;
Meli 0:96212ecff217 309 }
Meli 0:96212ecff217 310
Meli 0:96212ecff217 311
Meli 0:96212ecff217 312 lcd.locate(columna,fila);
Meli 0:96212ecff217 313 lcd.printf(" ");
Meli 0:96212ecff217 314 lcd.locate(columna,fila);
Meli 0:96212ecff217 315 lcd.printf("%d", constante);
Meli 0:96212ecff217 316 i=0; }
Meli 0:96212ecff217 317
Meli 0:96212ecff217 318
Meli 0:96212ecff217 319
Meli 0:96212ecff217 320 }
Meli 0:96212ecff217 321 marc=0;
Meli 0:96212ecff217 322 return constante;
Meli 0:96212ecff217 323 }
Meli 0:96212ecff217 324
Meli 0:96212ecff217 325 int presionado_decremento(int columna,int fila,int constante)
Meli 0:96212ecff217 326 {
Meli 0:96212ecff217 327 int marc=0,i=0;
Meli 0:96212ecff217 328
Meli 2:c4dc480057f6 329 while(button2==0) // cuando el boton 2 esta presionado
Meli 0:96212ecff217 330 {
Meli 0:96212ecff217 331
Meli 0:96212ecff217 332 i=1;
Meli 0:96212ecff217 333 wait (0.5);
Meli 0:96212ecff217 334
Meli 0:96212ecff217 335 if ((marc==2)&(i==1))
Meli 0:96212ecff217 336 {
Meli 0:96212ecff217 337 constante = constante-100;
Meli 0:96212ecff217 338 if (constante<=0)
Meli 0:96212ecff217 339 {
Meli 0:96212ecff217 340 constante = 0;
Meli 0:96212ecff217 341 }
Meli 0:96212ecff217 342
Meli 0:96212ecff217 343 lcd.locate(columna,fila);
Meli 0:96212ecff217 344 lcd.printf(" ");
Meli 0:96212ecff217 345 lcd.locate(columna,fila);
Meli 0:96212ecff217 346 lcd.printf("%d", constante);
Meli 0:96212ecff217 347 i=0;
Meli 0:96212ecff217 348
Meli 0:96212ecff217 349 }
Meli 0:96212ecff217 350 if ((marc==1)&(i==1))
Meli 0:96212ecff217 351 {
Meli 0:96212ecff217 352 constante=constante-10;
Meli 0:96212ecff217 353 if(constante%100==0){marc=2;}
Meli 0:96212ecff217 354 if (constante<=0)
Meli 0:96212ecff217 355 {
Meli 0:96212ecff217 356 constante = 0;
Meli 0:96212ecff217 357 }
Meli 0:96212ecff217 358
Meli 0:96212ecff217 359 lcd.locate(columna,fila);
Meli 0:96212ecff217 360 lcd.printf(" ");
Meli 0:96212ecff217 361 lcd.locate(columna,fila);
Meli 0:96212ecff217 362 lcd.printf("%d", constante);
Meli 0:96212ecff217 363 i=0; }
Meli 0:96212ecff217 364
Meli 0:96212ecff217 365 if ((marc==0)&(i==1))
Meli 0:96212ecff217 366 {
Meli 0:96212ecff217 367 --constante;
Meli 0:96212ecff217 368 if(constante%10==0){marc=1;}
Meli 0:96212ecff217 369 if (constante<=0)
Meli 0:96212ecff217 370 {
Meli 0:96212ecff217 371 constante = 0;
Meli 0:96212ecff217 372 }
Meli 0:96212ecff217 373
Meli 0:96212ecff217 374 lcd.locate(columna,fila);
Meli 0:96212ecff217 375 lcd.printf(" ");
Meli 0:96212ecff217 376 lcd.locate(columna,fila);
Meli 0:96212ecff217 377 lcd.printf("%d", constante);
Meli 0:96212ecff217 378 i=0; }
Meli 0:96212ecff217 379
Meli 0:96212ecff217 380
Meli 0:96212ecff217 381
Meli 0:96212ecff217 382 }
Meli 0:96212ecff217 383
Meli 0:96212ecff217 384 marc=0;
Meli 0:96212ecff217 385 return constante;
Meli 0:96212ecff217 386 };