Version Final

Dependencies:   mbed DS1820

Committer:
NIcolasFernandezSanz
Date:
Wed Jun 05 01:42:32 2019 +0000
Revision:
6:75b0f24dad9b
Parent:
5:f12c0d64518f
Child:
7:a16d4e848e5e
Version2(Funcionando)

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 5:f12c0d64518f 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 5:f12c0d64518f 257 tp = 0;
NIcolasFernandezSanz 5:f12c0d64518f 258 break;
NIcolasFernandezSanz 5:f12c0d64518f 259 case RISING_P:
NIcolasFernandezSanz 5:f12c0d64518f 260 estado = RETENCION_P;
NIcolasFernandezSanz 5:f12c0d64518f 261 tp = 0;
NIcolasFernandezSanz 5:f12c0d64518f 262 return 1;
NIcolasFernandezSanz 5:f12c0d64518f 263 case RETENCION_P:
NIcolasFernandezSanz 5:f12c0d64518f 264 if((tp >= 2) && (lectura == 0)) {
NIcolasFernandezSanz 5:f12c0d64518f 265 estado = INICIO_P;
NIcolasFernandezSanz 5:f12c0d64518f 266 }
NIcolasFernandezSanz 5:f12c0d64518f 267 break;
Sissors 0:e069f9f26768 268 }
NIcolasFernandezSanz 5:f12c0d64518f 269 lecant = lectura;
NIcolasFernandezSanz 5:f12c0d64518f 270 return 0;
NIcolasFernandezSanz 5:f12c0d64518f 271 }
NIcolasFernandezSanz 5:f12c0d64518f 272
NIcolasFernandezSanz 5:f12c0d64518f 273 //Funcion relacionada al timmer , es llamada cada 0.5 segundos
NIcolasFernandezSanz 5:f12c0d64518f 274 void base_de_tiempo()
NIcolasFernandezSanz 5:f12c0d64518f 275 {
NIcolasFernandezSanz 5:f12c0d64518f 276 tp ++; //Acumulador Antirebote
NIcolasFernandezSanz 5:f12c0d64518f 277 tv ++; //Acumulador Mediciond de velocidad
NIcolasFernandezSanz 5:f12c0d64518f 278 ta ++; //Acumulador Inicio del sistema..
NIcolasFernandezSanz 5:f12c0d64518f 279 IM++; //Acumulador Lazo Cerrado
Sissors 0:e069f9f26768 280 }
Sissors 0:e069f9f26768 281
NIcolasFernandezSanz 5:f12c0d64518f 282 //Funcion del timmer dos, es llamada cada 0.05 segundos
NIcolasFernandezSanz 5:f12c0d64518f 283 void tiempo_rapido()
NIcolasFernandezSanz 5:f12c0d64518f 284 {
NIcolasFernandezSanz 5:f12c0d64518f 285 tcd ++;//Acumulador Cambio de Duty(Lazo Abierto)
NIcolasFernandezSanz 5:f12c0d64518f 286 ty ++; //Acumulador Cambio de Duty(Lazo Cerrado)
NIcolasFernandezSanz 5:f12c0d64518f 287 }
NIcolasFernandezSanz 5:f12c0d64518f 288
NIcolasFernandezSanz 5:f12c0d64518f 289 //Funcion dedicada a controlar el pulsador y analizar los cambios de modo..
NIcolasFernandezSanz 5:f12c0d64518f 290 void CambioDeModo()
NIcolasFernandezSanz 5:f12c0d64518f 291 {
NIcolasFernandezSanz 5:f12c0d64518f 292 if(antirrebote(P)) {
NIcolasFernandezSanz 5:f12c0d64518f 293 Modo ++;
NIcolasFernandezSanz 5:f12c0d64518f 294 if(Modo > 2) {
NIcolasFernandezSanz 5:f12c0d64518f 295 Modo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 296 printf("Lazo Abierto!!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 297 }
NIcolasFernandezSanz 5:f12c0d64518f 298 }
NIcolasFernandezSanz 5:f12c0d64518f 299 }
NIcolasFernandezSanz 5:f12c0d64518f 300
NIcolasFernandezSanz 6:75b0f24dad9b 301 /*
NIcolasFernandezSanz 6:75b0f24dad9b 302 UN PERIODO ==> RISE - FALL - RISE
NIcolasFernandezSanz 6:75b0f24dad9b 303 2 PERIODOS ==> Una vuelta
NIcolasFernandezSanz 6:75b0f24dad9b 304 60 seg ==> 1 minuto / tiempo que tardo en dar una vuelta ==> RPM
NIcolasFernandezSanz 6:75b0f24dad9b 305 */
NIcolasFernandezSanz 6:75b0f24dad9b 306
NIcolasFernandezSanz 5:f12c0d64518f 307 //Inicio la medicion del tiempo de On del pulso
NIcolasFernandezSanz 5:f12c0d64518f 308 void R_ton()
NIcolasFernandezSanz 5:f12c0d64518f 309 {
NIcolasFernandezSanz 5:f12c0d64518f 310 switch(EMV) {
NIcolasFernandezSanz 5:f12c0d64518f 311 case INCIO_V:
NIcolasFernandezSanz 6:75b0f24dad9b 312 ap.reset(); //Reseteo el timmer
NIcolasFernandezSanz 6:75b0f24dad9b 313 ap.start(); //Inicio la cuenta
NIcolasFernandezSanz 6:75b0f24dad9b 314 em = 1; //Aviso que estoy midiendo
NIcolasFernandezSanz 6:75b0f24dad9b 315 tmv = 0; //Aviso que no termine de medir
NIcolasFernandezSanz 5:f12c0d64518f 316 EMV = RISE_1;
NIcolasFernandezSanz 5:f12c0d64518f 317 break;
NIcolasFernandezSanz 5:f12c0d64518f 318
NIcolasFernandezSanz 5:f12c0d64518f 319 case RISE_1:
NIcolasFernandezSanz 5:f12c0d64518f 320 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 321 break;
NIcolasFernandezSanz 5:f12c0d64518f 322
NIcolasFernandezSanz 5:f12c0d64518f 323 case FALL_1:
NIcolasFernandezSanz 6:75b0f24dad9b 324 ap.stop(); //Freno el timmer
NIcolasFernandezSanz 6:75b0f24dad9b 325 tmv = 1; //Aviso que termine de medir
NIcolasFernandezSanz 6:75b0f24dad9b 326 em = 0; //Ya no estoy midiendo
NIcolasFernandezSanz 6:75b0f24dad9b 327 tv = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 328 EMV = ESPERA_V;
NIcolasFernandezSanz 5:f12c0d64518f 329 break;
NIcolasFernandezSanz 5:f12c0d64518f 330
Sissors 0:e069f9f26768 331 }
Sissors 0:e069f9f26768 332 }
Sissors 0:e069f9f26768 333
NIcolasFernandezSanz 5:f12c0d64518f 334 void F_ton()
NIcolasFernandezSanz 5:f12c0d64518f 335 {
NIcolasFernandezSanz 5:f12c0d64518f 336 if(em) {
NIcolasFernandezSanz 5:f12c0d64518f 337 switch(EMV) {
NIcolasFernandezSanz 5:f12c0d64518f 338 case INCIO_V:
NIcolasFernandezSanz 5:f12c0d64518f 339 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 340 break;
NIcolasFernandezSanz 5:f12c0d64518f 341 case RISE_1:
NIcolasFernandezSanz 5:f12c0d64518f 342 EMV = FALL_1;
NIcolasFernandezSanz 5:f12c0d64518f 343 break;
NIcolasFernandezSanz 5:f12c0d64518f 344 case FALL_1:
NIcolasFernandezSanz 5:f12c0d64518f 345 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 346 break;
NIcolasFernandezSanz 5:f12c0d64518f 347 }
NIcolasFernandezSanz 5:f12c0d64518f 348 }
NIcolasFernandezSanz 5:f12c0d64518f 349
NIcolasFernandezSanz 5:f12c0d64518f 350 }
NIcolasFernandezSanz 5:f12c0d64518f 351
NIcolasFernandezSanz 5:f12c0d64518f 352 void cambio_duty_pwm(float nuevoDuty)
NIcolasFernandezSanz 5:f12c0d64518f 353 {
NIcolasFernandezSanz 5:f12c0d64518f 354 static float ND = 0;
NIcolasFernandezSanz 5:f12c0d64518f 355
NIcolasFernandezSanz 5:f12c0d64518f 356 switch(ECM) {
NIcolasFernandezSanz 5:f12c0d64518f 357 case INICIO_CM:
NIcolasFernandezSanz 5:f12c0d64518f 358
NIcolasFernandezSanz 5:f12c0d64518f 359 ND = nuevoDuty;
NIcolasFernandezSanz 5:f12c0d64518f 360 Azul = 1; //Apago el indicador de LazoCerrado
NIcolasFernandezSanz 5:f12c0d64518f 361
NIcolasFernandezSanz 5:f12c0d64518f 362 //Me fijo si estoy por poner mas o menos el mismo duty para evitar el proceso
NIcolasFernandezSanz 5:f12c0d64518f 363 if(abs(ND * 100.00f - DAN * 100.00f ) < 2) {
NIcolasFernandezSanz 5:f12c0d64518f 364 //printf("El duty es el mismo del ciclo previo...\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 365 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 366 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 367 break;
NIcolasFernandezSanz 5:f12c0d64518f 368 }
NIcolasFernandezSanz 5:f12c0d64518f 369
NIcolasFernandezSanz 5:f12c0d64518f 370 printf("Inicio el cambio de duty....\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 371 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 372 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 373 if(ND < 0.07f) {
NIcolasFernandezSanz 5:f12c0d64518f 374 Cooler.write(0);
NIcolasFernandezSanz 5:f12c0d64518f 375 duty = 0;
NIcolasFernandezSanz 5:f12c0d64518f 376 printf("Cooler APAGADO!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 377 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 378 DAN = 0.5f;
NIcolasFernandezSanz 5:f12c0d64518f 379 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 380 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 381 break;
NIcolasFernandezSanz 5:f12c0d64518f 382 }
NIcolasFernandezSanz 5:f12c0d64518f 383 if(ND >= 0.5f) {
NIcolasFernandezSanz 5:f12c0d64518f 384 ECM = CAMBIO_MAYOR;
NIcolasFernandezSanz 5:f12c0d64518f 385 } else
NIcolasFernandezSanz 5:f12c0d64518f 386 ECM = INICIO_CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 387 break;
NIcolasFernandezSanz 5:f12c0d64518f 388 case CAMBIO_MAYOR:
NIcolasFernandezSanz 5:f12c0d64518f 389 Cooler.write(ND);
NIcolasFernandezSanz 5:f12c0d64518f 390 printf("\tNuevo Duty = %f%\r\n", ND* 100);
NIcolasFernandezSanz 5:f12c0d64518f 391 DAN = ND;
NIcolasFernandezSanz 5:f12c0d64518f 392 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 393 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 394 break;
NIcolasFernandezSanz 5:f12c0d64518f 395 case INICIO_CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 396 cantv = abs( (int(DAN*100)) - (int(ND*100)));
NIcolasFernandezSanz 5:f12c0d64518f 397 printf("\tVoy a hacer %.0f pasos intermedios desde %.0f para llegar a %.0f%\r\n", cantv, DAN*100, ND * 100);
NIcolasFernandezSanz 5:f12c0d64518f 398 ECM = CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 399 jv = 0;
NIcolasFernandezSanz 5:f12c0d64518f 400 D = DAN;
NIcolasFernandezSanz 5:f12c0d64518f 401 break;
NIcolasFernandezSanz 5:f12c0d64518f 402 case CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 403 if(cantv >= jv) {
NIcolasFernandezSanz 5:f12c0d64518f 404 Cooler.write(D);
NIcolasFernandezSanz 5:f12c0d64518f 405 printf("\t\tEtapa intermedia en %.0f%\r\n", D * 100.00f);
NIcolasFernandezSanz 5:f12c0d64518f 406 /*Si quiero alcanzar un duty inferior*/
NIcolasFernandezSanz 5:f12c0d64518f 407 if(ND < DAN)
NIcolasFernandezSanz 5:f12c0d64518f 408 D -= 0.01f; //Decremeto 1%
NIcolasFernandezSanz 5:f12c0d64518f 409 /*Si quiero alcanzar un duty superior*/
NIcolasFernandezSanz 5:f12c0d64518f 410 if(ND > DAN)
NIcolasFernandezSanz 5:f12c0d64518f 411 D += 0.01f; //Incremento 1%
NIcolasFernandezSanz 5:f12c0d64518f 412 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 413 ECM = ESPERA_DECREMENTO;
NIcolasFernandezSanz 5:f12c0d64518f 414 jv++;
NIcolasFernandezSanz 5:f12c0d64518f 415 break;
NIcolasFernandezSanz 5:f12c0d64518f 416 } else {
NIcolasFernandezSanz 5:f12c0d64518f 417 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 418 ECM = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 419 printf("\t\tNuevo Duty = %.0f\r\n", floor(ND*100.00f));
NIcolasFernandezSanz 5:f12c0d64518f 420 DAN = ND;
NIcolasFernandezSanz 5:f12c0d64518f 421 }
NIcolasFernandezSanz 5:f12c0d64518f 422 break;
NIcolasFernandezSanz 5:f12c0d64518f 423 case ESPERA_DECREMENTO:
NIcolasFernandezSanz 5:f12c0d64518f 424 if(tcd >= 2) {
NIcolasFernandezSanz 5:f12c0d64518f 425 ECM = CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 426 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 427 }
NIcolasFernandezSanz 5:f12c0d64518f 428 break;
NIcolasFernandezSanz 5:f12c0d64518f 429 case ESPERA_FINAL:
NIcolasFernandezSanz 5:f12c0d64518f 430 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 431 if(tcd >= 100) {
NIcolasFernandezSanz 5:f12c0d64518f 432 ECM = INICIO_CM;
NIcolasFernandezSanz 5:f12c0d64518f 433 tcd = 0;
NIcolasFernandezSanz 5:f12c0d64518f 434 }
NIcolasFernandezSanz 5:f12c0d64518f 435 break;
NIcolasFernandezSanz 5:f12c0d64518f 436 }
NIcolasFernandezSanz 5:f12c0d64518f 437
NIcolasFernandezSanz 5:f12c0d64518f 438 }
NIcolasFernandezSanz 5:f12c0d64518f 439
NIcolasFernandezSanz 5:f12c0d64518f 440 //Maquina LazoCerrado
NIcolasFernandezSanz 5:f12c0d64518f 441 void control_PWM_Temp(void)
NIcolasFernandezSanz 5:f12c0d64518f 442 {
NIcolasFernandezSanz 5:f12c0d64518f 443 static float temperatura = 0;
NIcolasFernandezSanz 5:f12c0d64518f 444 float val = 0;
NIcolasFernandezSanz 5:f12c0d64518f 445 switch(CPT) {
NIcolasFernandezSanz 5:f12c0d64518f 446 case INCIO_LAZOCERRADO:
NIcolasFernandezSanz 5:f12c0d64518f 447 ECM = 0; //Reincio la maquina de cambio de duty de lazo abierto..
NIcolasFernandezSanz 5:f12c0d64518f 448 Rojo = 1;//Apago el Led rojo..
NIcolasFernandezSanz 5:f12c0d64518f 449 Azul = 0;//Prendo el Led azuil...
NIcolasFernandezSanz 5:f12c0d64518f 450 /*Fijo el duty en 50%*/
NIcolasFernandezSanz 5:f12c0d64518f 451 Cooler.write(0.5f);
NIcolasFernandezSanz 5:f12c0d64518f 452 duty = 0.5f;
NIcolasFernandezSanz 5:f12c0d64518f 453 printf("Lazo Cerrado!!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 454 CPT = MEDICION_TEMPERATURA;
NIcolasFernandezSanz 5:f12c0d64518f 455 break;
NIcolasFernandezSanz 5:f12c0d64518f 456
NIcolasFernandezSanz 5:f12c0d64518f 457 case MEDICION_TEMPERATURA:
NIcolasFernandezSanz 6:75b0f24dad9b 458 probe.convertTemperature(false, DS1820::all_devices); //Le digo que convierta la temperatura del sensor, false ==> No retiene || True ==> Retiene
NIcolasFernandezSanz 6:75b0f24dad9b 459 temperatura = probe.temperature(); //Guardo la temperatura
NIcolasFernandezSanz 5:f12c0d64518f 460 printf("La temperatura es de %3.1foC\r\n",temperatura );
NIcolasFernandezSanz 5:f12c0d64518f 461 /*Reinicio la medicion de RPM*/
NIcolasFernandezSanz 5:f12c0d64518f 462 CPT = MEDICION_RPM;
NIcolasFernandezSanz 5:f12c0d64518f 463 tv = 0;
NIcolasFernandezSanz 5:f12c0d64518f 464 EMV = INCIO_V; //Pongo en el estado inicial la maquina de medicion de velocidad
NIcolasFernandezSanz 5:f12c0d64518f 465 IM = 0; //Pongo en cero el acumulador para darle un TimeOut a la medicion de velocidad
NIcolasFernandezSanz 5:f12c0d64518f 466 break;
NIcolasFernandezSanz 5:f12c0d64518f 467
NIcolasFernandezSanz 5:f12c0d64518f 468 case MEDICION_RPM:
NIcolasFernandezSanz 5:f12c0d64518f 469 /*Si termine de medir la velocidad...*/
NIcolasFernandezSanz 5:f12c0d64518f 470 if(EMV == ESPERA_V) {
NIcolasFernandezSanz 5:f12c0d64518f 471 if(tv >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 472 RPM = 60.00 / (ap.read() * 2);
NIcolasFernandezSanz 5:f12c0d64518f 473 printf("Velocidad = %f RPM\r\n",RPM);
NIcolasFernandezSanz 5:f12c0d64518f 474 tv = 0;
NIcolasFernandezSanz 5:f12c0d64518f 475 EMV = INCIO_V;
NIcolasFernandezSanz 5:f12c0d64518f 476
NIcolasFernandezSanz 5:f12c0d64518f 477 val = floor(temperatura * MinRPM / 20);
NIcolasFernandezSanz 5:f12c0d64518f 478 printf("Deberia tener %f RPM y tengo %f RPM\r\n", val, RPM);
NIcolasFernandezSanz 5:f12c0d64518f 479
NIcolasFernandezSanz 5:f12c0d64518f 480 /*Aca me fijo si debo modificar el duty*/
NIcolasFernandezSanz 5:f12c0d64518f 481 if(abs(RPM - val) > ToleranciaRPM) {
NIcolasFernandezSanz 5:f12c0d64518f 482
NIcolasFernandezSanz 5:f12c0d64518f 483 /*Miro que duty debo enviar...*/
NIcolasFernandezSanz 5:f12c0d64518f 484 if(val < RPM)
NIcolasFernandezSanz 5:f12c0d64518f 485 NuevoDuty = duty - DEFINICION_CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 486 if(val > RPM)
NIcolasFernandezSanz 5:f12c0d64518f 487 NuevoDuty = duty + DEFINICION_CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 488
NIcolasFernandezSanz 5:f12c0d64518f 489 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 490 CPT = CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 491 break;
NIcolasFernandezSanz 5:f12c0d64518f 492 } else {
NIcolasFernandezSanz 5:f12c0d64518f 493 printf("EL duty es correcto! Estoy en %0.1f% :D\r\n", floor(duty * 100.0f));
NIcolasFernandezSanz 5:f12c0d64518f 494 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 495 CPT = ESPERA_ENTRE_MODIFICACIONES;
NIcolasFernandezSanz 5:f12c0d64518f 496 break;
NIcolasFernandezSanz 5:f12c0d64518f 497
NIcolasFernandezSanz 5:f12c0d64518f 498 }
NIcolasFernandezSanz 5:f12c0d64518f 499
NIcolasFernandezSanz 5:f12c0d64518f 500 }
NIcolasFernandezSanz 5:f12c0d64518f 501 }
NIcolasFernandezSanz 5:f12c0d64518f 502 /*Verifico que no se me apago el motor...*/
NIcolasFernandezSanz 5:f12c0d64518f 503 if(IM > 10) {
NIcolasFernandezSanz 5:f12c0d64518f 504 printf("El cooler estaba apagadoo!!..Reiniciando Lazo cerrado..\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 505 EMV = INCIO_LAZOCERRADO;
NIcolasFernandezSanz 5:f12c0d64518f 506 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 507 }
NIcolasFernandezSanz 5:f12c0d64518f 508
NIcolasFernandezSanz 5:f12c0d64518f 509 break;
NIcolasFernandezSanz 5:f12c0d64518f 510
NIcolasFernandezSanz 5:f12c0d64518f 511 case CAMBIO_PWM:
NIcolasFernandezSanz 6:75b0f24dad9b 512 cambio_gradual_duty(NuevoDuty); //Actualizo el duty, si el valor es menor a 50% hago un proceso especial..
NIcolasFernandezSanz 5:f12c0d64518f 513 /*Si termine de modificar el duty*/
NIcolasFernandezSanz 5:f12c0d64518f 514 if(tdm) {
NIcolasFernandezSanz 5:f12c0d64518f 515 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 516 CPT = ESPERA_CAMBIOS_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 517 }
NIcolasFernandezSanz 5:f12c0d64518f 518 break;
NIcolasFernandezSanz 5:f12c0d64518f 519
NIcolasFernandezSanz 5:f12c0d64518f 520 case ESPERA_CAMBIOS_PWM:
NIcolasFernandezSanz 5:f12c0d64518f 521 /*Si se cumplio un tiempo prudencial.. El motor se debe adecuar a la nueva velocidad*/
NIcolasFernandezSanz 5:f12c0d64518f 522 if(IM >= 2) {
NIcolasFernandezSanz 5:f12c0d64518f 523 tdm = 0; //Reinicio el flag de cambio de duty
NIcolasFernandezSanz 5:f12c0d64518f 524 EMV = 0; //Reinico la maquina de medicion de velocidad..
NIcolasFernandezSanz 5:f12c0d64518f 525 IM = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 526 CPT = MEDICION_RPM; //Mido nuevamente la velocidad y me fijo si debo modificar denuevo
NIcolasFernandezSanz 5:f12c0d64518f 527 break;
NIcolasFernandezSanz 5:f12c0d64518f 528 }
NIcolasFernandezSanz 5:f12c0d64518f 529
NIcolasFernandezSanz 5:f12c0d64518f 530 break;
NIcolasFernandezSanz 5:f12c0d64518f 531
NIcolasFernandezSanz 5:f12c0d64518f 532 case ESPERA_ENTRE_MODIFICACIONES:
NIcolasFernandezSanz 5:f12c0d64518f 533 if(IM >= 1)
NIcolasFernandezSanz 5:f12c0d64518f 534 CPT = MEDICION_TEMPERATURA;
NIcolasFernandezSanz 5:f12c0d64518f 535 break;
NIcolasFernandezSanz 5:f12c0d64518f 536 }
NIcolasFernandezSanz 5:f12c0d64518f 537 }
NIcolasFernandezSanz 5:f12c0d64518f 538
NIcolasFernandezSanz 5:f12c0d64518f 539 //Maquina de cambio de duty gradual....
NIcolasFernandezSanz 5:f12c0d64518f 540
NIcolasFernandezSanz 5:f12c0d64518f 541 void cambio_gradual_duty(float obj)
NIcolasFernandezSanz 5:f12c0d64518f 542 {
NIcolasFernandezSanz 5:f12c0d64518f 543 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 544
NIcolasFernandezSanz 5:f12c0d64518f 545 switch(FTR) {
NIcolasFernandezSanz 5:f12c0d64518f 546 case INICIO_CM:
NIcolasFernandezSanz 6:75b0f24dad9b 547
NIcolasFernandezSanz 5:f12c0d64518f 548 dtf = obj; //Fijo el nuevo objetivo...
NIcolasFernandezSanz 5:f12c0d64518f 549 tdm = 0; //Aviso que estoy modificando el duty...
NIcolasFernandezSanz 5:f12c0d64518f 550 printf("Inicio el cambio de duty....\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 551 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 552
NIcolasFernandezSanz 5:f12c0d64518f 553 /*Si estoy por debajo del minimo del Cooler directamente lo apago...*/
NIcolasFernandezSanz 5:f12c0d64518f 554 if(dtf < 0.07f) {
NIcolasFernandezSanz 5:f12c0d64518f 555 /*Apago el PWM*/
NIcolasFernandezSanz 5:f12c0d64518f 556 Cooler.write(0);
NIcolasFernandezSanz 5:f12c0d64518f 557 duty = 0;
NIcolasFernandezSanz 5:f12c0d64518f 558 printf("Cooler APAGADO!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 559 /*Voy al final de la maquina*/
NIcolasFernandezSanz 5:f12c0d64518f 560 ty = 0; //Reinicio el acumulador de tiempo final...
NIcolasFernandezSanz 5:f12c0d64518f 561 FTR = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 562 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 563 break;
NIcolasFernandezSanz 5:f12c0d64518f 564 }
NIcolasFernandezSanz 5:f12c0d64518f 565 if(dtf >= 0.5f) {
NIcolasFernandezSanz 5:f12c0d64518f 566 FTR = CAMBIO_MAYOR;
NIcolasFernandezSanz 5:f12c0d64518f 567 } else
NIcolasFernandezSanz 5:f12c0d64518f 568 FTR = INICIO_CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 569 break;
NIcolasFernandezSanz 5:f12c0d64518f 570
NIcolasFernandezSanz 5:f12c0d64518f 571 case CAMBIO_MAYOR:
NIcolasFernandezSanz 5:f12c0d64518f 572 Cooler.write(dtf); //Coloco el nuevo valor en el PWM de una..
NIcolasFernandezSanz 5:f12c0d64518f 573 //printf("\tNuevo Duty = %f%\r\n", dtf * 100);
NIcolasFernandezSanz 5:f12c0d64518f 574 duty = dtf; //Actualizo el duty actual..
NIcolasFernandezSanz 5:f12c0d64518f 575 ty = 0; //Reinicio el acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 576 FTR = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 577 break;
NIcolasFernandezSanz 5:f12c0d64518f 578
NIcolasFernandezSanz 5:f12c0d64518f 579 case INICIO_CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 580 cantv = abs( (int(duty*100)) - (int(dtf*100))); //Me fijo cuantos pasos intermedios voy a dar...
NIcolasFernandezSanz 5:f12c0d64518f 581 //printf("\tVoy a hacer %.0f pasos intermedios desde %.0f para llegar a %.0f%\r\n", cantv, duty*100, dtf * 100);
NIcolasFernandezSanz 5:f12c0d64518f 582 D = duty; //Parto desde el PWM actual
NIcolasFernandezSanz 5:f12c0d64518f 583 jv = 0; //Reinico el acumulador de veces
NIcolasFernandezSanz 5:f12c0d64518f 584 FTR = CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 585 break;
NIcolasFernandezSanz 5:f12c0d64518f 586
NIcolasFernandezSanz 5:f12c0d64518f 587 case CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 588 /*La cantidad de pasos intermedios calculados en el estado anterior...*/
NIcolasFernandezSanz 5:f12c0d64518f 589 if(cantv >= jv) {
NIcolasFernandezSanz 5:f12c0d64518f 590 Cooler.write(D); //Pongo el duty
NIcolasFernandezSanz 5:f12c0d64518f 591 //printf("\t\tEtapa intermedia en %.0f%\r\n", D * 100.00f);
NIcolasFernandezSanz 5:f12c0d64518f 592 /*Si quiero alcanzar un duty inferior*/
NIcolasFernandezSanz 5:f12c0d64518f 593 if(dtf < duty)
NIcolasFernandezSanz 5:f12c0d64518f 594 D -= 0.01f; //Decremeto 1%
NIcolasFernandezSanz 5:f12c0d64518f 595 /*Si quiero alcanzar un duty superior*/
NIcolasFernandezSanz 5:f12c0d64518f 596 if(dtf > duty)
NIcolasFernandezSanz 5:f12c0d64518f 597 D += 0.01f; //Incremento 1%
NIcolasFernandezSanz 5:f12c0d64518f 598
NIcolasFernandezSanz 5:f12c0d64518f 599 if(D < 0 || D > 1) { //Si estoy en valores no logicos...
NIcolasFernandezSanz 5:f12c0d64518f 600 //printf("Valores de duty no logicos... ERORR!!!! D:\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 601 FTR = INICIO_CM;
NIcolasFernandezSanz 5:f12c0d64518f 602 break;
NIcolasFernandezSanz 5:f12c0d64518f 603 }
NIcolasFernandezSanz 5:f12c0d64518f 604
NIcolasFernandezSanz 5:f12c0d64518f 605 jv++; //Acumulo el paso realizo en la variable(Lo cuento)..
NIcolasFernandezSanz 5:f12c0d64518f 606 ty = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 607 FTR = ESPERA_DECREMENTO; //Espero un tiempo para que se ajuste la salida..
NIcolasFernandezSanz 5:f12c0d64518f 608 break;
NIcolasFernandezSanz 5:f12c0d64518f 609 }
NIcolasFernandezSanz 5:f12c0d64518f 610 /*Si termine con las modificaciones de duty..*/
NIcolasFernandezSanz 5:f12c0d64518f 611 else {
NIcolasFernandezSanz 5:f12c0d64518f 612 //printf("\t\tNuevo Duty = %.0f\r\n", (D+0.01f)*100);
NIcolasFernandezSanz 5:f12c0d64518f 613 duty = dtf; //Guardo el nuevo valor de duty
NIcolasFernandezSanz 5:f12c0d64518f 614 ty = 0; //Reinicio el acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 615 FTR = ESPERA_FINAL; //Paso a la espera final...
NIcolasFernandezSanz 5:f12c0d64518f 616 }
NIcolasFernandezSanz 5:f12c0d64518f 617 break;
NIcolasFernandezSanz 5:f12c0d64518f 618
NIcolasFernandezSanz 5:f12c0d64518f 619 case ESPERA_DECREMENTO:
NIcolasFernandezSanz 5:f12c0d64518f 620 /*Si se cumplio el tiempo*/
NIcolasFernandezSanz 5:f12c0d64518f 621 if(ty >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 622 ty = 0; //Reinico el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 623 FTR = CAMBIO_MENOR;//Paso al nuevo paso
NIcolasFernandezSanz 5:f12c0d64518f 624 }
NIcolasFernandezSanz 5:f12c0d64518f 625 break;
NIcolasFernandezSanz 5:f12c0d64518f 626 case ESPERA_FINAL:
NIcolasFernandezSanz 5:f12c0d64518f 627 /*Termine el proceso de cambio de duty*/
NIcolasFernandezSanz 5:f12c0d64518f 628 Rojo = 1; //Apago el led modificador..
NIcolasFernandezSanz 5:f12c0d64518f 629 tdm = 1; //Notifico a las otras maquinas de estado que termine de modificar el duty..
NIcolasFernandezSanz 5:f12c0d64518f 630 /*Si se cumplio el tiempo*/
NIcolasFernandezSanz 5:f12c0d64518f 631 if(ty >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 632 ty = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 633 FTR = INICIO_CM; //Vuelvo al estado inicial del proceso..
NIcolasFernandezSanz 5:f12c0d64518f 634 }
NIcolasFernandezSanz 5:f12c0d64518f 635 break;
NIcolasFernandezSanz 5:f12c0d64518f 636 }
NIcolasFernandezSanz 5:f12c0d64518f 637 }
NIcolasFernandezSanz 5:f12c0d64518f 638
NIcolasFernandezSanz 5:f12c0d64518f 639 void medicion_velocidad(void)
NIcolasFernandezSanz 5:f12c0d64518f 640 {
NIcolasFernandezSanz 5:f12c0d64518f 641 if(EMV == ESPERA_V) {
NIcolasFernandezSanz 5:f12c0d64518f 642 if(tv >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 643 RPM = 60.00 / (ap.read() * 2);
NIcolasFernandezSanz 5:f12c0d64518f 644 printf("Velocidad maxima = %f RPM\r\n",RPM);
NIcolasFernandezSanz 5:f12c0d64518f 645 VMAX = RPM;
NIcolasFernandezSanz 5:f12c0d64518f 646 tv = 0;
NIcolasFernandezSanz 5:f12c0d64518f 647 EMV = INCIO_V;
NIcolasFernandezSanz 5:f12c0d64518f 648 Modo = LazoAbierto;
NIcolasFernandezSanz 5:f12c0d64518f 649 printf("Modo Lazo Abierto...!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 650 }
NIcolasFernandezSanz 5:f12c0d64518f 651 }
NIcolasFernandezSanz 5:f12c0d64518f 652 }