Nicolas Fernandez Sanz
/
TP1_EJER01
Version Final
main.cpp@6:75b0f24dad9b, 2019-06-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |