test

Committer:
dapi08
Date:
Tue Jul 27 14:03:30 2021 +0000
Revision:
7:60d157ef1134
Parent:
6:c21017e969af
Child:
8:b4465148d206
Operativa, inicio incluir deteccion de centro volante con opto;

Who changed what in which revision?

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