Version Final

Dependencies:   mbed DS1820

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