![](/media/cache/profiles/IMG-20170731-WA002223234124.jpg.50x50_q85.jpg)
Controlador PID
Dependencies: Debounced Pulse1 QEI RTC-DS1307 TextLCD_1 mbed
Fork of grafica_PID_android by
main.cpp@5:f39e8f190857, 2018-06-05 (annotated)
- 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?
User | Revision | Line number | New 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 |