PIO IX 6° A TP1_ejercicio1 ALMADA, Santiago MAVER, Francisco

Dependencies:   mbed tsi_sensor DS1820

Committer:
Franmaver
Date:
Thu May 30 22:43:23 2019 +0000
Revision:
6:3ebdc74fd68f
Parent:
5:ea823404aea8
TP1_ejer1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:e069f9f26768 1 #include "mbed.h"
Sissors 0:e069f9f26768 2 #include "DS1820.h"
Franmaver 5:ea823404aea8 3 #include "tsi_sensor.h"
Sissors 0:e069f9f26768 4
Franmaver 6:3ebdc74fd68f 5 //defino entradas
Franmaver 6:3ebdc74fd68f 6 DS1820 probe(PTD4);
Franmaver 6:3ebdc74fd68f 7 AnalogIn preset(PTC1);
Franmaver 6:3ebdc74fd68f 8 DigitalIn sensor_cooler(PTA12);
Sissors 0:e069f9f26768 9
Franmaver 5:ea823404aea8 10 /* This defines will be replaced by PinNames soon */
Franmaver 5:ea823404aea8 11 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
Franmaver 5:ea823404aea8 12 #define ELEC0 9
Franmaver 5:ea823404aea8 13 #define ELEC1 10
Franmaver 5:ea823404aea8 14 #elif defined (TARGET_KL05Z)
Franmaver 5:ea823404aea8 15 #define ELEC0 9
Franmaver 5:ea823404aea8 16 #define ELEC1 8
Sissors 0:e069f9f26768 17 #else
Franmaver 5:ea823404aea8 18 #error TARGET NOT DEFINED
Franmaver 5:ea823404aea8 19 #endif
Franmaver 5:ea823404aea8 20
Franmaver 6:3ebdc74fd68f 21 //general
Franmaver 6:3ebdc74fd68f 22 enum maquina_de_estados_general {inicio1, lazo_abierto, lazo_cerrado};
Franmaver 6:3ebdc74fd68f 23 maquina_de_estados_general maquina_general;
Franmaver 6:3ebdc74fd68f 24 void funcion_general();
Franmaver 6:3ebdc74fd68f 25 int pulsador = 0;
Franmaver 6:3ebdc74fd68f 26
Franmaver 6:3ebdc74fd68f 27 //lazo_cerrado
Franmaver 6:3ebdc74fd68f 28 enum maquina_de_estados_lazo_cerrado {inicio2, detecto_valor_temp, cooler_200rpm, cooler_vel_max, cooler_vel_aumenta_lineal};
Franmaver 6:3ebdc74fd68f 29 maquina_de_estados_lazo_cerrado maquina_lazo_cerrado;
Franmaver 6:3ebdc74fd68f 30 void funcion_lazo_cerrado();
Franmaver 6:3ebdc74fd68f 31 float detecto_temp();
Franmaver 6:3ebdc74fd68f 32 int cambio_a_lazo_cerrado = 0;
Franmaver 6:3ebdc74fd68f 33 float temperatura = 0.0;
Franmaver 6:3ebdc74fd68f 34 float rpm = 0;
Franmaver 6:3ebdc74fd68f 35 float duty = 0;
Franmaver 6:3ebdc74fd68f 36 float valor = 0.0;
Franmaver 6:3ebdc74fd68f 37
Franmaver 6:3ebdc74fd68f 38 //lazo abierto
Franmaver 6:3ebdc74fd68f 39 enum maquina_de_estados_lazo_abierto {inicio3, detecto_valor_pote, vario_vel_cooler};
Franmaver 6:3ebdc74fd68f 40 maquina_de_estados_lazo_abierto maquina_lazo_abierto;
Franmaver 6:3ebdc74fd68f 41 void funcion_lazo_abierto();
Franmaver 6:3ebdc74fd68f 42 int cambio_a_lazo_abierto = 0;
Franmaver 6:3ebdc74fd68f 43
Franmaver 6:3ebdc74fd68f 44 //ticker
Franmaver 6:3ebdc74fd68f 45 Ticker tiempo;
Franmaver 6:3ebdc74fd68f 46 int contador = 0;
Franmaver 6:3ebdc74fd68f 47 int a = 0;
Franmaver 6:3ebdc74fd68f 48
Franmaver 6:3ebdc74fd68f 49
Franmaver 6:3ebdc74fd68f 50 PwmOut salida1(PTB3);//defino el cooler como salida
Franmaver 6:3ebdc74fd68f 51 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);//defino TSI
Franmaver 5:ea823404aea8 52
Franmaver 6:3ebdc74fd68f 53 //defino variables para poder medir las RPM
Franmaver 6:3ebdc74fd68f 54 int cuento_rpm() ;
Franmaver 6:3ebdc74fd68f 55 int rpm_tot = 0;
Franmaver 6:3ebdc74fd68f 56 int rpmm = 0;
Franmaver 6:3ebdc74fd68f 57 int contador2 = 0;
Franmaver 6:3ebdc74fd68f 58
Franmaver 6:3ebdc74fd68f 59 //funcion para saber las RPM
Franmaver 6:3ebdc74fd68f 60 void funcion_tiempo()
Franmaver 6:3ebdc74fd68f 61 {
Franmaver 6:3ebdc74fd68f 62 contador2++;
Franmaver 6:3ebdc74fd68f 63 rpmm = rpm_tot*60;//rpm_tot en 1 segundo, multiplico por 60 para que sea un minuto (RPM)
Franmaver 6:3ebdc74fd68f 64 rpm_tot = 0;
Franmaver 6:3ebdc74fd68f 65 }
Franmaver 6:3ebdc74fd68f 66 int main()
Franmaver 6:3ebdc74fd68f 67 {
Franmaver 6:3ebdc74fd68f 68 salida1 = 1.0;//comienza el programa con el cooler encendido
Franmaver 6:3ebdc74fd68f 69 wait(2);//un wait fuera del while, que no afecta el programa
Franmaver 6:3ebdc74fd68f 70 tiempo.attach(&funcion_tiempo, 1);
Franmaver 6:3ebdc74fd68f 71
Sissors 0:e069f9f26768 72 while(1) {
Franmaver 6:3ebdc74fd68f 73 //reconozco los flancos del sensor de RPM
Franmaver 6:3ebdc74fd68f 74 if((sensor_cooler == 1) && (a == 0)) {
Franmaver 6:3ebdc74fd68f 75 rpm_tot++;
Franmaver 6:3ebdc74fd68f 76 a = 1;
Franmaver 6:3ebdc74fd68f 77 }
Franmaver 6:3ebdc74fd68f 78 else if((sensor_cooler == 0) && (a == 1))
Franmaver 6:3ebdc74fd68f 79 a = 0;
Franmaver 6:3ebdc74fd68f 80
Franmaver 6:3ebdc74fd68f 81 funcion_general();
Franmaver 6:3ebdc74fd68f 82 funcion_lazo_cerrado();
Franmaver 6:3ebdc74fd68f 83 funcion_lazo_abierto();
Sissors 0:e069f9f26768 84 }
Sissors 0:e069f9f26768 85 }
Franmaver 6:3ebdc74fd68f 86 //funcion que devuelve la temperatura
Franmaver 6:3ebdc74fd68f 87 float detecto_temp()
Franmaver 6:3ebdc74fd68f 88 {
Franmaver 6:3ebdc74fd68f 89 if(contador2 == 1)
Franmaver 6:3ebdc74fd68f 90 probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready
Franmaver 6:3ebdc74fd68f 91 printf(" temperatura: %3.1f", probe.temperature());
Franmaver 6:3ebdc74fd68f 92 contador2 = 0;
Franmaver 6:3ebdc74fd68f 93 return probe.temperature();
Franmaver 6:3ebdc74fd68f 94 }
Sissors 0:e069f9f26768 95
Franmaver 6:3ebdc74fd68f 96 //funcion de la máquina de estados general
Franmaver 6:3ebdc74fd68f 97 void funcion_general()
Franmaver 6:3ebdc74fd68f 98 {
Franmaver 6:3ebdc74fd68f 99 switch(maquina_general) {
Franmaver 6:3ebdc74fd68f 100
Franmaver 6:3ebdc74fd68f 101 default:
Franmaver 6:3ebdc74fd68f 102 maquina_general = inicio1;
Franmaver 6:3ebdc74fd68f 103 break;
Franmaver 6:3ebdc74fd68f 104
Franmaver 6:3ebdc74fd68f 105 case inicio1:
Franmaver 6:3ebdc74fd68f 106 //apreto TSI para dar inicio al sistema
Franmaver 6:3ebdc74fd68f 107 if(tsi.readPercentage() != 0) {
Franmaver 6:3ebdc74fd68f 108 cambio_a_lazo_cerrado = 1;
Franmaver 6:3ebdc74fd68f 109 maquina_general = lazo_cerrado;
Franmaver 6:3ebdc74fd68f 110 }
Franmaver 6:3ebdc74fd68f 111 break;
Franmaver 6:3ebdc74fd68f 112
Franmaver 6:3ebdc74fd68f 113 case lazo_cerrado:
Franmaver 6:3ebdc74fd68f 114 //entrta al if cuando estoy en el modo lazo cerrado
Franmaver 6:3ebdc74fd68f 115 //y se presiona el TSI
Franmaver 6:3ebdc74fd68f 116 if(cambio_a_lazo_cerrado == 0) {
Franmaver 6:3ebdc74fd68f 117 cambio_a_lazo_abierto = 1;
Franmaver 6:3ebdc74fd68f 118 maquina_general = lazo_abierto;
Franmaver 6:3ebdc74fd68f 119 }
Franmaver 6:3ebdc74fd68f 120
Franmaver 6:3ebdc74fd68f 121 ///////PARA CAMBIAR DE MODO//////
Franmaver 6:3ebdc74fd68f 122 if(tsi.readPercentage() >= 0.5) {
Franmaver 6:3ebdc74fd68f 123 cambio_a_lazo_cerrado = 0;
Franmaver 6:3ebdc74fd68f 124 maquina_lazo_cerrado = inicio2;
Franmaver 6:3ebdc74fd68f 125 }
Franmaver 6:3ebdc74fd68f 126 /////////////////////////////////
Franmaver 6:3ebdc74fd68f 127 break;
Franmaver 6:3ebdc74fd68f 128
Franmaver 6:3ebdc74fd68f 129 case lazo_abierto:
Franmaver 6:3ebdc74fd68f 130 //entrta al if cuando estoy en el modo lazo abierto
Franmaver 6:3ebdc74fd68f 131 //y se presiona el TSI
Franmaver 6:3ebdc74fd68f 132 if(cambio_a_lazo_abierto == 0) {
Franmaver 6:3ebdc74fd68f 133 cambio_a_lazo_cerrado = 1;
Franmaver 6:3ebdc74fd68f 134 maquina_general = lazo_cerrado;
Franmaver 6:3ebdc74fd68f 135 }
Franmaver 6:3ebdc74fd68f 136
Franmaver 6:3ebdc74fd68f 137 ///////PARA CAMBIAR DE MODO//////
Franmaver 6:3ebdc74fd68f 138 if((tsi.readPercentage() <= 0.4) && (tsi.readPercentage() != 0)) {
Franmaver 6:3ebdc74fd68f 139 cambio_a_lazo_abierto = 0;
Franmaver 6:3ebdc74fd68f 140 maquina_lazo_abierto = inicio3;
Franmaver 6:3ebdc74fd68f 141 }
Franmaver 6:3ebdc74fd68f 142 /////////////////////////////////
Franmaver 6:3ebdc74fd68f 143 break;
Franmaver 6:3ebdc74fd68f 144 }
Franmaver 6:3ebdc74fd68f 145 }
Franmaver 6:3ebdc74fd68f 146 //funcion del modo lazo cerrado
Franmaver 6:3ebdc74fd68f 147 void funcion_lazo_cerrado()
Franmaver 6:3ebdc74fd68f 148 {
Franmaver 6:3ebdc74fd68f 149 switch (maquina_lazo_cerrado) {
Franmaver 6:3ebdc74fd68f 150
Franmaver 6:3ebdc74fd68f 151 default:
Franmaver 6:3ebdc74fd68f 152 maquina_lazo_cerrado = inicio2;
Franmaver 6:3ebdc74fd68f 153 break;
Franmaver 6:3ebdc74fd68f 154
Franmaver 6:3ebdc74fd68f 155 case inicio2:
Franmaver 6:3ebdc74fd68f 156 if (cambio_a_lazo_cerrado == 1) {
Franmaver 6:3ebdc74fd68f 157 printf("\n\rLAZO CERRADO\r\n");
Franmaver 6:3ebdc74fd68f 158 maquina_lazo_cerrado = detecto_valor_temp;
Franmaver 6:3ebdc74fd68f 159 }
Franmaver 6:3ebdc74fd68f 160 break;
Franmaver 6:3ebdc74fd68f 161
Franmaver 6:3ebdc74fd68f 162 case detecto_valor_temp:
Franmaver 6:3ebdc74fd68f 163 temperatura = detecto_temp();
Franmaver 6:3ebdc74fd68f 164 if(temperatura <= 20) { //cooler 200rpm
Franmaver 6:3ebdc74fd68f 165 maquina_lazo_cerrado = cooler_200rpm;
Franmaver 6:3ebdc74fd68f 166 }
Franmaver 6:3ebdc74fd68f 167 if(temperatura >= 70) { //cooler maximo
Franmaver 6:3ebdc74fd68f 168 maquina_lazo_cerrado = cooler_vel_max;
Franmaver 6:3ebdc74fd68f 169 }
Franmaver 6:3ebdc74fd68f 170 if((temperatura > 20) && (temperatura < 70))//cooler varia
Franmaver 6:3ebdc74fd68f 171 maquina_lazo_cerrado = cooler_vel_aumenta_lineal;
Franmaver 6:3ebdc74fd68f 172 break;
Franmaver 6:3ebdc74fd68f 173
Franmaver 6:3ebdc74fd68f 174 case cooler_200rpm:
Franmaver 6:3ebdc74fd68f 175 //el cooler a 200RPM
Franmaver 6:3ebdc74fd68f 176 salida1.write(0.0222);
Franmaver 6:3ebdc74fd68f 177
Franmaver 6:3ebdc74fd68f 178 printf(" RPM = %d",rpmm);
Franmaver 6:3ebdc74fd68f 179
Franmaver 6:3ebdc74fd68f 180 maquina_lazo_cerrado = detecto_valor_temp;
Franmaver 6:3ebdc74fd68f 181 break;
Franmaver 6:3ebdc74fd68f 182
Franmaver 6:3ebdc74fd68f 183 case cooler_vel_max:
Franmaver 6:3ebdc74fd68f 184 //cooler a maxima RPM
Franmaver 6:3ebdc74fd68f 185 salida1 = 1.0;
Franmaver 6:3ebdc74fd68f 186
Franmaver 6:3ebdc74fd68f 187 printf("RPM = %d",rpmm);
Franmaver 6:3ebdc74fd68f 188
Franmaver 6:3ebdc74fd68f 189 maquina_lazo_cerrado = detecto_valor_temp;
Franmaver 6:3ebdc74fd68f 190
Franmaver 6:3ebdc74fd68f 191 break;
Franmaver 6:3ebdc74fd68f 192
Franmaver 6:3ebdc74fd68f 193 case cooler_vel_aumenta_lineal:
Franmaver 6:3ebdc74fd68f 194 //cooler aumenta segun la temperatura
Franmaver 6:3ebdc74fd68f 195 rpm = ((temperatura * 200) / 20);
Franmaver 6:3ebdc74fd68f 196
Franmaver 6:3ebdc74fd68f 197 duty = ((rpm * 100) / 9000);
Franmaver 6:3ebdc74fd68f 198
Franmaver 6:3ebdc74fd68f 199 valor = (duty / 10);
Franmaver 6:3ebdc74fd68f 200
Franmaver 6:3ebdc74fd68f 201 salida1.write(valor);
Franmaver 6:3ebdc74fd68f 202
Franmaver 6:3ebdc74fd68f 203 printf(" RPM: %f ",rpm);
Franmaver 6:3ebdc74fd68f 204
Franmaver 6:3ebdc74fd68f 205 maquina_lazo_cerrado = detecto_valor_temp;
Franmaver 6:3ebdc74fd68f 206 break;
Franmaver 6:3ebdc74fd68f 207 }
Franmaver 6:3ebdc74fd68f 208 }
Franmaver 6:3ebdc74fd68f 209 //modo lazo abierto
Franmaver 6:3ebdc74fd68f 210 void funcion_lazo_abierto()
Franmaver 6:3ebdc74fd68f 211 {
Franmaver 6:3ebdc74fd68f 212 switch(maquina_lazo_abierto) {
Franmaver 6:3ebdc74fd68f 213
Franmaver 6:3ebdc74fd68f 214 default:
Franmaver 6:3ebdc74fd68f 215 maquina_lazo_abierto = inicio3;
Franmaver 6:3ebdc74fd68f 216 break;
Franmaver 6:3ebdc74fd68f 217
Franmaver 6:3ebdc74fd68f 218 case inicio3:
Franmaver 6:3ebdc74fd68f 219 if(cambio_a_lazo_abierto == 1) {
Franmaver 6:3ebdc74fd68f 220 printf("LAZO_ABIERTO\n");
Franmaver 6:3ebdc74fd68f 221 maquina_lazo_abierto = detecto_valor_pote;
Franmaver 6:3ebdc74fd68f 222
Franmaver 6:3ebdc74fd68f 223 }
Franmaver 6:3ebdc74fd68f 224 break;
Franmaver 6:3ebdc74fd68f 225
Franmaver 6:3ebdc74fd68f 226 case detecto_valor_pote:
Franmaver 6:3ebdc74fd68f 227 //si el pote esta por debajo de 0,2 (pasado con el ADC
Franmaver 6:3ebdc74fd68f 228 //cooler con 200 RPM
Franmaver 6:3ebdc74fd68f 229 if(preset <= 0.0222) {
Franmaver 6:3ebdc74fd68f 230 salida1.write(0.222);
Franmaver 6:3ebdc74fd68f 231 printf(" RPM: %d",rpmm);
Franmaver 6:3ebdc74fd68f 232 } else {
Franmaver 6:3ebdc74fd68f 233 maquina_lazo_abierto = vario_vel_cooler;
Franmaver 6:3ebdc74fd68f 234 }
Franmaver 6:3ebdc74fd68f 235 break;
Franmaver 6:3ebdc74fd68f 236
Franmaver 6:3ebdc74fd68f 237 case vario_vel_cooler:
Franmaver 6:3ebdc74fd68f 238
Franmaver 6:3ebdc74fd68f 239 salida1.write(preset);//vario cooler segun preset
Franmaver 6:3ebdc74fd68f 240
Franmaver 6:3ebdc74fd68f 241 printf(" RPM: %d",rpmm);
Franmaver 6:3ebdc74fd68f 242
Franmaver 6:3ebdc74fd68f 243 maquina_lazo_abierto = detecto_valor_pote;
Franmaver 6:3ebdc74fd68f 244
Franmaver 6:3ebdc74fd68f 245 break;
Franmaver 6:3ebdc74fd68f 246 }
Franmaver 6:3ebdc74fd68f 247 }