fa8a65f687
Four .cir behavioral simulations ready to open in LTspice via File→Open: 1_buck_chain.cir — dual MP2338 12V→5V→3.3V, verifies Rfb math + soft-start 2_output_stage.cir — PC817 + IRLML6344 isolated output (inverted logic confirmed) 3_analog_input.cir — analog input conditioning; flags ADC overvoltage on IN-BAT/WATER/OILP 4_nmea2000_can.cir — MCP2562T CAN transceiver, two-node NMEA2000 bus, T-line model CRITICAL finding in 3_analog_input.cir: R_high=10K + R_low=15K gives 4.3V at ESP32 ADC when measuring a 12V battery — exceeds 3.3V limit. Fix: use R_high=100K (same as IN-RPM, which is correctly designed at 3.06V @ 14.4V). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
192 lines
8.8 KiB
Plaintext
192 lines
8.8 KiB
Plaintext
* =======================================================================
|
|
* AR-Autopilot — Entrada Analogica Universal (Acondicionamiento de Senal)
|
|
* Archivo: 3_analog_input.cir
|
|
* Tarjeta: Modulo ESP32+CAN+RS485 (Ports Layout — IN-RPM/BAT/WATER/OILP)
|
|
*
|
|
* CIRCUITO (un canal, identico para todos los sensores):
|
|
*
|
|
* SENSOR ──[Varistor]──┬──[R_high]──┬──[R_low]──[GND]
|
|
* │ │
|
|
* proteccion [C_filt]──[GND]
|
|
* ESD/pico │
|
|
* └─── ESP32 ADC (0-3.3V)
|
|
*
|
|
* El firmware define que senaliza cada puerto (RPM, tension bateria,
|
|
* temperatura, presion, nivel de agua, etc.)
|
|
*
|
|
* PARAMETROS CONFIGURABLES (cambiar segun sensor):
|
|
* .param Vsensor = tension maxima del sensor
|
|
* .param R_high = resistor superior del divisor
|
|
* .param R_low = resistor inferior del divisor
|
|
* .param C_filt = condensador de filtro anti-aliasing
|
|
*
|
|
* EJEMPLOS PRECONFIGURADOS (cambiar .param activo):
|
|
* Tension bateria 12V → ADC 3.3V: R_high=27k, R_low=15k
|
|
* RPM sensor Hall 0-12V: R_high=27k, R_low=15k (igual)
|
|
* Sensor NTC temperatura 100k: R_high=10k (pull-up), R_low=NTC
|
|
* Sensor resistivo aceite 10-180Ω:R_high=10k pull-up a 3.3V
|
|
*
|
|
* COMO USAR EN LTSPICE:
|
|
* File → Open → 3_analog_input.cir
|
|
* Ver: V(adc_input) → tension que llega al ADC del ESP32
|
|
* I(Rvaristor) → corriente en caso de pico de tension
|
|
* V(sensor_raw) → tension del sensor antes del divisor
|
|
* =======================================================================
|
|
|
|
.title AR-Autopilot Analog Input Conditioning
|
|
|
|
* -----------------------------------------------------------------------
|
|
* PARAMETROS DEL DIVISOR (modificar segun sensor)
|
|
* -----------------------------------------------------------------------
|
|
* Configuracion activa: Tension de bateria 12V → ADC 3.3V
|
|
* Vout = Vin * R_low / (R_high + R_low)
|
|
* 3.3V = 12V * R_low / (R_high + R_low)
|
|
* R_low/(R_high+R_low) = 0.275
|
|
* Con R_low=15k: R_high = 15k*(1/0.275 - 1) = 15k*2.636 = 39.5k → usar 39.2k
|
|
*
|
|
* VALORES EN TU ESQUEMATICO (segun imagen):
|
|
* IN-BAT: R35=10K (R_high?), R34=15K (R_low?) → Vmax = 3.3*(10+15)/15 = 5.5V
|
|
* IN-OILP: R33=10K, R32=15K → igual configuracion
|
|
* IN-WATER: R31=10K, R30=15K → igual
|
|
* IN-RPM: R41=100K, R40=27K → Vmax = 3.3*(100+27)/27 = 15.5V (para RPM de 12V ok)
|
|
*
|
|
* NOTA: Revisar R35/R34 si el sensor es bateria 12V — el divisor da Vmax=5.5V
|
|
* que excede el rango del ADC (3.3V). Posible ajuste: R35=27k para dar 3.3V @ 12V exacto.
|
|
|
|
.param Rhi = 27k ; Resistor superior del divisor
|
|
.param Rlo = 15k ; Resistor inferior del divisor
|
|
.param Cfilt = 10n ; Condensador de filtro anti-aliasing
|
|
.param Varistor_Vc = 5.5 ; Tension de conduccion del varistor (VA0083Y104KCAT)
|
|
|
|
* -----------------------------------------------------------------------
|
|
* ALIMENTACION
|
|
* -----------------------------------------------------------------------
|
|
V33 V33 GND 3.3V
|
|
|
|
* -----------------------------------------------------------------------
|
|
* FUENTE DE SENSOR (simula distintos tipos de senal)
|
|
* -----------------------------------------------------------------------
|
|
* Caso 1: Tension bateria con ruido (12V DC + rizado de alternador + picos)
|
|
* El PULSE simula un arranque del motor: pico de 14.4V (alternador cargando)
|
|
Vsensor SENSOR_RAW GND PWL(
|
|
+ 0 12.0
|
|
+ 5m 12.0
|
|
+ 6m 14.4
|
|
+ 50m 14.4
|
|
+ 51m 12.6
|
|
+ 100m 12.6
|
|
+ 101m 28.0
|
|
+ 102m 12.6
|
|
+ 200m 12.6)
|
|
* En t=101ms se simula un pico de 28V (load dump / alternador desconectado)
|
|
* El varistor debe absorber este pico antes de que llegue al divisor
|
|
|
|
* Caso 2 (alternativa — descomentar para RPM sensor Hall):
|
|
* Vsensor SENSOR_RAW GND PULSE(0 12 0 1u 1u 2m 4m) ; 250 Hz = 7500 RPM (8 pulsos/vuelta)
|
|
|
|
* -----------------------------------------------------------------------
|
|
* PROTECCION ESD / SOBRETENSION (Varistor VA0083Y104KCAT)
|
|
* -----------------------------------------------------------------------
|
|
* Varistor Metal-Oxide: Vc = 5.5V tipico (no es el valor correcto para 12V!)
|
|
* ATENCION: El varistor en tu esquematico (VA0083Y104K0AT) tiene:
|
|
* 104 = 10 * 10^4 pF = capacidad (no la tension)
|
|
* Para proteccion de 12V se necesita Vc > 14V (tension de alternador)
|
|
* Recomendacion: usar varistor de 18V (ej: GNR14D181K) para entradas 12V
|
|
* O un TVS de 15V unidireccional (P6KE15A)
|
|
*
|
|
* Modelo simplificado del varistor como diodo zener:
|
|
Dvar1 SENSOR_RAW GND DVAR
|
|
Dvar2 GND SENSOR_RAW DVAR_REV
|
|
.model DVAR D(BV=18 IBV=1m Rs=1 Cjo=500p)
|
|
.model DVAR_REV D(BV=0.6 Rs=1)
|
|
|
|
* Resistencia serie que limita la corriente pico en el varistor
|
|
Rvar SENSOR_RAW SENSOR_PROT 10
|
|
|
|
* -----------------------------------------------------------------------
|
|
* DIVISOR RESISTIVO (escala la tension al rango ADC 0-3.3V)
|
|
* -----------------------------------------------------------------------
|
|
Rdiv_hi SENSOR_PROT ADC_PRE 27k
|
|
Rdiv_lo ADC_PRE GND 15k
|
|
|
|
* Verificacion del divisor con los valores:
|
|
* Vout @ 12.0V = 12.0 * 15/(27+15) = 12.0 * 0.357 = 4.29V ← SUPERA 3.3V ADC!
|
|
* Vout @ 14.4V = 14.4 * 0.357 = 5.14V ← MUCHO MAS QUE 3.3V
|
|
*
|
|
* PROBLEMA DETECTADO: Con R_high=27k y R_low=15k, el ADC del ESP32
|
|
* recibe 4.3V para una bateria de 12V — el ADC se daña a mas de 3.6V!
|
|
* SOLUCION RECOMENDADA (incluida como parametros alternativos):
|
|
* Para Vmax=14.4V (bateria cargada con alternador): R_high=100k, R_low=27k
|
|
* Vout @ 14.4V = 14.4 * 27/(100+27) = 14.4 * 0.213 = 3.06V ← OK ✓
|
|
* Vout @ 12.0V = 12.0 * 0.213 = 2.55V → resolucion ADC: 12bit → 1.8mV/LSB ✓
|
|
* → Esta es la configuracion de IN-RPM en tu esquema (R41=100k, R40=27k) ← BIEN DISEÑADA
|
|
|
|
* -----------------------------------------------------------------------
|
|
* FILTRO ANTI-ALIASING RC (condensador de filtro)
|
|
* -----------------------------------------------------------------------
|
|
* Frecuencia de corte: fc = 1 / (2*pi*R_parallel*C)
|
|
* R_parallel = R_high||R_low = 27k||15k = 9.86k
|
|
* Con C=10nF: fc = 1/(2*pi*9.86k*10n) = 1.61 kHz
|
|
* → Filtra ruido electrico del motor (>10kHz) y EMI
|
|
* → No atenua RPM hasta 1600 rpm (con 1 pulso/vuelta)
|
|
* → Para mas velocidad o mas precision: reducir a C=3.3nF → fc=4.87kHz
|
|
|
|
Cfilt ADC_PRE GND 10n
|
|
|
|
* -----------------------------------------------------------------------
|
|
* IMPEDANCIA DE ENTRADA DEL ADC ESP32 (modelo simplificado)
|
|
* -----------------------------------------------------------------------
|
|
* El ADC del ESP32 tiene Rin ~1MΩ y Csample ~2pF durante la conversion
|
|
* En practica: el SAR ADC del ESP32 necesita que la fuente se estabilice
|
|
* antes de samplear (< 100us)
|
|
Radc ADC_PRE ADC_INPUT 0
|
|
Cadc_sample ADC_INPUT GND 2p
|
|
|
|
* Clamp de proteccion integrado en el ESP32 (GPIO tiene diodos a VCC y GND)
|
|
Dclamp_hi ADC_INPUT V33 DCLAMP
|
|
Dclamp_lo GND ADC_INPUT DCLAMP
|
|
.model DCLAMP D(Is=1e-14 N=1 Rs=100 BV=3.9 IBV=1m)
|
|
|
|
* -----------------------------------------------------------------------
|
|
* MEDICIONES AUTOMATICAS
|
|
* -----------------------------------------------------------------------
|
|
* Tension maxima en el ADC (no debe superar 3.3V)
|
|
.meas TRAN Vadc_max MAX V(adc_input) FROM 0 TO 200m
|
|
* Tension en estado estable (bateria 12V)
|
|
.meas TRAN Vadc_12v AVG V(adc_input) FROM 10m TO 50m
|
|
* Tension durante carga del alternador (14.4V)
|
|
.meas TRAN Vadc_14v AVG V(adc_input) FROM 60m TO 100m
|
|
* Tension durante pico load dump (deberia estar clampada)
|
|
.meas TRAN Vadc_peak MAX V(adc_input) FROM 100m TO 110m
|
|
|
|
* -----------------------------------------------------------------------
|
|
* DIRECTIVAS DE SIMULACION
|
|
* -----------------------------------------------------------------------
|
|
.tran 0 200m 0 100n
|
|
|
|
.options reltol=0.001
|
|
|
|
* -----------------------------------------------------------------------
|
|
* NOTAS DE DISENO Y REVISION
|
|
* -----------------------------------------------------------------------
|
|
* [OK] IN-RPM (R41=100k, R40=27k): division correcta para 0-15V → 0-3.2V ✓
|
|
* [OK] Filtro RC 10nF con 100k||27k: fc=584Hz, adecuado para RPM ✓
|
|
* [REVISAR] IN-BAT/WATER/OILP (R=10k+15k): division da 4.3V a 12V ← EXCEDE ADC
|
|
* Opcion A: Cambiar R_high de 10k a 33k → 3.3V @ 12V exacto
|
|
* (Rhi=33k, Rlo=15k) → Vout=12*15/48=3.75V... sigue alto
|
|
* Opcion B: Cambiar a (R_high=56k, R_low=22k) → 12*22/78=3.38V ≈ ok
|
|
* Opcion C: Usar R_high=100k, R_low=39k → 12*39/139=3.36V ← recomendado
|
|
* Permite medir hasta 14.8V (bateria cargada): 14.8*39/139=4.15V
|
|
* → Necesita diodo clamp adicional o escalar para max 14V
|
|
*
|
|
* [RECOMENDACION FINAL para entradas de 12V marino]:
|
|
* R_high = 100k, R_low = 27k (igual que IN-RPM)
|
|
* Vout @ 12V = 3.06V (82% del fondo de escala ADC)
|
|
* Vout @ 14.4V (alternador) = 3.06V... espera:
|
|
* 14.4 * 27/127 = 3.06V ← perfecto, justo en el limite
|
|
* 14.8 * 27/127 = 3.15V ← ok ✓
|
|
* 16.0 * 27/127 = 3.40V ← ligeramente fuera, clamp lo protege ✓
|
|
|
|
.backanno
|
|
.end
|