![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Version Final
main.cpp@9:56bfbc0947af, 2019-06-09 (annotated)
- 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?
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 | 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 |