Almaraz Bettig TP1_Ejer1: Sistema de Control

Dependencies:   mbed DS1820

Committer:
nicoalmaraz
Date:
Sun Jun 16 07:13:04 2019 +0000
Revision:
8:f5d80ad24de3
Parent:
7:597508b756a0
Child:
9:b6cca45c8314
Trabajo Practico 1 - Ejercicio 1: Sistema de Control

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