Dependencies:   mbed DS1820

Committer:
nicoalmaraz
Date:
Sun Jun 16 07:15:03 2019 +0000
Revision:
9:b6cca45c8314
Parent:
8:f5d80ad24de3
Child:
10:0d636b09764c

        

Who changed what in which revision?

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