test

Committer:
dapi08
Date:
Thu Jun 18 07:31:09 2020 +0000
Revision:
4:7564d0ffd595
Parent:
3:55227f9877e0
Child:
5:420cb56093d3
Comienzo pruebas con los dos mandos

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dapi08 2:82fdfeec5799 1 #include "declaraciones.h"
deepikabhavnani 0:cf516d904427 2 #include "EthernetInterface.h"
dapi08 2:82fdfeec5799 3 #include "gps.h"
dapi08 1:da6afd392792 4
dapi08 2:82fdfeec5799 5 #define IP "192.168.1.247"
dapi08 1:da6afd392792 6 #define GATEWAY "192.168.1.1"
dapi08 1:da6afd392792 7 #define MASK "255.255.255.0"
dapi08 1:da6afd392792 8
deepikabhavnani 0:cf516d904427 9
deepikabhavnani 0:cf516d904427 10 // Network interface
deepikabhavnani 0:cf516d904427 11 EthernetInterface net;
dapi08 1:da6afd392792 12
dapi08 2:82fdfeec5799 13
dapi08 2:82fdfeec5799 14 //GPS gps(PC_10, PC_11, PF_8);
dapi08 2:82fdfeec5799 15
dapi08 1:da6afd392792 16 // CANALES DE COMUNICACION
dapi08 1:da6afd392792 17 Serial pc(SERIAL_TX, SERIAL_RX, 115200);
dapi08 1:da6afd392792 18 Serial serGPS(PC_10, PC_11, 9600);
dapi08 2:82fdfeec5799 19 RawSerial serSERVO(PC_12, PD_2, 115200);
dapi08 1:da6afd392792 20 Serial serRS485(PD_5, PD_6, 115200);
dapi08 1:da6afd392792 21
dapi08 1:da6afd392792 22 // SALIDAS PARA LEDS
dapi08 1:da6afd392792 23 DigitalOut led1(LED1, 0); //LED1
dapi08 1:da6afd392792 24 DigitalOut led2(LED2, 0);
dapi08 1:da6afd392792 25 DigitalOut led3(LED3, 0);
dapi08 1:da6afd392792 26
dapi08 1:da6afd392792 27 // SALIDAS DE CONTROL COMUNICACIONES
dapi08 2:82fdfeec5799 28 DigitalOut RS485_DIR(PE_3, 0); //DIR RS485 a RX
dapi08 2:82fdfeec5799 29 DigitalOut RS485_OE(PF_7, 0); //OE RS485 a tri-state
dapi08 1:da6afd392792 30
dapi08 1:da6afd392792 31 // SALIDAS PARA CONTROL DEL SERVO
dapi08 1:da6afd392792 32 DigitalOut control_PWR_servo(PF_9, 1); // Alimentacion del inverter para 220V del servo
dapi08 1:da6afd392792 33 DigitalOut SERVO_ON(PG_1, 0); // Salida de control ON del servo (J7-2)
dapi08 1:da6afd392792 34 DigitalOut SERVO_CLR_COUNT(PG_0, 0); // Salida de control CLR_COUNT del servo (J7-1)
dapi08 1:da6afd392792 35 DigitalOut SERVO_ALARM_CLR(PF_0, 0); // Salida de control ALARM_CLR del servo (J7-4)
dapi08 1:da6afd392792 36 DigitalOut SERVO_CONTROL_MODE(PC_6, 0); // Salida de control CONTROL_MODE del servo (J7-3)
dapi08 1:da6afd392792 37 DigitalOut SERVO_INC_POS(PB_10, 0); // Salida de control INC_POS del servo (J1-2)
dapi08 1:da6afd392792 38 DigitalOut SERVO_DEC_POS(PB_11, 0); // Salida de control DEC_POS del servo (J1-3)
dapi08 1:da6afd392792 39 DigitalOut SERVO_AUX_OUT(PA_15, 0); // Salida de control AUX_OUT del servo (J7-10)
dapi08 1:da6afd392792 40
dapi08 1:da6afd392792 41 // ENTRADAS DE ESTADO DEL SERVO
dapi08 1:da6afd392792 42 DigitalIn SERVO_RDY_IN(PF_13); //Entrada desde SERVO_RDY, 1=activa;
dapi08 1:da6afd392792 43 DigitalIn SERVO_AL_IN(PE_9); //Entrada desde SERVO_AL, 1=activa;
dapi08 1:da6afd392792 44 DigitalIn SERVO_POS_IN(PE_11); //Entrada desde SERVO_POS, 1=activa;
dapi08 1:da6afd392792 45 DigitalIn SERVO_TORQ_L_IN(PF_14); //Entrada desde SERVO_TORQ_L, 1=activa;
dapi08 1:da6afd392792 46 DigitalIn SERVO_Z_SPEED_IN(PE_13); //Entrada desde SERVO_Z_SPEED, 1=activa;
dapi08 1:da6afd392792 47 DigitalIn SRV_D_VEL(PF_2); //Entrada desde SERVO signo nivel de velocidad 1=positivo
dapi08 1:da6afd392792 48 DigitalIn SRV_D_TRQ(PF_1); //Entrada desde SERVO signo nivel de torque 1=positivo
dapi08 1:da6afd392792 49
dapi08 2:82fdfeec5799 50 // ENTRADAS DEL SELECTOR
dapi08 2:82fdfeec5799 51 DigitalIn SEL0(PC_8); //Selector 1 = BABOR/ESTRIBOR, ON(0)=BABOR OFF(1)=ESTRIBOR
dapi08 2:82fdfeec5799 52 DigitalIn SEL1(PC_9); //Selector 2
dapi08 2:82fdfeec5799 53 DigitalIn SEL2(PG_2); //Selector 3
dapi08 2:82fdfeec5799 54 DigitalIn SEL3(PG_3); //Selector 4
dapi08 2:82fdfeec5799 55
dapi08 1:da6afd392792 56 // SALIDAS PWM
dapi08 1:da6afd392792 57 PwmOut SRV_C_TRQ_P(PD_13); // Salida PWM para control del torque POSITIVO del SERVO
dapi08 1:da6afd392792 58 PwmOut SRV_C_TRQ_N(PA_0); // Salida PWM para control del torque NEGATIVO del SERVO
dapi08 1:da6afd392792 59
dapi08 1:da6afd392792 60 // ENTRADAS ANALOGICAS
dapi08 1:da6afd392792 61 AnalogIn SRV_VEL(PA_3); // Entrada analogica de VELOCIDAD del servo
dapi08 1:da6afd392792 62 AnalogIn SRV_TRQ(PC_0); // Entrada analogica de TORQUE del servo
dapi08 1:da6afd392792 63
dapi08 1:da6afd392792 64
dapi08 1:da6afd392792 65 // ENTRADAS GENERALES
dapi08 1:da6afd392792 66 DigitalIn pulsador(PC_13); //Pulsador de usuario, 1=pulsado;
dapi08 1:da6afd392792 67
dapi08 1:da6afd392792 68
dapi08 1:da6afd392792 69
dapi08 2:82fdfeec5799 70 // VARIABLES DE SISTEMA
dapi08 2:82fdfeec5799 71 volatile unsigned long tiempo_ms = 0;
dapi08 2:82fdfeec5799 72 volatile bool f_ms = false; // se pone en cada interrupcion de ms
dapi08 4:7564d0ffd595 73 int babor_estribor = 0; // si 0=control servo babor, si 1=control servo estribor
dapi08 1:da6afd392792 74
dapi08 1:da6afd392792 75
dapi08 2:82fdfeec5799 76 long t_ult_recepcion; // guarda tiempo ultima recepción
dapi08 2:82fdfeec5799 77 byte nMando; // numero de mando 0=babor 1=estribor
dapi08 2:82fdfeec5799 78 int servo; // servo recibido en ultima comunicacion
dapi08 2:82fdfeec5799 79 volatile float latitud;
dapi08 2:82fdfeec5799 80 volatile float longitud;
dapi08 2:82fdfeec5799 81 volatile long fecha_hora;
dapi08 2:82fdfeec5799 82 volatile int n_satelites;
dapi08 2:82fdfeec5799 83 volatile float HDOP;
dapi08 2:82fdfeec5799 84 volatile int rumbo;
dapi08 2:82fdfeec5799 85 volatile int velocidad; // MNPH
dapi08 2:82fdfeec5799 86 volatile int timon_babor;
dapi08 2:82fdfeec5799 87 volatile int timon_estribor;
dapi08 2:82fdfeec5799 88 volatile enEstadoDireccion estado_direccion;
dapi08 2:82fdfeec5799 89 volatile byte EstadoAnteriorServo; //Guarda estado anterior del servo para salir de piloto-automatico o rumbo
dapi08 2:82fdfeec5799 90 volatile byte estado_otro_servo; // Estado del otro servo
dapi08 2:82fdfeec5799 91 volatile int retardoActualizacion; // para no visualizar estado durante este tiempo en ms
dapi08 2:82fdfeec5799 92 volatile bool act_display; // flag para actualizar display
dapi08 2:82fdfeec5799 93 volatile bool trama_estado_valida;
dapi08 2:82fdfeec5799 94 volatile bool trama_posicion_valida;
dapi08 1:da6afd392792 95
dapi08 4:7564d0ffd595 96
dapi08 2:82fdfeec5799 97 // VARIABLE CONTROL SERVO
dapi08 2:82fdfeec5799 98 enEstadoServo estado_servo;
dapi08 2:82fdfeec5799 99 int16_t velocidad_servo;
dapi08 2:82fdfeec5799 100 int16_t torque_servo;
dapi08 2:82fdfeec5799 101 long desviacion_servo;
dapi08 2:82fdfeec5799 102 volatile int pos_actual_servo = 0;
dapi08 2:82fdfeec5799 103 volatile int pos_objetivo_servo = 0;
dapi08 2:82fdfeec5799 104 volatile unsigned long tempo_espera = 0;
dapi08 2:82fdfeec5799 105
dapi08 2:82fdfeec5799 106 int torque_max; // torque máximo calculado
dapi08 2:82fdfeec5799 107 int out_torque = TORQUE_MINIMO; // nivel de torque de TORQUE_MINIMO a TORQUE_MAXIMO
dapi08 2:82fdfeec5799 108
dapi08 2:82fdfeec5799 109 int cons_timon_babor = 0; // consigna % de timon babor bajado
dapi08 2:82fdfeec5799 110 int cons_timon_estribor = 0; // consigna % de timon estribor bajado
dapi08 2:82fdfeec5799 111
dapi08 2:82fdfeec5799 112 float diferencia_rumbo = 0.0; // Diferencia al Rumbo deseado
dapi08 1:da6afd392792 113
dapi08 2:82fdfeec5799 114 st_datos_servo datos_servo; // ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION
dapi08 2:82fdfeec5799 115 st_datos_GPS datos_GPS; // ESTRUCTURA DE DATOS DE ESTADO DEL GPS
dapi08 2:82fdfeec5799 116
dapi08 2:82fdfeec5799 117
dapi08 4:7564d0ffd595 118
dapi08 2:82fdfeec5799 119 // VARIABLES CONFIGURACION DESDE ORDENADOR
dapi08 2:82fdfeec5799 120 int cfg_hora = 7200; // Suma dos horas a UTC
dapi08 2:82fdfeec5799 121
dapi08 2:82fdfeec5799 122
dapi08 2:82fdfeec5799 123 // VARIABLES GENERALES
dapi08 2:82fdfeec5799 124 float ana_velocidad = 0.0;
dapi08 2:82fdfeec5799 125 float ana_torque = 0.0;
dapi08 2:82fdfeec5799 126 bool newtime = false;
dapi08 2:82fdfeec5799 127 ntp_packet in_data; // para recibir fecha y hora del servidor
dapi08 2:82fdfeec5799 128
dapi08 2:82fdfeec5799 129 // VARIABLES DE COMUNICACION RS485
dapi08 3:55227f9877e0 130 volatile bool f_rs485_busy = false; // comunicacion ocupada
dapi08 3:55227f9877e0 131 volatile bool recibidoEstadoServo = false; //Si ha recibido estado del otro servo se pone a true para sincronizacion
dapi08 3:55227f9877e0 132
dapi08 4:7564d0ffd595 133 // VARIABLES RECIBIDAS DESDE MANDO
dapi08 4:7564d0ffd595 134 int estado_mando = 0;
dapi08 4:7564d0ffd595 135 byte pulsadores = 0; // Estado pulsadores del mando
dapi08 4:7564d0ffd595 136
dapi08 4:7564d0ffd595 137 byte estado_old = DIR_REPOSO; // ultimo estado enviado
dapi08 4:7564d0ffd595 138
dapi08 2:82fdfeec5799 139
dapi08 2:82fdfeec5799 140 // TIMERS
dapi08 2:82fdfeec5799 141 Timer timer;
dapi08 4:7564d0ffd595 142 Ticker tick_millis; // Interrupcion para cuenta de milisegundos
dapi08 3:55227f9877e0 143 Ticker tickRS485us; // Interrupcion de 100us para com rs485
dapi08 3:55227f9877e0 144 Timer timerRS485; // Timer para sincronizacion por rs485 de los mandos
dapi08 2:82fdfeec5799 145
dapi08 2:82fdfeec5799 146
dapi08 2:82fdfeec5799 147
dapi08 2:82fdfeec5799 148
dapi08 2:82fdfeec5799 149
dapi08 2:82fdfeec5799 150
dapi08 2:82fdfeec5799 151 // RUTINAS
dapi08 2:82fdfeec5799 152
dapi08 2:82fdfeec5799 153 // CUENTA MILISEGUNDOS DESDE RESET
dapi08 2:82fdfeec5799 154 void cuenta_ms() {
dapi08 2:82fdfeec5799 155 tiempo_ms++;
dapi08 2:82fdfeec5799 156 posicion_servo(); // AJUSTA POSICION SERVO SI ES NECESARIO
dapi08 2:82fdfeec5799 157 f_ms = true; // se pone en cada interrupcion de ms
dapi08 1:da6afd392792 158 }
dapi08 1:da6afd392792 159
dapi08 1:da6afd392792 160
dapi08 4:7564d0ffd595 161 // devuelve cuenta de tiempo en ms
dapi08 4:7564d0ffd595 162 unsigned long millis(void){ // devuelve cuenta de tiempo en ms
dapi08 4:7564d0ffd595 163 return tiempo_ms;
dapi08 4:7564d0ffd595 164 }
dapi08 4:7564d0ffd595 165
dapi08 4:7564d0ffd595 166
dapi08 1:da6afd392792 167
dapi08 1:da6afd392792 168
dapi08 1:da6afd392792 169 /*
dapi08 1:da6afd392792 170 /////////////////////////////////////////////////////////
dapi08 1:da6afd392792 171 // PROCESA RECEPCION DESDE SERIAL SERVO
dapi08 1:da6afd392792 172 void onSerialServo(void){ // Procesa recepcion SERVO
dapi08 1:da6afd392792 173
dapi08 1:da6afd392792 174 while (serSERVO.readable()) {
dapi08 1:da6afd392792 175 char c = serSERVO.getc();
dapi08 2:82fdfeec5799 176 // pc.putc(c);
dapi08 2:82fdfeec5799 177 }
dapi08 2:82fdfeec5799 178 }
dapi08 2:82fdfeec5799 179 */
dapi08 2:82fdfeec5799 180
dapi08 2:82fdfeec5799 181
dapi08 2:82fdfeec5799 182
dapi08 2:82fdfeec5799 183
dapi08 2:82fdfeec5799 184
dapi08 2:82fdfeec5799 185 #define FACTOR_INC_RUMBO_BABOR 0.015
dapi08 2:82fdfeec5799 186 #define FACTOR_INC_RUMBO_ESTRIBOR 0.015
dapi08 2:82fdfeec5799 187
dapi08 2:82fdfeec5799 188 // PARA SIMULACION
dapi08 2:82fdfeec5799 189 // Pocesa rumbo_GPS, llamada cada 250ms
dapi08 2:82fdfeec5799 190 void procesa_rumbo_GPS(void){
dapi08 2:82fdfeec5799 191
dapi08 2:82fdfeec5799 192 datos_servo.rumbo -= datos_servo.timon_babor * FACTOR_INC_RUMBO_BABOR;
dapi08 2:82fdfeec5799 193 datos_servo.rumbo += datos_servo.timon_estribor * FACTOR_INC_RUMBO_ESTRIBOR;
dapi08 2:82fdfeec5799 194 // datos_servo.rumbo = flimit_decimales(datos_servo.rumbo, 2);
dapi08 2:82fdfeec5799 195 if(datos_servo.rumbo>360.0){
dapi08 2:82fdfeec5799 196 datos_servo.rumbo -= 360.0;
dapi08 2:82fdfeec5799 197 }
dapi08 2:82fdfeec5799 198 else if(datos_servo.rumbo<0.0){
dapi08 2:82fdfeec5799 199 datos_servo.rumbo += 360.0;
dapi08 1:da6afd392792 200 }
dapi08 1:da6afd392792 201 }
dapi08 1:da6afd392792 202
dapi08 1:da6afd392792 203
dapi08 1:da6afd392792 204
dapi08 1:da6afd392792 205 /////////////////////////////////////////////////////////
dapi08 2:82fdfeec5799 206 // PROGRAMA PRINCIPAL
dapi08 2:82fdfeec5799 207 int main() {
dapi08 2:82fdfeec5799 208 int nc=0;
dapi08 2:82fdfeec5799 209 char out_buffer_2[50];
dapi08 2:82fdfeec5799 210 static int posicion_mando_old = 0;
dapi08 1:da6afd392792 211
dapi08 1:da6afd392792 212
deepikabhavnani 0:cf516d904427 213 // Bring up the ethernet interface
dapi08 2:82fdfeec5799 214 pc.printf("\r\n\r\n");
dapi08 2:82fdfeec5799 215 pc.printf("RESET\r\n\r\n");
dapi08 1:da6afd392792 216 pc.printf("PROGRAMA CONTROL SERVO V0.1\r\n");
dapi08 3:55227f9877e0 217 pc.printf("CONTROL DE SERVO DE ");
dapi08 4:7564d0ffd595 218 babor_estribor = SEL0.read();
dapi08 4:7564d0ffd595 219 if(babor_estribor == 0) // Si es servo de babor = 0
dapi08 3:55227f9877e0 220 pc.printf("BABOR\r\n");
dapi08 3:55227f9877e0 221 else
dapi08 3:55227f9877e0 222 pc.printf("ESTRIBOR\r\n");
dapi08 3:55227f9877e0 223
dapi08 3:55227f9877e0 224
dapi08 1:da6afd392792 225
dapi08 2:82fdfeec5799 226 // Open Ethernet connection
dapi08 2:82fdfeec5799 227 int c=0;
dapi08 2:82fdfeec5799 228 do{
dapi08 2:82fdfeec5799 229 net.disconnect();
dapi08 2:82fdfeec5799 230 wait(2.0); // espera de 1s
dapi08 2:82fdfeec5799 231 int j = net.set_network(IP, MASK, GATEWAY);
dapi08 2:82fdfeec5799 232 printf("set IP status: %i\r\n", j);
dapi08 1:da6afd392792 233
dapi08 2:82fdfeec5799 234 c=net.connect();
dapi08 2:82fdfeec5799 235 if(0 != c) {
dapi08 2:82fdfeec5799 236 printf("Error connecting\r\n");
dapi08 2:82fdfeec5799 237 // return -1;
dapi08 2:82fdfeec5799 238 }
dapi08 2:82fdfeec5799 239 }while(c != 0);
deepikabhavnani 0:cf516d904427 240
deepikabhavnani 0:cf516d904427 241 // Show the network address
deepikabhavnani 0:cf516d904427 242 const char *ip = net.get_ip_address();
dapi08 1:da6afd392792 243 printf("IP address is: %s\r\n", ip ? ip : "No IP");
dapi08 2:82fdfeec5799 244
dapi08 2:82fdfeec5799 245 Thread t; // can pass in the stack size here if you run out of memory
dapi08 2:82fdfeec5799 246 t.start(&udp_main);
dapi08 2:82fdfeec5799 247
dapi08 2:82fdfeec5799 248
dapi08 2:82fdfeec5799 249 // Inicializa datos_servo ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION
dapi08 4:7564d0ffd595 250 datos_servo.n_servo = babor_estribor;
dapi08 2:82fdfeec5799 251 datos_servo.estado = 0;
dapi08 2:82fdfeec5799 252 datos_servo.latitud = 0.0;
dapi08 2:82fdfeec5799 253 datos_servo.longitud = 0.0;
dapi08 2:82fdfeec5799 254 datos_servo.fecha_hora = 0;
dapi08 2:82fdfeec5799 255 datos_servo.velocidad = 0.0; // MNPH
dapi08 2:82fdfeec5799 256 datos_servo.rumbo = 0.0;
dapi08 2:82fdfeec5799 257 datos_servo.ch_radio = 0;
dapi08 2:82fdfeec5799 258 datos_servo.trim_timon_bab = 0;
dapi08 2:82fdfeec5799 259 datos_servo.trim_trans_bab = 6;
dapi08 2:82fdfeec5799 260 datos_servo.trim_timon_estr = 0;
dapi08 2:82fdfeec5799 261 datos_servo.trim_trans_estr = 6;
dapi08 2:82fdfeec5799 262 datos_servo.timon_babor = 0; // %de timon babor bajado, para 100% 5s, 1% = 50ms
dapi08 2:82fdfeec5799 263 datos_servo.timon_estribor = 0; // %de timon estribor bajado, para 100% 5s
dapi08 2:82fdfeec5799 264 datos_servo.rumbo_fijado = 0.0; // Rumbo fijado al pulsar botón para RUMBO FIJO
dapi08 2:82fdfeec5799 265 datos_servo.rumbo_piloto_auto = 0.0; // Rumbo fijado por piloto automático
dapi08 2:82fdfeec5799 266
dapi08 2:82fdfeec5799 267 // Set handler to be called when UDP socket event occurrs.
dapi08 2:82fdfeec5799 268 // sock.attach(&onUDPSocketEvent);
dapi08 1:da6afd392792 269
dapi08 1:da6afd392792 270 timer.start();
dapi08 4:7564d0ffd595 271 tick_millis.attach(&cuenta_ms, 0.001); // the address of the function to be attached (cuenta_ms) and the interval (1 miliseconds)
dapi08 3:55227f9877e0 272 tickRS485us.attach(&SerialTxRS485, 0.0001); // Interrupcion de 100us para comunicaciones por RS485 con mando
dapi08 3:55227f9877e0 273 timerRS485.start(); // Timer para sincronizacion desde recepcion del otro control servo
dapi08 3:55227f9877e0 274
dapi08 2:82fdfeec5799 275 led1 = led2 = led3 =1;
dapi08 1:da6afd392792 276 wait(0.5);
dapi08 2:82fdfeec5799 277 led1 = led2 = led3 =0;
dapi08 2:82fdfeec5799 278
dapi08 2:82fdfeec5799 279 // serSERVO.attach(&onSerialServo); // Interrupcion de serial Servo
dapi08 4:7564d0ffd595 280 serRS485.attach(&onSerialRxRS485, Serial::RxIrq); // Interrupcion de RX serial RS485 (MANDOS)
dapi08 2:82fdfeec5799 281 // serRS485.attach(&onSerialTxRS485, Serial::TxIrq); // Interrupcion de TX serial RS485 (MANDOS)
dapi08 2:82fdfeec5799 282
dapi08 2:82fdfeec5799 283 serGPS.attach(&onSerialGPS); // Interrupcion de serial GPS
dapi08 1:da6afd392792 284
dapi08 1:da6afd392792 285 RS485_OE = 1; // habilita conversor 3.3V a 5V para RS485
dapi08 1:da6afd392792 286
dapi08 2:82fdfeec5799 287 /*
dapi08 1:da6afd392792 288 SRV_C_TRQ_P.period(0.001f); // 1 kHz or 1 ms
dapi08 1:da6afd392792 289 SRV_C_TRQ_N.period(0.001f); // 1 kHz or 1 ms
dapi08 1:da6afd392792 290 SRV_C_TRQ_P=0;
dapi08 1:da6afd392792 291 SRV_C_TRQ_N=0;
dapi08 2:82fdfeec5799 292 */
dapi08 2:82fdfeec5799 293
dapi08 2:82fdfeec5799 294 SERVO_ON = 1; // Pone servo en ON
dapi08 2:82fdfeec5799 295
dapi08 2:82fdfeec5799 296 // uint8_t i=0;
dapi08 2:82fdfeec5799 297
dapi08 2:82fdfeec5799 298 // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC
dapi08 2:82fdfeec5799 299 // ShowDateTime();
deepikabhavnani 0:cf516d904427 300
dapi08 1:da6afd392792 301 while(1){
dapi08 1:da6afd392792 302
dapi08 2:82fdfeec5799 303 while(f_ms!=true); // espera interrupcion de 1 ms
dapi08 2:82fdfeec5799 304 f_ms = false;
dapi08 2:82fdfeec5799 305
dapi08 2:82fdfeec5799 306 procesaGPS(); // Comprueba trama pendiente de GPS y la procesa
dapi08 1:da6afd392792 307
dapi08 2:82fdfeec5799 308 if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_REPOSO)
dapi08 2:82fdfeec5799 309 datos_servo.posicion_mando = desviacion_servo;
dapi08 2:82fdfeec5799 310 else
dapi08 2:82fdfeec5799 311 datos_servo.posicion_mando = pos_objetivo_servo; // PARA PILOTO AUTOMATICO
dapi08 2:82fdfeec5799 312
dapi08 2:82fdfeec5799 313 if(datos_servo.posicion_mando != posicion_mando_old){ // Si cambia la posicion del mando envia trama
dapi08 2:82fdfeec5799 314 if(abs(desviacion_servo) >= 50 && datos_servo.estado == DIR_REPOSO && estado_otro_servo == DIR_REPOSO){
dapi08 2:82fdfeec5799 315 datos_servo.estado = DIR_MASTER;
dapi08 1:da6afd392792 316 }
dapi08 2:82fdfeec5799 317
dapi08 2:82fdfeec5799 318 if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_RUMBO || datos_servo.estado == DIR_PILOTO)
dapi08 2:82fdfeec5799 319 envia_posicion_mando(datos_servo.posicion_mando);
dapi08 2:82fdfeec5799 320 posicion_mando_old = datos_servo.posicion_mando;
dapi08 2:82fdfeec5799 321 }
dapi08 2:82fdfeec5799 322
dapi08 2:82fdfeec5799 323 // PROCESA CADA SEGUNDO
dapi08 2:82fdfeec5799 324 if(((tiempo_ms+500)%1000)==0){ // Envia cada segundo
dapi08 2:82fdfeec5799 325
dapi08 2:82fdfeec5799 326 // getTime();
dapi08 2:82fdfeec5799 327
dapi08 2:82fdfeec5799 328 // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC
dapi08 2:82fdfeec5799 329 // ShowDateTime();
dapi08 2:82fdfeec5799 330 // pc.printf("tiempo_ms:%d\r\n", tiempo_ms);
dapi08 2:82fdfeec5799 331
dapi08 2:82fdfeec5799 332 // pc.printf("RDY:%u AL:%u POS:%u TORQ_L:%u Z_SPEED:%u \r\n", SERVO_RDY_IN.read(), SERVO_AL_IN.read(), SERVO_POS_IN.read(), SERVO_TORQ_L_IN.read(), SERVO_Z_SPEED_IN.read());
dapi08 2:82fdfeec5799 333 // pc.printf("velocidad:%3.3f torque:%3.3f fix:%d satelites:%s\r\n", ana_velocidad, ana_torque, gps.have_fix, gps.NmeaGpsData.NmeaSatelliteTracked);
dapi08 2:82fdfeec5799 334
dapi08 2:82fdfeec5799 335 // procesa_servo(); // lee estado del servo, procesa torque y actualiza
dapi08 2:82fdfeec5799 336 // envia_posicion_mando(datos_servo.posicion_mando);
dapi08 2:82fdfeec5799 337
dapi08 4:7564d0ffd595 338 // printf("tiempo_ms=%d pos_objetivo_servo=%d SEL0=%d ESTADO=%d\r\n", tiempo_ms, pos_objetivo_servo, babor_estribor, datos_servo.estado);
dapi08 2:82fdfeec5799 339 }
dapi08 1:da6afd392792 340
dapi08 2:82fdfeec5799 341 /*
dapi08 2:82fdfeec5799 342 //PROCESO CADA 10ms
dapi08 2:82fdfeec5799 343 if((tiempo_ms%10) == 0){
dapi08 2:82fdfeec5799 344 ana_velocidad = SRV_VEL.read(); // 1.0=VCC, lee entradas analogicas
dapi08 2:82fdfeec5799 345 ana_torque = SRV_TRQ.read();
dapi08 2:82fdfeec5799 346 SRV_C_TRQ_P.pulsewidth(ana_velocidad*0.001f); // Ajusta PWM de salida DAC
dapi08 2:82fdfeec5799 347 SRV_C_TRQ_N.pulsewidth(ana_torque*0.001f);
dapi08 2:82fdfeec5799 348 }
dapi08 2:82fdfeec5799 349 */
dapi08 2:82fdfeec5799 350 //PROCESO CADA 100ms
dapi08 2:82fdfeec5799 351 if((tiempo_ms%100) == 0){
dapi08 2:82fdfeec5799 352 // procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS
dapi08 2:82fdfeec5799 353 // procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 100ms
dapi08 2:82fdfeec5799 354 }
dapi08 1:da6afd392792 355
dapi08 2:82fdfeec5799 356 //PROCESO CADA 250ms
dapi08 2:82fdfeec5799 357 if((tiempo_ms%250) == 0){
dapi08 2:82fdfeec5799 358 procesa_servo(); // lee estado del servo, procesa torque y actualiza
dapi08 4:7564d0ffd595 359 procesa_estado(); // PROCESA CAMBIO DE ESTADO
dapi08 4:7564d0ffd595 360 procesa_piloto_automatico(); // procesa piloto automático
dapi08 2:82fdfeec5799 361 procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 250ms
dapi08 2:82fdfeec5799 362 actualiza_timones(); // ACTUALIZA TIMONES
dapi08 2:82fdfeec5799 363 procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS
dapi08 2:82fdfeec5799 364 }
dapi08 1:da6afd392792 365
dapi08 3:55227f9877e0 366 if(recibidoEstadoServo==true){ //Si ha recibido estado del otro servo está a true para sincronizacion
dapi08 3:55227f9877e0 367 if(timerRS485.read_ms()>=110){
dapi08 3:55227f9877e0 368 envia_estado_mando();
dapi08 3:55227f9877e0 369 recibidoEstadoServo = false;
dapi08 3:55227f9877e0 370 timerRS485.reset();
dapi08 3:55227f9877e0 371 }
dapi08 3:55227f9877e0 372 }
dapi08 3:55227f9877e0 373 else{
dapi08 4:7564d0ffd595 374 int espera = (babor_estribor==0)? 240 :260;
dapi08 3:55227f9877e0 375 if(timerRS485.read_ms()>=espera){ // Si es servo de babor = 240ms, estribor = 260ms, evita colision
dapi08 3:55227f9877e0 376 envia_estado_mando();
dapi08 3:55227f9877e0 377 timerRS485.reset();
dapi08 3:55227f9877e0 378 }
dapi08 3:55227f9877e0 379 }
dapi08 3:55227f9877e0 380
dapi08 1:da6afd392792 381 // control_PWR_servo = (pulsador.read() == 1)?0:1;
dapi08 1:da6afd392792 382 control_PWR_servo = 0; // encendido
dapi08 2:82fdfeec5799 383
dapi08 2:82fdfeec5799 384 // PROCESO CADA 10 SEGUNDOS
dapi08 2:82fdfeec5799 385 if((tiempo_ms%10000)==0){
dapi08 1:da6afd392792 386
dapi08 2:82fdfeec5799 387 /*
dapi08 2:82fdfeec5799 388 if(pos_objetivo_servo == 0){
dapi08 2:82fdfeec5799 389 pos_objetivo_servo = 200;
dapi08 2:82fdfeec5799 390 escribe_parametro_servo(0, 13, TORQUE_MAXIMO);
dapi08 2:82fdfeec5799 391 }
dapi08 2:82fdfeec5799 392 else if(pos_objetivo_servo == 200){
dapi08 2:82fdfeec5799 393 pos_objetivo_servo = -200;
dapi08 2:82fdfeec5799 394 escribe_parametro_servo(0, 13, TORQUE_MAXIMO);
dapi08 2:82fdfeec5799 395 }
dapi08 2:82fdfeec5799 396 else if(pos_objetivo_servo == -200){
dapi08 2:82fdfeec5799 397 pos_objetivo_servo = 0;
dapi08 2:82fdfeec5799 398 escribe_parametro_servo(0, 13, TORQUE_MINIMO);
dapi08 2:82fdfeec5799 399 }
dapi08 2:82fdfeec5799 400 // printf("\r\n\r\npos_objetivo_servo=%d\r\n\r\n",pos_objetivo_servo);
dapi08 2:82fdfeec5799 401 */
dapi08 1:da6afd392792 402 }
dapi08 1:da6afd392792 403
dapi08 1:da6afd392792 404 // Thread::wait(10000);
dapi08 1:da6afd392792 405 }
dapi08 1:da6afd392792 406
deepikabhavnani 0:cf516d904427 407 return 0;
dapi08 1:da6afd392792 408 }