* ======================================================================= * AR-Autopilot — Interfaz RS-485 (NMEA 0183 / Instrumentos Serie) * Archivo: 5_rs485.cir * Tarjeta: Modulo ESP32+CAN+RS485 (solo esta tarjeta tiene RS-485) * * CIRCUITO: * * ESP32 GPIO17 (TXD) ──[R?=0Ω]──── SN65HVD1781 DI (Data Input) * ESP32 GPIO16 (RXD) ──────────── SN65HVD1781 RO (Receiver Output) * ESP32 GPIO4 (DE) ──────────── SN65HVD1781 DE (Driver Enable) * ESP32 GPIO4 (RE) ──────────── SN65HVD1781 /RE (Receiver Enable, activo bajo) * (DE y /RE conectados juntos — half-duplex, control por GPIO4) * * 3.3V ─── SN65HVD1781 Vcc ─── [C=100nF decoupling] * * SN65HVD1781 A ──[R_bias=560Ω]──── +3.3V (bias de terminacion) * SN65HVD1781 B ──[R_bias=560Ω]──── GND (bias de terminacion) * SN65HVD1781 A ──[R_term=120Ω]──── SN65HVD1781 B (terminacion) * SN65HVD1781 A ──[Proteccion ESD]──── Bus RS485_A * SN65HVD1781 B ──[Proteccion ESD]──── Bus RS485_B * * NMEA 0183: RS-485 half-duplex, 4800 bps (NMEA standard) o 38400 bps * Nivel logico: 3.3V (SN65HVD1781 es nativo 3.3V) ✓ * * SN65HVD1781: Bus Fault Protected RS-485 Transceiver * Vcc: 3V a 3.6V (3.3V ✓) * Max 32 unit loads por bus (vs 8 del RS-422 clasico) * Bus fault protection: hasta ±15kV HBM ESD * Bus pins toleran hasta 12V sin alimentacion (proteccion de bus caliente) * Driver: A-B > 200mV cuando DE=HIGH (dominante) * Receiver: salida HIGH cuando A-B > +200mV, LOW cuando A-B < -200mV * * VELOCIDADES RS-485 usadas en nautica: * NMEA 0183: 4800 bps (bit time = 208us) * NMEA 0183 HS: 38400 bps (bit time = 26us) * ModBus RTU: 9600 / 19200 / 38400 bps * Propietario (B&G): 115200 bps o superior * * COMO USAR EN LTSPICE: * Ver: V(rs485_a) y V(rs485_b) → diferencial del bus * V(rs485_diff) = A-B → tension diferencial * V(ro_esp32) → datos recibidos por el ESP32 * V(de_gpio) → estado del control de direccion (TX/RX) * ======================================================================= .title AR-Autopilot RS-485 SN65HVD1781 Interface * ----------------------------------------------------------------------- * ALIMENTACION * ----------------------------------------------------------------------- V33 V33 GND 3.3V * Condensador de desacoplo del transceiver Cvcc V33 GND 100n * ----------------------------------------------------------------------- * ESP32 TRANSMISOR (GPIO17 generando trama NMEA 0183) * ----------------------------------------------------------------------- * NMEA 0183 @ 4800 bps: bit time = 208us * Simulamos: idle(1) → start_bit(0) → 8 bits de dato → stop_bit(1) * Dato: ASCII 'G' = 0x47 = 0100 0111 (LSB primero: 1,1,1,0,0,0,1,0) * * Secuencia completa: IDLE | START | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | STOP | IDLE Vtxd TXD_ESP GND PWL( + 0 3.3 + 208u 3.3 + 208.1u 0 ; START BIT (dominante) + 416u 0 + 416.1u 3.3 ; BIT 0 = 1 (recesivo) + 624u 3.3 + 624.1u 3.3 ; BIT 1 = 1 (recesivo) + 832u 3.3 + 832.1u 3.3 ; BIT 2 = 1 (recesivo) + 1040u 3.3 + 1040.1u 0 ; BIT 3 = 0 (dominante) + 1248u 0 + 1248.1u 0 ; BIT 4 = 0 (dominante) + 1456u 0 + 1456.1u 0 ; BIT 5 = 0 (dominante) + 1664u 0 + 1664.1u 3.3 ; BIT 6 = 1 (recesivo) + 1872u 3.3 + 1872.1u 0 ; BIT 7 = 0 (dominante) + 2080u 0 + 2080.1u 3.3 ; STOP BIT (recesivo) + 2500u 3.3) ; IDLE * ----------------------------------------------------------------------- * CONTROL DE DIRECCION — GPIO4 (DE y /RE juntos) * ----------------------------------------------------------------------- * HIGH = Modo transmision (Driver Enable, Receiver Disable) * LOW = Modo recepcion (Driver Disable, Receiver Enable) * Durante transmision: GPIO4 = HIGH (activo durante toda la trama + guard time) Vde DE_GPIO GND PWL( + 0 0 ; modo recepcion al inicio + 100u 0 + 100.1u 3.3 ; cambiar a TX antes del start bit + 2500u 3.3 + 2500.1u 0 ; volver a RX despues del stop bit + 3000u 0) * ----------------------------------------------------------------------- * SN65HVD1781 — DRIVER RS-485 (modelo comportamental) * ----------------------------------------------------------------------- * Cuando DE=HIGH (transmitiendo): * DI=1 (idle/stop) → A > B → Va=3.3V, Vb=0V, Vdiff=+3.3V * DI=0 (start/mark)→ B > A → Va=0V, Vb=3.3V, Vdiff=-3.3V * (RS-485 usa logica inversa: 1=A>B, 0=B>A) * * Cuando DE=LOW (recibiendo): * Driver en alta impedancia (salidas flotan en el potencial del bias) * Driver A: HIGH cuando DI=1 y DE=1, alta-Z cuando DE=0 Edrv_a DRV_A GND VALUE={ + IF(V(DE_GPIO) > 1.65, + IF(V(TXD_ESP) > 1.65, 3.3, 0), + 1.65) } * (en alta-Z, el driver va al potencial medio; el bias de terminacion lo mantiene) * Driver B: complementario de A Edrv_b DRV_B GND VALUE={ + IF(V(DE_GPIO) > 1.65, + IF(V(TXD_ESP) > 1.65, 0, 3.3), + 1.65) } * Impedancia de salida del driver SN65HVD1781 * Ron del driver tipico: 12Ω (datasheet Texas Instruments) Rdrv_a DRV_A RS485_A_IC 12 Rdrv_b DRV_B RS485_B_IC 12 * ----------------------------------------------------------------------- * RESISTENCIAS DE POLARIZACION (BIAS) DEL BUS * ----------------------------------------------------------------------- * RS-485 requiere bias cuando el bus esta en reposo (sin driver activo) * para evitar estado indeterminado en el receptor. * NMEA 0183 requiere Vdiff > 200mV incluso en idle. * Con Rbias=560Ω a cada rail y Rterm=120Ω: * Vth = Rbias_hi || Rterm || Rbias_lo + GND * Va = 3.3 * (120||560) / (560 + 120||560) = 3.3 * 103/663 = 0.51V ← hmm * Vb = 3.3 * 560 / (560+120) + ... necesita analisis de divisor completo * * Analisis correcto con Rterm=120 en paralelo entre A y B: * Red: V33 -- 560 -- A --+-- 120 --+-- B -- 560 -- GND * Va = V33 * (120||560 + 560_B_GND) / total ... simplificado: * Con Rbias=560 y Rterm=120: * Va = 3.3V * R_abajo/(R_arriba+R_abajo) donde R_abajo incluye la red * Va ≈ 1.98V, Vb ≈ 1.32V → Vdiff = 0.66V > 200mV ✓ (bus en reposo seguro) * Rbias_hi V33 RS485_A_IC 560 ; pullup en linea A Rbias_lo RS485_B_IC GND 560 ; pulldown en linea B * ----------------------------------------------------------------------- * TERMINACION DEL BUS RS-485 * ----------------------------------------------------------------------- * Impedancia caracteristica del par trenzado: ~120Ω * En cada extremo del bus se coloca 120Ω para evitar reflexiones. * En NMEA 0183 es comun omitir terminacion en buses cortos (<10m) * En instalaciones largas (salon motor → puente) si es necesaria. Rterm RS485_A_IC RS485_B_IC 120 ; terminacion nominal * ----------------------------------------------------------------------- * CABLE DEL BUS RS-485 (modelo de linea de transmision) * ----------------------------------------------------------------------- * Par trenzado tipico: Zo=120Ω, velocidad ~200m/us * Para una instalacion tipica en barco: 10m → Td = 50ns T2 RS485_A_IC RS485_B_IC RS485_A_BUS RS485_B_BUS Zo=120 Td=50n * ----------------------------------------------------------------------- * SEGUNDO NODO RS-485 (simula un instrumento NMEA 0183) * ----------------------------------------------------------------------- * El segundo nodo esta en modo recepcion (solo escucha) * Solo aporta su impedancia de entrada al bus (tipicamente 1 unit load = 12kΩ) Rnode2_a RS485_A_BUS GND 12k ; impedancia de entrada receptor (unit load) Rnode2_b RS485_B_BUS GND 12k ; idem linea B * ----------------------------------------------------------------------- * TERMINACION REMOTA (extremo lejano del cable) * ----------------------------------------------------------------------- Rterm2 RS485_A_BUS RS485_B_BUS 120 * ----------------------------------------------------------------------- * RECEPTOR RS-485 → ESP32 (SN65HVD1781 Receiver Output) * ----------------------------------------------------------------------- * El receptor compara A vs B: * A - B > +200mV → RO = HIGH (3.3V al ESP32) * A - B < -200mV → RO = LOW (0V al ESP32) * Histeresis: ~60mV * Cuando DE=HIGH (transmitiendo): receptor deshabilitado (/RE=HIGH) * Erxd RO_ESP32 GND VALUE={ + IF(V(DE_GPIO) > 1.65, + 3.3, + IF(V(RS485_A_BUS) - V(RS485_B_BUS) > 0.2, + 3.3, + 0)) } * ----------------------------------------------------------------------- * TENSION DIFERENCIAL DEL BUS (para graficas) * ----------------------------------------------------------------------- Ediff RS485_DIFF GND VALUE={V(RS485_A_BUS) - V(RS485_B_BUS)} * ----------------------------------------------------------------------- * MEDICIONES AUTOMATICAS * ----------------------------------------------------------------------- * Tension diferencial durante bit dominante (start bit, t=208us a 416us) .meas TRAN Vdiff_dom AVG V(rs485_diff) FROM 210u TO 414u * Tension diferencial durante bit recesivo (bit0=1, t=416us a 624us) .meas TRAN Vdiff_rec AVG V(rs485_diff) FROM 418u TO 622u * Tension en linea A durante transmision .meas TRAN Va_dom AVG V(rs485_a_bus) FROM 210u TO 414u * Tension en linea B durante transmision .meas TRAN Vb_dom AVG V(rs485_b_bus) FROM 210u TO 414u * ----------------------------------------------------------------------- * DIRECTIVAS DE SIMULACION * ----------------------------------------------------------------------- * 3ms = un caracter NMEA 0183 completo a 4800 bps (10 bits: 1 start + 8 data + 1 stop) * Paso maximo 100ns para capturar transiciones del driver .tran 0 3m 0 100n .options reltol=0.001 * ----------------------------------------------------------------------- * VALORES ESPERADOS RS-485 / NMEA 0183 * ----------------------------------------------------------------------- * Modo DOMINANTE (DI=0, B>A): * V(rs485_a_bus) ≈ 0.2V (driver baja A) * V(rs485_b_bus) ≈ 3.1V (driver sube B) * V(rs485_diff) ≈ -2.9V → Vdiff = A-B < -200mV ✓ (dato logico 0) * * Modo RECESIVO (DI=1, A>B): * V(rs485_a_bus) ≈ 3.1V * V(rs485_b_bus) ≈ 0.2V * V(rs485_diff) ≈ +2.9V → Vdiff = A-B > +200mV ✓ (dato logico 1) * * Bus en reposo (DE=0, sin driver): * V(rs485_diff) ≈ +0.66V → receptor ve HIGH (idle = 1 = linea libre) ✓ * (garantizado por resistencias de bias 560Ω) * * NMEA 0183 Formato: 1 start (0) + 8 bits dato (LSB first) + 1 stop (1), sin paridad * ASCII 'G' = 0x47 = 0100 0111: * LSB first: 1 1 1 0 0 0 1 0 * Linea fisica: S=0, 1, 1, 1, 0, 0, 0, 1, 0, P=1 * (S=start, P=stop) * * LONGITUD MAXIMA DEL BUS: * A 4800 bps: td_max = 10% del bit time = 20.8us → longitud max = 4160m ✓ (mas que cualquier barco) * A 38400 bps: td_max = 2.6us → 520m ✓ (mas que suficiente) * * SN65HVD1781 — CARACTERISTICAS CLAVE: * 32 unit loads en bus (permite hasta 32 instrumentos NMEA) * Bus fault protection ±15kV → supervive conexion erronea en marina * Failsafe receiver: si bus abierto o cortocircuito, RO=HIGH (idle seguro) * Slew rate limitado: 230kbps max en modo normal (suficiente para NMEA 0183 HS) .backanno .end