Trabajo en el cual se realiza un PID, con los valores ingresados por medio de pulsadores, que son finalmente mostrados con el resultado en un lcd

Dependencies:   Debounced TextLCD mbed

Fork of PID_con_pulsadores by Melissa Elorza

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