Version Final

Dependencies:   mbed DS1820

Committer:
NIcolasFernandezSanz
Date:
Wed Jun 05 10:56:29 2019 +0000
Revision:
8:53555acc118b
Parent:
7:a16d4e848e5e
Child:
9:56bfbc0947af
Version4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NIcolasFernandezSanz 5:f12c0d64518f 1 /*
NIcolasFernandezSanz 5:f12c0d64518f 2 FERNANDEZ-CLERICI
NIcolasFernandezSanz 5:f12c0d64518f 3 EJER01 - TP01
Sissors 0:e069f9f26768 4
NIcolasFernandezSanz 5:f12c0d64518f 5 PTB0 -- Habilitacion Cooler
NIcolasFernandezSanz 5:f12c0d64518f 6 PTB1 -- DS18B20 (Data) (4K7 PullUp)
NIcolasFernandezSanz 5:f12c0d64518f 7 D3 -- Sensor Efecto de Hall --> PullUp 4k7
NIcolasFernandezSanz 5:f12c0d64518f 8 PTB3 -- Pulsador --> 0 = Nada || 1 = Pulsado
NIcolasFernandezSanz 5:f12c0d64518f 9 PTC2 -- Preset
NIcolasFernandezSanz 5:f12c0d64518f 10 A3 -- Pin Para Probar que el programa no retiene
Sissors 0:e069f9f26768 11
NIcolasFernandezSanz 5:f12c0d64518f 12 */
Sissors 0:e069f9f26768 13
NIcolasFernandezSanz 5:f12c0d64518f 14 /*Librerias*/
Sissors 0:e069f9f26768 15 #include "mbed.h"
Sissors 0:e069f9f26768 16 #include "DS1820.h"
Sissors 0:e069f9f26768 17
NIcolasFernandezSanz 5:f12c0d64518f 18
NIcolasFernandezSanz 5:f12c0d64518f 19 /*Definicion Pines*/
NIcolasFernandezSanz 5:f12c0d64518f 20 #define EN_COOLER PTB0
NIcolasFernandezSanz 5:f12c0d64518f 21 #define DS18B20_PIN PTB1
NIcolasFernandezSanz 5:f12c0d64518f 22 #define VELOCIDAD D3
NIcolasFernandezSanz 5:f12c0d64518f 23 #define PULSADOR A5
NIcolasFernandezSanz 5:f12c0d64518f 24 #define PRESET PTC2
NIcolasFernandezSanz 5:f12c0d64518f 25
NIcolasFernandezSanz 5:f12c0d64518f 26 /*Definicion de Elementos*/
NIcolasFernandezSanz 5:f12c0d64518f 27 DS1820 probe(DS18B20_PIN);
NIcolasFernandezSanz 5:f12c0d64518f 28
NIcolasFernandezSanz 5:f12c0d64518f 29 DigitalOut Rojo(LED1);
NIcolasFernandezSanz 5:f12c0d64518f 30 DigitalOut Verde(LED2);
NIcolasFernandezSanz 5:f12c0d64518f 31 DigitalOut Azul(LED3);
NIcolasFernandezSanz 5:f12c0d64518f 32
NIcolasFernandezSanz 5:f12c0d64518f 33 DigitalOut RET(A3);
NIcolasFernandezSanz 5:f12c0d64518f 34
NIcolasFernandezSanz 5:f12c0d64518f 35 PwmOut Cooler(EN_COOLER);
NIcolasFernandezSanz 5:f12c0d64518f 36 InterruptIn velocidad(VELOCIDAD);
NIcolasFernandezSanz 5:f12c0d64518f 37 AnalogIn Preset(PRESET);
NIcolasFernandezSanz 5:f12c0d64518f 38 DigitalIn P(PULSADOR);
NIcolasFernandezSanz 5:f12c0d64518f 39
NIcolasFernandezSanz 5:f12c0d64518f 40
NIcolasFernandezSanz 5:f12c0d64518f 41 /*MAQUINA DE ESTADOS CENTRAL*/
NIcolasFernandezSanz 5:f12c0d64518f 42
NIcolasFernandezSanz 5:f12c0d64518f 43 #define InicioSistema 0
NIcolasFernandezSanz 5:f12c0d64518f 44 #define LazoAbierto 1
NIcolasFernandezSanz 5:f12c0d64518f 45 #define LazoCerrado 2
NIcolasFernandezSanz 5:f12c0d64518f 46 #define VelocidadMaxima 3
NIcolasFernandezSanz 5:f12c0d64518f 47
NIcolasFernandezSanz 5:f12c0d64518f 48 /*Variables maquina de estado lazos*/
NIcolasFernandezSanz 5:f12c0d64518f 49 int Modo = 0; //Me avisa en que modo estoy : Lazo Abierto , Lazo Cerrado, Inicio Sistema y Velocidad maxima
NIcolasFernandezSanz 5:f12c0d64518f 50 int ta = 0; //Acumulador de tiempo del Inicio Sistema
NIcolasFernandezSanz 5:f12c0d64518f 51 void medicion_velocidad(void);
NIcolasFernandezSanz 5:f12c0d64518f 52 int VMAX = 0; //Velocidad maxima del Cooler
NIcolasFernandezSanz 5:f12c0d64518f 53
NIcolasFernandezSanz 5:f12c0d64518f 54
NIcolasFernandezSanz 5:f12c0d64518f 55 /*MAQUINA DE ESTADOS ANTI REBOTE*/
NIcolasFernandezSanz 5:f12c0d64518f 56
NIcolasFernandezSanz 5:f12c0d64518f 57 #define INICIO_P 0
NIcolasFernandezSanz 5:f12c0d64518f 58 #define RISING_P 1
NIcolasFernandezSanz 5:f12c0d64518f 59 #define RETENCION_P 2
NIcolasFernandezSanz 5:f12c0d64518f 60
NIcolasFernandezSanz 5:f12c0d64518f 61 bool antirrebote(bool lectura);
NIcolasFernandezSanz 5:f12c0d64518f 62 int estado = 0;//Variable que guaarda el estado de la maquina de estados
NIcolasFernandezSanz 5:f12c0d64518f 63 int tp = 0;//Acumulador de tiempo de la maquina
NIcolasFernandezSanz 5:f12c0d64518f 64 void CambioDeModo(); //Funcion que me sirve para switchear entre los dos modos
NIcolasFernandezSanz 5:f12c0d64518f 65
NIcolasFernandezSanz 5:f12c0d64518f 66
NIcolasFernandezSanz 5:f12c0d64518f 67 /*MAQUINA DE ESTADOS MEDICION VELOCIDAD*/
NIcolasFernandezSanz 5:f12c0d64518f 68
NIcolasFernandezSanz 5:f12c0d64518f 69 #define INCIO_V 0
NIcolasFernandezSanz 5:f12c0d64518f 70 #define RISE_1 1
NIcolasFernandezSanz 5:f12c0d64518f 71 #define FALL_1 2
NIcolasFernandezSanz 5:f12c0d64518f 72 #define ESPERA_V 3
NIcolasFernandezSanz 5:f12c0d64518f 73
NIcolasFernandezSanz 5:f12c0d64518f 74 //Interrupciones de deteccion de cambios en pin de medicion de valocidad
NIcolasFernandezSanz 5:f12c0d64518f 75 void R_ton(); //Funcion relacionada a la interrupcion de deteccion de flancos ascendentes
NIcolasFernandezSanz 5:f12c0d64518f 76 void F_ton(); //Funcion relacionada a la interrupcion de deteccion de flancos descendentes
NIcolasFernandezSanz 5:f12c0d64518f 77
NIcolasFernandezSanz 5:f12c0d64518f 78 //Flags medicion de ancho de pulso
NIcolasFernandezSanz 5:f12c0d64518f 79 bool em = 0; //Estoy midiendo
NIcolasFernandezSanz 5:f12c0d64518f 80 bool tmv = 0; //Termine de medir
NIcolasFernandezSanz 5:f12c0d64518f 81 int tv = 0; //Acumulacion de tiempo maquina control velocidad
NIcolasFernandezSanz 5:f12c0d64518f 82 int EMV = 0; //Guardar estado medicion de velocidad
NIcolasFernandezSanz 5:f12c0d64518f 83 float RPM = 0; //Guardo la velocidad
NIcolasFernandezSanz 5:f12c0d64518f 84
NIcolasFernandezSanz 5:f12c0d64518f 85
NIcolasFernandezSanz 5:f12c0d64518f 86
NIcolasFernandezSanz 5:f12c0d64518f 87 /*MAQUINA DE ESTADOS CAMBIO DE DUTY (LAZO ABIERTO)*/
NIcolasFernandezSanz 5:f12c0d64518f 88
NIcolasFernandezSanz 5:f12c0d64518f 89 #define INICIO_CM 0
NIcolasFernandezSanz 5:f12c0d64518f 90 #define CAMBIO_MAYOR 1
NIcolasFernandezSanz 5:f12c0d64518f 91 #define CAMBIO_MENOR 2
NIcolasFernandezSanz 5:f12c0d64518f 92 #define INICIO_CAMBIO_MENOR 5
NIcolasFernandezSanz 5:f12c0d64518f 93 #define ESPERA_DECREMENTO 3
NIcolasFernandezSanz 5:f12c0d64518f 94 #define ESPERA_FINAL 4
NIcolasFernandezSanz 5:f12c0d64518f 95
NIcolasFernandezSanz 5:f12c0d64518f 96 int tcd = 0; //Acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 97 int ECM = 0; //Guardo el estado de la maquina
NIcolasFernandezSanz 5:f12c0d64518f 98 float cantv = 0; //Cantidad de veces que debo modificar el duty (funciona como entero)
NIcolasFernandezSanz 5:f12c0d64518f 99 char jv = 0; //Cantidad de veces que modifique el duty
NIcolasFernandezSanz 5:f12c0d64518f 100 float D = 1.00f; //Duty Actual
NIcolasFernandezSanz 5:f12c0d64518f 101 float DAN = 0.5f;//Duty Anterior
NIcolasFernandezSanz 5:f12c0d64518f 102
NIcolasFernandezSanz 5:f12c0d64518f 103 void cambio_duty_pwm(float nuevoDuty); //Funcion que engloa la maquina
NIcolasFernandezSanz 5:f12c0d64518f 104
NIcolasFernandezSanz 5:f12c0d64518f 105
NIcolasFernandezSanz 5:f12c0d64518f 106 /*MAQUINA DE ESTADOS LAZO CERRADO (DUTY EN FUNCION DE TEMPERATURA)*/
NIcolasFernandezSanz 5:f12c0d64518f 107
NIcolasFernandezSanz 5:f12c0d64518f 108 #define INCIO_LAZOCERRADO 0
NIcolasFernandezSanz 5:f12c0d64518f 109 #define MEDICION_TEMPERATURA 1
NIcolasFernandezSanz 5:f12c0d64518f 110 #define MEDICION_RPM 2
NIcolasFernandezSanz 5:f12c0d64518f 111 #define CAMBIO_PWM 3
NIcolasFernandezSanz 5:f12c0d64518f 112 #define ESPERA_CAMBIOS_PWM 4
NIcolasFernandezSanz 5:f12c0d64518f 113 #define ESPERA_ENTRE_MODIFICACIONES 5
NIcolasFernandezSanz 5:f12c0d64518f 114
NIcolasFernandezSanz 5:f12c0d64518f 115 void control_PWM_Temp(void); //Funcion que engloba la maquina de estados
NIcolasFernandezSanz 5:f12c0d64518f 116
NIcolasFernandezSanz 5:f12c0d64518f 117 int CPT = 0; //Guardo el estado de la maquina
NIcolasFernandezSanz 5:f12c0d64518f 118 int IM = 0; //Acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 119 float duty = 0; //Guardo el duty actual
NIcolasFernandezSanz 5:f12c0d64518f 120
NIcolasFernandezSanz 5:f12c0d64518f 121 /*SubMaquina utilizada para modificar el duty*/
NIcolasFernandezSanz 5:f12c0d64518f 122 int FTR = 0; //Control de estados de la submaquina
NIcolasFernandezSanz 5:f12c0d64518f 123 bool tdm = 0; //Flag que me notifica cuando termine de cambiar el duty..
NIcolasFernandezSanz 5:f12c0d64518f 124
NIcolasFernandezSanz 5:f12c0d64518f 125 float NuevoDuty = 0; //Duty que voy enviando a forma de prueba y error..
NIcolasFernandezSanz 5:f12c0d64518f 126
NIcolasFernandezSanz 5:f12c0d64518f 127 /*VALORES DE CONFIGURACION LAZO CERRADO*/
NIcolasFernandezSanz 5:f12c0d64518f 128 #define DEFINICION_CAMBIO_PWM 0.02f //Resolucion de barrido, valores altos agilizan el cambio pero pueden hacer que nunca se alcance lo pedido..
NIcolasFernandezSanz 5:f12c0d64518f 129 #define MinRPM 500.0f //Minima velocidad establecida por el Cooler
NIcolasFernandezSanz 5:f12c0d64518f 130 #define ToleranciaRPM 100.0f //Tolerancia de calculos en torno a la velocidad (Cuanto me puedo desviar de la regla de tres simple y considerarlo verdadero)
NIcolasFernandezSanz 5:f12c0d64518f 131
NIcolasFernandezSanz 5:f12c0d64518f 132 /*RELACION DE REVOLUCIONES POR MINUTO EN FUNCION DE LA TEMPERATURA*/
NIcolasFernandezSanz 5:f12c0d64518f 133 /*
NIcolasFernandezSanz 5:f12c0d64518f 134 20ºC ==> 500rpm
NIcolasFernandezSanz 5:f12c0d64518f 135 x ºC ==> x rpm
NIcolasFernandezSanz 5:f12c0d64518f 136 */
NIcolasFernandezSanz 5:f12c0d64518f 137
NIcolasFernandezSanz 5:f12c0d64518f 138 void cambio_gradual_duty(float obj);//Funcion que engloba la maquina de modificacion del duty , en especial la zona que no puedo enviar directamente..
NIcolasFernandezSanz 5:f12c0d64518f 139
NIcolasFernandezSanz 5:f12c0d64518f 140 int ty = 0; //Acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 141
NIcolasFernandezSanz 5:f12c0d64518f 142
NIcolasFernandezSanz 5:f12c0d64518f 143 /*ELEMENTOS GENERALES DEL SISTEMA*/
NIcolasFernandezSanz 5:f12c0d64518f 144 void leds(int num);
NIcolasFernandezSanz 5:f12c0d64518f 145 /*Tickers*/
NIcolasFernandezSanz 5:f12c0d64518f 146 Ticker TiempoBase;
NIcolasFernandezSanz 5:f12c0d64518f 147 Ticker TiempoRapido;
NIcolasFernandezSanz 5:f12c0d64518f 148 void base_de_tiempo();
NIcolasFernandezSanz 5:f12c0d64518f 149 void tiempo_rapido();
NIcolasFernandezSanz 5:f12c0d64518f 150 /*Timmers*/
NIcolasFernandezSanz 5:f12c0d64518f 151 Timer ap;
NIcolasFernandezSanz 5:f12c0d64518f 152
NIcolasFernandezSanz 5:f12c0d64518f 153 int main()
NIcolasFernandezSanz 5:f12c0d64518f 154 {
NIcolasFernandezSanz 5:f12c0d64518f 155 /*Apago Todos los LEDS*/
NIcolasFernandezSanz 5:f12c0d64518f 156 leds(0);
NIcolasFernandezSanz 5:f12c0d64518f 157 printf("TRABAJO PRACTICO 1 : MAQUINAS DE ESTADO\r\n EJERCICIO 1\r\n ALUMNOS: FERNANDEZ SANZ Y CLERICI \r\n INICIANDO.............\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 158 /*Attach Timmers*/
NIcolasFernandezSanz 5:f12c0d64518f 159 TiempoBase.attach(&base_de_tiempo, 0.5f);
NIcolasFernandezSanz 5:f12c0d64518f 160 TiempoRapido.attach(&tiempo_rapido, 0.05f);
NIcolasFernandezSanz 5:f12c0d64518f 161 /*Inicio PWM*/
NIcolasFernandezSanz 5:f12c0d64518f 162 Cooler.period(0.01f); //Establezco un periodo de 100mS para el PWM
NIcolasFernandezSanz 5:f12c0d64518f 163
NIcolasFernandezSanz 5:f12c0d64518f 164 while(1) {
NIcolasFernandezSanz 5:f12c0d64518f 165
NIcolasFernandezSanz 5:f12c0d64518f 166 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NIcolasFernandezSanz 5:f12c0d64518f 167 /*Maquina de Estados Central del Sistema*/
NIcolasFernandezSanz 5:f12c0d64518f 168 switch(Modo) {
NIcolasFernandezSanz 5:f12c0d64518f 169
NIcolasFernandezSanz 5:f12c0d64518f 170 //La primera vez arranco el motor al maximo y inicializo la medicion de velocidad..
NIcolasFernandezSanz 5:f12c0d64518f 171 case InicioSistema:
NIcolasFernandezSanz 5:f12c0d64518f 172 Cooler.write(1);
NIcolasFernandezSanz 5:f12c0d64518f 173 //Espero un tiempo para q arranque el motor
NIcolasFernandezSanz 5:f12c0d64518f 174 if(ta > 5) {
NIcolasFernandezSanz 5:f12c0d64518f 175 ta = 0;
NIcolasFernandezSanz 5:f12c0d64518f 176 /*Attach Pin Interrupt del medidor de velocidad*/
NIcolasFernandezSanz 5:f12c0d64518f 177 velocidad.rise(&R_ton);
NIcolasFernandezSanz 5:f12c0d64518f 178 velocidad.fall(&F_ton);
NIcolasFernandezSanz 5:f12c0d64518f 179 printf("Termine de incializar....\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 180 Modo = VelocidadMaxima;
NIcolasFernandezSanz 5:f12c0d64518f 181 }
NIcolasFernandezSanz 5:f12c0d64518f 182
NIcolasFernandezSanz 5:f12c0d64518f 183 break;
NIcolasFernandezSanz 5:f12c0d64518f 184
NIcolasFernandezSanz 5:f12c0d64518f 185 //Mido la velocidad maxima del Cooler.. Lo setie al meximo en "InicioSistema"
NIcolasFernandezSanz 5:f12c0d64518f 186 case VelocidadMaxima:
NIcolasFernandezSanz 5:f12c0d64518f 187 medicion_velocidad();
NIcolasFernandezSanz 5:f12c0d64518f 188 break;
NIcolasFernandezSanz 5:f12c0d64518f 189
NIcolasFernandezSanz 5:f12c0d64518f 190 //Mido el Preset y seteo el duty del Cooler en funcion de la lectura
NIcolasFernandezSanz 5:f12c0d64518f 191 case LazoAbierto:
NIcolasFernandezSanz 5:f12c0d64518f 192 float lec = Preset;
NIcolasFernandezSanz 5:f12c0d64518f 193 cambio_duty_pwm(lec);
NIcolasFernandezSanz 5:f12c0d64518f 194 break;
NIcolasFernandezSanz 5:f12c0d64518f 195
NIcolasFernandezSanz 5:f12c0d64518f 196 //Mido la temperatura y establezco la velocidad del Cooler
NIcolasFernandezSanz 5:f12c0d64518f 197 case LazoCerrado:
NIcolasFernandezSanz 5:f12c0d64518f 198 control_PWM_Temp();
NIcolasFernandezSanz 5:f12c0d64518f 199 break;
NIcolasFernandezSanz 5:f12c0d64518f 200 }
NIcolasFernandezSanz 5:f12c0d64518f 201 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NIcolasFernandezSanz 5:f12c0d64518f 202
NIcolasFernandezSanz 5:f12c0d64518f 203 //Actualizo el pulsador...
NIcolasFernandezSanz 5:f12c0d64518f 204 CambioDeModo();
NIcolasFernandezSanz 8:53555acc118b 205
NIcolasFernandezSanz 5:f12c0d64518f 206 RET = !RET; //Cambio el estado del pin de verificacion..
NIcolasFernandezSanz 5:f12c0d64518f 207
NIcolasFernandezSanz 5:f12c0d64518f 208 }
NIcolasFernandezSanz 5:f12c0d64518f 209 }
NIcolasFernandezSanz 5:f12c0d64518f 210
NIcolasFernandezSanz 5:f12c0d64518f 211 //Funcion utilizada para controlar los Leds On Board
NIcolasFernandezSanz 5:f12c0d64518f 212 //IN ==> Combinacion Binaria de estados || OUT ==> Actualizacion estado de leds
NIcolasFernandezSanz 5:f12c0d64518f 213
NIcolasFernandezSanz 5:f12c0d64518f 214 void leds(int num)
NIcolasFernandezSanz 5:f12c0d64518f 215 {
NIcolasFernandezSanz 5:f12c0d64518f 216 switch(num) {
NIcolasFernandezSanz 5:f12c0d64518f 217 case 0:
NIcolasFernandezSanz 5:f12c0d64518f 218 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 219 Verde = 1;
NIcolasFernandezSanz 5:f12c0d64518f 220 Azul = 1;
NIcolasFernandezSanz 5:f12c0d64518f 221 break;
NIcolasFernandezSanz 5:f12c0d64518f 222 case 4:
NIcolasFernandezSanz 5:f12c0d64518f 223 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 224 Verde = 1;
NIcolasFernandezSanz 5:f12c0d64518f 225 Azul = 1;
NIcolasFernandezSanz 5:f12c0d64518f 226 break;
NIcolasFernandezSanz 5:f12c0d64518f 227 case 2:
NIcolasFernandezSanz 5:f12c0d64518f 228 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 229 Verde = 0;
NIcolasFernandezSanz 5:f12c0d64518f 230 Azul = 1;
NIcolasFernandezSanz 5:f12c0d64518f 231 break;
NIcolasFernandezSanz 5:f12c0d64518f 232 case 1:
NIcolasFernandezSanz 5:f12c0d64518f 233 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 234 Verde = 1;
NIcolasFernandezSanz 5:f12c0d64518f 235 Azul = 0;
NIcolasFernandezSanz 5:f12c0d64518f 236 break;
NIcolasFernandezSanz 5:f12c0d64518f 237 case 7:
NIcolasFernandezSanz 5:f12c0d64518f 238 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 239 Verde = 0;
NIcolasFernandezSanz 5:f12c0d64518f 240 Azul = 0;
Sissors 0:e069f9f26768 241 break;
Sissors 0:e069f9f26768 242 }
NIcolasFernandezSanz 5:f12c0d64518f 243 }
NIcolasFernandezSanz 5:f12c0d64518f 244
NIcolasFernandezSanz 5:f12c0d64518f 245 //Maquina de estados que elimina el Rebote de los pulsadores
NIcolasFernandezSanz 5:f12c0d64518f 246 //IN ==> DigitalIn || OUT ==> Detector de flancos ascendentes del pulsador
NIcolasFernandezSanz 5:f12c0d64518f 247 bool antirrebote(bool lectura)
NIcolasFernandezSanz 5:f12c0d64518f 248 {
NIcolasFernandezSanz 5:f12c0d64518f 249 static bool lecant = 0;
NIcolasFernandezSanz 5:f12c0d64518f 250
NIcolasFernandezSanz 5:f12c0d64518f 251 switch(estado) {
NIcolasFernandezSanz 5:f12c0d64518f 252 case INICIO_P:
NIcolasFernandezSanz 5:f12c0d64518f 253 //Si tengo un flanco ascendente
NIcolasFernandezSanz 5:f12c0d64518f 254 if((lectura == 1) && (lecant == 0)) {
NIcolasFernandezSanz 5:f12c0d64518f 255 estado = RISING_P;
NIcolasFernandezSanz 5:f12c0d64518f 256 }
NIcolasFernandezSanz 7:a16d4e848e5e 257 tp = 0;//Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 258 break;
NIcolasFernandezSanz 5:f12c0d64518f 259 case RISING_P:
NIcolasFernandezSanz 7:a16d4e848e5e 260 /*Devuelvo el estado uno , una unica vez (Saco el rebote)*/
NIcolasFernandezSanz 5:f12c0d64518f 261 estado = RETENCION_P;
NIcolasFernandezSanz 5:f12c0d64518f 262 tp = 0;
NIcolasFernandezSanz 7:a16d4e848e5e 263 return 1; //Devuelvo el estado alto ya que tuve un flanco
NIcolasFernandezSanz 5:f12c0d64518f 264 case RETENCION_P:
NIcolasFernandezSanz 7:a16d4e848e5e 265 /*Durante un segundo y siempre que la lectura siga siendo alta retengo*/
NIcolasFernandezSanz 5:f12c0d64518f 266 if((tp >= 2) && (lectura == 0)) {
NIcolasFernandezSanz 5:f12c0d64518f 267 estado = INICIO_P;
NIcolasFernandezSanz 5:f12c0d64518f 268 }
NIcolasFernandezSanz 5:f12c0d64518f 269 break;
Sissors 0:e069f9f26768 270 }
NIcolasFernandezSanz 7:a16d4e848e5e 271 lecant = lectura; //Asigno el estado previo para el proximo ciclo..
NIcolasFernandezSanz 8:53555acc118b 272 return 0; //Devuelvo el estado nulo o cero
NIcolasFernandezSanz 5:f12c0d64518f 273 }
NIcolasFernandezSanz 5:f12c0d64518f 274
NIcolasFernandezSanz 5:f12c0d64518f 275 //Funcion relacionada al timmer , es llamada cada 0.5 segundos
NIcolasFernandezSanz 5:f12c0d64518f 276 void base_de_tiempo()
NIcolasFernandezSanz 5:f12c0d64518f 277 {
NIcolasFernandezSanz 5:f12c0d64518f 278 tp ++; //Acumulador Antirebote
NIcolasFernandezSanz 5:f12c0d64518f 279 tv ++; //Acumulador Mediciond de velocidad
NIcolasFernandezSanz 5:f12c0d64518f 280 ta ++; //Acumulador Inicio del sistema..
NIcolasFernandezSanz 5:f12c0d64518f 281 IM++; //Acumulador Lazo Cerrado
Sissors 0:e069f9f26768 282 }
Sissors 0:e069f9f26768 283
NIcolasFernandezSanz 5:f12c0d64518f 284 //Funcion del timmer dos, es llamada cada 0.05 segundos
NIcolasFernandezSanz 5:f12c0d64518f 285 void tiempo_rapido()
NIcolasFernandezSanz 5:f12c0d64518f 286 {
NIcolasFernandezSanz 5:f12c0d64518f 287 tcd ++;//Acumulador Cambio de Duty(Lazo Abierto)
NIcolasFernandezSanz 5:f12c0d64518f 288 ty ++; //Acumulador Cambio de Duty(Lazo Cerrado)
NIcolasFernandezSanz 5:f12c0d64518f 289 }
NIcolasFernandezSanz 5:f12c0d64518f 290
NIcolasFernandezSanz 5:f12c0d64518f 291 //Funcion dedicada a controlar el pulsador y analizar los cambios de modo..
NIcolasFernandezSanz 5:f12c0d64518f 292 void CambioDeModo()
NIcolasFernandezSanz 5:f12c0d64518f 293 {
NIcolasFernandezSanz 7:a16d4e848e5e 294 /*Si tengo un flanco ascendente en el pulsador (Apretaron)*/
NIcolasFernandezSanz 5:f12c0d64518f 295 if(antirrebote(P)) {
NIcolasFernandezSanz 7:a16d4e848e5e 296 /*Switcheo entre MODO = 1 y MODO = 2 (LazoAbierto | LazoCerrado)*/
NIcolasFernandezSanz 5:f12c0d64518f 297 Modo ++;
NIcolasFernandezSanz 5:f12c0d64518f 298 if(Modo > 2) {
NIcolasFernandezSanz 5:f12c0d64518f 299 Modo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 300 printf("Lazo Abierto!!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 301 }
NIcolasFernandezSanz 5:f12c0d64518f 302 }
NIcolasFernandezSanz 5:f12c0d64518f 303 }
NIcolasFernandezSanz 5:f12c0d64518f 304
NIcolasFernandezSanz 7:a16d4e848e5e 305 /*///////////////////////////////////////////////////////////////////////////ETAPAS DE MEDICION DE VELOCIDAD///////////////////////////////////////////////////////////////////////////*/
NIcolasFernandezSanz 7:a16d4e848e5e 306
NIcolasFernandezSanz 6:75b0f24dad9b 307 /*
NIcolasFernandezSanz 6:75b0f24dad9b 308 UN PERIODO ==> RISE - FALL - RISE
NIcolasFernandezSanz 8:53555acc118b 309 2 PERIODOS ==> Una vuelta
NIcolasFernandezSanz 6:75b0f24dad9b 310 60 seg ==> 1 minuto / tiempo que tardo en dar una vuelta ==> RPM
NIcolasFernandezSanz 6:75b0f24dad9b 311 */
NIcolasFernandezSanz 6:75b0f24dad9b 312
NIcolasFernandezSanz 7:a16d4e848e5e 313 /*LA MAQUINA DE ESTADOS SE SUBDIVIDE EN TRES FUNCIONES (2 INTERRUPCIONES + 1 FUNCION EN LA MAQUINA PRINCIPAL)*/
NIcolasFernandezSanz 7:a16d4e848e5e 314
NIcolasFernandezSanz 7:a16d4e848e5e 315 //Interrupcion relacionada al Rising..
NIcolasFernandezSanz 7:a16d4e848e5e 316
NIcolasFernandezSanz 5:f12c0d64518f 317 void R_ton()
NIcolasFernandezSanz 5:f12c0d64518f 318 {
NIcolasFernandezSanz 5:f12c0d64518f 319 switch(EMV) {
NIcolasFernandezSanz 5:f12c0d64518f 320 case INCIO_V:
NIcolasFernandezSanz 6:75b0f24dad9b 321 ap.reset(); //Reseteo el timmer
NIcolasFernandezSanz 6:75b0f24dad9b 322 ap.start(); //Inicio la cuenta
NIcolasFernandezSanz 6:75b0f24dad9b 323 em = 1; //Aviso que estoy midiendo
NIcolasFernandezSanz 6:75b0f24dad9b 324 tmv = 0; //Aviso que no termine de medir
NIcolasFernandezSanz 5:f12c0d64518f 325 EMV = RISE_1;
NIcolasFernandezSanz 5:f12c0d64518f 326 break;
NIcolasFernandezSanz 5:f12c0d64518f 327
NIcolasFernandezSanz 5:f12c0d64518f 328 case RISE_1:
NIcolasFernandezSanz 5:f12c0d64518f 329 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 330 break;
NIcolasFernandezSanz 5:f12c0d64518f 331
NIcolasFernandezSanz 5:f12c0d64518f 332 case FALL_1:
NIcolasFernandezSanz 6:75b0f24dad9b 333 ap.stop(); //Freno el timmer
NIcolasFernandezSanz 6:75b0f24dad9b 334 tmv = 1; //Aviso que termine de medir
NIcolasFernandezSanz 6:75b0f24dad9b 335 em = 0; //Ya no estoy midiendo
NIcolasFernandezSanz 6:75b0f24dad9b 336 tv = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 337 EMV = ESPERA_V;
NIcolasFernandezSanz 5:f12c0d64518f 338 break;
NIcolasFernandezSanz 5:f12c0d64518f 339
Sissors 0:e069f9f26768 340 }
Sissors 0:e069f9f26768 341 }
Sissors 0:e069f9f26768 342
NIcolasFernandezSanz 7:a16d4e848e5e 343 //Interrupcion relacionada a el falling..
NIcolasFernandezSanz 7:a16d4e848e5e 344
NIcolasFernandezSanz 5:f12c0d64518f 345 void F_ton()
NIcolasFernandezSanz 5:f12c0d64518f 346 {
NIcolasFernandezSanz 5:f12c0d64518f 347 if(em) {
NIcolasFernandezSanz 5:f12c0d64518f 348 switch(EMV) {
NIcolasFernandezSanz 5:f12c0d64518f 349 case INCIO_V:
NIcolasFernandezSanz 5:f12c0d64518f 350 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 351 break;
NIcolasFernandezSanz 5:f12c0d64518f 352 case RISE_1:
NIcolasFernandezSanz 5:f12c0d64518f 353 EMV = FALL_1;
NIcolasFernandezSanz 5:f12c0d64518f 354 break;
NIcolasFernandezSanz 5:f12c0d64518f 355 case FALL_1:
NIcolasFernandezSanz 5:f12c0d64518f 356 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 357 break;
NIcolasFernandezSanz 5:f12c0d64518f 358 }
NIcolasFernandezSanz 5:f12c0d64518f 359 }
NIcolasFernandezSanz 5:f12c0d64518f 360
NIcolasFernandezSanz 5:f12c0d64518f 361 }
NIcolasFernandezSanz 5:f12c0d64518f 362
NIcolasFernandezSanz 7:a16d4e848e5e 363 //Estado final de la maquina de estados
NIcolasFernandezSanz 7:a16d4e848e5e 364 //Aqui genero la cuenta de donde obtengo las RPM y espero el tiempo prudencial..
NIcolasFernandezSanz 7:a16d4e848e5e 365
NIcolasFernandezSanz 7:a16d4e848e5e 366 void medicion_velocidad(void)
NIcolasFernandezSanz 7:a16d4e848e5e 367 {
NIcolasFernandezSanz 7:a16d4e848e5e 368 if(EMV == ESPERA_V) {
NIcolasFernandezSanz 7:a16d4e848e5e 369 if(tv >= 1) {
NIcolasFernandezSanz 7:a16d4e848e5e 370 RPM = 60.00 / (ap.read() * 2);
NIcolasFernandezSanz 7:a16d4e848e5e 371 printf("Velocidad maxima = %f RPM\r\n",RPM);
NIcolasFernandezSanz 7:a16d4e848e5e 372 VMAX = RPM;
NIcolasFernandezSanz 7:a16d4e848e5e 373 tv = 0;
NIcolasFernandezSanz 7:a16d4e848e5e 374 EMV = INCIO_V;
NIcolasFernandezSanz 7:a16d4e848e5e 375 Modo = LazoAbierto;
NIcolasFernandezSanz 7:a16d4e848e5e 376 printf("Modo Lazo Abierto...!\r\n");
NIcolasFernandezSanz 7:a16d4e848e5e 377 }
NIcolasFernandezSanz 7:a16d4e848e5e 378 }
NIcolasFernandezSanz 7:a16d4e848e5e 379 }
NIcolasFernandezSanz 7:a16d4e848e5e 380
NIcolasFernandezSanz 7:a16d4e848e5e 381 /*////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
NIcolasFernandezSanz 7:a16d4e848e5e 382
NIcolasFernandezSanz 7:a16d4e848e5e 383
NIcolasFernandezSanz 7:a16d4e848e5e 384
NIcolasFernandezSanz 5:f12c0d64518f 385 void cambio_duty_pwm(float nuevoDuty)
NIcolasFernandezSanz 5:f12c0d64518f 386 {
NIcolasFernandezSanz 5:f12c0d64518f 387 static float ND = 0;
NIcolasFernandezSanz 5:f12c0d64518f 388
NIcolasFernandezSanz 5:f12c0d64518f 389 switch(ECM) {
NIcolasFernandezSanz 5:f12c0d64518f 390 case INICIO_CM:
NIcolasFernandezSanz 5:f12c0d64518f 391
NIcolasFernandezSanz 5:f12c0d64518f 392 ND = nuevoDuty;
NIcolasFernandezSanz 5:f12c0d64518f 393 Azul = 1; //Apago el indicador de LazoCerrado
NIcolasFernandezSanz 5:f12c0d64518f 394
NIcolasFernandezSanz 5:f12c0d64518f 395 //Me fijo si estoy por poner mas o menos el mismo duty para evitar el proceso
NIcolasFernandezSanz 5:f12c0d64518f 396 if(abs(ND * 100.00f - DAN * 100.00f ) < 2) {
NIcolasFernandezSanz 5:f12c0d64518f 397 //printf("El duty es el mismo del ciclo previo...\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 398 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 399 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 400 break;
NIcolasFernandezSanz 5:f12c0d64518f 401 }
NIcolasFernandezSanz 5:f12c0d64518f 402
NIcolasFernandezSanz 5:f12c0d64518f 403 printf("Inicio el cambio de duty....\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 404 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 405 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 406 if(ND < 0.07f) {
NIcolasFernandezSanz 5:f12c0d64518f 407 Cooler.write(0);
NIcolasFernandezSanz 5:f12c0d64518f 408 duty = 0;
NIcolasFernandezSanz 5:f12c0d64518f 409 printf("Cooler APAGADO!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 410 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 411 DAN = 0.5f;
NIcolasFernandezSanz 5:f12c0d64518f 412 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 413 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 414 break;
NIcolasFernandezSanz 5:f12c0d64518f 415 }
NIcolasFernandezSanz 5:f12c0d64518f 416 if(ND >= 0.5f) {
NIcolasFernandezSanz 5:f12c0d64518f 417 ECM = CAMBIO_MAYOR;
NIcolasFernandezSanz 5:f12c0d64518f 418 } else
NIcolasFernandezSanz 5:f12c0d64518f 419 ECM = INICIO_CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 420 break;
NIcolasFernandezSanz 5:f12c0d64518f 421 case CAMBIO_MAYOR:
NIcolasFernandezSanz 5:f12c0d64518f 422 Cooler.write(ND);
NIcolasFernandezSanz 7:a16d4e848e5e 423 printf("\tNuevo Duty = %f%\r\n", floor(ND* 100.0f));
NIcolasFernandezSanz 5:f12c0d64518f 424 DAN = ND;
NIcolasFernandezSanz 5:f12c0d64518f 425 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 426 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 427 break;
NIcolasFernandezSanz 5:f12c0d64518f 428 case INICIO_CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 429 cantv = abs( (int(DAN*100)) - (int(ND*100)));
NIcolasFernandezSanz 7:a16d4e848e5e 430 //printf("\tVoy a hacer %.0f pasos intermedios desde %.0f para llegar a %.0f%\r\n", cantv, DAN*100, ND * 100);
NIcolasFernandezSanz 5:f12c0d64518f 431 ECM = CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 432 jv = 0;
NIcolasFernandezSanz 5:f12c0d64518f 433 D = DAN;
NIcolasFernandezSanz 5:f12c0d64518f 434 break;
NIcolasFernandezSanz 5:f12c0d64518f 435 case CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 436 if(cantv >= jv) {
NIcolasFernandezSanz 5:f12c0d64518f 437 Cooler.write(D);
NIcolasFernandezSanz 7:a16d4e848e5e 438 //printf("\t\tEtapa intermedia en %.0f%\r\n", D * 100.00f);
NIcolasFernandezSanz 5:f12c0d64518f 439 /*Si quiero alcanzar un duty inferior*/
NIcolasFernandezSanz 5:f12c0d64518f 440 if(ND < DAN)
NIcolasFernandezSanz 5:f12c0d64518f 441 D -= 0.01f; //Decremeto 1%
NIcolasFernandezSanz 5:f12c0d64518f 442 /*Si quiero alcanzar un duty superior*/
NIcolasFernandezSanz 5:f12c0d64518f 443 if(ND > DAN)
NIcolasFernandezSanz 5:f12c0d64518f 444 D += 0.01f; //Incremento 1%
NIcolasFernandezSanz 5:f12c0d64518f 445 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 446 ECM = ESPERA_DECREMENTO;
NIcolasFernandezSanz 5:f12c0d64518f 447 jv++;
NIcolasFernandezSanz 5:f12c0d64518f 448 break;
NIcolasFernandezSanz 5:f12c0d64518f 449 } else {
NIcolasFernandezSanz 5:f12c0d64518f 450 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 451 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 452 printf("\t\tNuevo Duty = %.0f\r\n", floor(ND*100.00f));
NIcolasFernandezSanz 5:f12c0d64518f 453 DAN = ND;
NIcolasFernandezSanz 5:f12c0d64518f 454 }
NIcolasFernandezSanz 5:f12c0d64518f 455 break;
NIcolasFernandezSanz 5:f12c0d64518f 456 case ESPERA_DECREMENTO:
NIcolasFernandezSanz 5:f12c0d64518f 457 if(tcd >= 2) {
NIcolasFernandezSanz 5:f12c0d64518f 458 ECM = CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 459 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 460 }
NIcolasFernandezSanz 5:f12c0d64518f 461 break;
NIcolasFernandezSanz 5:f12c0d64518f 462 case ESPERA_FINAL:
NIcolasFernandezSanz 5:f12c0d64518f 463 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 464 if(tcd >= 100) {
NIcolasFernandezSanz 5:f12c0d64518f 465 ECM = INICIO_CM;
NIcolasFernandezSanz 5:f12c0d64518f 466 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 467 }
NIcolasFernandezSanz 5:f12c0d64518f 468 break;
NIcolasFernandezSanz 5:f12c0d64518f 469 }
NIcolasFernandezSanz 5:f12c0d64518f 470
NIcolasFernandezSanz 5:f12c0d64518f 471 }
NIcolasFernandezSanz 5:f12c0d64518f 472
NIcolasFernandezSanz 5:f12c0d64518f 473 //Maquina LazoCerrado
NIcolasFernandezSanz 5:f12c0d64518f 474 void control_PWM_Temp(void)
NIcolasFernandezSanz 5:f12c0d64518f 475 {
NIcolasFernandezSanz 5:f12c0d64518f 476 static float temperatura = 0;
NIcolasFernandezSanz 5:f12c0d64518f 477 float val = 0;
NIcolasFernandezSanz 8:53555acc118b 478 static bool suptempmax = 0; //Flag que me indica si ya puse al maximo el duty
NIcolasFernandezSanz 5:f12c0d64518f 479 switch(CPT) {
NIcolasFernandezSanz 5:f12c0d64518f 480 case INCIO_LAZOCERRADO:
NIcolasFernandezSanz 5:f12c0d64518f 481 ECM = 0; //Reincio la maquina de cambio de duty de lazo abierto..
NIcolasFernandezSanz 5:f12c0d64518f 482 Rojo = 1;//Apago el Led rojo..
NIcolasFernandezSanz 5:f12c0d64518f 483 Azul = 0;//Prendo el Led azuil...
NIcolasFernandezSanz 5:f12c0d64518f 484 /*Fijo el duty en 50%*/
NIcolasFernandezSanz 5:f12c0d64518f 485 Cooler.write(0.5f);
NIcolasFernandezSanz 5:f12c0d64518f 486 duty = 0.5f;
NIcolasFernandezSanz 5:f12c0d64518f 487 printf("Lazo Cerrado!!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 488 CPT = MEDICION_TEMPERATURA;
NIcolasFernandezSanz 5:f12c0d64518f 489 break;
NIcolasFernandezSanz 5:f12c0d64518f 490
NIcolasFernandezSanz 5:f12c0d64518f 491 case MEDICION_TEMPERATURA:
NIcolasFernandezSanz 6:75b0f24dad9b 492 probe.convertTemperature(false, DS1820::all_devices); //Le digo que convierta la temperatura del sensor, false ==> No retiene || True ==> Retiene
NIcolasFernandezSanz 6:75b0f24dad9b 493 temperatura = probe.temperature(); //Guardo la temperatura
NIcolasFernandezSanz 5:f12c0d64518f 494 printf("La temperatura es de %3.1foC\r\n",temperatura );
NIcolasFernandezSanz 8:53555acc118b 495 /*Si tengo mas de 70 grados directamente pongo la maxima velocidad*/
NIcolasFernandezSanz 8:53555acc118b 496 if(temperatura >= 70) {
NIcolasFernandezSanz 8:53555acc118b 497 /*Aviso que supere los 70ºC*/
NIcolasFernandezSanz 8:53555acc118b 498 if(!suptempmax){
NIcolasFernandezSanz 8:53555acc118b 499 printf("Supere los 70oC... Pongo el duty al maximo.. Dejo de medir RPM momentaneamente..\r\n");
NIcolasFernandezSanz 8:53555acc118b 500 suptempmax = 1; //Seteo el flag de superar los 70ºC
NIcolasFernandezSanz 8:53555acc118b 501 }
NIcolasFernandezSanz 8:53555acc118b 502 duty = 1.00f; //Registro el cambio de duty al maximo
NIcolasFernandezSanz 8:53555acc118b 503 Cooler.write(1); //Ejecuto el cambio de duty al maximo
NIcolasFernandezSanz 8:53555acc118b 504 IM = 0; //Reinicio el acumulador para tener el tiempo entre modificaciones..
NIcolasFernandezSanz 8:53555acc118b 505 CPT = ESPERA_ENTRE_MODIFICACIONES;
NIcolasFernandezSanz 8:53555acc118b 506 break;
NIcolasFernandezSanz 8:53555acc118b 507 } else {
NIcolasFernandezSanz 8:53555acc118b 508 /*Aviso que baje de los 70ºC*/
NIcolasFernandezSanz 8:53555acc118b 509 if(suptempmax){
NIcolasFernandezSanz 8:53555acc118b 510 printf("Baje de los 70oC... duty dinamico.. Vuelvo a medir RPM ..\r\n");
NIcolasFernandezSanz 8:53555acc118b 511 suptempmax = 0; //Reinicio el flag de superar los 70ºC
NIcolasFernandezSanz 8:53555acc118b 512 }
NIcolasFernandezSanz 8:53555acc118b 513 /*Reinicio la medicion de RPM*/
NIcolasFernandezSanz 8:53555acc118b 514 tv = 0; //Reinicio el acumulador de tiempo de la maquina de estados que mide velocidad
NIcolasFernandezSanz 8:53555acc118b 515 EMV = INCIO_V; //Pongo en el estado inicial la maquina de medicion de velocidad
NIcolasFernandezSanz 8:53555acc118b 516 IM = 0; //Pongo en cero el acumulador para darle un TimeOut a la medicion de velocidad
NIcolasFernandezSanz 8:53555acc118b 517 CPT = MEDICION_RPM; //Paso a medir la velocidad del Cooler
NIcolasFernandezSanz 8:53555acc118b 518 break;
NIcolasFernandezSanz 8:53555acc118b 519 }
NIcolasFernandezSanz 5:f12c0d64518f 520 break;
NIcolasFernandezSanz 5:f12c0d64518f 521
NIcolasFernandezSanz 5:f12c0d64518f 522 case MEDICION_RPM:
NIcolasFernandezSanz 5:f12c0d64518f 523 /*Si termine de medir la velocidad...*/
NIcolasFernandezSanz 5:f12c0d64518f 524 if(EMV == ESPERA_V) {
NIcolasFernandezSanz 5:f12c0d64518f 525 if(tv >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 526 RPM = 60.00 / (ap.read() * 2);
NIcolasFernandezSanz 7:a16d4e848e5e 527 //printf("Velocidad = %f RPM\r\n",RPM);
NIcolasFernandezSanz 5:f12c0d64518f 528 tv = 0;
NIcolasFernandezSanz 5:f12c0d64518f 529 EMV = INCIO_V;
NIcolasFernandezSanz 5:f12c0d64518f 530
NIcolasFernandezSanz 5:f12c0d64518f 531 val = floor(temperatura * MinRPM / 20);
NIcolasFernandezSanz 5:f12c0d64518f 532 printf("Deberia tener %f RPM y tengo %f RPM\r\n", val, RPM);
NIcolasFernandezSanz 5:f12c0d64518f 533
NIcolasFernandezSanz 5:f12c0d64518f 534 /*Aca me fijo si debo modificar el duty*/
NIcolasFernandezSanz 5:f12c0d64518f 535 if(abs(RPM - val) > ToleranciaRPM) {
NIcolasFernandezSanz 5:f12c0d64518f 536
NIcolasFernandezSanz 5:f12c0d64518f 537 /*Miro que duty debo enviar...*/
NIcolasFernandezSanz 5:f12c0d64518f 538 if(val < RPM)
NIcolasFernandezSanz 5:f12c0d64518f 539 NuevoDuty = duty - DEFINICION_CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 540 if(val > RPM)
NIcolasFernandezSanz 5:f12c0d64518f 541 NuevoDuty = duty + DEFINICION_CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 542
NIcolasFernandezSanz 5:f12c0d64518f 543 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 544 CPT = CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 545 break;
NIcolasFernandezSanz 5:f12c0d64518f 546 } else {
NIcolasFernandezSanz 5:f12c0d64518f 547 printf("EL duty es correcto! Estoy en %0.1f% :D\r\n", floor(duty * 100.0f));
NIcolasFernandezSanz 5:f12c0d64518f 548 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 549 CPT = ESPERA_ENTRE_MODIFICACIONES;
NIcolasFernandezSanz 5:f12c0d64518f 550 break;
NIcolasFernandezSanz 5:f12c0d64518f 551
NIcolasFernandezSanz 5:f12c0d64518f 552 }
NIcolasFernandezSanz 5:f12c0d64518f 553
NIcolasFernandezSanz 5:f12c0d64518f 554 }
NIcolasFernandezSanz 5:f12c0d64518f 555 }
NIcolasFernandezSanz 5:f12c0d64518f 556 /*Verifico que no se me apago el motor...*/
NIcolasFernandezSanz 5:f12c0d64518f 557 if(IM > 10) {
NIcolasFernandezSanz 5:f12c0d64518f 558 printf("El cooler estaba apagadoo!!..Reiniciando Lazo cerrado..\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 559 EMV = INCIO_LAZOCERRADO;
NIcolasFernandezSanz 5:f12c0d64518f 560 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 561 }
NIcolasFernandezSanz 5:f12c0d64518f 562
NIcolasFernandezSanz 5:f12c0d64518f 563 break;
NIcolasFernandezSanz 5:f12c0d64518f 564
NIcolasFernandezSanz 5:f12c0d64518f 565 case CAMBIO_PWM:
NIcolasFernandezSanz 6:75b0f24dad9b 566 cambio_gradual_duty(NuevoDuty); //Actualizo el duty, si el valor es menor a 50% hago un proceso especial..
NIcolasFernandezSanz 5:f12c0d64518f 567 /*Si termine de modificar el duty*/
NIcolasFernandezSanz 5:f12c0d64518f 568 if(tdm) {
NIcolasFernandezSanz 5:f12c0d64518f 569 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 570 CPT = ESPERA_CAMBIOS_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 571 }
NIcolasFernandezSanz 5:f12c0d64518f 572 break;
NIcolasFernandezSanz 5:f12c0d64518f 573
NIcolasFernandezSanz 5:f12c0d64518f 574 case ESPERA_CAMBIOS_PWM:
NIcolasFernandezSanz 5:f12c0d64518f 575 /*Si se cumplio un tiempo prudencial.. El motor se debe adecuar a la nueva velocidad*/
NIcolasFernandezSanz 5:f12c0d64518f 576 if(IM >= 2) {
NIcolasFernandezSanz 5:f12c0d64518f 577 tdm = 0; //Reinicio el flag de cambio de duty
NIcolasFernandezSanz 5:f12c0d64518f 578 EMV = 0; //Reinico la maquina de medicion de velocidad..
NIcolasFernandezSanz 5:f12c0d64518f 579 IM = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 580 CPT = MEDICION_RPM; //Mido nuevamente la velocidad y me fijo si debo modificar denuevo
NIcolasFernandezSanz 5:f12c0d64518f 581 break;
NIcolasFernandezSanz 5:f12c0d64518f 582 }
NIcolasFernandezSanz 5:f12c0d64518f 583
NIcolasFernandezSanz 5:f12c0d64518f 584 break;
NIcolasFernandezSanz 5:f12c0d64518f 585
NIcolasFernandezSanz 5:f12c0d64518f 586 case ESPERA_ENTRE_MODIFICACIONES:
NIcolasFernandezSanz 7:a16d4e848e5e 587 /*Si se cumplio el tiempo..*/
NIcolasFernandezSanz 5:f12c0d64518f 588 if(IM >= 1)
NIcolasFernandezSanz 5:f12c0d64518f 589 CPT = MEDICION_TEMPERATURA;
NIcolasFernandezSanz 5:f12c0d64518f 590 break;
NIcolasFernandezSanz 5:f12c0d64518f 591 }
NIcolasFernandezSanz 5:f12c0d64518f 592 }
NIcolasFernandezSanz 5:f12c0d64518f 593
NIcolasFernandezSanz 5:f12c0d64518f 594 //Maquina de cambio de duty gradual....
NIcolasFernandezSanz 5:f12c0d64518f 595
NIcolasFernandezSanz 5:f12c0d64518f 596 void cambio_gradual_duty(float obj)
NIcolasFernandezSanz 5:f12c0d64518f 597 {
NIcolasFernandezSanz 5:f12c0d64518f 598 static float dtf = 0; //Variable que va a guardar durante todo el proceso el objetivo, es estatico... lo modifico en el estado inicial solamente..
NIcolasFernandezSanz 5:f12c0d64518f 599
NIcolasFernandezSanz 5:f12c0d64518f 600 switch(FTR) {
NIcolasFernandezSanz 5:f12c0d64518f 601 case INICIO_CM:
NIcolasFernandezSanz 8:53555acc118b 602
NIcolasFernandezSanz 5:f12c0d64518f 603 dtf = obj; //Fijo el nuevo objetivo...
NIcolasFernandezSanz 5:f12c0d64518f 604 tdm = 0; //Aviso que estoy modificando el duty...
NIcolasFernandezSanz 5:f12c0d64518f 605 printf("Inicio el cambio de duty....\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 606 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 607
NIcolasFernandezSanz 5:f12c0d64518f 608 /*Si estoy por debajo del minimo del Cooler directamente lo apago...*/
NIcolasFernandezSanz 5:f12c0d64518f 609 if(dtf < 0.07f) {
NIcolasFernandezSanz 5:f12c0d64518f 610 /*Apago el PWM*/
NIcolasFernandezSanz 5:f12c0d64518f 611 Cooler.write(0);
NIcolasFernandezSanz 5:f12c0d64518f 612 duty = 0;
NIcolasFernandezSanz 7:a16d4e848e5e 613 //printf("Cooler APAGADO!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 614 /*Voy al final de la maquina*/
NIcolasFernandezSanz 5:f12c0d64518f 615 ty = 0; //Reinicio el acumulador de tiempo final...
NIcolasFernandezSanz 5:f12c0d64518f 616 FTR = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 617 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 618 break;
NIcolasFernandezSanz 5:f12c0d64518f 619 }
NIcolasFernandezSanz 5:f12c0d64518f 620 if(dtf >= 0.5f) {
NIcolasFernandezSanz 5:f12c0d64518f 621 FTR = CAMBIO_MAYOR;
NIcolasFernandezSanz 5:f12c0d64518f 622 } else
NIcolasFernandezSanz 5:f12c0d64518f 623 FTR = INICIO_CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 624 break;
NIcolasFernandezSanz 5:f12c0d64518f 625
NIcolasFernandezSanz 5:f12c0d64518f 626 case CAMBIO_MAYOR:
NIcolasFernandezSanz 5:f12c0d64518f 627 Cooler.write(dtf); //Coloco el nuevo valor en el PWM de una..
NIcolasFernandezSanz 5:f12c0d64518f 628 //printf("\tNuevo Duty = %f%\r\n", dtf * 100);
NIcolasFernandezSanz 5:f12c0d64518f 629 duty = dtf; //Actualizo el duty actual..
NIcolasFernandezSanz 5:f12c0d64518f 630 ty = 0; //Reinicio el acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 631 FTR = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 632 break;
NIcolasFernandezSanz 5:f12c0d64518f 633
NIcolasFernandezSanz 5:f12c0d64518f 634 case INICIO_CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 635 cantv = abs( (int(duty*100)) - (int(dtf*100))); //Me fijo cuantos pasos intermedios voy a dar...
NIcolasFernandezSanz 5:f12c0d64518f 636 //printf("\tVoy a hacer %.0f pasos intermedios desde %.0f para llegar a %.0f%\r\n", cantv, duty*100, dtf * 100);
NIcolasFernandezSanz 5:f12c0d64518f 637 D = duty; //Parto desde el PWM actual
NIcolasFernandezSanz 5:f12c0d64518f 638 jv = 0; //Reinico el acumulador de veces
NIcolasFernandezSanz 5:f12c0d64518f 639 FTR = CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 640 break;
NIcolasFernandezSanz 5:f12c0d64518f 641
NIcolasFernandezSanz 5:f12c0d64518f 642 case CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 643 /*La cantidad de pasos intermedios calculados en el estado anterior...*/
NIcolasFernandezSanz 5:f12c0d64518f 644 if(cantv >= jv) {
NIcolasFernandezSanz 5:f12c0d64518f 645 Cooler.write(D); //Pongo el duty
NIcolasFernandezSanz 5:f12c0d64518f 646 //printf("\t\tEtapa intermedia en %.0f%\r\n", D * 100.00f);
NIcolasFernandezSanz 5:f12c0d64518f 647 /*Si quiero alcanzar un duty inferior*/
NIcolasFernandezSanz 5:f12c0d64518f 648 if(dtf < duty)
NIcolasFernandezSanz 5:f12c0d64518f 649 D -= 0.01f; //Decremeto 1%
NIcolasFernandezSanz 5:f12c0d64518f 650 /*Si quiero alcanzar un duty superior*/
NIcolasFernandezSanz 5:f12c0d64518f 651 if(dtf > duty)
NIcolasFernandezSanz 5:f12c0d64518f 652 D += 0.01f; //Incremento 1%
NIcolasFernandezSanz 5:f12c0d64518f 653
NIcolasFernandezSanz 5:f12c0d64518f 654 if(D < 0 || D > 1) { //Si estoy en valores no logicos...
NIcolasFernandezSanz 5:f12c0d64518f 655 //printf("Valores de duty no logicos... ERORR!!!! D:\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 656 FTR = INICIO_CM;
NIcolasFernandezSanz 5:f12c0d64518f 657 break;
NIcolasFernandezSanz 5:f12c0d64518f 658 }
NIcolasFernandezSanz 5:f12c0d64518f 659
NIcolasFernandezSanz 5:f12c0d64518f 660 jv++; //Acumulo el paso realizo en la variable(Lo cuento)..
NIcolasFernandezSanz 5:f12c0d64518f 661 ty = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 662 FTR = ESPERA_DECREMENTO; //Espero un tiempo para que se ajuste la salida..
NIcolasFernandezSanz 5:f12c0d64518f 663 break;
NIcolasFernandezSanz 5:f12c0d64518f 664 }
NIcolasFernandezSanz 5:f12c0d64518f 665 /*Si termine con las modificaciones de duty..*/
NIcolasFernandezSanz 5:f12c0d64518f 666 else {
NIcolasFernandezSanz 5:f12c0d64518f 667 //printf("\t\tNuevo Duty = %.0f\r\n", (D+0.01f)*100);
NIcolasFernandezSanz 5:f12c0d64518f 668 duty = dtf; //Guardo el nuevo valor de duty
NIcolasFernandezSanz 5:f12c0d64518f 669 ty = 0; //Reinicio el acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 670 FTR = ESPERA_FINAL; //Paso a la espera final...
NIcolasFernandezSanz 5:f12c0d64518f 671 }
NIcolasFernandezSanz 5:f12c0d64518f 672 break;
NIcolasFernandezSanz 5:f12c0d64518f 673
NIcolasFernandezSanz 5:f12c0d64518f 674 case ESPERA_DECREMENTO:
NIcolasFernandezSanz 5:f12c0d64518f 675 /*Si se cumplio el tiempo*/
NIcolasFernandezSanz 5:f12c0d64518f 676 if(ty >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 677 ty = 0; //Reinico el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 678 FTR = CAMBIO_MENOR;//Paso al nuevo paso
NIcolasFernandezSanz 5:f12c0d64518f 679 }
NIcolasFernandezSanz 5:f12c0d64518f 680 break;
NIcolasFernandezSanz 5:f12c0d64518f 681 case ESPERA_FINAL:
NIcolasFernandezSanz 5:f12c0d64518f 682 /*Termine el proceso de cambio de duty*/
NIcolasFernandezSanz 5:f12c0d64518f 683 Rojo = 1; //Apago el led modificador..
NIcolasFernandezSanz 5:f12c0d64518f 684 tdm = 1; //Notifico a las otras maquinas de estado que termine de modificar el duty..
NIcolasFernandezSanz 5:f12c0d64518f 685 /*Si se cumplio el tiempo*/
NIcolasFernandezSanz 5:f12c0d64518f 686 if(ty >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 687 ty = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 688 FTR = INICIO_CM; //Vuelvo al estado inicial del proceso..
NIcolasFernandezSanz 5:f12c0d64518f 689 }
NIcolasFernandezSanz 5:f12c0d64518f 690 break;
NIcolasFernandezSanz 5:f12c0d64518f 691 }
NIcolasFernandezSanz 5:f12c0d64518f 692 }
NIcolasFernandezSanz 5:f12c0d64518f 693