Almaraz Bettig TP1_Ejer1: Sistema de Control

Dependencies:   mbed DS1820

Committer:
nicoalmaraz
Date:
Sun Jun 16 07:16:32 2019 +0000
Revision:
10:0d636b09764c
Parent:
9:b6cca45c8314

        

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 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 7:597508b756a0 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 7:597508b756a0 187 //Leo velocidad angular
nicoalmaraz 5:e7ba8c80e3d3 188 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 189 if(velocidad_angular_leida) {
nicoalmaraz 5:e7ba8c80e3d3 190 velocidad_angular_leida=0;
nicoalmaraz 7:597508b756a0 191 //Hago ajuste grueso
nicoalmaraz 7:597508b756a0 192 if((velocidad_angular>300)||(velocidad_angular<150)) {
nicoalmaraz 7:597508b756a0 193 if(velocidad_angular>=1000)
nicoalmaraz 7:597508b756a0 194 duty-=0.09;
nicoalmaraz 7:597508b756a0 195 if((velocidad_angular>=300)&&(velocidad_angular<1000))
nicoalmaraz 7:597508b756a0 196 duty-=0.01;
nicoalmaraz 7:597508b756a0 197 if(velocidad_angular<150)
nicoalmaraz 7:597508b756a0 198 duty+=0.05;
nicoalmaraz 7:597508b756a0 199 //Protejo contra overflow
nicoalmaraz 7:597508b756a0 200 if(duty<0)
nicoalmaraz 7:597508b756a0 201 duty=0;
nicoalmaraz 7:597508b756a0 202 if(duty>1)
nicoalmaraz 7:597508b756a0 203 duty=1;
nicoalmaraz 7:597508b756a0 204 printf("Velocidad angular: %d, Duty: %4.1f\r\n",velocidad_angular,duty*100);
nicoalmaraz 7:597508b756a0 205 } //Si estoy muy proximo hago ajuste fino
nicoalmaraz 7:597508b756a0 206 else {
nicoalmaraz 7:597508b756a0 207 estado_definir_200_rpm=1;
nicoalmaraz 5:e7ba8c80e3d3 208 tiempo_estabilizacion=0;
nicoalmaraz 5:e7ba8c80e3d3 209 printf("Ya casi termna el proceso...\r\n");
nicoalmaraz 5:e7ba8c80e3d3 210 }
nicoalmaraz 5:e7ba8c80e3d3 211 }
nicoalmaraz 5:e7ba8c80e3d3 212 break;
nicoalmaraz 7:597508b756a0 213 case 1:
nicoalmaraz 5:e7ba8c80e3d3 214 //Si estoy muy proximo al valor hago un ajuste fino
nicoalmaraz 5:e7ba8c80e3d3 215 //Dejo funcionar al cooler por 3 segundos asi verificar que
nicoalmaraz 5:e7ba8c80e3d3 216 //mas adelante no se frene o varie su velocidad en ese tiempo
nicoalmaraz 5:e7ba8c80e3d3 217 if(tiempo_estabilizacion>3000) {
nicoalmaraz 5:e7ba8c80e3d3 218 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 219 if(velocidad_angular_leida) {
nicoalmaraz 7:597508b756a0 220 //Me quedo con el duty que haga girar al cooler entre 180rpm y 220rpm
nicoalmaraz 5:e7ba8c80e3d3 221 if((velocidad_angular<220)&&(velocidad_angular>180)) {
nicoalmaraz 5:e7ba8c80e3d3 222 duty_definido=1;
nicoalmaraz 5:e7ba8c80e3d3 223 duty_200_rpm=duty;
nicoalmaraz 7:597508b756a0 224 }
nicoalmaraz 7:597508b756a0 225 //Corrijo la señal vaiando muy de a poco el duty
nicoalmaraz 7:597508b756a0 226 else {
nicoalmaraz 5:e7ba8c80e3d3 227 printf("Ajuste fino...\r\n");
nicoalmaraz 5:e7ba8c80e3d3 228 if(velocidad_angular>200)
nicoalmaraz 5:e7ba8c80e3d3 229 duty-=0.003;
nicoalmaraz 5:e7ba8c80e3d3 230 if(velocidad_angular<200)
nicoalmaraz 5:e7ba8c80e3d3 231 duty+=0.003;
nicoalmaraz 7:597508b756a0 232 if(velocidad_angular<150)
nicoalmaraz 5:e7ba8c80e3d3 233 duty+=0.05;
nicoalmaraz 5:e7ba8c80e3d3 234 }
nicoalmaraz 5:e7ba8c80e3d3 235 printf("Velocidad angular: %d, Duty: %4.1f\r\n",velocidad_angular,duty*100);
nicoalmaraz 5:e7ba8c80e3d3 236 velocidad_angular_leida=0;
nicoalmaraz 5:e7ba8c80e3d3 237 tiempo_estabilizacion=0;
nicoalmaraz 7:597508b756a0 238 //Si ocurrio algun error y no estoy lo sufucientemente cerca vuelvo al ajuste grueso
nicoalmaraz 7:597508b756a0 239 if((velocidad_angular>350)||(velocidad_angular==0)) {
nicoalmaraz 7:597508b756a0 240 estado_definir_200_rpm=0;
nicoalmaraz 7:597508b756a0 241 }
nicoalmaraz 5:e7ba8c80e3d3 242 }
nicoalmaraz 5:e7ba8c80e3d3 243 }
nicoalmaraz 5:e7ba8c80e3d3 244 break;
nicoalmaraz 5:e7ba8c80e3d3 245 }
nicoalmaraz 5:e7ba8c80e3d3 246 }
nicoalmaraz 5:e7ba8c80e3d3 247
nicoalmaraz 5:e7ba8c80e3d3 248 void lazo_cerrado()
nicoalmaraz 5:e7ba8c80e3d3 249 //Máquina de estados del sistema de conrtol lazo cerrado
nicoalmaraz 5:e7ba8c80e3d3 250 {
nicoalmaraz 5:e7ba8c80e3d3 251 static char estado_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 252 switch(estado_lazo_cerrado) {
nicoalmaraz 5:e7ba8c80e3d3 253 default:
nicoalmaraz 5:e7ba8c80e3d3 254 case 0:
nicoalmaraz 5:e7ba8c80e3d3 255 //Leo la teperatura y la velocidad angular
nicoalmaraz 5:e7ba8c80e3d3 256 lectura_sensores_lazo_cerrado();
nicoalmaraz 5:e7ba8c80e3d3 257 if(sensores_lazo_cerrado_leidos) {
nicoalmaraz 5:e7ba8c80e3d3 258 sensores_lazo_cerrado_leidos=0;
nicoalmaraz 5:e7ba8c80e3d3 259 estado_lazo_cerrado=1;
nicoalmaraz 5:e7ba8c80e3d3 260 }
nicoalmaraz 5:e7ba8c80e3d3 261 break;
nicoalmaraz 5:e7ba8c80e3d3 262 case 1://Actuo en función de lo leido
nicoalmaraz 5:e7ba8c80e3d3 263 //Caso menor a 20°C
nicoalmaraz 5:e7ba8c80e3d3 264 if(temperatura<20) {
nicoalmaraz 5:e7ba8c80e3d3 265 velocidad_deseada=0;
nicoalmaraz 5:e7ba8c80e3d3 266 duty=0;
nicoalmaraz 5:e7ba8c80e3d3 267 }
nicoalmaraz 5:e7ba8c80e3d3 268 //Caso mayor a 70°C
nicoalmaraz 5:e7ba8c80e3d3 269 if(temperatura>70) {
nicoalmaraz 5:e7ba8c80e3d3 270 velocidad_deseada=velocidad_angular_maxima;
nicoalmaraz 5:e7ba8c80e3d3 271 duty=1;
nicoalmaraz 5:e7ba8c80e3d3 272 }
nicoalmaraz 5:e7ba8c80e3d3 273 //Caso mayor a 20°C y menor a 70°C
nicoalmaraz 5:e7ba8c80e3d3 274 if((temperatura>=20)&&(temperatura<=70))
nicoalmaraz 5:e7ba8c80e3d3 275 velocidad_deseada=(temperatura-20)*(velocidad_angular_maxima-200)/70+200;
nicoalmaraz 5:e7ba8c80e3d3 276 //Cada 2 segundos imprimo los parametros leidos
nicoalmaraz 5:e7ba8c80e3d3 277 if(tiempo_informacion>=2000) {
nicoalmaraz 5:e7ba8c80e3d3 278 tiempo_informacion=0;
nicoalmaraz 5:e7ba8c80e3d3 279 printf("Temperatura: %4.2f oC\r\n",temperatura);
nicoalmaraz 5:e7ba8c80e3d3 280 printf("Velocidad actual: %drpm\r\n",velocidad_angular);
nicoalmaraz 5:e7ba8c80e3d3 281 printf("Velocidad deseada: %4.2frpm\r\n\r\n\r\n",velocidad_deseada);
nicoalmaraz 5:e7ba8c80e3d3 282 }
nicoalmaraz 5:e7ba8c80e3d3 283 //Actuo
nicoalmaraz 5:e7ba8c80e3d3 284 //Si estoy muy lejos del valor deseado varío de al 10%
nicoalmaraz 5:e7ba8c80e3d3 285 if(velocidad_angular<(velocidad_deseada-500))
nicoalmaraz 5:e7ba8c80e3d3 286 duty+=0.1;
nicoalmaraz 5:e7ba8c80e3d3 287 if(velocidad_angular>(velocidad_deseada+500))
nicoalmaraz 5:e7ba8c80e3d3 288 duty-=0.1;
nicoalmaraz 5:e7ba8c80e3d3 289 //Si estoy proimo al valor deseado varío de al 1%
nicoalmaraz 5:e7ba8c80e3d3 290 if(velocidad_angular<(velocidad_deseada))
nicoalmaraz 5:e7ba8c80e3d3 291 duty+=0.01;
nicoalmaraz 5:e7ba8c80e3d3 292 if(velocidad_angular>velocidad_deseada)
nicoalmaraz 5:e7ba8c80e3d3 293 duty-=0.01;
nicoalmaraz 5:e7ba8c80e3d3 294 //Si tengo que hacer arrancar al cooler hago variaciones extras del 20%
nicoalmaraz 5:e7ba8c80e3d3 295 //Ya que hay que vencer la fuerza mínima de arranque
nicoalmaraz 5:e7ba8c80e3d3 296 if((velocidad_angular==0)&&(velocidad_deseada>velocidad_angular))
nicoalmaraz 5:e7ba8c80e3d3 297 duty+=0.2;
nicoalmaraz 5:e7ba8c80e3d3 298 estado_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 299 break;
nicoalmaraz 5:e7ba8c80e3d3 300 }
nicoalmaraz 5:e7ba8c80e3d3 301 }
nicoalmaraz 5:e7ba8c80e3d3 302
nicoalmaraz 5:e7ba8c80e3d3 303 void lectura_sensores_lazo_cerrado()
nicoalmaraz 5:e7ba8c80e3d3 304 //Leo los sensores de efecto hall y temperatura
nicoalmaraz 5:e7ba8c80e3d3 305 {
nicoalmaraz 5:e7ba8c80e3d3 306 static char estado_sensores_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 307 switch(estado_sensores_lazo_cerrado) {
nicoalmaraz 5:e7ba8c80e3d3 308 default:
nicoalmaraz 5:e7ba8c80e3d3 309 case 0:
nicoalmaraz 5:e7ba8c80e3d3 310 leer_velocidad_angular();
nicoalmaraz 5:e7ba8c80e3d3 311 if(velocidad_angular_leida) {
nicoalmaraz 5:e7ba8c80e3d3 312 velocidad_angular_leida=0;
nicoalmaraz 5:e7ba8c80e3d3 313 estado_sensores_lazo_cerrado=1;
nicoalmaraz 5:e7ba8c80e3d3 314 }
nicoalmaraz 5:e7ba8c80e3d3 315 break;
nicoalmaraz 5:e7ba8c80e3d3 316 case 1:
nicoalmaraz 7:597508b756a0 317 //Haciendo pruebas notamos que a veces el sensor mide mal entregando -1000°C
nicoalmaraz 7:597508b756a0 318 //Para corregir esto forzamos a que lea siempre bien con un "do while"
nicoalmaraz 7:597508b756a0 319 //El rango que consideramos correcto va de -5°C a 500°C
nicoalmaraz 5:e7ba8c80e3d3 320 do {
nicoalmaraz 5:e7ba8c80e3d3 321 probe.convertTemperature(false, DS1820::all_devices);
nicoalmaraz 5:e7ba8c80e3d3 322 temperatura=probe.temperature();
nicoalmaraz 6:1e7fe07e6ab4 323 } while((temperatura<-5)&&(temperatura>500));
nicoalmaraz 5:e7ba8c80e3d3 324 estado_sensores_lazo_cerrado=0;
nicoalmaraz 5:e7ba8c80e3d3 325 sensores_lazo_cerrado_leidos=1;
nicoalmaraz 5:e7ba8c80e3d3 326 break;
nicoalmaraz 5:e7ba8c80e3d3 327 }
nicoalmaraz 5:e7ba8c80e3d3 328 }
nicoalmaraz 5:e7ba8c80e3d3 329
nicoalmaraz 5:e7ba8c80e3d3 330 void pulsadores(char pulsador)
nicoalmaraz 7:597508b756a0 331 // Leo el pulsador, le quito el rebote y modifico el modo en caso de ser necesario
nicoalmaraz 5:e7ba8c80e3d3 332 {
nicoalmaraz 5:e7ba8c80e3d3 333 static char estado_pulsadores;
nicoalmaraz 5:e7ba8c80e3d3 334 switch(estado_pulsadores) {
nicoalmaraz 5:e7ba8c80e3d3 335 default:
nicoalmaraz 5:e7ba8c80e3d3 336 case 0: //Espero a que apreten
nicoalmaraz 5:e7ba8c80e3d3 337 if(pulsador_con_rebote==0) {
nicoalmaraz 5:e7ba8c80e3d3 338 tiempo_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 339 estado_pulsadores=1;
nicoalmaraz 5:e7ba8c80e3d3 340 }
nicoalmaraz 5:e7ba8c80e3d3 341 break;
nicoalmaraz 5:e7ba8c80e3d3 342 case 1: //Espero 50ms para quitar el rebote rise y analizo si fue ruido o realmente presionaron
nicoalmaraz 5:e7ba8c80e3d3 343 if(tiempo_pulsadores>=50) {
nicoalmaraz 5:e7ba8c80e3d3 344 if(pulsador_con_rebote==0) {
nicoalmaraz 5:e7ba8c80e3d3 345 estado_pulsadores=2;
nicoalmaraz 5:e7ba8c80e3d3 346 modo++;
nicoalmaraz 5:e7ba8c80e3d3 347 } else {
nicoalmaraz 5:e7ba8c80e3d3 348 estado_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 349 ruido=1;
nicoalmaraz 5:e7ba8c80e3d3 350 }
nicoalmaraz 5:e7ba8c80e3d3 351 }
nicoalmaraz 5:e7ba8c80e3d3 352 break;
nicoalmaraz 5:e7ba8c80e3d3 353 case 2: //Si se habia apretado espero a que se suelte
nicoalmaraz 5:e7ba8c80e3d3 354 if(pulsador_con_rebote==1) {
nicoalmaraz 5:e7ba8c80e3d3 355 tiempo_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 356 estado_pulsadores=3;
nicoalmaraz 5:e7ba8c80e3d3 357 }
nicoalmaraz 5:e7ba8c80e3d3 358 break;
nicoalmaraz 5:e7ba8c80e3d3 359 case 3: //Espero 50ms para quitar el rebote fall y analizo si ya se fue o debo darle más tiempo
nicoalmaraz 5:e7ba8c80e3d3 360 if(tiempo_pulsadores<=50) {
nicoalmaraz 5:e7ba8c80e3d3 361 if(pulsador_con_rebote==1) {
nicoalmaraz 5:e7ba8c80e3d3 362 estado_pulsadores=0;
nicoalmaraz 5:e7ba8c80e3d3 363 lectura_pulsador_valida=1;
nicoalmaraz 5:e7ba8c80e3d3 364 } else
nicoalmaraz 5:e7ba8c80e3d3 365 tiempo_pulsadores=0; // si todavia no se fue el rebote espero más tiempo
nicoalmaraz 5:e7ba8c80e3d3 366 }
nicoalmaraz 5:e7ba8c80e3d3 367 break;
nicoalmaraz 5:e7ba8c80e3d3 368 }
nicoalmaraz 5:e7ba8c80e3d3 369 }
nicoalmaraz 5:e7ba8c80e3d3 370
nicoalmaraz 5:e7ba8c80e3d3 371 void timer()
nicoalmaraz 7:597508b756a0 372 //Incremento contadores cada 1ms
nicoalmaraz 5:e7ba8c80e3d3 373 {
nicoalmaraz 5:e7ba8c80e3d3 374 tiempo_pulsadores++;
nicoalmaraz 5:e7ba8c80e3d3 375 tiempo_lazo_abierto++;
nicoalmaraz 5:e7ba8c80e3d3 376 tiempo_defino_velocidad_maxima++;
nicoalmaraz 5:e7ba8c80e3d3 377 tiempo_cooler++;
nicoalmaraz 5:e7ba8c80e3d3 378 tiempo_informacion++;
nicoalmaraz 5:e7ba8c80e3d3 379 tiempo_sensor_efecto_hall++;
nicoalmaraz 5:e7ba8c80e3d3 380 tiempo_estabilizacion++;
nicoalmaraz 5:e7ba8c80e3d3 381 }