Control PID para horno de reflujo con seguimiento de consigna

Dependencies:   Debounced Pulse1 QEI RTC-DS1307 TextLCD mbed

Fork of Tarea3_procesadores_Ds1307 by Camilo Londoño

Tarea 4 procesadores 2018-1

Juan Camilo Londoño Julieta Serrano Escalante

PID para horno de reflujo conseguimiento de consigna

/media/uploads/jclondonol/4.jpg

Committer:
jclondonol
Date:
Fri Jun 01 21:58:03 2018 +0000
Revision:
3:35a40be1047f
Parent:
2:bef1b1c9e387
Tarea 4 Control PID para horno de reflujo con seguimiento de consigna

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jepalacioh 0:c2ed510ee88d 1 #include "mbed.h"
Jepalacioh 0:c2ed510ee88d 2 #include "DebouncedIn.h"
Jepalacioh 0:c2ed510ee88d 3 #include "TextLCD.h"
Jepalacioh 0:c2ed510ee88d 4 #include "QEI.h"
Jepalacioh 0:c2ed510ee88d 5 #include "Rtc_Ds1307.h"
jclondonol 2:bef1b1c9e387 6 #include <Pulse1.h>
Jepalacioh 0:c2ed510ee88d 7
jclondonol 3:35a40be1047f 8 TextLCD lcd(PTE20, PTB1, PTB2, PTB3, PTC2, PTE21); // rs, e, d4, d5, d6, d7
Jepalacioh 0:c2ed510ee88d 9 Rtc_Ds1307 rtc(PTE0, PTE1);
jclondonol 2:bef1b1c9e387 10 QEI wheel (PTD7, PTD6, NC, 30);
Jepalacioh 0:c2ed510ee88d 11 DebouncedIn button_enco(PTC5);
jclondonol 3:35a40be1047f 12 PwmOut U_pwm(PTE29);
jclondonol 3:35a40be1047f 13 AnalogOut U_analog(PTE30);
jclondonol 3:35a40be1047f 14 AnalogIn Y(A0);
jclondonol 3:35a40be1047f 15 DigitalOut pwm_analog(PTC6);
jclondonol 2:bef1b1c9e387 16
Jepalacioh 0:c2ed510ee88d 17
Jepalacioh 0:c2ed510ee88d 18 int main()
Jepalacioh 0:c2ed510ee88d 19 {
jclondonol 3:35a40be1047f 20 int C1 = 0x0C;
jclondonol 3:35a40be1047f 21 int m = 0;
jclondonol 3:35a40be1047f 22 int Lugar = 0; // Definen el punto en el cual va el programa
jclondonol 3:35a40be1047f 23 int i = 0;
jclondonol 3:35a40be1047f 24 int pos = 0;
jclondonol 3:35a40be1047f 25 int Kp = 1, Ki = 1, Kd = 1, Sp = 0;
jclondonol 3:35a40be1047f 26 float sp_temp = 0;
jclondonol 3:35a40be1047f 27 float T1 = 0.1, T2 = 0.1, T3 = 0.1;
jclondonol 3:35a40be1047f 28 int flag_pwm = 0;
jclondonol 3:35a40be1047f 29 float periodo;
jclondonol 3:35a40be1047f 30 float Frecuencia = 2000;
jclondonol 3:35a40be1047f 31 float pid = 0,ai = 0,ad = 0,ap = 0,med = 0,err = 0;
jclondonol 3:35a40be1047f 32 float err_v;
jclondonol 3:35a40be1047f 33 int tiempo = 0, sec = 0, sec_ant = 0;
jclondonol 3:35a40be1047f 34
Jepalacioh 0:c2ed510ee88d 35 Rtc_Ds1307::Time_rtc tm = {};
Jepalacioh 0:c2ed510ee88d 36 lcd.cls();
Jepalacioh 0:c2ed510ee88d 37 lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD
Jepalacioh 0:c2ed510ee88d 38 lcd.locate(0,0);
jclondonol 3:35a40be1047f 39 rtc.getTime(tm);
Jepalacioh 0:c2ed510ee88d 40 periodo=(1/Frecuencia);
jclondonol 3:35a40be1047f 41 U_pwm.period(periodo);
jclondonol 3:35a40be1047f 42 U_pwm.pulsewidth(0);
jclondonol 3:35a40be1047f 43 U_analog = 0.0;
jclondonol 3:35a40be1047f 44 pwm_analog = 0;
jclondonol 3:35a40be1047f 45
Jepalacioh 0:c2ed510ee88d 46
Jepalacioh 0:c2ed510ee88d 47 while(1)
Jepalacioh 0:c2ed510ee88d 48 {
Jepalacioh 0:c2ed510ee88d 49 switch (Lugar)
jclondonol 2:bef1b1c9e387 50 {
jclondonol 3:35a40be1047f 51 case 0: // Seleccionar Configuracion
jclondonol 2:bef1b1c9e387 52 m = wheel.getPulses();
jclondonol 2:bef1b1c9e387 53 if(m != 0)
jclondonol 2:bef1b1c9e387 54 {
jclondonol 2:bef1b1c9e387 55 wheel.reset();
jclondonol 2:bef1b1c9e387 56 pos = pos + m;
jclondonol 2:bef1b1c9e387 57 m = 0;
jclondonol 2:bef1b1c9e387 58 lcd.cls();
jclondonol 2:bef1b1c9e387 59 }
jclondonol 3:35a40be1047f 60 if(pos > 3){pos = 0;}
jclondonol 3:35a40be1047f 61 if(pos < 0){pos = 3;}
Jepalacioh 0:c2ed510ee88d 62
jclondonol 3:35a40be1047f 63 switch(pos)
jclondonol 2:bef1b1c9e387 64 {
jclondonol 3:35a40be1047f 65 case 0:
jclondonol 3:35a40be1047f 66 lcd.locate(0,0);
jclondonol 3:35a40be1047f 67 lcd.printf("Kp: %03d", Kp);
jclondonol 3:35a40be1047f 68 lcd.locate(8,0);
jclondonol 3:35a40be1047f 69 lcd.printf("Ki: %03d", Ki);
jclondonol 3:35a40be1047f 70 lcd.locate(0,1);
jclondonol 3:35a40be1047f 71 lcd.printf("Kd: %03d", Kd);
jclondonol 3:35a40be1047f 72 lcd.locate(8,1);
jclondonol 3:35a40be1047f 73 lcd.printf("Sp: %03d", Sp);
jclondonol 3:35a40be1047f 74 wait(0.1);
jclondonol 3:35a40be1047f 75 break;
jclondonol 3:35a40be1047f 76 case 1:
jclondonol 2:bef1b1c9e387 77 lcd.locate(0,0);
jclondonol 3:35a40be1047f 78 lcd.printf("T1: %0.1f", T1);
jclondonol 3:35a40be1047f 79 lcd.locate(8,0);
jclondonol 3:35a40be1047f 80 lcd.printf("T2: %0.1f", T2);
jclondonol 3:35a40be1047f 81 lcd.locate(0,1);
jclondonol 3:35a40be1047f 82 lcd.printf("T3: %0.1f", T3);
jclondonol 3:35a40be1047f 83 lcd.locate(8,1);
jclondonol 3:35a40be1047f 84 lcd.printf("(min)");
jclondonol 3:35a40be1047f 85 wait(0.1);
jclondonol 3:35a40be1047f 86 break;
jclondonol 3:35a40be1047f 87 case 2:
jclondonol 3:35a40be1047f 88 lcd.locate(0,0);
jclondonol 3:35a40be1047f 89 lcd.printf("Setup Out");
jclondonol 2:bef1b1c9e387 90 lcd.locate(0,1);
jclondonol 3:35a40be1047f 91 if(flag_pwm == 0)
jclondonol 3:35a40be1047f 92 {
jclondonol 3:35a40be1047f 93 lcd.printf("-> Pwm -- Analog");
jclondonol 3:35a40be1047f 94 }
jclondonol 3:35a40be1047f 95 else
jclondonol 3:35a40be1047f 96 {
jclondonol 3:35a40be1047f 97 lcd.printf("-- Pwm -> Analog");
jclondonol 3:35a40be1047f 98 }
jclondonol 3:35a40be1047f 99 break;
jclondonol 3:35a40be1047f 100 case 3:
jclondonol 3:35a40be1047f 101 lcd.locate(0,0);
jclondonol 3:35a40be1047f 102 lcd.printf("Start PID");
jclondonol 3:35a40be1047f 103 break;
jclondonol 2:bef1b1c9e387 104 }
jclondonol 2:bef1b1c9e387 105
jclondonol 2:bef1b1c9e387 106 if (button_enco.falling()) //si se pulsa boton encoder
jclondonol 2:bef1b1c9e387 107 {
jclondonol 3:35a40be1047f 108 if(pos == 0)
jclondonol 3:35a40be1047f 109 {
jclondonol 3:35a40be1047f 110 Lugar = 1;
jclondonol 3:35a40be1047f 111 i = 0;
jclondonol 3:35a40be1047f 112 lcd.cls();
jclondonol 3:35a40be1047f 113 lcd.locate(0,0);
jclondonol 3:35a40be1047f 114 lcd.printf("Kp: ");
jclondonol 3:35a40be1047f 115 }
jclondonol 3:35a40be1047f 116 if(pos == 1)
jclondonol 3:35a40be1047f 117 {
jclondonol 3:35a40be1047f 118 Lugar = 2;
jclondonol 3:35a40be1047f 119 i = 0;
jclondonol 3:35a40be1047f 120 lcd.cls();
jclondonol 3:35a40be1047f 121 lcd.locate(0,0);
jclondonol 3:35a40be1047f 122 lcd.printf("T1: ");
jclondonol 3:35a40be1047f 123 }
jclondonol 3:35a40be1047f 124 if(pos == 2)
jclondonol 3:35a40be1047f 125 {
jclondonol 3:35a40be1047f 126 Lugar = 3;
jclondonol 3:35a40be1047f 127 }
jclondonol 3:35a40be1047f 128 if(pos == 3)
jclondonol 3:35a40be1047f 129 {
jclondonol 3:35a40be1047f 130 Lugar = 4;
jclondonol 3:35a40be1047f 131 lcd.cls();
jclondonol 3:35a40be1047f 132 tm.min = 0;
jclondonol 3:35a40be1047f 133 tm.sec = 0;
jclondonol 3:35a40be1047f 134 tm.hour = 1;
jclondonol 3:35a40be1047f 135 tm.mon = 1;
jclondonol 3:35a40be1047f 136 tm.date = 1;
jclondonol 3:35a40be1047f 137 tm.year = 2018;
jclondonol 3:35a40be1047f 138 rtc.setTime(tm, false, false);
jclondonol 3:35a40be1047f 139
jclondonol 3:35a40be1047f 140 rtc.startClock();
jclondonol 3:35a40be1047f 141 lcd.locate(0,1);
jclondonol 3:35a40be1047f 142 lcd.printf("Time: ");
jclondonol 3:35a40be1047f 143 }
jclondonol 2:bef1b1c9e387 144 }
jclondonol 2:bef1b1c9e387 145
Jepalacioh 0:c2ed510ee88d 146 break;
Jepalacioh 0:c2ed510ee88d 147
jclondonol 3:35a40be1047f 148 case 1: // Configurar Constantes
Jepalacioh 0:c2ed510ee88d 149 switch(i)
jclondonol 3:35a40be1047f 150 {
jclondonol 3:35a40be1047f 151 case 0: // Establecer Kp
jclondonol 2:bef1b1c9e387 152 m = wheel.getPulses();
jclondonol 2:bef1b1c9e387 153 if (m != 0)
Jepalacioh 0:c2ed510ee88d 154 {
jclondonol 3:35a40be1047f 155 Kp = Kp + m;
jclondonol 3:35a40be1047f 156 if(Kp > 99)
Jepalacioh 0:c2ed510ee88d 157 {
jclondonol 3:35a40be1047f 158 Kp = 0;
Jepalacioh 0:c2ed510ee88d 159 }
jclondonol 3:35a40be1047f 160 if(Kp < 0)
Jepalacioh 0:c2ed510ee88d 161 {
jclondonol 3:35a40be1047f 162 Kp = 99;
Jepalacioh 0:c2ed510ee88d 163 }
Jepalacioh 0:c2ed510ee88d 164 wheel.reset();
jclondonol 2:bef1b1c9e387 165 m = 0;
Jepalacioh 0:c2ed510ee88d 166 }
jclondonol 3:35a40be1047f 167 lcd.locate(4,0);
jclondonol 3:35a40be1047f 168 lcd.printf("%03d",Kp);
Jepalacioh 0:c2ed510ee88d 169
Jepalacioh 0:c2ed510ee88d 170 if (button_enco.falling())
Jepalacioh 0:c2ed510ee88d 171 {
Jepalacioh 0:c2ed510ee88d 172 i++;
Jepalacioh 0:c2ed510ee88d 173 lcd.cls();
Jepalacioh 0:c2ed510ee88d 174 lcd.locate(0,0);
jclondonol 3:35a40be1047f 175 lcd.printf("Ki: ");
Jepalacioh 0:c2ed510ee88d 176 }
Jepalacioh 0:c2ed510ee88d 177 break;
Jepalacioh 0:c2ed510ee88d 178
jclondonol 3:35a40be1047f 179 case 1: // Establecer Ki
jclondonol 2:bef1b1c9e387 180 m = wheel.getPulses();
jclondonol 2:bef1b1c9e387 181 if (m != 0)
Jepalacioh 0:c2ed510ee88d 182 {
jclondonol 3:35a40be1047f 183 Ki = Ki + m;
jclondonol 3:35a40be1047f 184 if(Ki > 99)
Jepalacioh 0:c2ed510ee88d 185 {
jclondonol 3:35a40be1047f 186 Ki = 0;
Jepalacioh 0:c2ed510ee88d 187 }
jclondonol 3:35a40be1047f 188 if(Ki < 0)
Jepalacioh 0:c2ed510ee88d 189 {
jclondonol 3:35a40be1047f 190 Ki = 99;
Jepalacioh 0:c2ed510ee88d 191 }
Jepalacioh 0:c2ed510ee88d 192 wheel.reset();
jclondonol 2:bef1b1c9e387 193 m = 0;
Jepalacioh 0:c2ed510ee88d 194 }
jclondonol 3:35a40be1047f 195 lcd.locate(4,0);
jclondonol 3:35a40be1047f 196 lcd.printf("%03d",Ki);
Jepalacioh 0:c2ed510ee88d 197
Jepalacioh 0:c2ed510ee88d 198 if (button_enco.falling())
Jepalacioh 0:c2ed510ee88d 199 {
Jepalacioh 0:c2ed510ee88d 200 i++;
Jepalacioh 0:c2ed510ee88d 201 lcd.cls();
Jepalacioh 0:c2ed510ee88d 202 lcd.locate(0,0);
jclondonol 3:35a40be1047f 203 lcd.printf("Kd: ");
Jepalacioh 0:c2ed510ee88d 204 }
Jepalacioh 0:c2ed510ee88d 205 break;
Jepalacioh 0:c2ed510ee88d 206
jclondonol 3:35a40be1047f 207 case 2: // Establecer Kd
jclondonol 2:bef1b1c9e387 208 m = wheel.getPulses();
jclondonol 2:bef1b1c9e387 209 if (m != 0)
Jepalacioh 0:c2ed510ee88d 210 {
jclondonol 3:35a40be1047f 211 Kd = Kd + m;
jclondonol 3:35a40be1047f 212 if(Kd > 99)
Jepalacioh 0:c2ed510ee88d 213 {
jclondonol 3:35a40be1047f 214 Kd = 0;
jclondonol 3:35a40be1047f 215 }
jclondonol 3:35a40be1047f 216 if(Kd < 0)
jclondonol 3:35a40be1047f 217 {
jclondonol 3:35a40be1047f 218 Kd = 99;
Jepalacioh 0:c2ed510ee88d 219 }
Jepalacioh 0:c2ed510ee88d 220 wheel.reset();
jclondonol 2:bef1b1c9e387 221 m = 0;
Jepalacioh 0:c2ed510ee88d 222 }
jclondonol 3:35a40be1047f 223 lcd.locate(4,0);
jclondonol 3:35a40be1047f 224 lcd.printf("%03d",Kd);
Jepalacioh 0:c2ed510ee88d 225
Jepalacioh 0:c2ed510ee88d 226 if (button_enco.falling())
Jepalacioh 0:c2ed510ee88d 227 {
Jepalacioh 0:c2ed510ee88d 228 i++;
Jepalacioh 0:c2ed510ee88d 229 lcd.cls();
Jepalacioh 0:c2ed510ee88d 230 lcd.locate(0,0);
jclondonol 3:35a40be1047f 231 lcd.printf("Sp: ");
Jepalacioh 0:c2ed510ee88d 232 }
Jepalacioh 0:c2ed510ee88d 233 break;
Jepalacioh 0:c2ed510ee88d 234
jclondonol 3:35a40be1047f 235 case 3: // Establecer Sp
jclondonol 2:bef1b1c9e387 236 m = wheel.getPulses();
jclondonol 2:bef1b1c9e387 237 if (m != 0)
Jepalacioh 0:c2ed510ee88d 238 {
jclondonol 3:35a40be1047f 239 Sp = Sp + m*1;
jclondonol 3:35a40be1047f 240 if(Sp > 100)
Jepalacioh 0:c2ed510ee88d 241 {
jclondonol 3:35a40be1047f 242 Sp = 0;
Jepalacioh 0:c2ed510ee88d 243 }
jclondonol 3:35a40be1047f 244 if(Sp < 0)
Jepalacioh 0:c2ed510ee88d 245 {
jclondonol 3:35a40be1047f 246 Sp = 100;
Jepalacioh 0:c2ed510ee88d 247 }
Jepalacioh 0:c2ed510ee88d 248 wheel.reset();
jclondonol 2:bef1b1c9e387 249 m = 0;
Jepalacioh 0:c2ed510ee88d 250 }
jclondonol 3:35a40be1047f 251 lcd.locate(4,0);
jclondonol 3:35a40be1047f 252 lcd.printf("%03d",Sp);
jclondonol 3:35a40be1047f 253
jclondonol 3:35a40be1047f 254 if (button_enco.falling())
jclondonol 3:35a40be1047f 255 {
jclondonol 3:35a40be1047f 256 lcd.cls();
jclondonol 3:35a40be1047f 257 lcd.locate(0, 0);
jclondonol 3:35a40be1047f 258 lcd.printf("Parameters Set");
jclondonol 3:35a40be1047f 259 wait(1);
jclondonol 3:35a40be1047f 260 i = 0;
jclondonol 3:35a40be1047f 261 Lugar = 0;
jclondonol 3:35a40be1047f 262 lcd.cls();
jclondonol 3:35a40be1047f 263 }
jclondonol 3:35a40be1047f 264
jclondonol 3:35a40be1047f 265 break;
jclondonol 3:35a40be1047f 266 }
jclondonol 3:35a40be1047f 267 break;
jclondonol 3:35a40be1047f 268
jclondonol 3:35a40be1047f 269
jclondonol 3:35a40be1047f 270 case 2: // Configurar Tiempos
jclondonol 3:35a40be1047f 271 switch(i)
jclondonol 3:35a40be1047f 272 {
jclondonol 3:35a40be1047f 273 case 0: // Establecer T1
jclondonol 3:35a40be1047f 274 m = wheel.getPulses();
jclondonol 3:35a40be1047f 275 if (m != 0)
jclondonol 3:35a40be1047f 276 {
jclondonol 3:35a40be1047f 277 T1 = T1 + m*0.1;
jclondonol 3:35a40be1047f 278 if(T1 > 5.0)
jclondonol 3:35a40be1047f 279 {
jclondonol 3:35a40be1047f 280 T1 = 0.1;
jclondonol 3:35a40be1047f 281 }
jclondonol 3:35a40be1047f 282 if(T1 < 0.1)
jclondonol 3:35a40be1047f 283 {
jclondonol 3:35a40be1047f 284 T1 = 5.0;
jclondonol 3:35a40be1047f 285 }
jclondonol 3:35a40be1047f 286 wheel.reset();
jclondonol 3:35a40be1047f 287 m = 0;
jclondonol 3:35a40be1047f 288 }
jclondonol 3:35a40be1047f 289 lcd.locate(4,0);
jclondonol 3:35a40be1047f 290 lcd.printf("%0.1f (min)",T1);
Jepalacioh 0:c2ed510ee88d 291
Jepalacioh 0:c2ed510ee88d 292 if (button_enco.falling())
Jepalacioh 0:c2ed510ee88d 293 {
Jepalacioh 0:c2ed510ee88d 294 i++;
Jepalacioh 0:c2ed510ee88d 295 lcd.cls();
Jepalacioh 0:c2ed510ee88d 296 lcd.locate(0,0);
jclondonol 3:35a40be1047f 297 lcd.printf("T2: ");
jclondonol 3:35a40be1047f 298 T2 = T1 + 0.1;
Jepalacioh 0:c2ed510ee88d 299 }
Jepalacioh 0:c2ed510ee88d 300 break;
Jepalacioh 0:c2ed510ee88d 301
jclondonol 3:35a40be1047f 302 case 1: // Establecer T2
jclondonol 2:bef1b1c9e387 303 m = wheel.getPulses();
jclondonol 2:bef1b1c9e387 304 if (m != 0)
Jepalacioh 0:c2ed510ee88d 305 {
jclondonol 3:35a40be1047f 306 T2 = T2 + m*0.1;
jclondonol 3:35a40be1047f 307 if(T2 > 5.0)
Jepalacioh 0:c2ed510ee88d 308 {
jclondonol 3:35a40be1047f 309 T2 = T1 + 0.1;
Jepalacioh 0:c2ed510ee88d 310 }
jclondonol 3:35a40be1047f 311 if(T2 < (T1 + 0.1))
Jepalacioh 0:c2ed510ee88d 312 {
jclondonol 3:35a40be1047f 313 T2 = 5.0;
Jepalacioh 0:c2ed510ee88d 314 }
Jepalacioh 0:c2ed510ee88d 315 wheel.reset();
jclondonol 2:bef1b1c9e387 316 m = 0;
Jepalacioh 0:c2ed510ee88d 317 }
jclondonol 3:35a40be1047f 318 lcd.locate(4,0);
jclondonol 3:35a40be1047f 319 lcd.printf("%0.1f (min)",T2);
Jepalacioh 0:c2ed510ee88d 320
Jepalacioh 0:c2ed510ee88d 321 if (button_enco.falling())
Jepalacioh 0:c2ed510ee88d 322 {
jclondonol 3:35a40be1047f 323 i++;
jclondonol 3:35a40be1047f 324 lcd.cls();
jclondonol 3:35a40be1047f 325 lcd.locate(0,0);
jclondonol 3:35a40be1047f 326 lcd.printf("T3: ");
jclondonol 3:35a40be1047f 327 T3 = T2 + 0.1;
jclondonol 3:35a40be1047f 328 }
jclondonol 3:35a40be1047f 329 break;
jclondonol 3:35a40be1047f 330
jclondonol 3:35a40be1047f 331 case 2: // Establecer T3
jclondonol 3:35a40be1047f 332 m = wheel.getPulses();
jclondonol 3:35a40be1047f 333 if (m != 0)
jclondonol 3:35a40be1047f 334 {
jclondonol 3:35a40be1047f 335 T3 = T3 + m*0.1;
jclondonol 3:35a40be1047f 336 if(T3 > 5.0)
Jepalacioh 0:c2ed510ee88d 337 {
jclondonol 3:35a40be1047f 338 T3 = T2 + 0.1;
jclondonol 3:35a40be1047f 339 }
jclondonol 3:35a40be1047f 340 if(T3 < (T2 + 0.1))
jclondonol 3:35a40be1047f 341 {
jclondonol 3:35a40be1047f 342 T3 = 5.0;
jclondonol 3:35a40be1047f 343 }
jclondonol 3:35a40be1047f 344 wheel.reset();
jclondonol 3:35a40be1047f 345 m = 0;
jclondonol 3:35a40be1047f 346 }
jclondonol 3:35a40be1047f 347 lcd.locate(4,0);
jclondonol 3:35a40be1047f 348 lcd.printf("%0.1f (min)",T3);
jclondonol 3:35a40be1047f 349
jclondonol 3:35a40be1047f 350 if (button_enco.falling())
jclondonol 3:35a40be1047f 351 {
Jepalacioh 0:c2ed510ee88d 352 lcd.cls();
jclondonol 2:bef1b1c9e387 353 lcd.locate(0, 0);
jclondonol 2:bef1b1c9e387 354 lcd.printf("Time Set");
Jepalacioh 0:c2ed510ee88d 355 wait(1);
jclondonol 2:bef1b1c9e387 356 i = 0;
jclondonol 2:bef1b1c9e387 357 Lugar = 0;
jclondonol 3:35a40be1047f 358 lcd.cls();
jclondonol 2:bef1b1c9e387 359 }
jclondonol 2:bef1b1c9e387 360
jclondonol 2:bef1b1c9e387 361 break;
Jepalacioh 0:c2ed510ee88d 362 }
Jepalacioh 0:c2ed510ee88d 363 break;
Jepalacioh 0:c2ed510ee88d 364
jclondonol 3:35a40be1047f 365 case 3: // Configurar salida
jclondonol 3:35a40be1047f 366
jclondonol 2:bef1b1c9e387 367 m = wheel.getPulses();
jclondonol 3:35a40be1047f 368 if(flag_pwm == 0)
jclondonol 2:bef1b1c9e387 369 {
jclondonol 2:bef1b1c9e387 370 if(m != 0)
Jepalacioh 0:c2ed510ee88d 371 {
jclondonol 3:35a40be1047f 372 flag_pwm = 1;
Jepalacioh 0:c2ed510ee88d 373 wheel.reset();
jclondonol 2:bef1b1c9e387 374 m = 0;
jclondonol 2:bef1b1c9e387 375 lcd.locate(1,1);
Jepalacioh 0:c2ed510ee88d 376 lcd.printf("-");
jclondonol 3:35a40be1047f 377 lcd.locate(8,1);
Jepalacioh 0:c2ed510ee88d 378 lcd.printf(">");
Jepalacioh 0:c2ed510ee88d 379 }
Jepalacioh 0:c2ed510ee88d 380 }
Jepalacioh 0:c2ed510ee88d 381
jclondonol 3:35a40be1047f 382 if(flag_pwm == 1)
Jepalacioh 0:c2ed510ee88d 383 {
jclondonol 2:bef1b1c9e387 384 if(m != 0)
Jepalacioh 0:c2ed510ee88d 385 {
jclondonol 3:35a40be1047f 386 flag_pwm = 0;
Jepalacioh 0:c2ed510ee88d 387 wheel.reset();
jclondonol 2:bef1b1c9e387 388 m = 0;
jclondonol 2:bef1b1c9e387 389 lcd.locate(1,1);
Jepalacioh 0:c2ed510ee88d 390 lcd.printf(">");
jclondonol 3:35a40be1047f 391 lcd.locate(8,1);
Jepalacioh 0:c2ed510ee88d 392 lcd.printf("-");
Jepalacioh 0:c2ed510ee88d 393 }
Jepalacioh 0:c2ed510ee88d 394 }
Jepalacioh 0:c2ed510ee88d 395
Jepalacioh 0:c2ed510ee88d 396 if (button_enco.falling())
Jepalacioh 0:c2ed510ee88d 397 {
jclondonol 3:35a40be1047f 398 lcd.cls();
jclondonol 3:35a40be1047f 399 lcd.locate(0, 0);
jclondonol 3:35a40be1047f 400 lcd.printf("Out Set");
jclondonol 3:35a40be1047f 401 if(flag_pwm == 1){pwm_analog = 1;}
jclondonol 3:35a40be1047f 402 else{pwm_analog = 0;}
jclondonol 3:35a40be1047f 403
jclondonol 3:35a40be1047f 404 wait(1);
jclondonol 2:bef1b1c9e387 405 Lugar = 0;
jclondonol 3:35a40be1047f 406 lcd.cls();
Jepalacioh 0:c2ed510ee88d 407 }
jclondonol 3:35a40be1047f 408
jclondonol 2:bef1b1c9e387 409 break;
jclondonol 2:bef1b1c9e387 410
jclondonol 3:35a40be1047f 411
jclondonol 3:35a40be1047f 412 case 4: // CICLO PRINCIPAL CONTROLADOR PID
jclondonol 3:35a40be1047f 413 lop1: rtc.getTime(tm);
jclondonol 3:35a40be1047f 414 lcd.locate(0,0);
jclondonol 3:35a40be1047f 415 lcd.printf("%Y : %0.0f ", med);
jclondonol 3:35a40be1047f 416 lcd.locate(6,1);
jclondonol 3:35a40be1047f 417 lcd.printf("%02d:",tm.min);
jclondonol 3:35a40be1047f 418 lcd.printf("%02d",tm.sec);
jclondonol 3:35a40be1047f 419
jclondonol 3:35a40be1047f 420 tiempo = tm.sec + tm.min*60;
jclondonol 3:35a40be1047f 421 sec = tm.sec;
jclondonol 3:35a40be1047f 422
jclondonol 3:35a40be1047f 423 if(sec != sec_ant)
jclondonol 2:bef1b1c9e387 424 {
jclondonol 3:35a40be1047f 425 sec_ant = sec;
jclondonol 3:35a40be1047f 426 if(tiempo <= (T1*60))
jclondonol 2:bef1b1c9e387 427 {
jclondonol 3:35a40be1047f 428 sp_temp = sp_temp + Sp/(T1*60);
jclondonol 2:bef1b1c9e387 429 }
jclondonol 3:35a40be1047f 430
jclondonol 3:35a40be1047f 431 if( (tiempo > (T2*60)) && (tiempo < (T3*60)) )
jclondonol 2:bef1b1c9e387 432 {
jclondonol 3:35a40be1047f 433 sp_temp = sp_temp + ((10)-Sp)/((T3*60)-(T2*60));
jclondonol 2:bef1b1c9e387 434 }
jclondonol 3:35a40be1047f 435 //if(tiempo > (T3*60))
jclondonol 3:35a40be1047f 436 //{
jclondonol 3:35a40be1047f 437 //sp_temp = 0;
jclondonol 3:35a40be1047f 438 //}
jclondonol 3:35a40be1047f 439 }
jclondonol 3:35a40be1047f 440 med = Y.read()*100.0;
jclondonol 3:35a40be1047f 441 err = (sp_temp-med); //se calcula el error
jclondonol 3:35a40be1047f 442 ap = Kp*10*err*0.01f; //se calcula la accion proporcinal
jclondonol 3:35a40be1047f 443 ai =(Ki*10*err*0.01f)+ai; //calculo de la integral del error
jclondonol 3:35a40be1047f 444 ad = Kd*10*(err-err_v)*0.01f; //calculo de la accion derivativa
jclondonol 3:35a40be1047f 445 pid = (ap+ai+ad);
jclondonol 3:35a40be1047f 446 // se verifica que pid sea positivo **************************************
jclondonol 3:35a40be1047f 447 if(pid<0)
jclondonol 3:35a40be1047f 448 {
jclondonol 3:35a40be1047f 449 pid = 0;
jclondonol 2:bef1b1c9e387 450 }
jclondonol 3:35a40be1047f 451
jclondonol 3:35a40be1047f 452 // se verifica que pid sea menor o igual la valor maximo *****************
jclondonol 3:35a40be1047f 453 if (pid > 100)
jclondonol 3:35a40be1047f 454 {
jclondonol 3:35a40be1047f 455 pid = 100;
jclondonol 3:35a40be1047f 456 }
jclondonol 3:35a40be1047f 457
jclondonol 3:35a40be1047f 458 //Normalizacion de la salida
jclondonol 3:35a40be1047f 459 // se actualizan las variables *******************************************
jclondonol 3:35a40be1047f 460 err_v = err;
jclondonol 3:35a40be1047f 461 U_analog = pid/100;
jclondonol 3:35a40be1047f 462 U_pwm.pulsewidth(U_analog*periodo);
jclondonol 3:35a40be1047f 463 // se envia el valor pid a puerto analogico de salida (D/A) **************
jclondonol 3:35a40be1047f 464 // se repite el ciclo
jclondonol 3:35a40be1047f 465 if (button_enco.falling())
jclondonol 3:35a40be1047f 466 {
jclondonol 3:35a40be1047f 467 lcd.cls();
jclondonol 3:35a40be1047f 468 lcd.locate(0, 0);
jclondonol 3:35a40be1047f 469 lcd.printf("PID Stop");
jclondonol 3:35a40be1047f 470 wait(1);
jclondonol 3:35a40be1047f 471 Lugar = 0;
jclondonol 3:35a40be1047f 472 lcd.cls();
jclondonol 3:35a40be1047f 473 U_analog = 0.0;
jclondonol 3:35a40be1047f 474 U_pwm.pulsewidth(0);
jclondonol 3:35a40be1047f 475 sec = 0;
jclondonol 3:35a40be1047f 476 sec_ant = 0;
jclondonol 3:35a40be1047f 477 }
jclondonol 3:35a40be1047f 478 else
jclondonol 3:35a40be1047f 479 {
jclondonol 3:35a40be1047f 480 wait_ms(300);
jclondonol 3:35a40be1047f 481 goto lop1;
jclondonol 3:35a40be1047f 482 }
jclondonol 3:35a40be1047f 483
jclondonol 3:35a40be1047f 484
jclondonol 3:35a40be1047f 485 break;
Jepalacioh 0:c2ed510ee88d 486
Jepalacioh 0:c2ed510ee88d 487 }
Jepalacioh 0:c2ed510ee88d 488 }
jclondonol 3:35a40be1047f 489 }