Almaraz Bettig TP1_Ejer1: Sistema de Control

Dependencies:   mbed DS1820

Committer:
nicoalmaraz
Date:
Tue Jun 11 19:07:40 2019 +0000
Revision:
6:1e7fe07e6ab4
Parent:
5:e7ba8c80e3d3
Child:
7:597508b756a0
Trabajo Practico 1 - Ejercicio 1: Sistema de control 1.1

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"
Sissors 0:e069f9f26768 3
nicoalmaraz 5:e7ba8c80e3d3 4 char velocidad_angular_leida=0;//Flag que indica si ya termine de medir las rpm
nicoalmaraz 5:e7ba8c80e3d3 5 char velocidad_angular_maxima_leida=0;//Flag que indica si ya definí a qué velocidad puede girar el cooler como máximo
nicoalmaraz 5:e7ba8c80e3d3 6 char habilitacion_pulsos=0; //Flag que permite contar los pulsos del sensor de efecto hall
nicoalmaraz 5:e7ba8c80e3d3 7 char duty_definido=0; //Flag que indica que se definió el duty con el que el cooler gira a 200rpm
nicoalmaraz 5:e7ba8c80e3d3 8 char ruido=0; //Flag que indica que se detectó ruido en el pulsador
nicoalmaraz 5:e7ba8c80e3d3 9 char lectura_pulsador_valida=0; //Flag que indica que se detectó un cambio en el pulsador y ya se ejecutó la orden
nicoalmaraz 5:e7ba8c80e3d3 10 char sensores_lazo_cerrado_leidos=0; //Flag que indica que ya se terminaron de leer los sensores de temperatura y velocidad angular
nicoalmaraz 5:e7ba8c80e3d3 11 int cuenta_pulsos=0;//Variable que cuenta los pulsos del sensor de efecto hall
nicoalmaraz 5:e7ba8c80e3d3 12 char modo = 1; //Variable que indica si estoy en modo lazo abierto o modo lazo cerrado
nicoalmaraz 5:e7ba8c80e3d3 13 float duty=0; //Variable donde se guarda el duty del PWM del cooler
nicoalmaraz 5:e7ba8c80e3d3 14 float velocidad_deseada=0; //Es la velocidad angular a la que corresponde llegar en función de la temperatura leida
nicoalmaraz 5:e7ba8c80e3d3 15 unsigned int velocidad_angular_maxima=0; //Es la velocidad máxima que puede alcanzar el cooler empleado
nicoalmaraz 5:e7ba8c80e3d3 16 float duty_200_rpm=0.5; //Es el duty con el que el cooler gira a 200rpm
nicoalmaraz 5:e7ba8c80e3d3 17 unsigned int velocidad_angular; //Variable donde se guarda la velocidad angular calculada
nicoalmaraz 5:e7ba8c80e3d3 18 float temperatura; //Variable donde se guarda la temperatura recibida por el sensor de temperatura
nicoalmaraz 5:e7ba8c80e3d3 19 int tiempo_defino_velocidad_maxima=0; //Variable de tiempo
nicoalmaraz 5:e7ba8c80e3d3 20 int tiempo_pulsadores=0; //Variable de tiempo
nicoalmaraz 5:e7ba8c80e3d3 21 char tiempo_lazo_abierto=0; //Variable de tiempo
nicoalmaraz 5:e7ba8c80e3d3 22 int tiempo_sensor_efecto_hall=0;//Variable de tiempo
nicoalmaraz 5:e7ba8c80e3d3 23 int tiempo_cooler=0; //Variable de tiempo
nicoalmaraz 5:e7ba8c80e3d3 24 int tiempo_informacion=0;//Variable de tiempo
nicoalmaraz 5:e7ba8c80e3d3 25 int tiempo_estabilizacion=0;
nicoalmaraz 5:e7ba8c80e3d3 26
nicoalmaraz 5:e7ba8c80e3d3 27 void pulsadores(char pulsador);
nicoalmaraz 5:e7ba8c80e3d3 28 void timer();
nicoalmaraz 5:e7ba8c80e3d3 29 void interrput_sensor_efecto_hall();
nicoalmaraz 5:e7ba8c80e3d3 30 void leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 31 void defino_velocidad_angular_maxima();
nicoalmaraz 5:e7ba8c80e3d3 32 void defino_duty_para_lograr_200_rpm();
nicoalmaraz 5:e7ba8c80e3d3 33 void lazo_cerrado();
nicoalmaraz 5:e7ba8c80e3d3 34 void lectura_sensores_lazo_cerrado();
nicoalmaraz 5:e7ba8c80e3d3 35
nicoalmaraz 5:e7ba8c80e3d3 36
nicoalmaraz 5:e7ba8c80e3d3 37
nicoalmaraz 5:e7ba8c80e3d3 38 DS1820 probe(A0);
nicoalmaraz 5:e7ba8c80e3d3 39 AnalogIn preset(A1);
nicoalmaraz 5:e7ba8c80e3d3 40 DigitalIn pulsador_con_rebote(A2);
nicoalmaraz 5:e7ba8c80e3d3 41 PwmOut cooler(A3);
nicoalmaraz 5:e7ba8c80e3d3 42 InterruptIn sensor_efecto_hall(D0);
nicoalmaraz 5:e7ba8c80e3d3 43 Ticker ticker;
nicoalmaraz 5:e7ba8c80e3d3 44
nicoalmaraz 5:e7ba8c80e3d3 45 int main()
nicoalmaraz 5:e7ba8c80e3d3 46 {
nicoalmaraz 5:e7ba8c80e3d3 47 char sistema_de_control=0;
nicoalmaraz 5:e7ba8c80e3d3 48 sensor_efecto_hall.rise(&interrput_sensor_efecto_hall); //Interrupcion para el sensor de efecto hall
nicoalmaraz 5:e7ba8c80e3d3 49 cooler.period(0.0001f); //PWM para el cooler - 10khz
nicoalmaraz 5:e7ba8c80e3d3 50 ticker.attach(&timer, 0.001); //Timer cada 1ms
nicoalmaraz 5:e7ba8c80e3d3 51 printf("Definiendo velocidad maxima...\r\n");
nicoalmaraz 5:e7ba8c80e3d3 52 while (1) {
nicoalmaraz 5:e7ba8c80e3d3 53 switch(sistema_de_control) {
nicoalmaraz 5:e7ba8c80e3d3 54 default:
nicoalmaraz 5:e7ba8c80e3d3 55 case 0://Hago la medicion de velocidad maxima posible para el cooler empleado
nicoalmaraz 5:e7ba8c80e3d3 56 defino_velocidad_angular_maxima();
nicoalmaraz 5:e7ba8c80e3d3 57 if(velocidad_angular_maxima_leida) {
nicoalmaraz 5:e7ba8c80e3d3 58 sistema_de_control=1;
nicoalmaraz 5:e7ba8c80e3d3 59 printf("Velocidad Maxima: %d\r\n\r\nDefiniendo duty necesario para lograr 200 rpm...\r\nEste proceso puede durar varios segundos\r\n", velocidad_angular_maxima);
nicoalmaraz 5:e7ba8c80e3d3 60 }
nicoalmaraz 5:e7ba8c80e3d3 61 break;
nicoalmaraz 5:e7ba8c80e3d3 62 case 1://Determino qué duty necesito para lograr que el cooler gire a 200rpm
nicoalmaraz 5:e7ba8c80e3d3 63 defino_duty_para_lograr_200_rpm();
nicoalmaraz 5:e7ba8c80e3d3 64 if(duty_definido) {
nicoalmaraz 5:e7ba8c80e3d3 65 sistema_de_control=2;
nicoalmaraz 5:e7ba8c80e3d3 66 printf("\r\nDuty necesario: %4.1f\r\n",duty_200_rpm*100);
nicoalmaraz 5:e7ba8c80e3d3 67 printf("\r\n-----------------\r\n");
nicoalmaraz 5:e7ba8c80e3d3 68 printf("Modo lazo cerrado\r\n");
nicoalmaraz 5:e7ba8c80e3d3 69 printf("-----------------\r\n\r\n");
nicoalmaraz 5:e7ba8c80e3d3 70 }
nicoalmaraz 5:e7ba8c80e3d3 71 break;
nicoalmaraz 5:e7ba8c80e3d3 72 case 2://Ejecuto el modo lazo cerrado
nicoalmaraz 5:e7ba8c80e3d3 73 lazo_cerrado();
nicoalmaraz 5:e7ba8c80e3d3 74 //Si se presiona el pulsador proceso la información
nicoalmaraz 5:e7ba8c80e3d3 75 if(pulsador_con_rebote==0)
nicoalmaraz 5:e7ba8c80e3d3 76 sistema_de_control=4;
nicoalmaraz 5:e7ba8c80e3d3 77 break;
nicoalmaraz 5:e7ba8c80e3d3 78 case 3://Ejecuto el modo lazo abierto
nicoalmaraz 5:e7ba8c80e3d3 79 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 80 if(velocidad_angular_leida) {
nicoalmaraz 5:e7ba8c80e3d3 81 velocidad_angular_leida=0;
nicoalmaraz 5:e7ba8c80e3d3 82 printf("Velocidad_angular: %d\r\n",velocidad_angular);
nicoalmaraz 5:e7ba8c80e3d3 83 //Si la velocidad angular es muy baja le doy un "empujon" para subirla
nicoalmaraz 5:e7ba8c80e3d3 84 if(velocidad_angular<100)
nicoalmaraz 5:e7ba8c80e3d3 85 duty=1;
nicoalmaraz 5:e7ba8c80e3d3 86 }
nicoalmaraz 5:e7ba8c80e3d3 87 //cada 50ms actualizo el preset
nicoalmaraz 5:e7ba8c80e3d3 88 if(tiempo_lazo_abierto>50) {
nicoalmaraz 5:e7ba8c80e3d3 89 duty = preset * (1-duty_200_rpm) + duty_200_rpm;
nicoalmaraz 5:e7ba8c80e3d3 90 tiempo_lazo_abierto=0;
nicoalmaraz 5:e7ba8c80e3d3 91 }
nicoalmaraz 5:e7ba8c80e3d3 92 //Si se presiona el pulsador proceso la información
nicoalmaraz 5:e7ba8c80e3d3 93 if(pulsador_con_rebote==0)
nicoalmaraz 5:e7ba8c80e3d3 94 sistema_de_control=4;
nicoalmaraz 5:e7ba8c80e3d3 95 break;
nicoalmaraz 5:e7ba8c80e3d3 96 case 4: //Analizo el pulsador y si es necesario cambio de estado
nicoalmaraz 5:e7ba8c80e3d3 97 pulsadores(pulsador_con_rebote);
nicoalmaraz 5:e7ba8c80e3d3 98 if(ruido||lectura_pulsador_valida) {
nicoalmaraz 5:e7ba8c80e3d3 99 lectura_pulsador_valida=0;
nicoalmaraz 5:e7ba8c80e3d3 100 if(ruido)
nicoalmaraz 5:e7ba8c80e3d3 101 printf("Se detecto ruido en el pulsador\r\n");
nicoalmaraz 5:e7ba8c80e3d3 102 ruido=0;
nicoalmaraz 5:e7ba8c80e3d3 103 if(modo%2) {
nicoalmaraz 5:e7ba8c80e3d3 104 sistema_de_control=2;
nicoalmaraz 5:e7ba8c80e3d3 105 printf("\r\n-----------------\r\n");
nicoalmaraz 5:e7ba8c80e3d3 106 printf("Modo lazo cerrado\r\n");
nicoalmaraz 5:e7ba8c80e3d3 107 printf("-----------------\r\n");
nicoalmaraz 5:e7ba8c80e3d3 108 } else {
nicoalmaraz 5:e7ba8c80e3d3 109 sistema_de_control=3;
nicoalmaraz 5:e7ba8c80e3d3 110 printf("\r\n-----------------\r\n");
nicoalmaraz 5:e7ba8c80e3d3 111 printf("Modo lazo abierto\r\n");
nicoalmaraz 5:e7ba8c80e3d3 112 printf("-----------------\r\n");
nicoalmaraz 5:e7ba8c80e3d3 113 }
nicoalmaraz 5:e7ba8c80e3d3 114 }
nicoalmaraz 5:e7ba8c80e3d3 115 break;
nicoalmaraz 5:e7ba8c80e3d3 116 }
nicoalmaraz 5:e7ba8c80e3d3 117 //Actualizo el duty cada 10ms
nicoalmaraz 5:e7ba8c80e3d3 118 if(tiempo_cooler>10) {
nicoalmaraz 5:e7ba8c80e3d3 119 tiempo_cooler=0;
nicoalmaraz 5:e7ba8c80e3d3 120 cooler.write(duty);
nicoalmaraz 5:e7ba8c80e3d3 121 }
nicoalmaraz 5:e7ba8c80e3d3 122 }
nicoalmaraz 5:e7ba8c80e3d3 123 }
nicoalmaraz 5:e7ba8c80e3d3 124
nicoalmaraz 5:e7ba8c80e3d3 125 void defino_velocidad_angular_maxima()
nicoalmaraz 5:e7ba8c80e3d3 126 //Esta fucion hace girar el cooler a maxima velocidad y lee cuantas rpm puede alcanzar
nicoalmaraz 5:e7ba8c80e3d3 127 {
nicoalmaraz 5:e7ba8c80e3d3 128 static char estado_defino_velocidad_angular_maxima=0;
nicoalmaraz 5:e7ba8c80e3d3 129 switch(estado_defino_velocidad_angular_maxima) {
nicoalmaraz 5:e7ba8c80e3d3 130 default:
nicoalmaraz 5:e7ba8c80e3d3 131 case 0:
nicoalmaraz 5:e7ba8c80e3d3 132 duty=1;
nicoalmaraz 5:e7ba8c80e3d3 133 //Doy 5 segundos a que se acelere el cooler
nicoalmaraz 5:e7ba8c80e3d3 134 if(tiempo_defino_velocidad_maxima>=5000) {
nicoalmaraz 5:e7ba8c80e3d3 135 estado_defino_velocidad_angular_maxima=1;
nicoalmaraz 5:e7ba8c80e3d3 136 }
nicoalmaraz 5:e7ba8c80e3d3 137 break;
nicoalmaraz 5:e7ba8c80e3d3 138 case 1:
nicoalmaraz 5:e7ba8c80e3d3 139 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 140 if(velocidad_angular_leida) {
nicoalmaraz 5:e7ba8c80e3d3 141 velocidad_angular_maxima=velocidad_angular;
nicoalmaraz 5:e7ba8c80e3d3 142 velocidad_angular_leida=0;
nicoalmaraz 5:e7ba8c80e3d3 143 velocidad_angular_maxima_leida=1;
nicoalmaraz 5:e7ba8c80e3d3 144 }
Sissors 0:e069f9f26768 145 break;
Sissors 0:e069f9f26768 146 }
Sissors 0:e069f9f26768 147 }
Sissors 0:e069f9f26768 148
nicoalmaraz 5:e7ba8c80e3d3 149 void leer_velocidad_angular()
nicoalmaraz 5:e7ba8c80e3d3 150 //Esta funcion cuenta los pulsos que entrega el sensor de efecto hall y calcula las rpm
nicoalmaraz 5:e7ba8c80e3d3 151 {
nicoalmaraz 5:e7ba8c80e3d3 152 static char estado_interpretar_velocidad_angular=0;
nicoalmaraz 5:e7ba8c80e3d3 153 switch(estado_interpretar_velocidad_angular) {
nicoalmaraz 5:e7ba8c80e3d3 154 default:
nicoalmaraz 5:e7ba8c80e3d3 155 case 0:
nicoalmaraz 5:e7ba8c80e3d3 156 //Habilito con un flag la cuenta de pulsos en el interrupt del pin
nicoalmaraz 5:e7ba8c80e3d3 157 cuenta_pulsos=0;
nicoalmaraz 5:e7ba8c80e3d3 158 habilitacion_pulsos=1;
nicoalmaraz 5:e7ba8c80e3d3 159 tiempo_sensor_efecto_hall=0;
nicoalmaraz 5:e7ba8c80e3d3 160 estado_interpretar_velocidad_angular=1;
nicoalmaraz 5:e7ba8c80e3d3 161 break;
nicoalmaraz 5:e7ba8c80e3d3 162 case 1:
nicoalmaraz 5:e7ba8c80e3d3 163 //Deshabilito despues de 2 seg y calculo las rpm
nicoalmaraz 5:e7ba8c80e3d3 164 if(tiempo_sensor_efecto_hall>=2000) {
nicoalmaraz 5:e7ba8c80e3d3 165 habilitacion_pulsos=0;
nicoalmaraz 5:e7ba8c80e3d3 166 velocidad_angular=cuenta_pulsos*30/2; //Nuestro cooler da 2 pulsos por vuelta
nicoalmaraz 5:e7ba8c80e3d3 167 estado_interpretar_velocidad_angular=0;
nicoalmaraz 5:e7ba8c80e3d3 168 velocidad_angular_leida=1;
nicoalmaraz 5:e7ba8c80e3d3 169 }
nicoalmaraz 5:e7ba8c80e3d3 170 break;
Sissors 0:e069f9f26768 171 }
Sissors 0:e069f9f26768 172 }
Sissors 0:e069f9f26768 173
nicoalmaraz 5:e7ba8c80e3d3 174 void interrput_sensor_efecto_hall()
nicoalmaraz 5:e7ba8c80e3d3 175 {
nicoalmaraz 5:e7ba8c80e3d3 176 if(habilitacion_pulsos)
nicoalmaraz 5:e7ba8c80e3d3 177 cuenta_pulsos++;
nicoalmaraz 5:e7ba8c80e3d3 178 }
nicoalmaraz 5:e7ba8c80e3d3 179
nicoalmaraz 5:e7ba8c80e3d3 180 void defino_duty_para_lograr_200_rpm()
nicoalmaraz 5:e7ba8c80e3d3 181 {
nicoalmaraz 5:e7ba8c80e3d3 182 static char estado_definir_200_rpm=0;
nicoalmaraz 5:e7ba8c80e3d3 183 switch(estado_definir_200_rpm) {
nicoalmaraz 5:e7ba8c80e3d3 184 default:
nicoalmaraz 5:e7ba8c80e3d3 185 case 0:
nicoalmaraz 5:e7ba8c80e3d3 186 //Ajusto el duty hasta un aproximado de 200rpm
nicoalmaraz 5:e7ba8c80e3d3 187 if(velocidad_angular>=1000)
nicoalmaraz 5:e7ba8c80e3d3 188 duty-=0.09;
nicoalmaraz 5:e7ba8c80e3d3 189 if((velocidad_angular>=300)&&(velocidad_angular<1000))
nicoalmaraz 5:e7ba8c80e3d3 190 duty-=0.01;
nicoalmaraz 5:e7ba8c80e3d3 191 if(velocidad_angular<150)
nicoalmaraz 5:e7ba8c80e3d3 192 duty+=0.05;
nicoalmaraz 5:e7ba8c80e3d3 193 //Protejo contra overflow
nicoalmaraz 5:e7ba8c80e3d3 194 if(duty<0)
nicoalmaraz 5:e7ba8c80e3d3 195 duty=0;
nicoalmaraz 5:e7ba8c80e3d3 196 if(duty>1)
nicoalmaraz 5:e7ba8c80e3d3 197 duty=1;
nicoalmaraz 5:e7ba8c80e3d3 198 estado_definir_200_rpm=1;
nicoalmaraz 5:e7ba8c80e3d3 199 break;
nicoalmaraz 5:e7ba8c80e3d3 200 case 1:
nicoalmaraz 5:e7ba8c80e3d3 201 //Leo la nueva veloicidad angular
nicoalmaraz 5:e7ba8c80e3d3 202 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 203 if(velocidad_angular_leida) {
nicoalmaraz 5:e7ba8c80e3d3 204 //Me fijo si estoy lo suficientemente cercano al valor deseado
nicoalmaraz 5:e7ba8c80e3d3 205 velocidad_angular_leida=0;
nicoalmaraz 5:e7ba8c80e3d3 206 if((velocidad_angular<300)&&(velocidad_angular>150)) {
nicoalmaraz 5:e7ba8c80e3d3 207 estado_definir_200_rpm=2;
nicoalmaraz 5:e7ba8c80e3d3 208 tiempo_estabilizacion=0;
nicoalmaraz 5:e7ba8c80e3d3 209 printf("Ya casi termna el proceso...\r\n");
nicoalmaraz 5:e7ba8c80e3d3 210 } else {
nicoalmaraz 5:e7ba8c80e3d3 211 //Si todavia falta variar sigo variando
nicoalmaraz 5:e7ba8c80e3d3 212 estado_definir_200_rpm=0;
nicoalmaraz 5:e7ba8c80e3d3 213 printf("Velocidad angular: %d, Duty: %4.1f\r\n",velocidad_angular,duty*100);
nicoalmaraz 5:e7ba8c80e3d3 214 }
nicoalmaraz 5:e7ba8c80e3d3 215 }
nicoalmaraz 5:e7ba8c80e3d3 216 break;
nicoalmaraz 5:e7ba8c80e3d3 217 case 2:
nicoalmaraz 5:e7ba8c80e3d3 218 //Si estoy muy proximo al valor hago un ajuste fino
nicoalmaraz 5:e7ba8c80e3d3 219 //Dejo funcionar al cooler por 3 segundos asi verificar que
nicoalmaraz 5:e7ba8c80e3d3 220 //mas adelante no se frene o varie su velocidad en ese tiempo
nicoalmaraz 5:e7ba8c80e3d3 221 if(tiempo_estabilizacion>3000) {
nicoalmaraz 5:e7ba8c80e3d3 222 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 223 if(velocidad_angular_leida) {
nicoalmaraz 5:e7ba8c80e3d3 224 if((velocidad_angular<220)&&(velocidad_angular>180)) {
nicoalmaraz 5:e7ba8c80e3d3 225 duty_definido=1;
nicoalmaraz 5:e7ba8c80e3d3 226 duty_200_rpm=duty;
nicoalmaraz 5:e7ba8c80e3d3 227 } else {
nicoalmaraz 5:e7ba8c80e3d3 228 printf("Ajuste fino...\r\n");
nicoalmaraz 5:e7ba8c80e3d3 229 if(velocidad_angular>200)
nicoalmaraz 5:e7ba8c80e3d3 230 duty-=0.003;
nicoalmaraz 5:e7ba8c80e3d3 231 if(velocidad_angular<200)
nicoalmaraz 5:e7ba8c80e3d3 232 duty+=0.003;
nicoalmaraz 5:e7ba8c80e3d3 233 if(velocidad_angular==0)
nicoalmaraz 5:e7ba8c80e3d3 234 duty+=0.05;
nicoalmaraz 5:e7ba8c80e3d3 235 }
nicoalmaraz 5:e7ba8c80e3d3 236 printf("Velocidad angular: %d, Duty: %4.1f\r\n",velocidad_angular,duty*100);
nicoalmaraz 5:e7ba8c80e3d3 237 velocidad_angular_leida=0;
nicoalmaraz 5:e7ba8c80e3d3 238 tiempo_estabilizacion=0;
nicoalmaraz 5:e7ba8c80e3d3 239 }
nicoalmaraz 5:e7ba8c80e3d3 240 }
nicoalmaraz 5:e7ba8c80e3d3 241 break;
nicoalmaraz 5:e7ba8c80e3d3 242 }
nicoalmaraz 5:e7ba8c80e3d3 243 }
nicoalmaraz 5:e7ba8c80e3d3 244
nicoalmaraz 5:e7ba8c80e3d3 245 void lazo_cerrado()
nicoalmaraz 5:e7ba8c80e3d3 246 //Máquina de estados del sistema de conrtol lazo cerrado
nicoalmaraz 5:e7ba8c80e3d3 247 {
nicoalmaraz 5:e7ba8c80e3d3 248 static char estado_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 249 switch(estado_lazo_cerrado) {
nicoalmaraz 5:e7ba8c80e3d3 250 default:
nicoalmaraz 5:e7ba8c80e3d3 251 case 0:
nicoalmaraz 5:e7ba8c80e3d3 252 //Leo la teperatura y la velocidad angular
nicoalmaraz 5:e7ba8c80e3d3 253 lectura_sensores_lazo_cerrado();
nicoalmaraz 5:e7ba8c80e3d3 254 if(sensores_lazo_cerrado_leidos) {
nicoalmaraz 5:e7ba8c80e3d3 255 sensores_lazo_cerrado_leidos=0;
nicoalmaraz 5:e7ba8c80e3d3 256 estado_lazo_cerrado=1;
nicoalmaraz 5:e7ba8c80e3d3 257 }
nicoalmaraz 5:e7ba8c80e3d3 258 break;
nicoalmaraz 5:e7ba8c80e3d3 259 case 1://Actuo en función de lo leido
nicoalmaraz 5:e7ba8c80e3d3 260 //Caso menor a 20°C
nicoalmaraz 5:e7ba8c80e3d3 261 if(temperatura<20) {
nicoalmaraz 5:e7ba8c80e3d3 262 velocidad_deseada=0;
nicoalmaraz 5:e7ba8c80e3d3 263 duty=0;
nicoalmaraz 5:e7ba8c80e3d3 264 }
nicoalmaraz 5:e7ba8c80e3d3 265 //Caso mayor a 70°C
nicoalmaraz 5:e7ba8c80e3d3 266 if(temperatura>70) {
nicoalmaraz 5:e7ba8c80e3d3 267 velocidad_deseada=velocidad_angular_maxima;
nicoalmaraz 5:e7ba8c80e3d3 268 duty=1;
nicoalmaraz 5:e7ba8c80e3d3 269 }
nicoalmaraz 5:e7ba8c80e3d3 270 //Caso mayor a 20°C y menor a 70°C
nicoalmaraz 5:e7ba8c80e3d3 271 if((temperatura>=20)&&(temperatura<=70))
nicoalmaraz 5:e7ba8c80e3d3 272 velocidad_deseada=(temperatura-20)*(velocidad_angular_maxima-200)/70+200;
nicoalmaraz 5:e7ba8c80e3d3 273 //Cada 2 segundos imprimo los parametros leidos
nicoalmaraz 5:e7ba8c80e3d3 274 if(tiempo_informacion>=2000) {
nicoalmaraz 5:e7ba8c80e3d3 275 tiempo_informacion=0;
nicoalmaraz 5:e7ba8c80e3d3 276 printf("Temperatura: %4.2f oC\r\n",temperatura);
nicoalmaraz 5:e7ba8c80e3d3 277 printf("Velocidad actual: %drpm\r\n",velocidad_angular);
nicoalmaraz 5:e7ba8c80e3d3 278 printf("Velocidad deseada: %4.2frpm\r\n\r\n\r\n",velocidad_deseada);
nicoalmaraz 5:e7ba8c80e3d3 279 }
nicoalmaraz 5:e7ba8c80e3d3 280 //Actuo
nicoalmaraz 5:e7ba8c80e3d3 281 //Si estoy muy lejos del valor deseado varío de al 10%
nicoalmaraz 5:e7ba8c80e3d3 282 if(velocidad_angular<(velocidad_deseada-500))
nicoalmaraz 5:e7ba8c80e3d3 283 duty+=0.1;
nicoalmaraz 5:e7ba8c80e3d3 284 if(velocidad_angular>(velocidad_deseada+500))
nicoalmaraz 5:e7ba8c80e3d3 285 duty-=0.1;
nicoalmaraz 5:e7ba8c80e3d3 286 //Si estoy proimo al valor deseado varío de al 1%
nicoalmaraz 5:e7ba8c80e3d3 287 if(velocidad_angular<(velocidad_deseada))
nicoalmaraz 5:e7ba8c80e3d3 288 duty+=0.01;
nicoalmaraz 5:e7ba8c80e3d3 289 if(velocidad_angular>velocidad_deseada)
nicoalmaraz 5:e7ba8c80e3d3 290 duty-=0.01;
nicoalmaraz 5:e7ba8c80e3d3 291 //Si tengo que hacer arrancar al cooler hago variaciones extras del 20%
nicoalmaraz 5:e7ba8c80e3d3 292 //Ya que hay que vencer la fuerza mínima de arranque
nicoalmaraz 5:e7ba8c80e3d3 293 if((velocidad_angular==0)&&(velocidad_deseada>velocidad_angular))
nicoalmaraz 5:e7ba8c80e3d3 294 duty+=0.2;
nicoalmaraz 5:e7ba8c80e3d3 295 estado_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 296 break;
nicoalmaraz 5:e7ba8c80e3d3 297 }
nicoalmaraz 5:e7ba8c80e3d3 298 }
nicoalmaraz 5:e7ba8c80e3d3 299
nicoalmaraz 5:e7ba8c80e3d3 300 void lectura_sensores_lazo_cerrado()
nicoalmaraz 5:e7ba8c80e3d3 301 //Leo los sensores de efecto hall y temperatura
nicoalmaraz 5:e7ba8c80e3d3 302 {
nicoalmaraz 5:e7ba8c80e3d3 303 static char estado_sensores_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 304 switch(estado_sensores_lazo_cerrado) {
nicoalmaraz 5:e7ba8c80e3d3 305 default:
nicoalmaraz 5:e7ba8c80e3d3 306 case 0:
nicoalmaraz 5:e7ba8c80e3d3 307 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 308 if(velocidad_angular_leida) {
nicoalmaraz 5:e7ba8c80e3d3 309 velocidad_angular_leida=0;
nicoalmaraz 5:e7ba8c80e3d3 310 estado_sensores_lazo_cerrado=1;
nicoalmaraz 5:e7ba8c80e3d3 311 }
nicoalmaraz 5:e7ba8c80e3d3 312 break;
nicoalmaraz 5:e7ba8c80e3d3 313 case 1:
nicoalmaraz 5:e7ba8c80e3d3 314 //Haciendo pruebas notamos que muchas veces el sensor mide mal entregando -1000° por lo que forzamos a que lea siempre bien con un "do while"
nicoalmaraz 5:e7ba8c80e3d3 315 //El rango que consideramos correcto va de -5°C a 120°C
nicoalmaraz 5:e7ba8c80e3d3 316 do {
nicoalmaraz 5:e7ba8c80e3d3 317 probe.convertTemperature(false, DS1820::all_devices);
nicoalmaraz 5:e7ba8c80e3d3 318 temperatura=probe.temperature();
nicoalmaraz 6:1e7fe07e6ab4 319 } while((temperatura<-5)&&(temperatura>500));
nicoalmaraz 5:e7ba8c80e3d3 320 estado_sensores_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 321 sensores_lazo_cerrado_leidos=1;
nicoalmaraz 5:e7ba8c80e3d3 322 break;
nicoalmaraz 5:e7ba8c80e3d3 323 }
nicoalmaraz 5:e7ba8c80e3d3 324 }
nicoalmaraz 5:e7ba8c80e3d3 325
nicoalmaraz 5:e7ba8c80e3d3 326 void pulsadores(char pulsador)
nicoalmaraz 5:e7ba8c80e3d3 327 // Leo el pulsador, le quito el rebote y guardo el dato ingresado en el vector "usuario". Además distingo entre ruido o una lectura valida
nicoalmaraz 5:e7ba8c80e3d3 328 {
nicoalmaraz 5:e7ba8c80e3d3 329 static char estado_pulsadores;
nicoalmaraz 5:e7ba8c80e3d3 330 switch(estado_pulsadores) {
nicoalmaraz 5:e7ba8c80e3d3 331 default:
nicoalmaraz 5:e7ba8c80e3d3 332 case 0: //Espero a que apreten
nicoalmaraz 5:e7ba8c80e3d3 333 if(pulsador_con_rebote==0) {
nicoalmaraz 5:e7ba8c80e3d3 334 tiempo_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 335 estado_pulsadores=1;
nicoalmaraz 5:e7ba8c80e3d3 336 }
nicoalmaraz 5:e7ba8c80e3d3 337 break;
nicoalmaraz 5:e7ba8c80e3d3 338 case 1: //Espero 50ms para quitar el rebote rise y analizo si fue ruido o realmente presionaron
nicoalmaraz 5:e7ba8c80e3d3 339 if(tiempo_pulsadores>=50) {
nicoalmaraz 5:e7ba8c80e3d3 340 if(pulsador_con_rebote==0) {
nicoalmaraz 5:e7ba8c80e3d3 341 estado_pulsadores=2;
nicoalmaraz 5:e7ba8c80e3d3 342 modo++;
nicoalmaraz 5:e7ba8c80e3d3 343 } else {
nicoalmaraz 5:e7ba8c80e3d3 344 estado_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 345 ruido=1;
nicoalmaraz 5:e7ba8c80e3d3 346 }
nicoalmaraz 5:e7ba8c80e3d3 347 }
nicoalmaraz 5:e7ba8c80e3d3 348 break;
nicoalmaraz 5:e7ba8c80e3d3 349 case 2: //Si se habia apretado espero a que se suelte
nicoalmaraz 5:e7ba8c80e3d3 350 if(pulsador_con_rebote==1) {
nicoalmaraz 5:e7ba8c80e3d3 351 tiempo_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 352 estado_pulsadores=3;
nicoalmaraz 5:e7ba8c80e3d3 353 }
nicoalmaraz 5:e7ba8c80e3d3 354 break;
nicoalmaraz 5:e7ba8c80e3d3 355 case 3: //Espero 50ms para quitar el rebote fall y analizo si ya se fue o debo darle más tiempo
nicoalmaraz 5:e7ba8c80e3d3 356 if(tiempo_pulsadores<=50) {
nicoalmaraz 5:e7ba8c80e3d3 357 if(pulsador_con_rebote==1) {
nicoalmaraz 5:e7ba8c80e3d3 358 estado_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 359 lectura_pulsador_valida=1;
nicoalmaraz 5:e7ba8c80e3d3 360 } else
nicoalmaraz 5:e7ba8c80e3d3 361 tiempo_pulsadores=0; // si todavia no se fue el rebote espero más tiempo
nicoalmaraz 5:e7ba8c80e3d3 362 }
nicoalmaraz 5:e7ba8c80e3d3 363 break;
nicoalmaraz 5:e7ba8c80e3d3 364 }
nicoalmaraz 5:e7ba8c80e3d3 365 }
nicoalmaraz 5:e7ba8c80e3d3 366
nicoalmaraz 5:e7ba8c80e3d3 367 void timer()
nicoalmaraz 5:e7ba8c80e3d3 368 //Incremento contadores
nicoalmaraz 5:e7ba8c80e3d3 369 {
nicoalmaraz 5:e7ba8c80e3d3 370 tiempo_pulsadores++;
nicoalmaraz 5:e7ba8c80e3d3 371 tiempo_lazo_abierto++;
nicoalmaraz 5:e7ba8c80e3d3 372 tiempo_defino_velocidad_maxima++;
nicoalmaraz 5:e7ba8c80e3d3 373 tiempo_cooler++;
nicoalmaraz 5:e7ba8c80e3d3 374 tiempo_informacion++;
nicoalmaraz 5:e7ba8c80e3d3 375 tiempo_sensor_efecto_hall++;
nicoalmaraz 5:e7ba8c80e3d3 376 tiempo_estabilizacion++;
nicoalmaraz 5:e7ba8c80e3d3 377 }