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 Gustavo Ramirez

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?

UserRevisionLine numberNew 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 }