Controlador PWM de temperatura Por Medio de accion por PWM... Lectura y filtro digiral de lectura de temperatura de Sensor LM35 a entradas análogas. Accionamiento de potencia por medio de Relés. Link De La Implementación: https://www.youtube.com/watch?v=gcQtUNqF5M0&list=UULR7eSOJgpTUlpzbloXAgIQ
Dependencies: DebouncedIn QEI TextLCD_encoder mbed
Fork of PID_Encoder by
main.cpp@5:e3a1ff046504, 2014-11-16 (annotated)
- Committer:
- payarito32
- Date:
- Sun Nov 16 20:50:07 2014 +0000
- Revision:
- 5:e3a1ff046504
- Parent:
- 4:d42fe3777735
Controlador PID De temperatura basado en Accion Por PWM..; ; Juan Salvador Payares I.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lcorralesc1 | 0:8d2bbee60422 | 1 | #include "mbed.h" |
lcorralesc1 | 0:8d2bbee60422 | 2 | #include "DebouncedIn.h" |
lcorralesc1 | 0:8d2bbee60422 | 3 | #include "TextLCD.h" |
payarito32 | 5:e3a1ff046504 | 4 | #include "QEI.h" |
lcorralesc1 | 0:8d2bbee60422 | 5 | |
payarito32 | 5:e3a1ff046504 | 6 | TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7 entradas del LCD |
payarito32 | 5:e3a1ff046504 | 7 | QEI wheel (PTD7, PTD6, NC, 100); // entradas para el ENCODER |
payarito32 | 5:e3a1ff046504 | 8 | AnalogIn LM(PTB0); // temperatura leida por un LM35 |
payarito32 | 5:e3a1ff046504 | 9 | PwmOut bomb(PTC5); //salida para activar un bombillo |
payarito32 | 5:e3a1ff046504 | 10 | PwmOut vent(PTC4); //salida para activar un ventilador |
payarito32 | 5:e3a1ff046504 | 11 | DigitalOut led3(LED3); // Led para indicar que los botones se presionan |
payarito32 | 5:e3a1ff046504 | 12 | DebouncedIn button3(PTC16); //boton 3 es el pulsador del ENCODER |
payarito32 | 5:e3a1ff046504 | 13 | DebouncedIn button4(PTA13); // boton 4 es para la configuración de las constantes del pid, de tiempo de rampa y de temperatura del horno |
lcorralesc1 | 0:8d2bbee60422 | 14 | |
payarito32 | 5:e3a1ff046504 | 15 | //codigos movimiento del curzor LCD |
lcorralesc1 | 0:8d2bbee60422 | 16 | int C2=0x18; // desplaza izquierda |
lcorralesc1 | 0:8d2bbee60422 | 17 | int C3=0x1A; // desplaza derecha |
lcorralesc1 | 0:8d2bbee60422 | 18 | int C4=0x0C; // quito cursor bajo |
payarito32 | 5:e3a1ff046504 | 19 | int C1=0x0F; // solo muestra el curzor |
payarito32 | 5:e3a1ff046504 | 20 | Serial pc(USBTX, USBRX, "pc"); |
lcorralesc1 | 0:8d2bbee60422 | 21 | |
payarito32 | 5:e3a1ff046504 | 22 | //definicion de varibles |
payarito32 | 5:e3a1ff046504 | 23 | int i=1; // i controla cambio de "modo" del boton 4. i=1 -> (constantes PID), i=2 -> (Tiempo y temperatura) |
payarito32 | 5:e3a1ff046504 | 24 | int j=1; //j controla cambio de posiciones para cambiar variable (con el boton del ENCODER) |
payarito32 | 5:e3a1ff046504 | 25 | int kp, ki, kd, sp; //constantes del pid y del setpoint |
payarito32 | 5:e3a1ff046504 | 26 | int t1, t2, t3; //tiempos de la rapmpa de subida, temperatura estable y tiempo de bajada t1=t2=t3 [segundos] |
payarito32 | 5:e3a1ff046504 | 27 | int temp=50; // temp:temperatura final a la que llega el horno[ºC] |
payarito32 | 5:e3a1ff046504 | 28 | float ta; // ta: temperatura ambiente que se lee con el LM35, antes de empezar control |
payarito32 | 5:e3a1ff046504 | 29 | float yr, ap, ai, ad, err, med, err_v, cycle, pid; // |
payarito32 | 5:e3a1ff046504 | 30 | float dt1, dt2, dt3,c=0; // variables para ciclos de control en tiempos t1, t2 y t3 |
payarito32 | 5:e3a1ff046504 | 31 | int b=0; // Se usa para imprimir datos en la LCD |
lcorralesc1 | 0:8d2bbee60422 | 32 | float pidn; |
lcorralesc1 | 3:9347b362d33c | 33 | Timer t; |
lcorralesc1 | 0:8d2bbee60422 | 34 | |
payarito32 | 5:e3a1ff046504 | 35 | // Inicia el código |
payarito32 | 5:e3a1ff046504 | 36 | int main() |
payarito32 | 5:e3a1ff046504 | 37 | { |
lcorralesc1 | 0:8d2bbee60422 | 38 | |
payarito32 | 5:e3a1ff046504 | 39 | kp =60; |
payarito32 | 5:e3a1ff046504 | 40 | ki = 10; |
payarito32 | 5:e3a1ff046504 | 41 | kd=4; |
payarito32 | 5:e3a1ff046504 | 42 | t1 = 5; |
payarito32 | 5:e3a1ff046504 | 43 | t2= 5; |
payarito32 | 5:e3a1ff046504 | 44 | t3=20; |
payarito32 | 5:e3a1ff046504 | 45 | temp = 50; |
payarito32 | 5:e3a1ff046504 | 46 | while(1) { |
payarito32 | 5:e3a1ff046504 | 47 | if(i==1) { |
payarito32 | 5:e3a1ff046504 | 48 | lcd.cls(); |
payarito32 | 5:e3a1ff046504 | 49 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD |
payarito32 | 5:e3a1ff046504 | 50 | lcd.locate(0,0); |
payarito32 | 5:e3a1ff046504 | 51 | lcd.printf(" PID"); |
payarito32 | 5:e3a1ff046504 | 52 | lcd.locate(8,0); |
payarito32 | 5:e3a1ff046504 | 53 | lcd.printf("Kp:%d",kp); |
payarito32 | 5:e3a1ff046504 | 54 | lcd.locate(0,1); |
payarito32 | 5:e3a1ff046504 | 55 | lcd.printf("Ki:%d",ki); |
payarito32 | 5:e3a1ff046504 | 56 | lcd.locate(8,1); |
payarito32 | 5:e3a1ff046504 | 57 | lcd.printf("Kd:%d",kd); |
payarito32 | 5:e3a1ff046504 | 58 | |
payarito32 | 5:e3a1ff046504 | 59 | led3 =1; |
payarito32 | 5:e3a1ff046504 | 60 | if (button3.falling()) { //INCREMENTA POSICION DEL MENU CON BOTON 3 (Switche encoder) |
payarito32 | 5:e3a1ff046504 | 61 | led3 =!led3; |
payarito32 | 5:e3a1ff046504 | 62 | } |
payarito32 | 5:e3a1ff046504 | 63 | |
payarito32 | 5:e3a1ff046504 | 64 | if (j==1) { |
payarito32 | 5:e3a1ff046504 | 65 | kp=kp+wheel.getPulses(); |
payarito32 | 5:e3a1ff046504 | 66 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 67 | if (kp>999) { |
payarito32 | 5:e3a1ff046504 | 68 | kp=999; |
payarito32 | 5:e3a1ff046504 | 69 | } |
payarito32 | 5:e3a1ff046504 | 70 | if (kp<0) { |
payarito32 | 5:e3a1ff046504 | 71 | kp=0; |
payarito32 | 5:e3a1ff046504 | 72 | } |
payarito32 | 5:e3a1ff046504 | 73 | lcd.locate(11,0); |
payarito32 | 5:e3a1ff046504 | 74 | lcd.printf(" "); |
payarito32 | 5:e3a1ff046504 | 75 | lcd.locate(11,0); |
payarito32 | 5:e3a1ff046504 | 76 | lcd.printf("%d",kp); |
payarito32 | 5:e3a1ff046504 | 77 | wait(0.2); |
payarito32 | 5:e3a1ff046504 | 78 | |
payarito32 | 5:e3a1ff046504 | 79 | if(button3.falling()) { |
payarito32 | 5:e3a1ff046504 | 80 | j=2; |
payarito32 | 5:e3a1ff046504 | 81 | led3=0; |
payarito32 | 5:e3a1ff046504 | 82 | wait(0.3); |
payarito32 | 5:e3a1ff046504 | 83 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 84 | } |
payarito32 | 5:e3a1ff046504 | 85 | } |
payarito32 | 5:e3a1ff046504 | 86 | if (j==2) { |
payarito32 | 5:e3a1ff046504 | 87 | ki=ki+wheel.getPulses(); |
payarito32 | 5:e3a1ff046504 | 88 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 89 | if (ki>999) { |
payarito32 | 5:e3a1ff046504 | 90 | ki=999; |
payarito32 | 5:e3a1ff046504 | 91 | } |
payarito32 | 5:e3a1ff046504 | 92 | if (ki<0) { |
payarito32 | 5:e3a1ff046504 | 93 | ki=0; |
payarito32 | 5:e3a1ff046504 | 94 | } |
payarito32 | 5:e3a1ff046504 | 95 | lcd.locate(3,1); |
payarito32 | 5:e3a1ff046504 | 96 | lcd.printf(" "); |
payarito32 | 5:e3a1ff046504 | 97 | lcd.locate(3,1); |
payarito32 | 5:e3a1ff046504 | 98 | lcd.printf("%d",ki); |
payarito32 | 5:e3a1ff046504 | 99 | wait(0.2); |
payarito32 | 5:e3a1ff046504 | 100 | |
payarito32 | 5:e3a1ff046504 | 101 | if(button3.falling()) { |
payarito32 | 5:e3a1ff046504 | 102 | j=3; |
payarito32 | 5:e3a1ff046504 | 103 | led3=0; |
payarito32 | 5:e3a1ff046504 | 104 | wait(0.3); |
payarito32 | 5:e3a1ff046504 | 105 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 106 | } |
payarito32 | 5:e3a1ff046504 | 107 | } |
payarito32 | 5:e3a1ff046504 | 108 | if (j==3) { |
payarito32 | 5:e3a1ff046504 | 109 | kd=kd+wheel.getPulses(); |
payarito32 | 5:e3a1ff046504 | 110 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 111 | if (kd>999) { |
payarito32 | 5:e3a1ff046504 | 112 | kd=999; |
payarito32 | 5:e3a1ff046504 | 113 | } |
payarito32 | 5:e3a1ff046504 | 114 | if (kd<0) { |
payarito32 | 5:e3a1ff046504 | 115 | kd=0; |
payarito32 | 5:e3a1ff046504 | 116 | } |
payarito32 | 5:e3a1ff046504 | 117 | lcd.locate(11,1); |
payarito32 | 5:e3a1ff046504 | 118 | lcd.printf(" "); |
payarito32 | 5:e3a1ff046504 | 119 | lcd.locate(11,1); |
payarito32 | 5:e3a1ff046504 | 120 | lcd.printf("%d",kd); |
payarito32 | 5:e3a1ff046504 | 121 | wait(0.2); |
payarito32 | 5:e3a1ff046504 | 122 | |
payarito32 | 5:e3a1ff046504 | 123 | if(button3.falling()) { |
payarito32 | 5:e3a1ff046504 | 124 | j=1; |
payarito32 | 5:e3a1ff046504 | 125 | led3=0; |
payarito32 | 5:e3a1ff046504 | 126 | wait(0.3); |
payarito32 | 5:e3a1ff046504 | 127 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 128 | } |
payarito32 | 5:e3a1ff046504 | 129 | } |
payarito32 | 5:e3a1ff046504 | 130 | if (j==4) { |
payarito32 | 5:e3a1ff046504 | 131 | j=1; |
payarito32 | 5:e3a1ff046504 | 132 | } |
payarito32 | 5:e3a1ff046504 | 133 | if(button4.falling()) { |
payarito32 | 5:e3a1ff046504 | 134 | i=2; |
payarito32 | 5:e3a1ff046504 | 135 | j=0; |
payarito32 | 5:e3a1ff046504 | 136 | } |
payarito32 | 5:e3a1ff046504 | 137 | }//CIERRA EL MODO i=1 -> constantes PID |
payarito32 | 5:e3a1ff046504 | 138 | if(i==2) { //INICIA EL MODO i=2 -> tiempos y temperatura |
payarito32 | 5:e3a1ff046504 | 139 | lcd.cls(); |
payarito32 | 5:e3a1ff046504 | 140 | lcd.writeCommand(C1);//escribimos un comando segun el manual del modulo LCD |
payarito32 | 5:e3a1ff046504 | 141 | lcd.locate(0,0); |
payarito32 | 5:e3a1ff046504 | 142 | lcd.printf("T1:%d",t1); |
payarito32 | 5:e3a1ff046504 | 143 | lcd.locate(8,0); |
payarito32 | 5:e3a1ff046504 | 144 | lcd.printf("T2:%d",t2); |
payarito32 | 5:e3a1ff046504 | 145 | lcd.locate(0,1); |
payarito32 | 5:e3a1ff046504 | 146 | lcd.printf("T3:%d",t3); |
payarito32 | 5:e3a1ff046504 | 147 | lcd.locate(8,1); |
payarito32 | 5:e3a1ff046504 | 148 | lcd.printf("Tm:%d",temp); |
payarito32 | 5:e3a1ff046504 | 149 | |
payarito32 | 5:e3a1ff046504 | 150 | |
payarito32 | 5:e3a1ff046504 | 151 | led3 =1; |
payarito32 | 5:e3a1ff046504 | 152 | if (button3.falling()) { //INCREMENTA POSICION DEL MENU CON BOTON 3 (Switche encoder) |
payarito32 | 5:e3a1ff046504 | 153 | led3 =!led3; |
payarito32 | 5:e3a1ff046504 | 154 | } |
payarito32 | 5:e3a1ff046504 | 155 | if (j==0) { |
payarito32 | 5:e3a1ff046504 | 156 | t1=t1+wheel.getPulses(); |
payarito32 | 5:e3a1ff046504 | 157 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 158 | if (t1>5*60) { // Tiempos no mayores a 6 minutos |
payarito32 | 5:e3a1ff046504 | 159 | t1=5*60; |
payarito32 | 5:e3a1ff046504 | 160 | } |
payarito32 | 5:e3a1ff046504 | 161 | if (t1<60) { |
payarito32 | 5:e3a1ff046504 | 162 | t1=60; |
payarito32 | 5:e3a1ff046504 | 163 | } |
payarito32 | 5:e3a1ff046504 | 164 | lcd.locate(3,0); |
payarito32 | 5:e3a1ff046504 | 165 | lcd.printf(" ",t1); |
payarito32 | 5:e3a1ff046504 | 166 | lcd.locate(3,0); |
payarito32 | 5:e3a1ff046504 | 167 | lcd.printf("%d",t1); |
payarito32 | 5:e3a1ff046504 | 168 | wait(0.2); |
payarito32 | 5:e3a1ff046504 | 169 | |
payarito32 | 5:e3a1ff046504 | 170 | if(button3.falling()) { |
payarito32 | 5:e3a1ff046504 | 171 | j=1; |
payarito32 | 5:e3a1ff046504 | 172 | led3=0; |
payarito32 | 5:e3a1ff046504 | 173 | wait(0.3); |
payarito32 | 5:e3a1ff046504 | 174 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 175 | } |
payarito32 | 5:e3a1ff046504 | 176 | } |
payarito32 | 5:e3a1ff046504 | 177 | |
payarito32 | 5:e3a1ff046504 | 178 | if (j==1) { |
payarito32 | 5:e3a1ff046504 | 179 | t2=t2+wheel.getPulses(); |
payarito32 | 5:e3a1ff046504 | 180 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 181 | if (t2>5*60) { |
payarito32 | 5:e3a1ff046504 | 182 | t2=5*60; |
payarito32 | 5:e3a1ff046504 | 183 | } |
payarito32 | 5:e3a1ff046504 | 184 | if (t2<60) { |
payarito32 | 5:e3a1ff046504 | 185 | t2=60; |
payarito32 | 5:e3a1ff046504 | 186 | } |
payarito32 | 5:e3a1ff046504 | 187 | lcd.locate(11,0); |
payarito32 | 5:e3a1ff046504 | 188 | lcd.printf(" "); |
payarito32 | 5:e3a1ff046504 | 189 | lcd.locate(11,0); |
payarito32 | 5:e3a1ff046504 | 190 | lcd.printf("%d",t2); |
payarito32 | 5:e3a1ff046504 | 191 | wait(0.2); |
payarito32 | 5:e3a1ff046504 | 192 | |
payarito32 | 5:e3a1ff046504 | 193 | if(button3.falling()) { |
payarito32 | 5:e3a1ff046504 | 194 | j=2; |
payarito32 | 5:e3a1ff046504 | 195 | led3=0; |
payarito32 | 5:e3a1ff046504 | 196 | wait(0.3); |
payarito32 | 5:e3a1ff046504 | 197 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 198 | } |
payarito32 | 5:e3a1ff046504 | 199 | } |
payarito32 | 5:e3a1ff046504 | 200 | if (j==2) { |
payarito32 | 5:e3a1ff046504 | 201 | t3=t3+wheel.getPulses(); |
payarito32 | 5:e3a1ff046504 | 202 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 203 | if (t3>5*60) { |
payarito32 | 5:e3a1ff046504 | 204 | t3=5*60; |
payarito32 | 5:e3a1ff046504 | 205 | } |
payarito32 | 5:e3a1ff046504 | 206 | if (t3<60) { |
payarito32 | 5:e3a1ff046504 | 207 | t3=60; |
payarito32 | 5:e3a1ff046504 | 208 | } |
payarito32 | 5:e3a1ff046504 | 209 | lcd.locate(3,1); |
payarito32 | 5:e3a1ff046504 | 210 | lcd.printf(" "); |
payarito32 | 5:e3a1ff046504 | 211 | lcd.locate(3,1); |
payarito32 | 5:e3a1ff046504 | 212 | lcd.printf("%d",t3); |
payarito32 | 5:e3a1ff046504 | 213 | wait(0.2); |
payarito32 | 5:e3a1ff046504 | 214 | |
payarito32 | 5:e3a1ff046504 | 215 | if(button3.falling()) { |
payarito32 | 5:e3a1ff046504 | 216 | j=3; |
payarito32 | 5:e3a1ff046504 | 217 | led3=0; |
payarito32 | 5:e3a1ff046504 | 218 | wait(0.3); |
payarito32 | 5:e3a1ff046504 | 219 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 220 | } |
payarito32 | 5:e3a1ff046504 | 221 | } |
payarito32 | 5:e3a1ff046504 | 222 | if (j==3) { |
payarito32 | 5:e3a1ff046504 | 223 | temp=temp+wheel.getPulses(); |
payarito32 | 5:e3a1ff046504 | 224 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 225 | if (temp>60) { |
payarito32 | 5:e3a1ff046504 | 226 | temp=60; |
payarito32 | 5:e3a1ff046504 | 227 | } |
payarito32 | 5:e3a1ff046504 | 228 | if (temp<20) { |
payarito32 | 5:e3a1ff046504 | 229 | temp=20; |
payarito32 | 5:e3a1ff046504 | 230 | } |
payarito32 | 5:e3a1ff046504 | 231 | lcd.locate(11,1); |
payarito32 | 5:e3a1ff046504 | 232 | lcd.printf(" "); |
payarito32 | 5:e3a1ff046504 | 233 | lcd.locate(11,1); |
payarito32 | 5:e3a1ff046504 | 234 | lcd.printf("%d",temp); |
payarito32 | 5:e3a1ff046504 | 235 | wait(0.2); |
payarito32 | 5:e3a1ff046504 | 236 | |
payarito32 | 5:e3a1ff046504 | 237 | if(button3.falling()) { |
payarito32 | 5:e3a1ff046504 | 238 | j=0; |
payarito32 | 5:e3a1ff046504 | 239 | led3=0; |
payarito32 | 5:e3a1ff046504 | 240 | wait(0.3); |
payarito32 | 5:e3a1ff046504 | 241 | wheel.reset(); |
payarito32 | 5:e3a1ff046504 | 242 | } |
payarito32 | 5:e3a1ff046504 | 243 | } |
payarito32 | 5:e3a1ff046504 | 244 | if (j==4) { |
payarito32 | 5:e3a1ff046504 | 245 | j=0; |
payarito32 | 5:e3a1ff046504 | 246 | } |
payarito32 | 5:e3a1ff046504 | 247 | if (button4.falling()) { |
payarito32 | 5:e3a1ff046504 | 248 | break; |
payarito32 | 5:e3a1ff046504 | 249 | } |
payarito32 | 5:e3a1ff046504 | 250 | }//CIERRE MODO i=2 -> tiempo y temperatura |
payarito32 | 5:e3a1ff046504 | 251 | }// Cierre del while(1) |
payarito32 | 5:e3a1ff046504 | 252 | //%--------------------------------------------------------------------- |
payarito32 | 5:e3a1ff046504 | 253 | |
payarito32 | 5:e3a1ff046504 | 254 | |
payarito32 | 5:e3a1ff046504 | 255 | lcd.writeCommand(C4);//escribimos un comando segun el manual del modulo LCD para quitar cursor bajo |
payarito32 | 5:e3a1ff046504 | 256 | lcd.cls(); //borra la pantalla |
payarito32 | 5:e3a1ff046504 | 257 | lcd.printf("Valores \nGuardados"); |
payarito32 | 5:e3a1ff046504 | 258 | wait(1); |
payarito32 | 5:e3a1ff046504 | 259 | |
payarito32 | 5:e3a1ff046504 | 260 | ta=100*3*LM.read()-13; |
payarito32 | 5:e3a1ff046504 | 261 | lcd.cls(); //borra la pantalla |
payarito32 | 5:e3a1ff046504 | 262 | lcd.printf("T Ambiente:%2f",ta); |
payarito32 | 5:e3a1ff046504 | 263 | wait(2); |
payarito32 | 5:e3a1ff046504 | 264 | |
payarito32 | 5:e3a1ff046504 | 265 | // se imprimen los parches del control ***************************************** |
payarito32 | 5:e3a1ff046504 | 266 | lcd.cls(); |
payarito32 | 5:e3a1ff046504 | 267 | lcd.printf("Er:%f",err); |
payarito32 | 5:e3a1ff046504 | 268 | lcd.locate(8,0); |
payarito32 | 5:e3a1ff046504 | 269 | lcd.printf("Me:%f",med); |
payarito32 | 5:e3a1ff046504 | 270 | lcd.locate(0,1); |
payarito32 | 5:e3a1ff046504 | 271 | lcd.printf("dt:%f",dt1); |
payarito32 | 5:e3a1ff046504 | 272 | wait(2); |
payarito32 | 5:e3a1ff046504 | 273 | |
payarito32 | 5:e3a1ff046504 | 274 | // CICLO PARA CONTROL DE RAMPA ASCENDENTE (T1) |
payarito32 | 5:e3a1ff046504 | 275 | b=0; |
payarito32 | 5:e3a1ff046504 | 276 | // Comienza el ciclo for para la primera parte del control(Rampa ascendente) |
payarito32 | 5:e3a1ff046504 | 277 | for(dt1=ta; dt1<=temp; dt1+=(temp-ta)/t1 ) { |
payarito32 | 5:e3a1ff046504 | 278 | med=100*3*LM.read()-13; //leer puerto analogo y asignar a med (*100 ya que LM35 da 10mV/ºC) |
payarito32 | 5:e3a1ff046504 | 279 | err = (dt1-med); |
payarito32 | 5:e3a1ff046504 | 280 | ap = kp*err; //calculo de la acción proporcional |
payarito32 | 5:e3a1ff046504 | 281 | // se verifica que la accion integral no sea muy grande |
payarito32 | 5:e3a1ff046504 | 282 | if(ai<100) { |
payarito32 | 5:e3a1ff046504 | 283 | ai =(ki*err)+ai; //calculo de la integral del error |
lcorralesc1 | 3:9347b362d33c | 284 | } |
payarito32 | 5:e3a1ff046504 | 285 | ad = kd*(err-err_v); //calculo de la accion derivativa |
payarito32 | 5:e3a1ff046504 | 286 | pid = (ap+ai+ad); |
payarito32 | 5:e3a1ff046504 | 287 | // se verifica que pid sea positivo ************************************** |
payarito32 | 5:e3a1ff046504 | 288 | if(pid<=0) { |
payarito32 | 5:e3a1ff046504 | 289 | pid=0; |
payarito32 | 5:e3a1ff046504 | 290 | } |
payarito32 | 5:e3a1ff046504 | 291 | // se verifica que pid sea menor o igual la valor maximo ***************** |
payarito32 | 5:e3a1ff046504 | 292 | if(pid>=100) { |
payarito32 | 5:e3a1ff046504 | 293 | pid=100; |
payarito32 | 5:e3a1ff046504 | 294 | } |
payarito32 | 5:e3a1ff046504 | 295 | // se actualizan las variables ******************************************* |
payarito32 | 5:e3a1ff046504 | 296 | err_v = err; |
payarito32 | 5:e3a1ff046504 | 297 | //se muestran las variables****************************************** |
payarito32 | 5:e3a1ff046504 | 298 | //if (b==0) { |
payarito32 | 5:e3a1ff046504 | 299 | // t.start(); |
payarito32 | 5:e3a1ff046504 | 300 | // b=1; |
payarito32 | 5:e3a1ff046504 | 301 | //} |
payarito32 | 5:e3a1ff046504 | 302 | //if(t>=0.01) { |
payarito32 | 5:e3a1ff046504 | 303 | lcd.cls(); |
payarito32 | 5:e3a1ff046504 | 304 | lcd.locate(0,0); |
payarito32 | 5:e3a1ff046504 | 305 | lcd.printf("Er:%f",err); |
payarito32 | 5:e3a1ff046504 | 306 | lcd.locate(8,0); |
payarito32 | 5:e3a1ff046504 | 307 | lcd.printf("Me:%f",med); |
payarito32 | 5:e3a1ff046504 | 308 | lcd.locate(0,1); |
payarito32 | 5:e3a1ff046504 | 309 | lcd.printf("dt:%f",dt1); |
payarito32 | 5:e3a1ff046504 | 310 | //} |
payarito32 | 5:e3a1ff046504 | 311 | //Normalizacion de la salida |
payarito32 | 5:e3a1ff046504 | 312 | pidn=pid/100; |
payarito32 | 5:e3a1ff046504 | 313 | // se envia el valor pid a puerto analogico de salida (D/A) ************** |
payarito32 | 5:e3a1ff046504 | 314 | bomb.write(pidn); |
payarito32 | 5:e3a1ff046504 | 315 | // se repite el ciclo |
payarito32 | 5:e3a1ff046504 | 316 | wait(1); |
payarito32 | 5:e3a1ff046504 | 317 | } |
payarito32 | 5:e3a1ff046504 | 318 | // Comienza el segundo ciclo para la segunda parte del control (Temperatura estable) |
payarito32 | 5:e3a1ff046504 | 319 | t.start(); |
payarito32 | 5:e3a1ff046504 | 320 | while(t<=t2) { |
payarito32 | 5:e3a1ff046504 | 321 | med=100*3*LM.read()-13; //leer puerto analogo y asignar a med (*100 ya que LM35 da 10mV/ºC) |
payarito32 | 5:e3a1ff046504 | 322 | err = (temp-med); |
payarito32 | 5:e3a1ff046504 | 323 | ap = kp*err; //calculo de la acción proporcional |
payarito32 | 5:e3a1ff046504 | 324 | // se verifica que la accion integral no sea muy grande |
payarito32 | 5:e3a1ff046504 | 325 | if(ai<100) { |
payarito32 | 5:e3a1ff046504 | 326 | ai =(ki*err)+ai; //calculo de la integral del error |
payarito32 | 5:e3a1ff046504 | 327 | } |
payarito32 | 5:e3a1ff046504 | 328 | ad = kd*(err-err_v); //calculo de la accion derivativa |
payarito32 | 5:e3a1ff046504 | 329 | pid = (ap+ai+ad); |
payarito32 | 5:e3a1ff046504 | 330 | // se verifica que pid sea positivo ************************************** |
payarito32 | 5:e3a1ff046504 | 331 | if(pid<=0) { |
payarito32 | 5:e3a1ff046504 | 332 | pid=0; |
payarito32 | 5:e3a1ff046504 | 333 | } |
payarito32 | 5:e3a1ff046504 | 334 | // se verifica que pid sea menor o igual la valor maximo ***************** |
payarito32 | 5:e3a1ff046504 | 335 | if(pid>=100) { |
payarito32 | 5:e3a1ff046504 | 336 | pid=100; |
payarito32 | 5:e3a1ff046504 | 337 | } |
payarito32 | 5:e3a1ff046504 | 338 | // se actualizan las variables ******************************************* |
payarito32 | 5:e3a1ff046504 | 339 | err_v = err; |
payarito32 | 5:e3a1ff046504 | 340 | //se muestran las variables****************************************** |
payarito32 | 5:e3a1ff046504 | 341 | //if (b==0) { |
payarito32 | 5:e3a1ff046504 | 342 | // t.start(); |
payarito32 | 5:e3a1ff046504 | 343 | // b=1; |
payarito32 | 5:e3a1ff046504 | 344 | //} |
payarito32 | 5:e3a1ff046504 | 345 | //if(t>=0.01) { |
payarito32 | 5:e3a1ff046504 | 346 | lcd.cls(); |
payarito32 | 5:e3a1ff046504 | 347 | lcd.locate(0,0); |
payarito32 | 5:e3a1ff046504 | 348 | lcd.printf("Er:%f",err); |
payarito32 | 5:e3a1ff046504 | 349 | lcd.locate(8,0); |
payarito32 | 5:e3a1ff046504 | 350 | lcd.printf("Me:%f",med); |
payarito32 | 5:e3a1ff046504 | 351 | lcd.locate(0,1); |
payarito32 | 5:e3a1ff046504 | 352 | lcd.printf("Tm:%d",temp); |
payarito32 | 5:e3a1ff046504 | 353 | //} |
payarito32 | 5:e3a1ff046504 | 354 | //Normalizacion de la salida |
payarito32 | 5:e3a1ff046504 | 355 | pidn=pid/100; |
payarito32 | 5:e3a1ff046504 | 356 | // se envia el valor pid a puerto analogico de salida (D/A) ************** |
payarito32 | 5:e3a1ff046504 | 357 | bomb.write(pidn); |
payarito32 | 5:e3a1ff046504 | 358 | // se repite el ciclo |
payarito32 | 5:e3a1ff046504 | 359 | wait(1); |
payarito32 | 5:e3a1ff046504 | 360 | } |
payarito32 | 5:e3a1ff046504 | 361 | bomb=0; |
payarito32 | 5:e3a1ff046504 | 362 | ta=3*100*LM.read()-13; |
payarito32 | 5:e3a1ff046504 | 363 | // Comienza el tercerciclo para la ultima parte del control (Descenso de rampa) |
payarito32 | 5:e3a1ff046504 | 364 | for(dt3=temp; dt3>=ta; dt3-=(temp-ta)/t3 ) { |
payarito32 | 5:e3a1ff046504 | 365 | med=100*3*LM.read()-13; //leer puerto analogo y asignar a med (*100 ya que LM35 da 10mV/ºC) |
payarito32 | 5:e3a1ff046504 | 366 | err = (dt3-med); |
payarito32 | 5:e3a1ff046504 | 367 | ap = kp*err; //calculo de la acción proporcional |
payarito32 | 5:e3a1ff046504 | 368 | // se verifica que la accion integral no sea muy grande |
payarito32 | 5:e3a1ff046504 | 369 | if(ai<100) { |
payarito32 | 5:e3a1ff046504 | 370 | ai =(ki*err)+ai; //calculo de la integral del error |
payarito32 | 5:e3a1ff046504 | 371 | } |
payarito32 | 5:e3a1ff046504 | 372 | ad = kd*(err-err_v); //calculo de la accion derivativa |
payarito32 | 5:e3a1ff046504 | 373 | pid = (ap+ai+ad); |
payarito32 | 5:e3a1ff046504 | 374 | // se verifica que pid sea positivo ************************************** |
payarito32 | 5:e3a1ff046504 | 375 | if(pid<=0) { |
payarito32 | 5:e3a1ff046504 | 376 | pid=0; |
payarito32 | 5:e3a1ff046504 | 377 | } |
payarito32 | 5:e3a1ff046504 | 378 | // se verifica que pid sea menor o igual la valor maximo ***************** |
payarito32 | 5:e3a1ff046504 | 379 | if(pid>=100) { |
payarito32 | 5:e3a1ff046504 | 380 | pid=100; |
payarito32 | 5:e3a1ff046504 | 381 | } |
payarito32 | 5:e3a1ff046504 | 382 | // se actualizan las variables ******************************************* |
payarito32 | 5:e3a1ff046504 | 383 | err_v = err; |
payarito32 | 5:e3a1ff046504 | 384 | //se muestran las variables****************************************** |
payarito32 | 5:e3a1ff046504 | 385 | //if (b==0) { |
payarito32 | 5:e3a1ff046504 | 386 | // t.start(); |
payarito32 | 5:e3a1ff046504 | 387 | // b=1; |
payarito32 | 5:e3a1ff046504 | 388 | //} |
payarito32 | 5:e3a1ff046504 | 389 | //if(t>=0.01) { |
payarito32 | 5:e3a1ff046504 | 390 | lcd.cls(); |
payarito32 | 5:e3a1ff046504 | 391 | lcd.locate(0,0); |
payarito32 | 5:e3a1ff046504 | 392 | lcd.printf("Er:%f",err); |
payarito32 | 5:e3a1ff046504 | 393 | lcd.locate(8,0); |
payarito32 | 5:e3a1ff046504 | 394 | lcd.printf("Me:%f",med); |
payarito32 | 5:e3a1ff046504 | 395 | lcd.locate(0,1); |
payarito32 | 5:e3a1ff046504 | 396 | lcd.printf("dt:%f",dt3); |
payarito32 | 5:e3a1ff046504 | 397 | //} |
payarito32 | 5:e3a1ff046504 | 398 | //Normalizacion de la salida |
payarito32 | 5:e3a1ff046504 | 399 | pidn=pid/100; |
payarito32 | 5:e3a1ff046504 | 400 | // se envia el valor pid a puerto analogico de salida (D/A) ************** |
payarito32 | 5:e3a1ff046504 | 401 | vent.write(pidn); |
payarito32 | 5:e3a1ff046504 | 402 | // se repite el ciclo |
payarito32 | 5:e3a1ff046504 | 403 | wait(1); |
payarito32 | 5:e3a1ff046504 | 404 | } |
payarito32 | 5:e3a1ff046504 | 405 | bomb=0; |
payarito32 | 5:e3a1ff046504 | 406 | vent=0; |
payarito32 | 5:e3a1ff046504 | 407 | lcd.cls(); |
payarito32 | 5:e3a1ff046504 | 408 | lcd.printf("fin"); |
payarito32 | 5:e3a1ff046504 | 409 | } |