![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
main.cpp@0:42d47d159d5a, 2018-06-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |