Controlador PID

Dependencies:   Debounced Pulse1 QEI RTC-DS1307 TextLCD_1 mbed

Fork of grafica_PID_android by Nicolás Villegas Echavarría

/media/uploads/seccastanova/whatsapp_image_2018-06-05_at_10.25.03_am.jpeg

Committer:
seccastanova
Date:
Tue Jun 05 15:42:17 2018 +0000
Revision:
5:f39e8f190857
Parent:
4:82ac4b34c3d9
Controlador PID para Horno de Reflujo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NicolasV 2:00db719ebd81 1 /*
seccastanova 5:f39e8f190857 2 ESTE PROGRAMA SIMULA EL CONTROL DE UN HORNO DE REFLUJO CON UN PID, USANDO SALIDA ANALÓGICA
seccastanova 5:f39e8f190857 3 O PWM (OPCION DISPONIBLE EN MENU). ADEMÁS SE ENVÍAN LOS DATOS POR BLUETOOTH A UNA APLICACIÓN
seccastanova 5:f39e8f190857 4 EN ANDROID (DESARROLLADA EN APPINVENTOR) PARA SU VISUALIZACIÓN.
seccastanova 5:f39e8f190857 5 ESTA TAREA FUE DESARROLLADA POR SEBASTIÁN CAMILO CASTAÑO VANEGAS Y CARLOS MAURICIO ALZATE TORRES
seccastanova 5:f39e8f190857 6 PARA LA MATERIA DE PROCESADORES DE LA UNIVERSIDAD NACIONAL DE MEDELLÍN SEMESTRE I DEL AÑO 2018
seccastanova 5:f39e8f190857 7 */
seccastanova 5:f39e8f190857 8
tony63 0:4e0dfcf0e7ce 9 #include "mbed.h"
seccastanova 5:f39e8f190857 10 #include "DebouncedIn.h"
seccastanova 5:f39e8f190857 11 #include "TextLCD.h"
tony63 0:4e0dfcf0e7ce 12 #include "QEI.h"
seccastanova 5:f39e8f190857 13 #include "Rtc_Ds1307.h"
seccastanova 5:f39e8f190857 14 #include "string.h"
seccastanova 5:f39e8f190857 15 #include "Pulse1.h"
tony63 0:4e0dfcf0e7ce 16
NicolasV 2:00db719ebd81 17 Serial GSM(PTE0,PTE1); // Módulo Bluetooh
tony63 0:4e0dfcf0e7ce 18 TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // rs, e, d4-d7
seccastanova 5:f39e8f190857 19 Rtc_Ds1307 rtc(PTC9, PTC8); //Reloj
seccastanova 5:f39e8f190857 20 QEI wheel (PTA13, PTD5, NC, 10);
NicolasV 3:2e823b16a4a1 21 Timer t;
NicolasV 2:00db719ebd81 22
NicolasV 2:00db719ebd81 23 AnalogIn y(PTC2); // Entrada análoga: Salida del sistema
NicolasV 2:00db719ebd81 24 AnalogOut u(PTE30); // Salida análoga: Señal de control
seccastanova 5:f39e8f190857 25 PwmOut u2(PTE29); // Salida wn PWM: Señal de control
seccastanova 5:f39e8f190857 26 DigitalOut rele(PTB8); // Activación de relé
NicolasV 2:00db719ebd81 27
seccastanova 5:f39e8f190857 28 DigitalOut red(LED1);
seccastanova 5:f39e8f190857 29 DigitalOut green(LED2);
seccastanova 5:f39e8f190857 30 DigitalOut blue(LED3);
tony63 0:4e0dfcf0e7ce 31
seccastanova 5:f39e8f190857 32 DebouncedIn button3(PTC16); // Botón del encoder -> cambiar opciones dentro de los menu
seccastanova 5:f39e8f190857 33 DebouncedIn button4(PTC17); // Pulsador -> cambiar de menu
tony63 0:4e0dfcf0e7ce 34
NicolasV 2:00db719ebd81 35 int C1=0x0F;
NicolasV 4:82ac4b34c3d9 36 int C2=0x18;
NicolasV 4:82ac4b34c3d9 37 int C3=0x1A;
NicolasV 4:82ac4b34c3d9 38 int C4=0x0C;
seccastanova 5:f39e8f190857 39 int conta=0;
seccastanova 5:f39e8f190857 40 int m=0;
NicolasV 2:00db719ebd81 41 int cambio = 0, diferencia = 0;
NicolasV 3:2e823b16a4a1 42 float pid, o, ai, ad, ap, med, err, setpoint;
tony63 1:058b8f5c135d 43 float err_v;
seccastanova 5:f39e8f190857 44 int spnum = 0, kinum = 15, kpnum = 50 ,kdnum = 3;
NicolasV 2:00db719ebd81 45 int j,k;
NicolasV 3:2e823b16a4a1 46 long t_pid = 0, t_btn = 0;
tony63 0:4e0dfcf0e7ce 47
seccastanova 5:f39e8f190857 48 int c = 0; //consigna
seccastanova 5:f39e8f190857 49 int min = 0; //minutos
seccastanova 5:f39e8f190857 50 int seg = 0; //segundos
seccastanova 5:f39e8f190857 51 int T1 = 120,T2 = 180,T3 = 240; //tiempos consigna
seccastanova 5:f39e8f190857 52 int Tmax = 500; //temperatura maxima
seccastanova 5:f39e8f190857 53 int TI = 25; //temperatura ambiente (Fija)
seccastanova 5:f39e8f190857 54 int pos = 0; // posicion inicializada en cero
seccastanova 5:f39e8f190857 55 int state = 0; // estado inicializado en cero
seccastanova 5:f39e8f190857 56 int selsalida=0; //Salida Análoga:0 PWM:1
seccastanova 5:f39e8f190857 57 int salidaAn=0; int salidaPWM=0;
seccastanova 5:f39e8f190857 58 int tiemp=0;
seccastanova 5:f39e8f190857 59
seccastanova 5:f39e8f190857 60 // FUNCIONES ----------------------------------------------------------------------------------------------------
seccastanova 5:f39e8f190857 61
seccastanova 5:f39e8f190857 62 // Funcion para consigna
seccastanova 5:f39e8f190857 63
seccastanova 5:f39e8f190857 64 void cons(int m, int n){
NicolasV 3:2e823b16a4a1 65
seccastanova 5:f39e8f190857 66 tiemp= 60*m+ n; //el tiempo a segundos
seccastanova 5:f39e8f190857 67 if(tiemp <=T1){
seccastanova 5:f39e8f190857 68 c = ((Tmax-TI)*tiemp/T1)+TI; //Tramo 1: Rampa subida temperatura
seccastanova 5:f39e8f190857 69 }
seccastanova 5:f39e8f190857 70 else if(tiemp > T1 and tiemp <= T2){
seccastanova 5:f39e8f190857 71 c = Tmax;
seccastanova 5:f39e8f190857 72 }
seccastanova 5:f39e8f190857 73 else if(tiemp > T2 and tiemp <= T3){
seccastanova 5:f39e8f190857 74 c = ((TI - Tmax)*(tiemp-T2)/(T3-T2)) + Tmax;
seccastanova 5:f39e8f190857 75 }
seccastanova 5:f39e8f190857 76 else if(tiemp>T3){
seccastanova 5:f39e8f190857 77 c = TI;
seccastanova 5:f39e8f190857 78 }
seccastanova 5:f39e8f190857 79 }
seccastanova 5:f39e8f190857 80
seccastanova 5:f39e8f190857 81 //Funcion para presiones de botones
seccastanova 5:f39e8f190857 82 void buttpress(){
seccastanova 5:f39e8f190857 83 //Presion boton de encoder
seccastanova 5:f39e8f190857 84 if (button3.falling())
seccastanova 5:f39e8f190857 85 {
seccastanova 5:f39e8f190857 86 pos++;
seccastanova 5:f39e8f190857 87 }
seccastanova 5:f39e8f190857 88 if (button4.falling())
seccastanova 5:f39e8f190857 89 {
seccastanova 5:f39e8f190857 90 state++;
seccastanova 5:f39e8f190857 91 pos=0;
seccastanova 5:f39e8f190857 92 conta=0;
seccastanova 5:f39e8f190857 93 selsalida=0;
seccastanova 5:f39e8f190857 94 rele=0;
seccastanova 5:f39e8f190857 95 lcd.cls();
seccastanova 5:f39e8f190857 96 lcd.writeCommand(C1);
seccastanova 5:f39e8f190857 97 }
seccastanova 5:f39e8f190857 98 }
seccastanova 5:f39e8f190857 99
seccastanova 5:f39e8f190857 100 // FUNCIÓN PRINCIPAL
seccastanova 5:f39e8f190857 101 int main() {
seccastanova 5:f39e8f190857 102 red=1;
seccastanova 5:f39e8f190857 103 blue=1;
seccastanova 5:f39e8f190857 104 green=1;
seccastanova 5:f39e8f190857 105 rele=0;
seccastanova 5:f39e8f190857 106 Rtc_Ds1307::Time_rtc tm = {}; //Estructura para el reloj
seccastanova 5:f39e8f190857 107 rtc.getTime(tm); //lee el tiempo del DS1307
seccastanova 5:f39e8f190857 108 u2.period_ms(10);
NicolasV 3:2e823b16a4a1 109
seccastanova 5:f39e8f190857 110 // Se asigna baudrate y se configura el puerto serie de la USART
NicolasV 2:00db719ebd81 111 GSM.baud(9600);
NicolasV 2:00db719ebd81 112 GSM.format(8,Serial::None,1);
NicolasV 3:2e823b16a4a1 113 t.start();
NicolasV 3:2e823b16a4a1 114
seccastanova 5:f39e8f190857 115 lcd.cls();
seccastanova 5:f39e8f190857 116 lcd.locate(0,0);
seccastanova 5:f39e8f190857 117 lcd.printf(" Control PID ");
seccastanova 5:f39e8f190857 118 lcd.locate(0,1);
seccastanova 5:f39e8f190857 119 lcd.printf("Horno de reflujo");
seccastanova 5:f39e8f190857 120 wait_ms(3000);
NicolasV 3:2e823b16a4a1 121 lcd.cls();
NicolasV 3:2e823b16a4a1 122 lcd.writeCommand(C1);
NicolasV 2:00db719ebd81 123
seccastanova 5:f39e8f190857 124 while(true){
seccastanova 5:f39e8f190857 125 switch(state%4){ //Menus
seccastanova 5:f39e8f190857 126 case 0: //Menu 1: Configuracion controlador
seccastanova 5:f39e8f190857 127 //Grafica titulos
seccastanova 5:f39e8f190857 128 if(conta==0){
seccastanova 5:f39e8f190857 129 lcd.locate(0,0);
seccastanova 5:f39e8f190857 130 lcd.printf(" Constantes PID ");
seccastanova 5:f39e8f190857 131 wait_ms(2000);
seccastanova 5:f39e8f190857 132 lcd.cls();
seccastanova 5:f39e8f190857 133 conta++;
seccastanova 5:f39e8f190857 134 }
seccastanova 5:f39e8f190857 135 lcd.locate(0,0);
seccastanova 5:f39e8f190857 136 lcd.printf("Kp= %03d",kpnum);
seccastanova 5:f39e8f190857 137 lcd.locate(8,0);
seccastanova 5:f39e8f190857 138 lcd.printf("Ki= %03d",kinum);
seccastanova 5:f39e8f190857 139 lcd.locate(0,1);
seccastanova 5:f39e8f190857 140 lcd.printf("Kd= %03d",kdnum);
seccastanova 5:f39e8f190857 141 switch(pos%3){ //Configuracion variables
seccastanova 5:f39e8f190857 142 case 0: //Kp
seccastanova 5:f39e8f190857 143 red=0;
seccastanova 5:f39e8f190857 144 blue=1;
seccastanova 5:f39e8f190857 145 green=1;
seccastanova 5:f39e8f190857 146 m=0;
seccastanova 5:f39e8f190857 147 m=wheel.getPulses();
seccastanova 5:f39e8f190857 148 if (m!=0)
seccastanova 5:f39e8f190857 149 {
seccastanova 5:f39e8f190857 150 kpnum+=m*3;
seccastanova 5:f39e8f190857 151 if (kpnum >= 999)
seccastanova 5:f39e8f190857 152 kpnum = 999;
seccastanova 5:f39e8f190857 153 else if (kpnum < 0)
seccastanova 5:f39e8f190857 154 kpnum = 0;
seccastanova 5:f39e8f190857 155 wheel.reset();
seccastanova 5:f39e8f190857 156 m=0;
seccastanova 5:f39e8f190857 157 }
seccastanova 5:f39e8f190857 158 lcd.locate(4,0);
seccastanova 5:f39e8f190857 159 lcd.printf("%03d", kpnum);
seccastanova 5:f39e8f190857 160 buttpress(); //Verifica si se presiono el boton
seccastanova 5:f39e8f190857 161 break;
seccastanova 5:f39e8f190857 162 case 1: //Ki
seccastanova 5:f39e8f190857 163 red=1;
seccastanova 5:f39e8f190857 164 blue=1;
seccastanova 5:f39e8f190857 165 green=0;
seccastanova 5:f39e8f190857 166 m=0;
seccastanova 5:f39e8f190857 167 m=wheel.getPulses();
seccastanova 5:f39e8f190857 168 if (m!=0)
seccastanova 5:f39e8f190857 169 {
seccastanova 5:f39e8f190857 170 kinum+=m*3;
seccastanova 5:f39e8f190857 171 if (kinum >= 999)
seccastanova 5:f39e8f190857 172 kinum = 999;
seccastanova 5:f39e8f190857 173 else if (kinum < 0)
seccastanova 5:f39e8f190857 174 kinum = 0;
seccastanova 5:f39e8f190857 175 wheel.reset();
seccastanova 5:f39e8f190857 176 m=0;
seccastanova 5:f39e8f190857 177 }
seccastanova 5:f39e8f190857 178 lcd.locate(12,0);
seccastanova 5:f39e8f190857 179 lcd.printf("%03d", kinum);
seccastanova 5:f39e8f190857 180 buttpress(); //Verifica si se presiono el boton
seccastanova 5:f39e8f190857 181 break;
seccastanova 5:f39e8f190857 182 case 2: //Kd
seccastanova 5:f39e8f190857 183 red=1;
seccastanova 5:f39e8f190857 184 blue=0;
seccastanova 5:f39e8f190857 185 green=1;
seccastanova 5:f39e8f190857 186 m=0;
seccastanova 5:f39e8f190857 187 m=wheel.getPulses();
seccastanova 5:f39e8f190857 188 if (m!=0)
seccastanova 5:f39e8f190857 189 {
seccastanova 5:f39e8f190857 190 kdnum+=m*3;
seccastanova 5:f39e8f190857 191 if (kdnum >= 999)
seccastanova 5:f39e8f190857 192 kdnum = 999;
seccastanova 5:f39e8f190857 193 else if (kdnum < 0)
seccastanova 5:f39e8f190857 194 kdnum = 0;
seccastanova 5:f39e8f190857 195 wheel.reset();
seccastanova 5:f39e8f190857 196 m=0;
seccastanova 5:f39e8f190857 197 }
seccastanova 5:f39e8f190857 198 lcd.locate(4,1);
seccastanova 5:f39e8f190857 199 lcd.printf("%03d", kdnum);
seccastanova 5:f39e8f190857 200 buttpress(); //Verifica si se presiono el boton
seccastanova 5:f39e8f190857 201 break;
seccastanova 5:f39e8f190857 202 }
seccastanova 5:f39e8f190857 203 break;
seccastanova 5:f39e8f190857 204 case 1: //Menu 2: Configuracion referencia
seccastanova 5:f39e8f190857 205 if(conta==0){
seccastanova 5:f39e8f190857 206 lcd.locate(0,0);
seccastanova 5:f39e8f190857 207 lcd.printf(" Parametros del ");
seccastanova 5:f39e8f190857 208 lcd.locate(0,1);
seccastanova 5:f39e8f190857 209 lcd.printf(" Horno ");
seccastanova 5:f39e8f190857 210 wait_ms(2000);
seccastanova 5:f39e8f190857 211 lcd.cls();
seccastanova 5:f39e8f190857 212 conta++;
seccastanova 5:f39e8f190857 213 }
seccastanova 5:f39e8f190857 214 //Grafica titulos
seccastanova 5:f39e8f190857 215 red=0;
seccastanova 5:f39e8f190857 216 blue=0;
seccastanova 5:f39e8f190857 217 green=0;
seccastanova 5:f39e8f190857 218 lcd.locate(0,0);
seccastanova 5:f39e8f190857 219 lcd.printf("Tmax=");
seccastanova 5:f39e8f190857 220 lcd.locate(9,0);
seccastanova 5:f39e8f190857 221 lcd.printf("T1=");
seccastanova 5:f39e8f190857 222 lcd.locate(0,1);
seccastanova 5:f39e8f190857 223 lcd.printf("T2=");
seccastanova 5:f39e8f190857 224 lcd.locate(9,1);
seccastanova 5:f39e8f190857 225 lcd.printf("T3=");
seccastanova 5:f39e8f190857 226 //Grafica valores iniciales de variables
seccastanova 5:f39e8f190857 227 lcd.locate(5,0);
seccastanova 5:f39e8f190857 228 lcd.printf("%03d",Tmax);
seccastanova 5:f39e8f190857 229 lcd.locate(12,0);
seccastanova 5:f39e8f190857 230 lcd.printf("%04d",T1);
seccastanova 5:f39e8f190857 231 lcd.locate(3,1);
seccastanova 5:f39e8f190857 232 lcd.printf("%04d",T2);
seccastanova 5:f39e8f190857 233 lcd.locate(12,1);
seccastanova 5:f39e8f190857 234 lcd.printf("%04d",T3);
seccastanova 5:f39e8f190857 235
seccastanova 5:f39e8f190857 236 switch(pos%4){ // Se mueve entre las variables
seccastanova 5:f39e8f190857 237 case 0:
seccastanova 5:f39e8f190857 238 m=0;
seccastanova 5:f39e8f190857 239 m=wheel.getPulses();
seccastanova 5:f39e8f190857 240 if (m!=0)
seccastanova 5:f39e8f190857 241 {
seccastanova 5:f39e8f190857 242 Tmax+=m*10;
seccastanova 5:f39e8f190857 243 if (Tmax >= 800)
seccastanova 5:f39e8f190857 244 Tmax = 800;
seccastanova 5:f39e8f190857 245 else if (Tmax < TI)
seccastanova 5:f39e8f190857 246 Tmax = TI;
seccastanova 5:f39e8f190857 247 wheel.reset();
seccastanova 5:f39e8f190857 248 m=0;
seccastanova 5:f39e8f190857 249 }
seccastanova 5:f39e8f190857 250 lcd.locate(5,0);
seccastanova 5:f39e8f190857 251 lcd.printf("%03d", Tmax);
seccastanova 5:f39e8f190857 252 buttpress();
seccastanova 5:f39e8f190857 253 break;
NicolasV 3:2e823b16a4a1 254
NicolasV 2:00db719ebd81 255 case 1:
seccastanova 5:f39e8f190857 256 m=0;
seccastanova 5:f39e8f190857 257 m=wheel.getPulses();
seccastanova 5:f39e8f190857 258 if (m!=0)
seccastanova 5:f39e8f190857 259 {
seccastanova 5:f39e8f190857 260 T1+=m*10;
seccastanova 5:f39e8f190857 261 if (T1 >= 1800)
seccastanova 5:f39e8f190857 262 T1 = 1800;
seccastanova 5:f39e8f190857 263 else if (T1 < 0)
seccastanova 5:f39e8f190857 264 T1 = 0;
seccastanova 5:f39e8f190857 265 wheel.reset();
seccastanova 5:f39e8f190857 266 m=0;
seccastanova 5:f39e8f190857 267 }
seccastanova 5:f39e8f190857 268 if (T2<T1)T2=T1;
seccastanova 5:f39e8f190857 269 lcd.locate(12,0);
seccastanova 5:f39e8f190857 270 lcd.printf("%4d", T1);
seccastanova 5:f39e8f190857 271 buttpress();
seccastanova 5:f39e8f190857 272 break;
seccastanova 5:f39e8f190857 273
NicolasV 2:00db719ebd81 274 case 2:
seccastanova 5:f39e8f190857 275 m=0;
seccastanova 5:f39e8f190857 276 m=wheel.getPulses();
seccastanova 5:f39e8f190857 277 if (m!=0)
seccastanova 5:f39e8f190857 278 {
seccastanova 5:f39e8f190857 279 T2+=m*10;
seccastanova 5:f39e8f190857 280 if (T2 >= 1800)
seccastanova 5:f39e8f190857 281 T2 = 1800;
seccastanova 5:f39e8f190857 282 else if (T2 < T1)
seccastanova 5:f39e8f190857 283 T2 = T1;
seccastanova 5:f39e8f190857 284 wheel.reset();
seccastanova 5:f39e8f190857 285 m=0;
seccastanova 5:f39e8f190857 286 }
seccastanova 5:f39e8f190857 287 if (T3<T2)T3=T2;
tony63 0:4e0dfcf0e7ce 288 lcd.locate(3,1);
seccastanova 5:f39e8f190857 289 lcd.printf("%4d", T2);
seccastanova 5:f39e8f190857 290 buttpress();
seccastanova 5:f39e8f190857 291 break;
seccastanova 5:f39e8f190857 292
seccastanova 5:f39e8f190857 293 case 3:
seccastanova 5:f39e8f190857 294 m=0;
seccastanova 5:f39e8f190857 295 m=wheel.getPulses();
seccastanova 5:f39e8f190857 296 if (m!=0)
seccastanova 5:f39e8f190857 297 {
seccastanova 5:f39e8f190857 298 T3+=m*10;
seccastanova 5:f39e8f190857 299 if (T3 >= 1800)
seccastanova 5:f39e8f190857 300 T3 = 1800;
seccastanova 5:f39e8f190857 301 else if (T3 < T2)
seccastanova 5:f39e8f190857 302 T3 = T2;
seccastanova 5:f39e8f190857 303 wheel.reset();
seccastanova 5:f39e8f190857 304 m=0;
seccastanova 5:f39e8f190857 305 }
seccastanova 5:f39e8f190857 306 lcd.locate(12,1);
seccastanova 5:f39e8f190857 307 lcd.printf("%4d", T3);
seccastanova 5:f39e8f190857 308 buttpress();
seccastanova 5:f39e8f190857 309 break;
NicolasV 3:2e823b16a4a1 310 }
seccastanova 5:f39e8f190857 311 break;
seccastanova 5:f39e8f190857 312 ////// ELECCIÓN DE SALIDA /////////////////////////////////////////////////////////////////////////////////////////////////////
seccastanova 5:f39e8f190857 313 case 2:
seccastanova 5:f39e8f190857 314 if(conta==0){
seccastanova 5:f39e8f190857 315 lcd.locate(0,0);
seccastanova 5:f39e8f190857 316 lcd.printf(" Seleccione el ");
seccastanova 5:f39e8f190857 317 lcd.locate(0,1);
seccastanova 5:f39e8f190857 318 lcd.printf(" tipo de salida ");
seccastanova 5:f39e8f190857 319 wait(2);
seccastanova 5:f39e8f190857 320 lcd.locate(0,0);
seccastanova 5:f39e8f190857 321 lcd.printf("-> Analogica ");
seccastanova 5:f39e8f190857 322 lcd.locate(0,1);
seccastanova 5:f39e8f190857 323 lcd.printf("-- PWM ");
seccastanova 5:f39e8f190857 324 conta++;
seccastanova 5:f39e8f190857 325 }
seccastanova 5:f39e8f190857 326 if(selsalida==0) //Salida Analógica
seccastanova 5:f39e8f190857 327 {
seccastanova 5:f39e8f190857 328 red=0;
seccastanova 5:f39e8f190857 329 green=1;
seccastanova 5:f39e8f190857 330 blue=1;
seccastanova 5:f39e8f190857 331 salidaAn=1;
seccastanova 5:f39e8f190857 332 salidaPWM=0;
seccastanova 5:f39e8f190857 333 m=wheel.getPulses();
seccastanova 5:f39e8f190857 334 if(m!=0)
seccastanova 5:f39e8f190857 335 {
seccastanova 5:f39e8f190857 336 selsalida=1;
seccastanova 5:f39e8f190857 337 m=0;
seccastanova 5:f39e8f190857 338 wheel.reset();
seccastanova 5:f39e8f190857 339
seccastanova 5:f39e8f190857 340 lcd.locate(1,0);
seccastanova 5:f39e8f190857 341 lcd.printf("- Analogica ");
seccastanova 5:f39e8f190857 342 lcd.locate(1,1);
seccastanova 5:f39e8f190857 343 lcd.printf("> PWM ");
seccastanova 5:f39e8f190857 344 }
seccastanova 5:f39e8f190857 345 }
seccastanova 5:f39e8f190857 346
seccastanova 5:f39e8f190857 347 ///////////////////
seccastanova 5:f39e8f190857 348
seccastanova 5:f39e8f190857 349 if(selsalida==1) //Salida PWM
seccastanova 5:f39e8f190857 350 {
seccastanova 5:f39e8f190857 351 red=1;
seccastanova 5:f39e8f190857 352 green=1;
seccastanova 5:f39e8f190857 353 blue=0;
seccastanova 5:f39e8f190857 354 salidaAn=0;
seccastanova 5:f39e8f190857 355 salidaPWM=1;
seccastanova 5:f39e8f190857 356 m=wheel.getPulses();
seccastanova 5:f39e8f190857 357 if(m!=0)
seccastanova 5:f39e8f190857 358 {
seccastanova 5:f39e8f190857 359 selsalida=0;
seccastanova 5:f39e8f190857 360 m=0;
seccastanova 5:f39e8f190857 361 wheel.reset();
seccastanova 5:f39e8f190857 362
seccastanova 5:f39e8f190857 363 lcd.locate(1,0);
seccastanova 5:f39e8f190857 364 lcd.printf("> Analogica ");
seccastanova 5:f39e8f190857 365 lcd.locate(1,1);
seccastanova 5:f39e8f190857 366 lcd.printf("- PWM ");
seccastanova 5:f39e8f190857 367 }
seccastanova 5:f39e8f190857 368 }
seccastanova 5:f39e8f190857 369
seccastanova 5:f39e8f190857 370 if (button4.falling())
seccastanova 5:f39e8f190857 371 {
seccastanova 5:f39e8f190857 372 state++;
seccastanova 5:f39e8f190857 373 pos=0;
seccastanova 5:f39e8f190857 374 conta=0;
seccastanova 5:f39e8f190857 375 lcd.cls();
seccastanova 5:f39e8f190857 376 lcd.writeCommand(C1);
seccastanova 5:f39e8f190857 377 }
seccastanova 5:f39e8f190857 378 break;
seccastanova 5:f39e8f190857 379 case 3: // Menu 3: Dinamica del sistema y visualizacion
seccastanova 5:f39e8f190857 380 //control:
seccastanova 5:f39e8f190857 381
seccastanova 5:f39e8f190857 382 rtc.getTime(tm); //READING THE RTC
seccastanova 5:f39e8f190857 383 //Grafica titulos
seccastanova 5:f39e8f190857 384 if(conta==0){
seccastanova 5:f39e8f190857 385
seccastanova 5:f39e8f190857 386 if (salidaAn==1){
seccastanova 5:f39e8f190857 387 red=0;
seccastanova 5:f39e8f190857 388 green=1;
seccastanova 5:f39e8f190857 389 blue=1;
seccastanova 5:f39e8f190857 390 }
seccastanova 5:f39e8f190857 391 if (salidaPWM==1){
seccastanova 5:f39e8f190857 392 red=1;
seccastanova 5:f39e8f190857 393 green=1;
seccastanova 5:f39e8f190857 394 blue=0;
seccastanova 5:f39e8f190857 395 rele=1;
seccastanova 5:f39e8f190857 396 }
seccastanova 5:f39e8f190857 397
seccastanova 5:f39e8f190857 398 lcd.locate(0,0);lcd.printf(" Parametros ");
seccastanova 5:f39e8f190857 399 lcd.locate(0,1);lcd.printf(" Guardados ");
seccastanova 5:f39e8f190857 400 wait(1.5);
seccastanova 5:f39e8f190857 401 lcd.locate(0,0);lcd.printf(" Inicia control ");
seccastanova 5:f39e8f190857 402 lcd.locate(0,1);lcd.printf(" de reflujo ");
seccastanova 5:f39e8f190857 403 wait(1.5);
seccastanova 5:f39e8f190857 404 lcd.cls();
seccastanova 5:f39e8f190857 405 tm.min=0;
seccastanova 5:f39e8f190857 406 tm.sec=0;
seccastanova 5:f39e8f190857 407 conta++;
seccastanova 5:f39e8f190857 408 rtc.setTime(tm,true,false);
seccastanova 5:f39e8f190857 409 }
seccastanova 5:f39e8f190857 410 min=tm.min;
seccastanova 5:f39e8f190857 411 seg=tm.sec;
seccastanova 5:f39e8f190857 412 cons(min,seg);
NicolasV 3:2e823b16a4a1 413 lcd.locate(0,0);
seccastanova 5:f39e8f190857 414 lcd.printf("y= %3.0f",med);
seccastanova 5:f39e8f190857 415 lcd.locate(8,0);
seccastanova 5:f39e8f190857 416 lcd.printf("e=%3.0f ",err);
seccastanova 5:f39e8f190857 417 lcd.locate(0,1);
seccastanova 5:f39e8f190857 418 lcd.printf("r= %03d",c);
seccastanova 5:f39e8f190857 419 lcd.locate(8,1);
seccastanova 5:f39e8f190857 420 lcd.printf("t=%02d:%02d ",tm.min,tm.sec);
NicolasV 2:00db719ebd81 421
seccastanova 5:f39e8f190857 422 if (t.read_ms() - t_pid > 20) {
seccastanova 5:f39e8f190857 423 cons(min,seg);
seccastanova 5:f39e8f190857 424 med = y.read()*999;
seccastanova 5:f39e8f190857 425 err = c - med; // Se calcula el error
seccastanova 5:f39e8f190857 426 ap = kpnum*err*0.01f; // Se calcula la acción proporcional
seccastanova 5:f39e8f190857 427 ai += kinum*err*0.01f; // Cálculo de la integral del error
seccastanova 5:f39e8f190857 428 ad = kdnum*(err - err_v)*0.01f; // Cálculo de la acción derivativa
seccastanova 5:f39e8f190857 429 pid = ap + ai + ad;
seccastanova 5:f39e8f190857 430
seccastanova 5:f39e8f190857 431 if (pid <= 0) pid = 0;
seccastanova 5:f39e8f190857 432 if (pid > 999) pid = 999;
seccastanova 5:f39e8f190857 433
seccastanova 5:f39e8f190857 434 setpoint = c;
seccastanova 5:f39e8f190857 435 GSM.printf("#%3.0f%3.0f&", med, setpoint); // Se envía una cadena de caracteres por el puerto serial. Se agregan identificadores #...& que denotan el comienzo y la terminación de la misma.
seccastanova 5:f39e8f190857 436 // Esto se hace con el fin de evitar errores en la transmisión. Estos identificadores se usan en la aplicación de AppInventor.
seccastanova 5:f39e8f190857 437 err_v = err;
seccastanova 5:f39e8f190857 438 o = pid/999;
seccastanova 5:f39e8f190857 439 if (salidaAn==1)u.write(o);
seccastanova 5:f39e8f190857 440 if (salidaPWM==1)u2.write(o);
seccastanova 5:f39e8f190857 441 t_pid = t.read_ms();
seccastanova 5:f39e8f190857 442 }
seccastanova 5:f39e8f190857 443
seccastanova 5:f39e8f190857 444 buttpress();
seccastanova 5:f39e8f190857 445 break;
seccastanova 5:f39e8f190857 446
NicolasV 3:2e823b16a4a1 447 }
NicolasV 3:2e823b16a4a1 448 }
seccastanova 5:f39e8f190857 449 }
seccastanova 5:f39e8f190857 450
seccastanova 5:f39e8f190857 451