se ingresan las constantes kp, ki y kd, y ademas, los tiempos de subida, sostenido y bajada de la planta

Dependencies:   QEI RTC-DS1307 TextLCD mbed

Committer:
slorm
Date:
Tue Jun 05 17:21:44 2018 +0000
Revision:
0:42d47d159d5a
PID con encoder y reloj

Who changed what in which revision?

UserRevisionLine numberNew contents of line
slorm 0:42d47d159d5a 1 #include "mbed.h"
slorm 0:42d47d159d5a 2 #include "QEI.h"
slorm 0:42d47d159d5a 3 #include "TextLCD.h"
slorm 0:42d47d159d5a 4 #include "Rtc_Ds1307.h"
slorm 0:42d47d159d5a 5
slorm 0:42d47d159d5a 6 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
slorm 0:42d47d159d5a 7 QEI encoder (PTA13, PTD5, NC, 624);
slorm 0:42d47d159d5a 8 Rtc_Ds1307 rtc(PTE0, PTE1);
slorm 0:42d47d159d5a 9 AnalogIn y(PTB3);//entrada analoga
slorm 0:42d47d159d5a 10 AnalogOut u(PTE30);//salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer
slorm 0:42d47d159d5a 11 //si se ignora esto se arruina la FRDMKL25Z
slorm 0:42d47d159d5a 12 DigitalOut led1(LED1);
slorm 0:42d47d159d5a 13 DigitalOut led2(LED2);
slorm 0:42d47d159d5a 14 DigitalOut led3(LED3);
slorm 0:42d47d159d5a 15
slorm 0:42d47d159d5a 16 DigitalIn button3(PTC16);//cambia ingreso de los 4 parametros
slorm 0:42d47d159d5a 17 DigitalIn button4(PTC17);//termina y consolida valores de 4 parametros y sale del loop
slorm 0:42d47d159d5a 18
slorm 0:42d47d159d5a 19
slorm 0:42d47d159d5a 20 //codigos movimiento del curzor
slorm 0:42d47d159d5a 21
slorm 0:42d47d159d5a 22 //int C1=0x0E; // solo muestra el curzor
slorm 0:42d47d159d5a 23 int C2=0x18; // desplaza izquierda
slorm 0:42d47d159d5a 24 int C3=0x1A; // desplaza derecha
slorm 0:42d47d159d5a 25 int C4=0x0C; // quito cursor bajo
slorm 0:42d47d159d5a 26
slorm 0:42d47d159d5a 27 int C1=0x0F;
slorm 0:42d47d159d5a 28 int cambio=0, diferencia=0;
slorm 0:42d47d159d5a 29 float pid,o,ai,ad,ap,med,err;
slorm 0:42d47d159d5a 30 float err_v;
slorm 0:42d47d159d5a 31 int spnum=0,kinum=0,kpnum=0,kdnum=0,pos=1;
slorm 0:42d47d159d5a 32 int sub=0,sost=0,baj=0,pos1=1;
slorm 0:42d47d159d5a 33 int t1,t2,t3;
slorm 0:42d47d159d5a 34 float f;
slorm 0:42d47d159d5a 35 int i=0;
slorm 0:42d47d159d5a 36 int c,c1=0;
slorm 0:42d47d159d5a 37 int n=60;
slorm 0:42d47d159d5a 38 float ref;
slorm 0:42d47d159d5a 39
slorm 0:42d47d159d5a 40 int main()
slorm 0:42d47d159d5a 41 {
slorm 0:42d47d159d5a 42 lcd.locate(0,1);
slorm 0:42d47d159d5a 43 lcd.printf("**Control PID**");
slorm 0:42d47d159d5a 44 wait(2);
slorm 0:42d47d159d5a 45 lcd.cls(); // Borrar Pantalla
slorm 0:42d47d159d5a 46 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
slorm 0:42d47d159d5a 47
slorm 0:42d47d159d5a 48 lcd.locate(8,0);
slorm 0:42d47d159d5a 49 lcd.printf("Kp=%d",kpnum);
slorm 0:42d47d159d5a 50 lcd.locate(0,1);
slorm 0:42d47d159d5a 51 lcd.printf("Ki=%d",kinum);
slorm 0:42d47d159d5a 52 lcd.locate(8,1);
slorm 0:42d47d159d5a 53 lcd.printf("Kd=%d",kdnum);
slorm 0:42d47d159d5a 54 lcd.locate(0,0);
slorm 0:42d47d159d5a 55 lcd.printf("Sp=%d",spnum);
slorm 0:42d47d159d5a 56
slorm 0:42d47d159d5a 57 while(1)
slorm 0:42d47d159d5a 58 {
slorm 0:42d47d159d5a 59 //lcd.locate(8,0);
slorm 0:42d47d159d5a 60 //lcd.printf("Kp=%d",encoder.getPulses());
slorm 0:42d47d159d5a 61 //wait(.5);
slorm 0:42d47d159d5a 62
slorm 0:42d47d159d5a 63 diferencia=encoder.getPulses()-cambio;
slorm 0:42d47d159d5a 64 cambio=encoder.getPulses();
slorm 0:42d47d159d5a 65
slorm 0:42d47d159d5a 66 if (diferencia==0)
slorm 0:42d47d159d5a 67 {
slorm 0:42d47d159d5a 68 //nada
slorm 0:42d47d159d5a 69 }
slorm 0:42d47d159d5a 70 else if(diferencia>0)
slorm 0:42d47d159d5a 71 {
slorm 0:42d47d159d5a 72 if(pos==1)
slorm 0:42d47d159d5a 73 {
slorm 0:42d47d159d5a 74 if(spnum+diferencia>=999)
slorm 0:42d47d159d5a 75 {
slorm 0:42d47d159d5a 76 spnum=999;
slorm 0:42d47d159d5a 77 lcd.locate(3,0);
slorm 0:42d47d159d5a 78 lcd.printf(" ");
slorm 0:42d47d159d5a 79 lcd.locate(3,0);
slorm 0:42d47d159d5a 80 lcd.printf("%d", spnum);
slorm 0:42d47d159d5a 81 }
slorm 0:42d47d159d5a 82 else
slorm 0:42d47d159d5a 83 {
slorm 0:42d47d159d5a 84 spnum+=diferencia;
slorm 0:42d47d159d5a 85 lcd.locate(3,0);
slorm 0:42d47d159d5a 86 lcd.printf("%d", spnum);
slorm 0:42d47d159d5a 87 }
slorm 0:42d47d159d5a 88 }
slorm 0:42d47d159d5a 89 else if(pos==2)
slorm 0:42d47d159d5a 90 {
slorm 0:42d47d159d5a 91 if(kpnum+diferencia>=999)
slorm 0:42d47d159d5a 92 {
slorm 0:42d47d159d5a 93 kpnum=999;
slorm 0:42d47d159d5a 94 lcd.locate(11,0);
slorm 0:42d47d159d5a 95 lcd.printf(" ");
slorm 0:42d47d159d5a 96 lcd.locate(11,0);
slorm 0:42d47d159d5a 97 lcd.printf("%d", kpnum);
slorm 0:42d47d159d5a 98 }
slorm 0:42d47d159d5a 99 else
slorm 0:42d47d159d5a 100 {
slorm 0:42d47d159d5a 101 kpnum+=diferencia;
slorm 0:42d47d159d5a 102 lcd.locate(11,0);
slorm 0:42d47d159d5a 103 lcd.printf("%d", kpnum);
slorm 0:42d47d159d5a 104 }
slorm 0:42d47d159d5a 105 }
slorm 0:42d47d159d5a 106 else if(pos==3)
slorm 0:42d47d159d5a 107 {
slorm 0:42d47d159d5a 108 if(kinum+diferencia>=999)
slorm 0:42d47d159d5a 109 {
slorm 0:42d47d159d5a 110 kinum=999;
slorm 0:42d47d159d5a 111 lcd.locate(3,1);
slorm 0:42d47d159d5a 112 lcd.printf(" ");
slorm 0:42d47d159d5a 113 lcd.locate(3,1);
slorm 0:42d47d159d5a 114 lcd.printf("%d", kinum);
slorm 0:42d47d159d5a 115 }
slorm 0:42d47d159d5a 116 else
slorm 0:42d47d159d5a 117 {
slorm 0:42d47d159d5a 118 kinum+=diferencia;
slorm 0:42d47d159d5a 119 lcd.locate(3,1);
slorm 0:42d47d159d5a 120 lcd.printf("%d", kinum);
slorm 0:42d47d159d5a 121 }
slorm 0:42d47d159d5a 122 }
slorm 0:42d47d159d5a 123 else if(pos==4)
slorm 0:42d47d159d5a 124 {
slorm 0:42d47d159d5a 125 if(kdnum+diferencia>=999)
slorm 0:42d47d159d5a 126 {
slorm 0:42d47d159d5a 127 kdnum=999;
slorm 0:42d47d159d5a 128 lcd.locate(11,1);
slorm 0:42d47d159d5a 129 lcd.printf(" ");
slorm 0:42d47d159d5a 130 lcd.locate(11,1);
slorm 0:42d47d159d5a 131 lcd.printf("%d", kdnum);
slorm 0:42d47d159d5a 132 }
slorm 0:42d47d159d5a 133 else
slorm 0:42d47d159d5a 134 {
slorm 0:42d47d159d5a 135 kdnum+=diferencia;
slorm 0:42d47d159d5a 136 lcd.locate(11,1);
slorm 0:42d47d159d5a 137 lcd.printf("%d", kdnum);
slorm 0:42d47d159d5a 138 }
slorm 0:42d47d159d5a 139 }
slorm 0:42d47d159d5a 140 }
slorm 0:42d47d159d5a 141
slorm 0:42d47d159d5a 142 else if(diferencia<0)
slorm 0:42d47d159d5a 143 {
slorm 0:42d47d159d5a 144 if(pos==1)
slorm 0:42d47d159d5a 145 {
slorm 0:42d47d159d5a 146 if(spnum+diferencia<0)
slorm 0:42d47d159d5a 147 {
slorm 0:42d47d159d5a 148 //No ocurre nada
slorm 0:42d47d159d5a 149 }
slorm 0:42d47d159d5a 150 else
slorm 0:42d47d159d5a 151 {
slorm 0:42d47d159d5a 152 spnum+=diferencia;
slorm 0:42d47d159d5a 153 lcd.locate(3,0);
slorm 0:42d47d159d5a 154 lcd.printf(" ");
slorm 0:42d47d159d5a 155 lcd.locate(3,0);
slorm 0:42d47d159d5a 156 lcd.printf("%d", spnum);
slorm 0:42d47d159d5a 157 }
slorm 0:42d47d159d5a 158 }
slorm 0:42d47d159d5a 159 else if(pos==2)
slorm 0:42d47d159d5a 160 {
slorm 0:42d47d159d5a 161 if(kpnum+diferencia<0)
slorm 0:42d47d159d5a 162 {
slorm 0:42d47d159d5a 163 //No ocurre nada
slorm 0:42d47d159d5a 164 }
slorm 0:42d47d159d5a 165 else
slorm 0:42d47d159d5a 166 {
slorm 0:42d47d159d5a 167 kpnum+=diferencia;
slorm 0:42d47d159d5a 168 lcd.locate(11,0);
slorm 0:42d47d159d5a 169 lcd.printf(" ");
slorm 0:42d47d159d5a 170 lcd.locate(11,0);
slorm 0:42d47d159d5a 171 lcd.printf("%d", kpnum);
slorm 0:42d47d159d5a 172 }
slorm 0:42d47d159d5a 173 }
slorm 0:42d47d159d5a 174 else if(pos==3)
slorm 0:42d47d159d5a 175 {
slorm 0:42d47d159d5a 176 if(kinum+diferencia<0)
slorm 0:42d47d159d5a 177 {
slorm 0:42d47d159d5a 178 //No ocurre nada
slorm 0:42d47d159d5a 179 }
slorm 0:42d47d159d5a 180 else
slorm 0:42d47d159d5a 181 {
slorm 0:42d47d159d5a 182 kinum+=diferencia;
slorm 0:42d47d159d5a 183 lcd.locate(3,1);
slorm 0:42d47d159d5a 184 lcd.printf(" ");
slorm 0:42d47d159d5a 185 lcd.locate(3,1);
slorm 0:42d47d159d5a 186 lcd.printf("%d", kinum);
slorm 0:42d47d159d5a 187 }
slorm 0:42d47d159d5a 188 }
slorm 0:42d47d159d5a 189 else if(pos==4)
slorm 0:42d47d159d5a 190 {
slorm 0:42d47d159d5a 191 if(kdnum+diferencia<0)
slorm 0:42d47d159d5a 192 {
slorm 0:42d47d159d5a 193 //No ocurre nada
slorm 0:42d47d159d5a 194 }
slorm 0:42d47d159d5a 195 else
slorm 0:42d47d159d5a 196 {
slorm 0:42d47d159d5a 197 kdnum+=diferencia;
slorm 0:42d47d159d5a 198 lcd.locate(11,1);
slorm 0:42d47d159d5a 199 lcd.printf(" ");
slorm 0:42d47d159d5a 200 lcd.locate(11,1);
slorm 0:42d47d159d5a 201 lcd.printf("%d", kdnum);
slorm 0:42d47d159d5a 202 }
slorm 0:42d47d159d5a 203 }
slorm 0:42d47d159d5a 204 }
slorm 0:42d47d159d5a 205
slorm 0:42d47d159d5a 206 if (!button3) //cambia la posicion de ingreso de parametros
slorm 0:42d47d159d5a 207 {
slorm 0:42d47d159d5a 208 led3 =!led3;
slorm 0:42d47d159d5a 209 if(pos==4)
slorm 0:42d47d159d5a 210 {
slorm 0:42d47d159d5a 211 pos=1;
slorm 0:42d47d159d5a 212 lcd.locate(3,0);
slorm 0:42d47d159d5a 213 lcd.printf("%d", spnum);
slorm 0:42d47d159d5a 214 }
slorm 0:42d47d159d5a 215 else if (pos==1)
slorm 0:42d47d159d5a 216 {
slorm 0:42d47d159d5a 217 pos++;
slorm 0:42d47d159d5a 218 lcd.locate(11,0);
slorm 0:42d47d159d5a 219 lcd.printf("%d", kpnum);
slorm 0:42d47d159d5a 220 }
slorm 0:42d47d159d5a 221 else if(pos==2)
slorm 0:42d47d159d5a 222 {
slorm 0:42d47d159d5a 223 pos++;
slorm 0:42d47d159d5a 224 lcd.locate(3,1);
slorm 0:42d47d159d5a 225 lcd.printf("%d", kinum);
slorm 0:42d47d159d5a 226 }
slorm 0:42d47d159d5a 227 else if(pos==3)
slorm 0:42d47d159d5a 228 {
slorm 0:42d47d159d5a 229 pos++;
slorm 0:42d47d159d5a 230 lcd.locate(11,1);
slorm 0:42d47d159d5a 231 lcd.printf("%d", kdnum);
slorm 0:42d47d159d5a 232 }
slorm 0:42d47d159d5a 233 wait(0.25);
slorm 0:42d47d159d5a 234
slorm 0:42d47d159d5a 235 }
slorm 0:42d47d159d5a 236
slorm 0:42d47d159d5a 237 if (!button4)
slorm 0:42d47d159d5a 238 {
slorm 0:42d47d159d5a 239 break; //sale del bucle si pisan suiche4
slorm 0:42d47d159d5a 240 }
slorm 0:42d47d159d5a 241 wait(0.1);
slorm 0:42d47d159d5a 242 }
slorm 0:42d47d159d5a 243 lcd.cls();
slorm 0:42d47d159d5a 244 lcd.locate(8,0);
slorm 0:42d47d159d5a 245 lcd.printf("so=%d",sost);
slorm 0:42d47d159d5a 246 lcd.locate(0,1);
slorm 0:42d47d159d5a 247 lcd.printf("ba=%d",baj);
slorm 0:42d47d159d5a 248 lcd.locate(0,0);
slorm 0:42d47d159d5a 249 lcd.printf("su=%d",sub);
slorm 0:42d47d159d5a 250 wait(3);
slorm 0:42d47d159d5a 251 while (0.1)
slorm 0:42d47d159d5a 252 {
slorm 0:42d47d159d5a 253 diferencia=encoder.getPulses()-cambio;
slorm 0:42d47d159d5a 254 cambio=encoder.getPulses();
slorm 0:42d47d159d5a 255
slorm 0:42d47d159d5a 256 if (diferencia==0)
slorm 0:42d47d159d5a 257 {
slorm 0:42d47d159d5a 258 //nada
slorm 0:42d47d159d5a 259 }
slorm 0:42d47d159d5a 260 else if(diferencia>0)
slorm 0:42d47d159d5a 261 {
slorm 0:42d47d159d5a 262 if(pos1==1)
slorm 0:42d47d159d5a 263 {
slorm 0:42d47d159d5a 264 if(sub+diferencia>=59)
slorm 0:42d47d159d5a 265 {
slorm 0:42d47d159d5a 266 sub=59;
slorm 0:42d47d159d5a 267 lcd.locate(3,0);
slorm 0:42d47d159d5a 268 lcd.printf(" ");
slorm 0:42d47d159d5a 269 lcd.locate(3,0);
slorm 0:42d47d159d5a 270 lcd.printf("%d", sub);
slorm 0:42d47d159d5a 271 }
slorm 0:42d47d159d5a 272 else
slorm 0:42d47d159d5a 273 {
slorm 0:42d47d159d5a 274 sub+=diferencia;
slorm 0:42d47d159d5a 275 lcd.locate(3,0);
slorm 0:42d47d159d5a 276 lcd.printf("%d", sub);
slorm 0:42d47d159d5a 277 }
slorm 0:42d47d159d5a 278 }
slorm 0:42d47d159d5a 279 else if(pos1==2)
slorm 0:42d47d159d5a 280 {
slorm 0:42d47d159d5a 281 if(sost+diferencia>=59)
slorm 0:42d47d159d5a 282 {
slorm 0:42d47d159d5a 283 sost=59;
slorm 0:42d47d159d5a 284 lcd.locate(11,0);
slorm 0:42d47d159d5a 285 lcd.printf(" ");
slorm 0:42d47d159d5a 286 lcd.locate(11,0);
slorm 0:42d47d159d5a 287 lcd.printf("%d", sost);
slorm 0:42d47d159d5a 288 }
slorm 0:42d47d159d5a 289 else
slorm 0:42d47d159d5a 290 {
slorm 0:42d47d159d5a 291 sost+=diferencia;
slorm 0:42d47d159d5a 292 lcd.locate(11,0);
slorm 0:42d47d159d5a 293 lcd.printf("%d", sost);
slorm 0:42d47d159d5a 294 }
slorm 0:42d47d159d5a 295 }
slorm 0:42d47d159d5a 296 else if(pos1==3)
slorm 0:42d47d159d5a 297 {
slorm 0:42d47d159d5a 298 if(baj+diferencia>=59)
slorm 0:42d47d159d5a 299 {
slorm 0:42d47d159d5a 300 baj=59;
slorm 0:42d47d159d5a 301 lcd.locate(3,1);
slorm 0:42d47d159d5a 302 lcd.printf(" ");
slorm 0:42d47d159d5a 303 lcd.locate(3,1);
slorm 0:42d47d159d5a 304 lcd.printf("%d", baj);
slorm 0:42d47d159d5a 305 }
slorm 0:42d47d159d5a 306 else
slorm 0:42d47d159d5a 307 {
slorm 0:42d47d159d5a 308 baj+=diferencia;
slorm 0:42d47d159d5a 309 lcd.locate(3,1);
slorm 0:42d47d159d5a 310 lcd.printf("%d", baj);
slorm 0:42d47d159d5a 311 }
slorm 0:42d47d159d5a 312 }
slorm 0:42d47d159d5a 313 }
slorm 0:42d47d159d5a 314
slorm 0:42d47d159d5a 315 else if(diferencia<0)
slorm 0:42d47d159d5a 316 {
slorm 0:42d47d159d5a 317 if(pos1==1)
slorm 0:42d47d159d5a 318 {
slorm 0:42d47d159d5a 319 if(sub+diferencia<0)
slorm 0:42d47d159d5a 320 {
slorm 0:42d47d159d5a 321 //No ocurre nada
slorm 0:42d47d159d5a 322 }
slorm 0:42d47d159d5a 323 else
slorm 0:42d47d159d5a 324 {
slorm 0:42d47d159d5a 325 sub+=diferencia;
slorm 0:42d47d159d5a 326 lcd.locate(3,0);
slorm 0:42d47d159d5a 327 lcd.printf(" ");
slorm 0:42d47d159d5a 328 lcd.locate(3,0);
slorm 0:42d47d159d5a 329 lcd.printf("%d", sub);
slorm 0:42d47d159d5a 330 }
slorm 0:42d47d159d5a 331 }
slorm 0:42d47d159d5a 332 else if(pos1==2)
slorm 0:42d47d159d5a 333 {
slorm 0:42d47d159d5a 334 if(sost+diferencia<0)
slorm 0:42d47d159d5a 335 {
slorm 0:42d47d159d5a 336 //No ocurre nada
slorm 0:42d47d159d5a 337 }
slorm 0:42d47d159d5a 338 else
slorm 0:42d47d159d5a 339 {
slorm 0:42d47d159d5a 340 sost+=diferencia;
slorm 0:42d47d159d5a 341 lcd.locate(11,0);
slorm 0:42d47d159d5a 342 lcd.printf(" ");
slorm 0:42d47d159d5a 343 lcd.locate(11,0);
slorm 0:42d47d159d5a 344 lcd.printf("%d", sost);
slorm 0:42d47d159d5a 345 }
slorm 0:42d47d159d5a 346 }
slorm 0:42d47d159d5a 347 else if(pos1==3)
slorm 0:42d47d159d5a 348 {
slorm 0:42d47d159d5a 349 if(baj+diferencia<0)
slorm 0:42d47d159d5a 350 {
slorm 0:42d47d159d5a 351 //No ocurre nada
slorm 0:42d47d159d5a 352 }
slorm 0:42d47d159d5a 353 else
slorm 0:42d47d159d5a 354 {
slorm 0:42d47d159d5a 355 baj+=diferencia;
slorm 0:42d47d159d5a 356 lcd.locate(3,1);
slorm 0:42d47d159d5a 357 lcd.printf(" ");
slorm 0:42d47d159d5a 358 lcd.locate(3,1);
slorm 0:42d47d159d5a 359 lcd.printf("%d", baj);
slorm 0:42d47d159d5a 360 }
slorm 0:42d47d159d5a 361 }
slorm 0:42d47d159d5a 362
slorm 0:42d47d159d5a 363 }
slorm 0:42d47d159d5a 364
slorm 0:42d47d159d5a 365 if (!button3) //cambia la posicion de ingreso de parametros
slorm 0:42d47d159d5a 366 {
slorm 0:42d47d159d5a 367 led3 =!led3;
slorm 0:42d47d159d5a 368 if(pos1==3)
slorm 0:42d47d159d5a 369 {
slorm 0:42d47d159d5a 370 pos1=1;
slorm 0:42d47d159d5a 371 lcd.locate(3,0);
slorm 0:42d47d159d5a 372 lcd.printf("%d", sub);
slorm 0:42d47d159d5a 373 }
slorm 0:42d47d159d5a 374 else if (pos1==1)
slorm 0:42d47d159d5a 375 {
slorm 0:42d47d159d5a 376 pos1++;
slorm 0:42d47d159d5a 377 lcd.locate(11,0);
slorm 0:42d47d159d5a 378 lcd.printf("%d", sost);
slorm 0:42d47d159d5a 379 }
slorm 0:42d47d159d5a 380 else if(pos1==2)
slorm 0:42d47d159d5a 381 {
slorm 0:42d47d159d5a 382 pos1++;
slorm 0:42d47d159d5a 383 lcd.locate(3,1);
slorm 0:42d47d159d5a 384 lcd.printf("%d", baj);
slorm 0:42d47d159d5a 385 }
slorm 0:42d47d159d5a 386 wait(0.25);
slorm 0:42d47d159d5a 387
slorm 0:42d47d159d5a 388 }
slorm 0:42d47d159d5a 389
slorm 0:42d47d159d5a 390 if (!button4)
slorm 0:42d47d159d5a 391 {
slorm 0:42d47d159d5a 392 break; //sale del bucle si pisan suiche4
slorm 0:42d47d159d5a 393 }
slorm 0:42d47d159d5a 394 wait(0.1);
slorm 0:42d47d159d5a 395 }
slorm 0:42d47d159d5a 396
slorm 0:42d47d159d5a 397 //Transicion
slorm 0:42d47d159d5a 398 lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo
slorm 0:42d47d159d5a 399 lcd.cls(); //borra la pantalla
slorm 0:42d47d159d5a 400 lcd.printf(" GUARDADOS!");
slorm 0:42d47d159d5a 401 Rtc_Ds1307::Time_rtc tm = {};
slorm 0:42d47d159d5a 402 tm.min=0;
slorm 0:42d47d159d5a 403 tm.sec=0;
slorm 0:42d47d159d5a 404 t1=sub*60;
slorm 0:42d47d159d5a 405 t2=(sost+sub)*60;
slorm 0:42d47d159d5a 406 t3=(sub+sost+baj)*60;
slorm 0:42d47d159d5a 407 rtc.setTime(tm, false, false);
slorm 0:42d47d159d5a 408 wait(1);
slorm 0:42d47d159d5a 409 lcd.cls();
slorm 0:42d47d159d5a 410 lcd.printf(" INICIA EL PID");
slorm 0:42d47d159d5a 411 wait(1);
slorm 0:42d47d159d5a 412 rtc.startClock();
slorm 0:42d47d159d5a 413 // se imprimen los parches del control *****************************************
slorm 0:42d47d159d5a 414 lcd.cls();
slorm 0:42d47d159d5a 415 lcd.printf("Er=%3.0f",err);
slorm 0:42d47d159d5a 416 lcd.locate(8,0);
slorm 0:42d47d159d5a 417 lcd.printf("Me=%3.0f",med);
slorm 0:42d47d159d5a 418 lcd.locate(0,1);
slorm 0:42d47d159d5a 419 lcd.printf("Sp=%3.0f",spnum);
slorm 0:42d47d159d5a 420 lcd.locate(8,1);
slorm 0:42d47d159d5a 421 lcd.printf("tm=%02d",tm.min);
slorm 0:42d47d159d5a 422 lcd.printf(":%02d",tm.sec);
slorm 0:42d47d159d5a 423 wait(1);
slorm 0:42d47d159d5a 424
slorm 0:42d47d159d5a 425 // CICLO PRINCIPAL CONTROLADOR PID
slorm 0:42d47d159d5a 426 lop1:
slorm 0:42d47d159d5a 427 rtc.getTime(tm);
slorm 0:42d47d159d5a 428 if(c1<t1)
slorm 0:42d47d159d5a 429 {
slorm 0:42d47d159d5a 430 f=spnum/float(sub*60);
slorm 0:42d47d159d5a 431 ref=f*float(c1);
slorm 0:42d47d159d5a 432 }
slorm 0:42d47d159d5a 433 if((c1>=t1)&&(c1<t2))
slorm 0:42d47d159d5a 434 {
slorm 0:42d47d159d5a 435 ref=spnum;
slorm 0:42d47d159d5a 436 }
slorm 0:42d47d159d5a 437 if((c1>=t2)&&(c1<t3))
slorm 0:42d47d159d5a 438 {
slorm 0:42d47d159d5a 439 f=-spnum/float(baj*60);
slorm 0:42d47d159d5a 440 ref=f*float(c1-t2)+spnum;
slorm 0:42d47d159d5a 441 }
slorm 0:42d47d159d5a 442 if (c1>=t3)
slorm 0:42d47d159d5a 443 {
slorm 0:42d47d159d5a 444 ref=0;
slorm 0:42d47d159d5a 445 }
slorm 0:42d47d159d5a 446 med = y.read()*999;
slorm 0:42d47d159d5a 447 err = (ref-med); //se calcula el error
slorm 0:42d47d159d5a 448 ap = kpnum*err*0.01f; //se calcula la accion proporcinal
slorm 0:42d47d159d5a 449 ai =(kinum*err*0.01f)+ai; //calculo de la integral del error
slorm 0:42d47d159d5a 450 ad = kdnum*(err-err_v)*0.01f; //calculo de la accion derivativa
slorm 0:42d47d159d5a 451 pid = (ap+ai+ad);
slorm 0:42d47d159d5a 452 // se verifica que pid sea positivo **************************************
slorm 0:42d47d159d5a 453 if(pid<=0)
slorm 0:42d47d159d5a 454 {
slorm 0:42d47d159d5a 455 pid=0;
slorm 0:42d47d159d5a 456 }
slorm 0:42d47d159d5a 457
slorm 0:42d47d159d5a 458 // se verifica que pid sea menor o igual la valor maximo *****************
slorm 0:42d47d159d5a 459 if (pid > 999)
slorm 0:42d47d159d5a 460 {
slorm 0:42d47d159d5a 461 pid=999;
slorm 0:42d47d159d5a 462 }
slorm 0:42d47d159d5a 463 //contador
slorm 0:42d47d159d5a 464 if ((tm.sec==0)&&(tm.min!=0))
slorm 0:42d47d159d5a 465 {
slorm 0:42d47d159d5a 466 n=n+60;
slorm 0:42d47d159d5a 467 wait(1);
slorm 0:42d47d159d5a 468 }
slorm 0:42d47d159d5a 469 c1=n+tm.sec-60;
slorm 0:42d47d159d5a 470 //se muestran las variables******************************************
slorm 0:42d47d159d5a 471 lcd.locate(3,0);
slorm 0:42d47d159d5a 472 lcd.printf(" ");
slorm 0:42d47d159d5a 473 lcd.locate(3,0);
slorm 0:42d47d159d5a 474 lcd.printf("%3.0f",err);
slorm 0:42d47d159d5a 475 lcd.locate(11,0);
slorm 0:42d47d159d5a 476 lcd.printf(" ");
slorm 0:42d47d159d5a 477 lcd.locate(11,0);
slorm 0:42d47d159d5a 478 lcd.printf("%3.0f",med);
slorm 0:42d47d159d5a 479 lcd.locate(3,1);
slorm 0:42d47d159d5a 480 lcd.printf(" ");
slorm 0:42d47d159d5a 481 lcd.locate(3,1);
slorm 0:42d47d159d5a 482 lcd.printf("%3.0f",ref);
slorm 0:42d47d159d5a 483 lcd.locate(11,1);
slorm 0:42d47d159d5a 484 lcd.printf(" ");
slorm 0:42d47d159d5a 485 lcd.locate(11,1);
slorm 0:42d47d159d5a 486 lcd.printf("%02d",tm.min);
slorm 0:42d47d159d5a 487 lcd.printf(":%02d",tm.sec);
slorm 0:42d47d159d5a 488
slorm 0:42d47d159d5a 489
slorm 0:42d47d159d5a 490
slorm 0:42d47d159d5a 491
slorm 0:42d47d159d5a 492 //Normalizacion de la salida
slorm 0:42d47d159d5a 493 // se actualizan las variables *******************************************
slorm 0:42d47d159d5a 494 err_v = err;
slorm 0:42d47d159d5a 495 o = pid/999;
slorm 0:42d47d159d5a 496 u.write(o);
slorm 0:42d47d159d5a 497 // se envia el valor pid a puerto analogico de salida (D/A) **************
slorm 0:42d47d159d5a 498 wait(0.1);
slorm 0:42d47d159d5a 499 // se repite el ciclo
slorm 0:42d47d159d5a 500 goto lop1;
slorm 0:42d47d159d5a 501 }