Version Final

Dependencies:   mbed DS1820

Committer:
NIcolasFernandezSanz
Date:
Sun Jun 09 19:11:46 2019 +0000
Revision:
9:56bfbc0947af
Parent:
8:53555acc118b
Child:
10:d0d3e0429c6f
VFInal(Funciona)

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 9:56bfbc0947af 70 #define V_1 1
NIcolasFernandezSanz 9:56bfbc0947af 71 #define V_2 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 9:56bfbc0947af 87 /*MAQUINA DE ESTADOS CAMBIO DE DUTY */
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 9:56bfbc0947af 93 #define ESPERA 3
NIcolasFernandezSanz 5:f12c0d64518f 94 #define ESPERA_FINAL 4
NIcolasFernandezSanz 5:f12c0d64518f 95
NIcolasFernandezSanz 9:56bfbc0947af 96 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 9:56bfbc0947af 97 int ty = 0; //Acumulador de tiempo
NIcolasFernandezSanz 9:56bfbc0947af 98 int FTR = 0; //Control de estados de la submaquina
NIcolasFernandezSanz 9:56bfbc0947af 99 bool tdm = 0; //Flag que me notifica cuando termine de cambiar el duty..
NIcolasFernandezSanz 9:56bfbc0947af 100
NIcolasFernandezSanz 5:f12c0d64518f 101 float cantv = 0; //Cantidad de veces que debo modificar el duty (funciona como entero)
NIcolasFernandezSanz 5:f12c0d64518f 102 char jv = 0; //Cantidad de veces que modifique el duty
NIcolasFernandezSanz 5:f12c0d64518f 103 float D = 1.00f; //Duty Actual
NIcolasFernandezSanz 5:f12c0d64518f 104
NIcolasFernandezSanz 5:f12c0d64518f 105 void cambio_duty_pwm(float nuevoDuty); //Funcion que engloa la maquina
NIcolasFernandezSanz 5:f12c0d64518f 106
NIcolasFernandezSanz 5:f12c0d64518f 107
NIcolasFernandezSanz 5:f12c0d64518f 108 /*MAQUINA DE ESTADOS LAZO CERRADO (DUTY EN FUNCION DE TEMPERATURA)*/
NIcolasFernandezSanz 5:f12c0d64518f 109
NIcolasFernandezSanz 9:56bfbc0947af 110 #define INICIO_LC 0
NIcolasFernandezSanz 9:56bfbc0947af 111 #define TEMPERATURA 1
NIcolasFernandezSanz 5:f12c0d64518f 112 #define MEDICION_RPM 2
NIcolasFernandezSanz 5:f12c0d64518f 113 #define CAMBIO_PWM 3
NIcolasFernandezSanz 9:56bfbc0947af 114 #define ESPERA_CPWM 4
NIcolasFernandezSanz 9:56bfbc0947af 115 #define ESPERA_LC 5
NIcolasFernandezSanz 9:56bfbc0947af 116
NIcolasFernandezSanz 9:56bfbc0947af 117 float NuevoDuty = 0; //Duty que voy enviando a forma de prueba y error..
NIcolasFernandezSanz 5:f12c0d64518f 118
NIcolasFernandezSanz 5:f12c0d64518f 119 void control_PWM_Temp(void); //Funcion que engloba la maquina de estados
NIcolasFernandezSanz 5:f12c0d64518f 120
NIcolasFernandezSanz 5:f12c0d64518f 121 int CPT = 0; //Guardo el estado de la maquina
NIcolasFernandezSanz 5:f12c0d64518f 122 int IM = 0; //Acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 123 float duty = 0; //Guardo el duty actual
NIcolasFernandezSanz 5:f12c0d64518f 124
NIcolasFernandezSanz 5:f12c0d64518f 125
NIcolasFernandezSanz 5:f12c0d64518f 126 /*VALORES DE CONFIGURACION LAZO CERRADO*/
NIcolasFernandezSanz 5:f12c0d64518f 127 #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 128 #define MinRPM 500.0f //Minima velocidad establecida por el Cooler
NIcolasFernandezSanz 5:f12c0d64518f 129 #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 130
NIcolasFernandezSanz 5:f12c0d64518f 131 /*RELACION DE REVOLUCIONES POR MINUTO EN FUNCION DE LA TEMPERATURA*/
NIcolasFernandezSanz 5:f12c0d64518f 132 /*
NIcolasFernandezSanz 5:f12c0d64518f 133 20ºC ==> 500rpm
NIcolasFernandezSanz 5:f12c0d64518f 134 x ºC ==> x rpm
NIcolasFernandezSanz 5:f12c0d64518f 135 */
NIcolasFernandezSanz 5:f12c0d64518f 136
NIcolasFernandezSanz 5:f12c0d64518f 137
NIcolasFernandezSanz 5:f12c0d64518f 138 /*ELEMENTOS GENERALES DEL SISTEMA*/
NIcolasFernandezSanz 5:f12c0d64518f 139 void leds(int num);
NIcolasFernandezSanz 5:f12c0d64518f 140 /*Tickers*/
NIcolasFernandezSanz 5:f12c0d64518f 141 Ticker TiempoBase;
NIcolasFernandezSanz 5:f12c0d64518f 142 Ticker TiempoRapido;
NIcolasFernandezSanz 5:f12c0d64518f 143 void base_de_tiempo();
NIcolasFernandezSanz 5:f12c0d64518f 144 void tiempo_rapido();
NIcolasFernandezSanz 5:f12c0d64518f 145 /*Timmers*/
NIcolasFernandezSanz 5:f12c0d64518f 146 Timer ap;
NIcolasFernandezSanz 5:f12c0d64518f 147
NIcolasFernandezSanz 5:f12c0d64518f 148 int main()
NIcolasFernandezSanz 5:f12c0d64518f 149 {
NIcolasFernandezSanz 5:f12c0d64518f 150 /*Apago Todos los LEDS*/
NIcolasFernandezSanz 5:f12c0d64518f 151 leds(0);
NIcolasFernandezSanz 5:f12c0d64518f 152 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 153 /*Attach Timmers*/
NIcolasFernandezSanz 5:f12c0d64518f 154 TiempoBase.attach(&base_de_tiempo, 0.5f);
NIcolasFernandezSanz 5:f12c0d64518f 155 TiempoRapido.attach(&tiempo_rapido, 0.05f);
NIcolasFernandezSanz 5:f12c0d64518f 156 /*Inicio PWM*/
NIcolasFernandezSanz 5:f12c0d64518f 157 Cooler.period(0.01f); //Establezco un periodo de 100mS para el PWM
NIcolasFernandezSanz 5:f12c0d64518f 158
NIcolasFernandezSanz 5:f12c0d64518f 159 while(1) {
NIcolasFernandezSanz 5:f12c0d64518f 160
NIcolasFernandezSanz 5:f12c0d64518f 161 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NIcolasFernandezSanz 5:f12c0d64518f 162 /*Maquina de Estados Central del Sistema*/
NIcolasFernandezSanz 5:f12c0d64518f 163 switch(Modo) {
NIcolasFernandezSanz 5:f12c0d64518f 164
NIcolasFernandezSanz 5:f12c0d64518f 165 //La primera vez arranco el motor al maximo y inicializo la medicion de velocidad..
NIcolasFernandezSanz 5:f12c0d64518f 166 case InicioSistema:
NIcolasFernandezSanz 5:f12c0d64518f 167 Cooler.write(1);
NIcolasFernandezSanz 5:f12c0d64518f 168 //Espero un tiempo para q arranque el motor
NIcolasFernandezSanz 5:f12c0d64518f 169 if(ta > 5) {
NIcolasFernandezSanz 5:f12c0d64518f 170 ta = 0;
NIcolasFernandezSanz 5:f12c0d64518f 171 /*Attach Pin Interrupt del medidor de velocidad*/
NIcolasFernandezSanz 5:f12c0d64518f 172 velocidad.rise(&R_ton);
NIcolasFernandezSanz 5:f12c0d64518f 173 velocidad.fall(&F_ton);
NIcolasFernandezSanz 5:f12c0d64518f 174 printf("Termine de incializar....\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 175 Modo = VelocidadMaxima;
NIcolasFernandezSanz 5:f12c0d64518f 176 }
NIcolasFernandezSanz 5:f12c0d64518f 177
NIcolasFernandezSanz 5:f12c0d64518f 178 break;
NIcolasFernandezSanz 5:f12c0d64518f 179
NIcolasFernandezSanz 5:f12c0d64518f 180 //Mido la velocidad maxima del Cooler.. Lo setie al meximo en "InicioSistema"
NIcolasFernandezSanz 5:f12c0d64518f 181 case VelocidadMaxima:
NIcolasFernandezSanz 5:f12c0d64518f 182 medicion_velocidad();
NIcolasFernandezSanz 5:f12c0d64518f 183 break;
NIcolasFernandezSanz 5:f12c0d64518f 184
NIcolasFernandezSanz 5:f12c0d64518f 185 //Mido el Preset y seteo el duty del Cooler en funcion de la lectura
NIcolasFernandezSanz 5:f12c0d64518f 186 case LazoAbierto:
NIcolasFernandezSanz 5:f12c0d64518f 187 float lec = Preset;
NIcolasFernandezSanz 9:56bfbc0947af 188 cambio_gradual_duty(lec);
NIcolasFernandezSanz 5:f12c0d64518f 189 break;
NIcolasFernandezSanz 5:f12c0d64518f 190
NIcolasFernandezSanz 5:f12c0d64518f 191 //Mido la temperatura y establezco la velocidad del Cooler
NIcolasFernandezSanz 5:f12c0d64518f 192 case LazoCerrado:
NIcolasFernandezSanz 5:f12c0d64518f 193 control_PWM_Temp();
NIcolasFernandezSanz 5:f12c0d64518f 194 break;
NIcolasFernandezSanz 5:f12c0d64518f 195 }
NIcolasFernandezSanz 5:f12c0d64518f 196 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NIcolasFernandezSanz 5:f12c0d64518f 197
NIcolasFernandezSanz 5:f12c0d64518f 198 //Actualizo el pulsador...
NIcolasFernandezSanz 5:f12c0d64518f 199 CambioDeModo();
NIcolasFernandezSanz 8:53555acc118b 200
NIcolasFernandezSanz 5:f12c0d64518f 201 RET = !RET; //Cambio el estado del pin de verificacion..
NIcolasFernandezSanz 5:f12c0d64518f 202
NIcolasFernandezSanz 5:f12c0d64518f 203 }
NIcolasFernandezSanz 5:f12c0d64518f 204 }
NIcolasFernandezSanz 5:f12c0d64518f 205
NIcolasFernandezSanz 5:f12c0d64518f 206 //Funcion utilizada para controlar los Leds On Board
NIcolasFernandezSanz 5:f12c0d64518f 207 //IN ==> Combinacion Binaria de estados || OUT ==> Actualizacion estado de leds
NIcolasFernandezSanz 5:f12c0d64518f 208
NIcolasFernandezSanz 5:f12c0d64518f 209 void leds(int num)
NIcolasFernandezSanz 5:f12c0d64518f 210 {
NIcolasFernandezSanz 5:f12c0d64518f 211 switch(num) {
NIcolasFernandezSanz 5:f12c0d64518f 212 case 0:
NIcolasFernandezSanz 5:f12c0d64518f 213 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 214 Verde = 1;
NIcolasFernandezSanz 5:f12c0d64518f 215 Azul = 1;
NIcolasFernandezSanz 5:f12c0d64518f 216 break;
NIcolasFernandezSanz 5:f12c0d64518f 217 case 4:
NIcolasFernandezSanz 5:f12c0d64518f 218 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 219 Verde = 1;
NIcolasFernandezSanz 5:f12c0d64518f 220 Azul = 1;
NIcolasFernandezSanz 5:f12c0d64518f 221 break;
NIcolasFernandezSanz 5:f12c0d64518f 222 case 2:
NIcolasFernandezSanz 5:f12c0d64518f 223 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 224 Verde = 0;
NIcolasFernandezSanz 5:f12c0d64518f 225 Azul = 1;
NIcolasFernandezSanz 5:f12c0d64518f 226 break;
NIcolasFernandezSanz 5:f12c0d64518f 227 case 1:
NIcolasFernandezSanz 5:f12c0d64518f 228 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 229 Verde = 1;
NIcolasFernandezSanz 5:f12c0d64518f 230 Azul = 0;
NIcolasFernandezSanz 5:f12c0d64518f 231 break;
NIcolasFernandezSanz 5:f12c0d64518f 232 case 7:
NIcolasFernandezSanz 5:f12c0d64518f 233 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 234 Verde = 0;
NIcolasFernandezSanz 5:f12c0d64518f 235 Azul = 0;
Sissors 0:e069f9f26768 236 break;
Sissors 0:e069f9f26768 237 }
NIcolasFernandezSanz 5:f12c0d64518f 238 }
NIcolasFernandezSanz 5:f12c0d64518f 239
NIcolasFernandezSanz 5:f12c0d64518f 240 //Maquina de estados que elimina el Rebote de los pulsadores
NIcolasFernandezSanz 5:f12c0d64518f 241 //IN ==> DigitalIn || OUT ==> Detector de flancos ascendentes del pulsador
NIcolasFernandezSanz 5:f12c0d64518f 242 bool antirrebote(bool lectura)
NIcolasFernandezSanz 5:f12c0d64518f 243 {
NIcolasFernandezSanz 5:f12c0d64518f 244 static bool lecant = 0;
NIcolasFernandezSanz 5:f12c0d64518f 245
NIcolasFernandezSanz 5:f12c0d64518f 246 switch(estado) {
NIcolasFernandezSanz 5:f12c0d64518f 247 case INICIO_P:
NIcolasFernandezSanz 5:f12c0d64518f 248 //Si tengo un flanco ascendente
NIcolasFernandezSanz 5:f12c0d64518f 249 if((lectura == 1) && (lecant == 0)) {
NIcolasFernandezSanz 5:f12c0d64518f 250 estado = RISING_P;
NIcolasFernandezSanz 5:f12c0d64518f 251 }
NIcolasFernandezSanz 5:f12c0d64518f 252 break;
NIcolasFernandezSanz 5:f12c0d64518f 253 case RISING_P:
NIcolasFernandezSanz 7:a16d4e848e5e 254 /*Devuelvo el estado uno , una unica vez (Saco el rebote)*/
NIcolasFernandezSanz 5:f12c0d64518f 255 estado = RETENCION_P;
NIcolasFernandezSanz 5:f12c0d64518f 256 tp = 0;
NIcolasFernandezSanz 7:a16d4e848e5e 257 return 1; //Devuelvo el estado alto ya que tuve un flanco
NIcolasFernandezSanz 5:f12c0d64518f 258 case RETENCION_P:
NIcolasFernandezSanz 7:a16d4e848e5e 259 /*Durante un segundo y siempre que la lectura siga siendo alta retengo*/
NIcolasFernandezSanz 5:f12c0d64518f 260 if((tp >= 2) && (lectura == 0)) {
NIcolasFernandezSanz 5:f12c0d64518f 261 estado = INICIO_P;
NIcolasFernandezSanz 5:f12c0d64518f 262 }
NIcolasFernandezSanz 5:f12c0d64518f 263 break;
Sissors 0:e069f9f26768 264 }
NIcolasFernandezSanz 7:a16d4e848e5e 265 lecant = lectura; //Asigno el estado previo para el proximo ciclo..
NIcolasFernandezSanz 8:53555acc118b 266 return 0; //Devuelvo el estado nulo o cero
NIcolasFernandezSanz 5:f12c0d64518f 267 }
NIcolasFernandezSanz 5:f12c0d64518f 268
NIcolasFernandezSanz 5:f12c0d64518f 269 //Funcion relacionada al timmer , es llamada cada 0.5 segundos
NIcolasFernandezSanz 5:f12c0d64518f 270 void base_de_tiempo()
NIcolasFernandezSanz 5:f12c0d64518f 271 {
NIcolasFernandezSanz 5:f12c0d64518f 272 tp ++; //Acumulador Antirebote
NIcolasFernandezSanz 5:f12c0d64518f 273 tv ++; //Acumulador Mediciond de velocidad
NIcolasFernandezSanz 5:f12c0d64518f 274 ta ++; //Acumulador Inicio del sistema..
NIcolasFernandezSanz 5:f12c0d64518f 275 IM++; //Acumulador Lazo Cerrado
Sissors 0:e069f9f26768 276 }
Sissors 0:e069f9f26768 277
NIcolasFernandezSanz 5:f12c0d64518f 278 //Funcion del timmer dos, es llamada cada 0.05 segundos
NIcolasFernandezSanz 5:f12c0d64518f 279 void tiempo_rapido()
NIcolasFernandezSanz 5:f12c0d64518f 280 {
NIcolasFernandezSanz 5:f12c0d64518f 281 ty ++; //Acumulador Cambio de Duty(Lazo Cerrado)
NIcolasFernandezSanz 5:f12c0d64518f 282 }
NIcolasFernandezSanz 5:f12c0d64518f 283
NIcolasFernandezSanz 5:f12c0d64518f 284 //Funcion dedicada a controlar el pulsador y analizar los cambios de modo..
NIcolasFernandezSanz 5:f12c0d64518f 285 void CambioDeModo()
NIcolasFernandezSanz 5:f12c0d64518f 286 {
NIcolasFernandezSanz 7:a16d4e848e5e 287 /*Si tengo un flanco ascendente en el pulsador (Apretaron)*/
NIcolasFernandezSanz 5:f12c0d64518f 288 if(antirrebote(P)) {
NIcolasFernandezSanz 7:a16d4e848e5e 289 /*Switcheo entre MODO = 1 y MODO = 2 (LazoAbierto | LazoCerrado)*/
NIcolasFernandezSanz 5:f12c0d64518f 290 Modo ++;
NIcolasFernandezSanz 5:f12c0d64518f 291 if(Modo > 2) {
NIcolasFernandezSanz 5:f12c0d64518f 292 Modo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 293 printf("Lazo Abierto!!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 294 }
NIcolasFernandezSanz 9:56bfbc0947af 295 FTR = 0;
NIcolasFernandezSanz 5:f12c0d64518f 296 }
NIcolasFernandezSanz 5:f12c0d64518f 297 }
NIcolasFernandezSanz 5:f12c0d64518f 298
NIcolasFernandezSanz 9:56bfbc0947af 299 ///////////////////////////////////////////////////////////////////////////ETAPAS DE MEDICION DE VELOCIDAD///////////////////////////////////////////////////////////////////////////
NIcolasFernandezSanz 7:a16d4e848e5e 300
NIcolasFernandezSanz 6:75b0f24dad9b 301 /*
NIcolasFernandezSanz 6:75b0f24dad9b 302 UN PERIODO ==> RISE - FALL - RISE
NIcolasFernandezSanz 8:53555acc118b 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 7:a16d4e848e5e 307 /*LA MAQUINA DE ESTADOS SE SUBDIVIDE EN TRES FUNCIONES (2 INTERRUPCIONES + 1 FUNCION EN LA MAQUINA PRINCIPAL)*/
NIcolasFernandezSanz 7:a16d4e848e5e 308
NIcolasFernandezSanz 7:a16d4e848e5e 309 //Interrupcion relacionada al Rising..
NIcolasFernandezSanz 7:a16d4e848e5e 310
NIcolasFernandezSanz 5:f12c0d64518f 311 void R_ton()
NIcolasFernandezSanz 5:f12c0d64518f 312 {
NIcolasFernandezSanz 5:f12c0d64518f 313 switch(EMV) {
NIcolasFernandezSanz 5:f12c0d64518f 314 case INCIO_V:
NIcolasFernandezSanz 6:75b0f24dad9b 315 ap.reset(); //Reseteo el timmer
NIcolasFernandezSanz 6:75b0f24dad9b 316 ap.start(); //Inicio la cuenta
NIcolasFernandezSanz 6:75b0f24dad9b 317 em = 1; //Aviso que estoy midiendo
NIcolasFernandezSanz 6:75b0f24dad9b 318 tmv = 0; //Aviso que no termine de medir
NIcolasFernandezSanz 9:56bfbc0947af 319 EMV = V_1;
NIcolasFernandezSanz 5:f12c0d64518f 320 break;
NIcolasFernandezSanz 5:f12c0d64518f 321
NIcolasFernandezSanz 9:56bfbc0947af 322 case V_1:
NIcolasFernandezSanz 5:f12c0d64518f 323 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 324 break;
NIcolasFernandezSanz 5:f12c0d64518f 325
NIcolasFernandezSanz 9:56bfbc0947af 326 case V_2:
NIcolasFernandezSanz 6:75b0f24dad9b 327 ap.stop(); //Freno el timmer
NIcolasFernandezSanz 6:75b0f24dad9b 328 tmv = 1; //Aviso que termine de medir
NIcolasFernandezSanz 6:75b0f24dad9b 329 em = 0; //Ya no estoy midiendo
NIcolasFernandezSanz 6:75b0f24dad9b 330 tv = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 331 EMV = ESPERA_V;
NIcolasFernandezSanz 5:f12c0d64518f 332 break;
NIcolasFernandezSanz 5:f12c0d64518f 333
Sissors 0:e069f9f26768 334 }
Sissors 0:e069f9f26768 335 }
Sissors 0:e069f9f26768 336
NIcolasFernandezSanz 7:a16d4e848e5e 337 //Interrupcion relacionada a el falling..
NIcolasFernandezSanz 7:a16d4e848e5e 338
NIcolasFernandezSanz 5:f12c0d64518f 339 void F_ton()
NIcolasFernandezSanz 5:f12c0d64518f 340 {
NIcolasFernandezSanz 5:f12c0d64518f 341 if(em) {
NIcolasFernandezSanz 5:f12c0d64518f 342 switch(EMV) {
NIcolasFernandezSanz 5:f12c0d64518f 343 case INCIO_V:
NIcolasFernandezSanz 5:f12c0d64518f 344 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 345 break;
NIcolasFernandezSanz 9:56bfbc0947af 346 case V_1:
NIcolasFernandezSanz 9:56bfbc0947af 347 EMV = V_2;
NIcolasFernandezSanz 5:f12c0d64518f 348 break;
NIcolasFernandezSanz 9:56bfbc0947af 349 case V_2:
NIcolasFernandezSanz 5:f12c0d64518f 350 printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV);
NIcolasFernandezSanz 5:f12c0d64518f 351 break;
NIcolasFernandezSanz 5:f12c0d64518f 352 }
NIcolasFernandezSanz 5:f12c0d64518f 353 }
NIcolasFernandezSanz 5:f12c0d64518f 354
NIcolasFernandezSanz 5:f12c0d64518f 355 }
NIcolasFernandezSanz 5:f12c0d64518f 356
NIcolasFernandezSanz 7:a16d4e848e5e 357 //Estado final de la maquina de estados
NIcolasFernandezSanz 7:a16d4e848e5e 358 //Aqui genero la cuenta de donde obtengo las RPM y espero el tiempo prudencial..
NIcolasFernandezSanz 7:a16d4e848e5e 359
NIcolasFernandezSanz 7:a16d4e848e5e 360 void medicion_velocidad(void)
NIcolasFernandezSanz 7:a16d4e848e5e 361 {
NIcolasFernandezSanz 7:a16d4e848e5e 362 if(EMV == ESPERA_V) {
NIcolasFernandezSanz 7:a16d4e848e5e 363 if(tv >= 1) {
NIcolasFernandezSanz 7:a16d4e848e5e 364 RPM = 60.00 / (ap.read() * 2);
NIcolasFernandezSanz 7:a16d4e848e5e 365 printf("Velocidad maxima = %f RPM\r\n",RPM);
NIcolasFernandezSanz 7:a16d4e848e5e 366 VMAX = RPM;
NIcolasFernandezSanz 7:a16d4e848e5e 367 tv = 0;
NIcolasFernandezSanz 7:a16d4e848e5e 368 EMV = INCIO_V;
NIcolasFernandezSanz 7:a16d4e848e5e 369 Modo = LazoAbierto;
NIcolasFernandezSanz 7:a16d4e848e5e 370 printf("Modo Lazo Abierto...!\r\n");
NIcolasFernandezSanz 7:a16d4e848e5e 371 }
NIcolasFernandezSanz 7:a16d4e848e5e 372 }
NIcolasFernandezSanz 7:a16d4e848e5e 373 }
NIcolasFernandezSanz 7:a16d4e848e5e 374
NIcolasFernandezSanz 9:56bfbc0947af 375 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NIcolasFernandezSanz 5:f12c0d64518f 376
NIcolasFernandezSanz 5:f12c0d64518f 377 //Maquina LazoCerrado
NIcolasFernandezSanz 5:f12c0d64518f 378 void control_PWM_Temp(void)
NIcolasFernandezSanz 5:f12c0d64518f 379 {
NIcolasFernandezSanz 5:f12c0d64518f 380 static float temperatura = 0;
NIcolasFernandezSanz 5:f12c0d64518f 381 float val = 0;
NIcolasFernandezSanz 8:53555acc118b 382 static bool suptempmax = 0; //Flag que me indica si ya puse al maximo el duty
NIcolasFernandezSanz 9:56bfbc0947af 383
NIcolasFernandezSanz 5:f12c0d64518f 384 switch(CPT) {
NIcolasFernandezSanz 9:56bfbc0947af 385 case INICIO_LC:
NIcolasFernandezSanz 5:f12c0d64518f 386 Rojo = 1;//Apago el Led rojo..
NIcolasFernandezSanz 5:f12c0d64518f 387 Azul = 0;//Prendo el Led azuil...
NIcolasFernandezSanz 5:f12c0d64518f 388 /*Fijo el duty en 50%*/
NIcolasFernandezSanz 5:f12c0d64518f 389 Cooler.write(0.5f);
NIcolasFernandezSanz 5:f12c0d64518f 390 duty = 0.5f;
NIcolasFernandezSanz 5:f12c0d64518f 391 printf("Lazo Cerrado!!\r\n");
NIcolasFernandezSanz 9:56bfbc0947af 392 CPT = TEMPERATURA;
NIcolasFernandezSanz 5:f12c0d64518f 393 break;
NIcolasFernandezSanz 5:f12c0d64518f 394
NIcolasFernandezSanz 9:56bfbc0947af 395 case TEMPERATURA:
NIcolasFernandezSanz 6:75b0f24dad9b 396 probe.convertTemperature(false, DS1820::all_devices); //Le digo que convierta la temperatura del sensor, false ==> No retiene || True ==> Retiene
NIcolasFernandezSanz 6:75b0f24dad9b 397 temperatura = probe.temperature(); //Guardo la temperatura
NIcolasFernandezSanz 5:f12c0d64518f 398 printf("La temperatura es de %3.1foC\r\n",temperatura );
NIcolasFernandezSanz 8:53555acc118b 399 /*Si tengo mas de 70 grados directamente pongo la maxima velocidad*/
NIcolasFernandezSanz 8:53555acc118b 400 if(temperatura >= 70) {
NIcolasFernandezSanz 8:53555acc118b 401 /*Aviso que supere los 70ºC*/
NIcolasFernandezSanz 8:53555acc118b 402 if(!suptempmax){
NIcolasFernandezSanz 8:53555acc118b 403 printf("Supere los 70oC... Pongo el duty al maximo.. Dejo de medir RPM momentaneamente..\r\n");
NIcolasFernandezSanz 8:53555acc118b 404 suptempmax = 1; //Seteo el flag de superar los 70ºC
NIcolasFernandezSanz 8:53555acc118b 405 }
NIcolasFernandezSanz 8:53555acc118b 406 duty = 1.00f; //Registro el cambio de duty al maximo
NIcolasFernandezSanz 8:53555acc118b 407 Cooler.write(1); //Ejecuto el cambio de duty al maximo
NIcolasFernandezSanz 8:53555acc118b 408 IM = 0; //Reinicio el acumulador para tener el tiempo entre modificaciones..
NIcolasFernandezSanz 9:56bfbc0947af 409 CPT = ESPERA_LC;
NIcolasFernandezSanz 8:53555acc118b 410 break;
NIcolasFernandezSanz 8:53555acc118b 411 } else {
NIcolasFernandezSanz 8:53555acc118b 412 /*Aviso que baje de los 70ºC*/
NIcolasFernandezSanz 8:53555acc118b 413 if(suptempmax){
NIcolasFernandezSanz 8:53555acc118b 414 printf("Baje de los 70oC... duty dinamico.. Vuelvo a medir RPM ..\r\n");
NIcolasFernandezSanz 8:53555acc118b 415 suptempmax = 0; //Reinicio el flag de superar los 70ºC
NIcolasFernandezSanz 8:53555acc118b 416 }
NIcolasFernandezSanz 8:53555acc118b 417 /*Reinicio la medicion de RPM*/
NIcolasFernandezSanz 9:56bfbc0947af 418 tv = 0; //Reinicio el acumulador de tiempo de la maquina de estados que mide velocidad
NIcolasFernandezSanz 9:56bfbc0947af 419 EMV = INCIO_V; //Pongo en el estado inicial la maquina de medicion de velocidad
NIcolasFernandezSanz 9:56bfbc0947af 420 IM = 0; //Pongo en cero el acumulador para darle un TimeOut a la medicion de velocidad
NIcolasFernandezSanz 8:53555acc118b 421 CPT = MEDICION_RPM; //Paso a medir la velocidad del Cooler
NIcolasFernandezSanz 8:53555acc118b 422 break;
NIcolasFernandezSanz 8:53555acc118b 423 }
NIcolasFernandezSanz 5:f12c0d64518f 424
NIcolasFernandezSanz 5:f12c0d64518f 425 case MEDICION_RPM:
NIcolasFernandezSanz 5:f12c0d64518f 426 /*Si termine de medir la velocidad...*/
NIcolasFernandezSanz 5:f12c0d64518f 427 if(EMV == ESPERA_V) {
NIcolasFernandezSanz 5:f12c0d64518f 428 if(tv >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 429 RPM = 60.00 / (ap.read() * 2);
NIcolasFernandezSanz 7:a16d4e848e5e 430 //printf("Velocidad = %f RPM\r\n",RPM);
NIcolasFernandezSanz 5:f12c0d64518f 431 tv = 0;
NIcolasFernandezSanz 5:f12c0d64518f 432 EMV = INCIO_V;
NIcolasFernandezSanz 5:f12c0d64518f 433
NIcolasFernandezSanz 5:f12c0d64518f 434 val = floor(temperatura * MinRPM / 20);
NIcolasFernandezSanz 5:f12c0d64518f 435 printf("Deberia tener %f RPM y tengo %f RPM\r\n", val, RPM);
NIcolasFernandezSanz 5:f12c0d64518f 436
NIcolasFernandezSanz 5:f12c0d64518f 437 /*Aca me fijo si debo modificar el duty*/
NIcolasFernandezSanz 5:f12c0d64518f 438 if(abs(RPM - val) > ToleranciaRPM) {
NIcolasFernandezSanz 5:f12c0d64518f 439
NIcolasFernandezSanz 5:f12c0d64518f 440 /*Miro que duty debo enviar...*/
NIcolasFernandezSanz 5:f12c0d64518f 441 if(val < RPM)
NIcolasFernandezSanz 5:f12c0d64518f 442 NuevoDuty = duty - DEFINICION_CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 443 if(val > RPM)
NIcolasFernandezSanz 5:f12c0d64518f 444 NuevoDuty = duty + DEFINICION_CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 445
NIcolasFernandezSanz 5:f12c0d64518f 446 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 447 CPT = CAMBIO_PWM;
NIcolasFernandezSanz 5:f12c0d64518f 448 break;
NIcolasFernandezSanz 5:f12c0d64518f 449 } else {
NIcolasFernandezSanz 5:f12c0d64518f 450 printf("EL duty es correcto! Estoy en %0.1f% :D\r\n", floor(duty * 100.0f));
NIcolasFernandezSanz 5:f12c0d64518f 451 IM = 0;
NIcolasFernandezSanz 9:56bfbc0947af 452 CPT = ESPERA_LC;
NIcolasFernandezSanz 9:56bfbc0947af 453 break;
NIcolasFernandezSanz 5:f12c0d64518f 454
NIcolasFernandezSanz 5:f12c0d64518f 455 }
NIcolasFernandezSanz 5:f12c0d64518f 456
NIcolasFernandezSanz 5:f12c0d64518f 457 }
NIcolasFernandezSanz 5:f12c0d64518f 458 }
NIcolasFernandezSanz 5:f12c0d64518f 459 /*Verifico que no se me apago el motor...*/
NIcolasFernandezSanz 5:f12c0d64518f 460 if(IM > 10) {
NIcolasFernandezSanz 5:f12c0d64518f 461 printf("El cooler estaba apagadoo!!..Reiniciando Lazo cerrado..\r\n");
NIcolasFernandezSanz 9:56bfbc0947af 462 EMV = INICIO_LC;
NIcolasFernandezSanz 5:f12c0d64518f 463 IM = 0;
NIcolasFernandezSanz 5:f12c0d64518f 464 }
NIcolasFernandezSanz 5:f12c0d64518f 465
NIcolasFernandezSanz 5:f12c0d64518f 466 break;
NIcolasFernandezSanz 5:f12c0d64518f 467
NIcolasFernandezSanz 5:f12c0d64518f 468 case CAMBIO_PWM:
NIcolasFernandezSanz 6:75b0f24dad9b 469 cambio_gradual_duty(NuevoDuty); //Actualizo el duty, si el valor es menor a 50% hago un proceso especial..
NIcolasFernandezSanz 5:f12c0d64518f 470 /*Si termine de modificar el duty*/
NIcolasFernandezSanz 5:f12c0d64518f 471 if(tdm) {
NIcolasFernandezSanz 5:f12c0d64518f 472 IM = 0;
NIcolasFernandezSanz 9:56bfbc0947af 473 CPT = ESPERA_CPWM;
NIcolasFernandezSanz 5:f12c0d64518f 474 }
NIcolasFernandezSanz 5:f12c0d64518f 475 break;
NIcolasFernandezSanz 5:f12c0d64518f 476
NIcolasFernandezSanz 9:56bfbc0947af 477 case ESPERA_CPWM:
NIcolasFernandezSanz 5:f12c0d64518f 478 /*Si se cumplio un tiempo prudencial.. El motor se debe adecuar a la nueva velocidad*/
NIcolasFernandezSanz 5:f12c0d64518f 479 if(IM >= 2) {
NIcolasFernandezSanz 5:f12c0d64518f 480 tdm = 0; //Reinicio el flag de cambio de duty
NIcolasFernandezSanz 5:f12c0d64518f 481 EMV = 0; //Reinico la maquina de medicion de velocidad..
NIcolasFernandezSanz 5:f12c0d64518f 482 IM = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 483 CPT = MEDICION_RPM; //Mido nuevamente la velocidad y me fijo si debo modificar denuevo
NIcolasFernandezSanz 5:f12c0d64518f 484 break;
NIcolasFernandezSanz 5:f12c0d64518f 485 }
NIcolasFernandezSanz 5:f12c0d64518f 486
NIcolasFernandezSanz 5:f12c0d64518f 487 break;
NIcolasFernandezSanz 5:f12c0d64518f 488
NIcolasFernandezSanz 9:56bfbc0947af 489 case ESPERA_LC:
NIcolasFernandezSanz 7:a16d4e848e5e 490 /*Si se cumplio el tiempo..*/
NIcolasFernandezSanz 5:f12c0d64518f 491 if(IM >= 1)
NIcolasFernandezSanz 9:56bfbc0947af 492 CPT = TEMPERATURA;
NIcolasFernandezSanz 5:f12c0d64518f 493 break;
NIcolasFernandezSanz 5:f12c0d64518f 494 }
NIcolasFernandezSanz 5:f12c0d64518f 495 }
NIcolasFernandezSanz 5:f12c0d64518f 496
NIcolasFernandezSanz 5:f12c0d64518f 497 //Maquina de cambio de duty gradual....
NIcolasFernandezSanz 5:f12c0d64518f 498
NIcolasFernandezSanz 5:f12c0d64518f 499 void cambio_gradual_duty(float obj)
NIcolasFernandezSanz 5:f12c0d64518f 500 {
NIcolasFernandezSanz 5:f12c0d64518f 501 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 502
NIcolasFernandezSanz 5:f12c0d64518f 503 switch(FTR) {
NIcolasFernandezSanz 5:f12c0d64518f 504 case INICIO_CM:
NIcolasFernandezSanz 8:53555acc118b 505
NIcolasFernandezSanz 5:f12c0d64518f 506 dtf = obj; //Fijo el nuevo objetivo...
NIcolasFernandezSanz 5:f12c0d64518f 507 tdm = 0; //Aviso que estoy modificando el duty...
NIcolasFernandezSanz 5:f12c0d64518f 508 printf("Inicio el cambio de duty....\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 509 Rojo = 0;
NIcolasFernandezSanz 5:f12c0d64518f 510
NIcolasFernandezSanz 5:f12c0d64518f 511 /*Si estoy por debajo del minimo del Cooler directamente lo apago...*/
NIcolasFernandezSanz 5:f12c0d64518f 512 if(dtf < 0.07f) {
NIcolasFernandezSanz 5:f12c0d64518f 513 /*Apago el PWM*/
NIcolasFernandezSanz 5:f12c0d64518f 514 Cooler.write(0);
NIcolasFernandezSanz 5:f12c0d64518f 515 duty = 0;
NIcolasFernandezSanz 7:a16d4e848e5e 516 //printf("Cooler APAGADO!\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 517 /*Voy al final de la maquina*/
NIcolasFernandezSanz 5:f12c0d64518f 518 ty = 0; //Reinicio el acumulador de tiempo final...
NIcolasFernandezSanz 5:f12c0d64518f 519 FTR = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 520 Rojo = 1;
NIcolasFernandezSanz 5:f12c0d64518f 521 break;
NIcolasFernandezSanz 5:f12c0d64518f 522 }
NIcolasFernandezSanz 5:f12c0d64518f 523 if(dtf >= 0.5f) {
NIcolasFernandezSanz 5:f12c0d64518f 524 FTR = CAMBIO_MAYOR;
NIcolasFernandezSanz 5:f12c0d64518f 525 } else
NIcolasFernandezSanz 5:f12c0d64518f 526 FTR = INICIO_CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 527 break;
NIcolasFernandezSanz 5:f12c0d64518f 528
NIcolasFernandezSanz 5:f12c0d64518f 529 case CAMBIO_MAYOR:
NIcolasFernandezSanz 5:f12c0d64518f 530 Cooler.write(dtf); //Coloco el nuevo valor en el PWM de una..
NIcolasFernandezSanz 5:f12c0d64518f 531 //printf("\tNuevo Duty = %f%\r\n", dtf * 100);
NIcolasFernandezSanz 5:f12c0d64518f 532 duty = dtf; //Actualizo el duty actual..
NIcolasFernandezSanz 5:f12c0d64518f 533 ty = 0; //Reinicio el acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 534 FTR = ESPERA_FINAL;
NIcolasFernandezSanz 5:f12c0d64518f 535 break;
NIcolasFernandezSanz 5:f12c0d64518f 536
NIcolasFernandezSanz 5:f12c0d64518f 537 case INICIO_CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 538 cantv = abs( (int(duty*100)) - (int(dtf*100))); //Me fijo cuantos pasos intermedios voy a dar...
NIcolasFernandezSanz 5:f12c0d64518f 539 //printf("\tVoy a hacer %.0f pasos intermedios desde %.0f para llegar a %.0f%\r\n", cantv, duty*100, dtf * 100);
NIcolasFernandezSanz 5:f12c0d64518f 540 D = duty; //Parto desde el PWM actual
NIcolasFernandezSanz 5:f12c0d64518f 541 jv = 0; //Reinico el acumulador de veces
NIcolasFernandezSanz 5:f12c0d64518f 542 FTR = CAMBIO_MENOR;
NIcolasFernandezSanz 5:f12c0d64518f 543 break;
NIcolasFernandezSanz 5:f12c0d64518f 544
NIcolasFernandezSanz 5:f12c0d64518f 545 case CAMBIO_MENOR:
NIcolasFernandezSanz 5:f12c0d64518f 546 /*La cantidad de pasos intermedios calculados en el estado anterior...*/
NIcolasFernandezSanz 5:f12c0d64518f 547 if(cantv >= jv) {
NIcolasFernandezSanz 5:f12c0d64518f 548 Cooler.write(D); //Pongo el duty
NIcolasFernandezSanz 5:f12c0d64518f 549 //printf("\t\tEtapa intermedia en %.0f%\r\n", D * 100.00f);
NIcolasFernandezSanz 5:f12c0d64518f 550 /*Si quiero alcanzar un duty inferior*/
NIcolasFernandezSanz 5:f12c0d64518f 551 if(dtf < duty)
NIcolasFernandezSanz 5:f12c0d64518f 552 D -= 0.01f; //Decremeto 1%
NIcolasFernandezSanz 5:f12c0d64518f 553 /*Si quiero alcanzar un duty superior*/
NIcolasFernandezSanz 5:f12c0d64518f 554 if(dtf > duty)
NIcolasFernandezSanz 5:f12c0d64518f 555 D += 0.01f; //Incremento 1%
NIcolasFernandezSanz 5:f12c0d64518f 556
NIcolasFernandezSanz 5:f12c0d64518f 557 if(D < 0 || D > 1) { //Si estoy en valores no logicos...
NIcolasFernandezSanz 5:f12c0d64518f 558 //printf("Valores de duty no logicos... ERORR!!!! D:\r\n");
NIcolasFernandezSanz 5:f12c0d64518f 559 FTR = INICIO_CM;
NIcolasFernandezSanz 5:f12c0d64518f 560 break;
NIcolasFernandezSanz 5:f12c0d64518f 561 }
NIcolasFernandezSanz 5:f12c0d64518f 562
NIcolasFernandezSanz 5:f12c0d64518f 563 jv++; //Acumulo el paso realizo en la variable(Lo cuento)..
NIcolasFernandezSanz 5:f12c0d64518f 564 ty = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 9:56bfbc0947af 565 FTR = ESPERA; //Espero un tiempo para que se ajuste la salida..
NIcolasFernandezSanz 5:f12c0d64518f 566 break;
NIcolasFernandezSanz 5:f12c0d64518f 567 }
NIcolasFernandezSanz 5:f12c0d64518f 568 /*Si termine con las modificaciones de duty..*/
NIcolasFernandezSanz 5:f12c0d64518f 569 else {
NIcolasFernandezSanz 5:f12c0d64518f 570 //printf("\t\tNuevo Duty = %.0f\r\n", (D+0.01f)*100);
NIcolasFernandezSanz 5:f12c0d64518f 571 duty = dtf; //Guardo el nuevo valor de duty
NIcolasFernandezSanz 5:f12c0d64518f 572 ty = 0; //Reinicio el acumulador de tiempo base
NIcolasFernandezSanz 5:f12c0d64518f 573 FTR = ESPERA_FINAL; //Paso a la espera final...
NIcolasFernandezSanz 5:f12c0d64518f 574 }
NIcolasFernandezSanz 5:f12c0d64518f 575 break;
NIcolasFernandezSanz 5:f12c0d64518f 576
NIcolasFernandezSanz 9:56bfbc0947af 577 case ESPERA:
NIcolasFernandezSanz 5:f12c0d64518f 578 /*Si se cumplio el tiempo*/
NIcolasFernandezSanz 5:f12c0d64518f 579 if(ty >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 580 ty = 0; //Reinico el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 581 FTR = CAMBIO_MENOR;//Paso al nuevo paso
NIcolasFernandezSanz 5:f12c0d64518f 582 }
NIcolasFernandezSanz 5:f12c0d64518f 583 break;
NIcolasFernandezSanz 5:f12c0d64518f 584 case ESPERA_FINAL:
NIcolasFernandezSanz 5:f12c0d64518f 585 /*Termine el proceso de cambio de duty*/
NIcolasFernandezSanz 5:f12c0d64518f 586 Rojo = 1; //Apago el led modificador..
NIcolasFernandezSanz 5:f12c0d64518f 587 tdm = 1; //Notifico a las otras maquinas de estado que termine de modificar el duty..
NIcolasFernandezSanz 5:f12c0d64518f 588 /*Si se cumplio el tiempo*/
NIcolasFernandezSanz 5:f12c0d64518f 589 if(ty >= 1) {
NIcolasFernandezSanz 5:f12c0d64518f 590 ty = 0; //Reinicio el acumulador de tiempo
NIcolasFernandezSanz 5:f12c0d64518f 591 FTR = INICIO_CM; //Vuelvo al estado inicial del proceso..
NIcolasFernandezSanz 5:f12c0d64518f 592 }
NIcolasFernandezSanz 5:f12c0d64518f 593 break;
NIcolasFernandezSanz 5:f12c0d64518f 594 }
NIcolasFernandezSanz 5:f12c0d64518f 595 }
NIcolasFernandezSanz 5:f12c0d64518f 596