![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Version Final
Diff: main.cpp
- Revision:
- 9:56bfbc0947af
- Parent:
- 8:53555acc118b
- Child:
- 10:d0d3e0429c6f
--- a/main.cpp Wed Jun 05 10:56:29 2019 +0000 +++ b/main.cpp Sun Jun 09 19:11:46 2019 +0000 @@ -67,8 +67,8 @@ /*MAQUINA DE ESTADOS MEDICION VELOCIDAD*/ #define INCIO_V 0 -#define RISE_1 1 -#define FALL_1 2 +#define V_1 1 +#define V_2 2 #define ESPERA_V 3 //Interrupciones de deteccion de cambios en pin de medicion de valocidad @@ -84,33 +84,37 @@ -/*MAQUINA DE ESTADOS CAMBIO DE DUTY (LAZO ABIERTO)*/ +/*MAQUINA DE ESTADOS CAMBIO DE DUTY */ #define INICIO_CM 0 #define CAMBIO_MAYOR 1 #define CAMBIO_MENOR 2 #define INICIO_CAMBIO_MENOR 5 -#define ESPERA_DECREMENTO 3 +#define ESPERA 3 #define ESPERA_FINAL 4 -int tcd = 0; //Acumulador de tiempo -int ECM = 0; //Guardo el estado de la maquina +void cambio_gradual_duty(float obj);//Funcion que engloba la maquina de modificacion del duty , en especial la zona que no puedo enviar directamente.. +int ty = 0; //Acumulador de tiempo +int FTR = 0; //Control de estados de la submaquina +bool tdm = 0; //Flag que me notifica cuando termine de cambiar el duty.. + float cantv = 0; //Cantidad de veces que debo modificar el duty (funciona como entero) char jv = 0; //Cantidad de veces que modifique el duty float D = 1.00f; //Duty Actual -float DAN = 0.5f;//Duty Anterior void cambio_duty_pwm(float nuevoDuty); //Funcion que engloa la maquina /*MAQUINA DE ESTADOS LAZO CERRADO (DUTY EN FUNCION DE TEMPERATURA)*/ -#define INCIO_LAZOCERRADO 0 -#define MEDICION_TEMPERATURA 1 +#define INICIO_LC 0 +#define TEMPERATURA 1 #define MEDICION_RPM 2 #define CAMBIO_PWM 3 -#define ESPERA_CAMBIOS_PWM 4 -#define ESPERA_ENTRE_MODIFICACIONES 5 +#define ESPERA_CPWM 4 +#define ESPERA_LC 5 + +float NuevoDuty = 0; //Duty que voy enviando a forma de prueba y error.. void control_PWM_Temp(void); //Funcion que engloba la maquina de estados @@ -118,11 +122,6 @@ int IM = 0; //Acumulador de tiempo base float duty = 0; //Guardo el duty actual -/*SubMaquina utilizada para modificar el duty*/ -int FTR = 0; //Control de estados de la submaquina -bool tdm = 0; //Flag que me notifica cuando termine de cambiar el duty.. - -float NuevoDuty = 0; //Duty que voy enviando a forma de prueba y error.. /*VALORES DE CONFIGURACION LAZO CERRADO*/ #define DEFINICION_CAMBIO_PWM 0.02f //Resolucion de barrido, valores altos agilizan el cambio pero pueden hacer que nunca se alcance lo pedido.. @@ -135,10 +134,6 @@ x ºC ==> x rpm */ -void cambio_gradual_duty(float obj);//Funcion que engloba la maquina de modificacion del duty , en especial la zona que no puedo enviar directamente.. - -int ty = 0; //Acumulador de tiempo - /*ELEMENTOS GENERALES DEL SISTEMA*/ void leds(int num); @@ -190,7 +185,7 @@ //Mido el Preset y seteo el duty del Cooler en funcion de la lectura case LazoAbierto: float lec = Preset; - cambio_duty_pwm(lec); + cambio_gradual_duty(lec); break; //Mido la temperatura y establezco la velocidad del Cooler @@ -254,7 +249,6 @@ if((lectura == 1) && (lecant == 0)) { estado = RISING_P; } - tp = 0;//Reinicio el acumulador de tiempo break; case RISING_P: /*Devuelvo el estado uno , una unica vez (Saco el rebote)*/ @@ -284,7 +278,6 @@ //Funcion del timmer dos, es llamada cada 0.05 segundos void tiempo_rapido() { - tcd ++;//Acumulador Cambio de Duty(Lazo Abierto) ty ++; //Acumulador Cambio de Duty(Lazo Cerrado) } @@ -299,10 +292,11 @@ Modo = 1; printf("Lazo Abierto!!\r\n"); } + FTR = 0; } } -/*///////////////////////////////////////////////////////////////////////////ETAPAS DE MEDICION DE VELOCIDAD///////////////////////////////////////////////////////////////////////////*/ +///////////////////////////////////////////////////////////////////////////ETAPAS DE MEDICION DE VELOCIDAD/////////////////////////////////////////////////////////////////////////// /* UN PERIODO ==> RISE - FALL - RISE @@ -322,14 +316,14 @@ ap.start(); //Inicio la cuenta em = 1; //Aviso que estoy midiendo tmv = 0; //Aviso que no termine de medir - EMV = RISE_1; + EMV = V_1; break; - case RISE_1: + case V_1: printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV); break; - case FALL_1: + case V_2: ap.stop(); //Freno el timmer tmv = 1; //Aviso que termine de medir em = 0; //Ya no estoy midiendo @@ -349,10 +343,10 @@ case INCIO_V: printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV); break; - case RISE_1: - EMV = FALL_1; + case V_1: + EMV = V_2; break; - case FALL_1: + case V_2: printf("ERROR MIDIENDO VELOCIDAD, EMV = %d!!\r\n", EMV); break; } @@ -378,97 +372,7 @@ } } -/*////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/ - - - -void cambio_duty_pwm(float nuevoDuty) -{ - static float ND = 0; - - switch(ECM) { - case INICIO_CM: - - ND = nuevoDuty; - Azul = 1; //Apago el indicador de LazoCerrado - - //Me fijo si estoy por poner mas o menos el mismo duty para evitar el proceso - if(abs(ND * 100.00f - DAN * 100.00f ) < 2) { - //printf("El duty es el mismo del ciclo previo...\r\n"); - tcd = 0; - ECM = ESPERA_FINAL; - break; - } - - printf("Inicio el cambio de duty....\r\n"); - Rojo = 0; - tcd = 0; - if(ND < 0.07f) { - Cooler.write(0); - duty = 0; - printf("Cooler APAGADO!\r\n"); - tcd = 0; - DAN = 0.5f; - ECM = ESPERA_FINAL; - Rojo = 1; - break; - } - if(ND >= 0.5f) { - ECM = CAMBIO_MAYOR; - } else - ECM = INICIO_CAMBIO_MENOR; - break; - case CAMBIO_MAYOR: - Cooler.write(ND); - printf("\tNuevo Duty = %f%\r\n", floor(ND* 100.0f)); - DAN = ND; - tcd = 0; - ECM = ESPERA_FINAL; - break; - case INICIO_CAMBIO_MENOR: - cantv = abs( (int(DAN*100)) - (int(ND*100))); - //printf("\tVoy a hacer %.0f pasos intermedios desde %.0f para llegar a %.0f%\r\n", cantv, DAN*100, ND * 100); - ECM = CAMBIO_MENOR; - jv = 0; - D = DAN; - break; - case CAMBIO_MENOR: - if(cantv >= jv) { - Cooler.write(D); - //printf("\t\tEtapa intermedia en %.0f%\r\n", D * 100.00f); - /*Si quiero alcanzar un duty inferior*/ - if(ND < DAN) - D -= 0.01f; //Decremeto 1% - /*Si quiero alcanzar un duty superior*/ - if(ND > DAN) - D += 0.01f; //Incremento 1% - tcd = 0; - ECM = ESPERA_DECREMENTO; - jv++; - break; - } else { - tcd = 0; - ECM = ESPERA_FINAL; - printf("\t\tNuevo Duty = %.0f\r\n", floor(ND*100.00f)); - DAN = ND; - } - break; - case ESPERA_DECREMENTO: - if(tcd >= 2) { - ECM = CAMBIO_MENOR; - tcd = 0; - } - break; - case ESPERA_FINAL: - Rojo = 1; - if(tcd >= 100) { - ECM = INICIO_CM; - tcd = 0; - } - break; - } - -} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Maquina LazoCerrado void control_PWM_Temp(void) @@ -476,19 +380,19 @@ static float temperatura = 0; float val = 0; static bool suptempmax = 0; //Flag que me indica si ya puse al maximo el duty + switch(CPT) { - case INCIO_LAZOCERRADO: - ECM = 0; //Reincio la maquina de cambio de duty de lazo abierto.. + case INICIO_LC: Rojo = 1;//Apago el Led rojo.. Azul = 0;//Prendo el Led azuil... /*Fijo el duty en 50%*/ Cooler.write(0.5f); duty = 0.5f; printf("Lazo Cerrado!!\r\n"); - CPT = MEDICION_TEMPERATURA; + CPT = TEMPERATURA; break; - case MEDICION_TEMPERATURA: + case TEMPERATURA: probe.convertTemperature(false, DS1820::all_devices); //Le digo que convierta la temperatura del sensor, false ==> No retiene || True ==> Retiene temperatura = probe.temperature(); //Guardo la temperatura printf("La temperatura es de %3.1foC\r\n",temperatura ); @@ -502,7 +406,7 @@ duty = 1.00f; //Registro el cambio de duty al maximo Cooler.write(1); //Ejecuto el cambio de duty al maximo IM = 0; //Reinicio el acumulador para tener el tiempo entre modificaciones.. - CPT = ESPERA_ENTRE_MODIFICACIONES; + CPT = ESPERA_LC; break; } else { /*Aviso que baje de los 70ºC*/ @@ -511,13 +415,12 @@ suptempmax = 0; //Reinicio el flag de superar los 70ºC } /*Reinicio la medicion de RPM*/ - tv = 0; //Reinicio el acumulador de tiempo de la maquina de estados que mide velocidad - EMV = INCIO_V; //Pongo en el estado inicial la maquina de medicion de velocidad - IM = 0; //Pongo en cero el acumulador para darle un TimeOut a la medicion de velocidad + tv = 0; //Reinicio el acumulador de tiempo de la maquina de estados que mide velocidad + EMV = INCIO_V; //Pongo en el estado inicial la maquina de medicion de velocidad + IM = 0; //Pongo en cero el acumulador para darle un TimeOut a la medicion de velocidad CPT = MEDICION_RPM; //Paso a medir la velocidad del Cooler break; } - break; case MEDICION_RPM: /*Si termine de medir la velocidad...*/ @@ -546,8 +449,8 @@ } else { printf("EL duty es correcto! Estoy en %0.1f% :D\r\n", floor(duty * 100.0f)); IM = 0; - CPT = ESPERA_ENTRE_MODIFICACIONES; - break; + CPT = ESPERA_LC; + break; } @@ -556,7 +459,7 @@ /*Verifico que no se me apago el motor...*/ if(IM > 10) { printf("El cooler estaba apagadoo!!..Reiniciando Lazo cerrado..\r\n"); - EMV = INCIO_LAZOCERRADO; + EMV = INICIO_LC; IM = 0; } @@ -567,11 +470,11 @@ /*Si termine de modificar el duty*/ if(tdm) { IM = 0; - CPT = ESPERA_CAMBIOS_PWM; + CPT = ESPERA_CPWM; } break; - case ESPERA_CAMBIOS_PWM: + case ESPERA_CPWM: /*Si se cumplio un tiempo prudencial.. El motor se debe adecuar a la nueva velocidad*/ if(IM >= 2) { tdm = 0; //Reinicio el flag de cambio de duty @@ -583,10 +486,10 @@ break; - case ESPERA_ENTRE_MODIFICACIONES: + case ESPERA_LC: /*Si se cumplio el tiempo..*/ if(IM >= 1) - CPT = MEDICION_TEMPERATURA; + CPT = TEMPERATURA; break; } } @@ -659,7 +562,7 @@ jv++; //Acumulo el paso realizo en la variable(Lo cuento).. ty = 0; //Reinicio el acumulador de tiempo - FTR = ESPERA_DECREMENTO; //Espero un tiempo para que se ajuste la salida.. + FTR = ESPERA; //Espero un tiempo para que se ajuste la salida.. break; } /*Si termine con las modificaciones de duty..*/ @@ -671,7 +574,7 @@ } break; - case ESPERA_DECREMENTO: + case ESPERA: /*Si se cumplio el tiempo*/ if(ty >= 1) { ty = 0; //Reinico el acumulador de tiempo