196 lines
8.6 KiB
Markdown
196 lines
8.6 KiB
Markdown
|
|
# Fase 10 — Electromecánica + ICs integrados
|
|||
|
|
|
|||
|
|
> **Destino:** `frontend/src/simulation/spice/componentToSpice.ts`, `frontend/src/simulation/parts/`, `scripts/component-overrides.json`, `frontend/src/components/components-wokwi/`.
|
|||
|
|
> **Pre-requisito leído:** [`phase_9_component_catalog_expansion.md`](phase_9_component_catalog_expansion.md) (completada).
|
|||
|
|
> **Meta:** cubrir los componentes que quedaban fuera del catálogo analógico puro — electromecánicos (relé), aislamiento óptico (optoacopladores), packaging de lógica combinacional (74HC series) y electromecánica compleja (driver de motores).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 0. Resumen ejecutivo
|
|||
|
|
|
|||
|
|
| | |
|
|||
|
|
|---|---|
|
|||
|
|
| **Alcance** | 5 familias nuevas: relé electromecánico, optoacopladores, 74HC logic ICs, flip-flops, driver de motor L293D |
|
|||
|
|
| **Componentes nuevos** | ≈ 10 (1 relé + 2 optos + 5 ICs 74HC + 3 flip-flops + L293D) |
|
|||
|
|
| **Patrón arquitectónico nuevo** | Mappers SPICE que emiten **varias** B-sources / `.subckt` por componente (primera vez en el proyecto — hasta fase 9 cada mapper emitía una device card) |
|
|||
|
|
| **Limitación conocida** | Flip-flops solo en digital-sim: SPICE no puede hacer edge detection sin `ddt()` en `.op` — se documenta y se añade en digital-sim layer únicamente |
|
|||
|
|
| **Validación** | Tests de electrical-mode en `test/test_circuit/test/` + tests de digital-sim en `frontend/src/__tests__/` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Componentes
|
|||
|
|
|
|||
|
|
### 1.1 Relé electromecánico (5-pin SPDT)
|
|||
|
|
|
|||
|
|
**Pins:** `COIL+`, `COIL-`, `COM` (común), `NO` (normalmente abierto), `NC` (normalmente cerrado).
|
|||
|
|
|
|||
|
|
**Modelo SPICE:**
|
|||
|
|
```
|
|||
|
|
* Coil: resistencia + inductancia con diodo flyback integrado
|
|||
|
|
R_coil COIL+ COIL- 70
|
|||
|
|
L_coil COIL+ COIL- 20m
|
|||
|
|
D_fly COIL- COIL+ D1N4148 ; flyback integrado (opcional por propiedad)
|
|||
|
|
* Contactos: conmutados por el voltaje de la bobina
|
|||
|
|
.model RELAY_SW SW(Vt=3 Vh=0.5 Ron=0.05 Roff=1G)
|
|||
|
|
S_no COM NO COIL+ COIL- RELAY_SW off
|
|||
|
|
S_nc COM NC COIL+ COIL- RELAY_SW
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
El switch `S` de ngspice tiene histéresis nativa vía `Vt` / `Vh` — esto evita oscilación cuando V(COIL) cruza el umbral.
|
|||
|
|
|
|||
|
|
**Propiedades expuestas:**
|
|||
|
|
- `coil_voltage` (V) — voltaje nominal de activación (5V, 12V, 24V)
|
|||
|
|
- `coil_resistance` (Ω) — afecta corriente requerida
|
|||
|
|
- `include_flyback` (bool) — si se incluye el diodo integrado
|
|||
|
|
|
|||
|
|
### 1.2 Optoacopladores (4N25, PC817)
|
|||
|
|
|
|||
|
|
**Pins:** `AN` (anodo LED), `CAT` (cátodo LED), `COL` (colector phototransistor), `EMIT` (emisor).
|
|||
|
|
|
|||
|
|
**Modelo SPICE:**
|
|||
|
|
```
|
|||
|
|
* LED del optoacoplador (IR, Vf ≈ 1.2V)
|
|||
|
|
D_led AN _led_mid DLED_OPTO
|
|||
|
|
V_sense _led_mid CAT DC 0 ; 0V para medir I_LED
|
|||
|
|
* Phototransistor: CCCS con CTR (Current Transfer Ratio)
|
|||
|
|
F_pt COL EMIT V_sense ${CTR}
|
|||
|
|
* Saturación del phototransistor: limita I_C a ~50 mA
|
|||
|
|
R_pt_leak COL EMIT 100Meg
|
|||
|
|
.model DLED_OPTO D(Is=1e-14 N=2 Rs=5)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- **4N25:** CTR = 0.5 (50%)
|
|||
|
|
- **PC817:** CTR = 1.0 (100%, rangos 80–600% típicos)
|
|||
|
|
|
|||
|
|
### 1.3 74HC logic ICs
|
|||
|
|
|
|||
|
|
Primer caso de "un componente = múltiples gates en un package de 14 pines".
|
|||
|
|
|
|||
|
|
| IC | Contenido | Pins (1..14) |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `ic-74hc00` | 4× NAND 2-input | 1A,1B,1Y,2A,2B,2Y,GND,3Y,3A,3B,4Y,4A,4B,VCC |
|
|||
|
|
| `ic-74hc04` | 6× NOT | 1A,1Y,2A,2Y,3A,3Y,GND,4Y,4A,5Y,5A,6Y,6A,VCC |
|
|||
|
|
| `ic-74hc08` | 4× AND 2-input | 1A,1B,1Y,2A,2B,2Y,GND,3Y,3A,3B,4Y,4A,4B,VCC |
|
|||
|
|
| `ic-74hc32` | 4× OR 2-input | 1A,1B,1Y,2A,2B,2Y,GND,3Y,3A,3B,4Y,4A,4B,VCC |
|
|||
|
|
| `ic-74hc14` | 6× Schmitt NOT | 1A,1Y,2A,2Y,3A,3Y,GND,4Y,4A,5Y,5A,6Y,6A,VCC |
|
|||
|
|
|
|||
|
|
**Mapper emite 4 o 6 tarjetas B-source** (una por gate) reutilizando las expresiones de fase 9.1:
|
|||
|
|
```
|
|||
|
|
B_${id}_1 1Y 0 V = Vcc * (1 - u(V(1A)-T)*u(V(1B)-T))
|
|||
|
|
R_${id}_1_load 1Y 0 1Meg
|
|||
|
|
B_${id}_2 2Y 0 V = ...
|
|||
|
|
... (3 más)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
El Schmitt (74HC14) añade histéresis: umbral rising = 0.6·Vcc, falling = 0.4·Vcc. Implementado con una resistencia de realimentación al input:
|
|||
|
|
```
|
|||
|
|
B_${id}_1 1Y 0 V = Vcc * (1 - u(V(1A) - (V(1Y) > Vcc/2 ? 0.4*Vcc : 0.6*Vcc)))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 1.4 Flip-flops (digital-sim only)
|
|||
|
|
|
|||
|
|
**Pins (D-FF):** `D`, `CLK`, `Q`, `Qbar`
|
|||
|
|
**Pins (JK-FF):** `J`, `K`, `CLK`, `Q`, `Qbar`
|
|||
|
|
**Pins (T-FF):** `T`, `CLK`, `Q`, `Qbar`
|
|||
|
|
|
|||
|
|
Edge detection requiere comparar el estado previo del CLK contra el actual. En `PartSimulationRegistry`:
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
register('flip-flop-d', {
|
|||
|
|
attachEvents: (element, simulator, getPin) => {
|
|||
|
|
let prevClk = false;
|
|||
|
|
let q = false;
|
|||
|
|
const pinCLK = getPin('CLK');
|
|||
|
|
const pinD = getPin('D');
|
|||
|
|
const pinQ = getPin('Q');
|
|||
|
|
const pinQbar = getPin('Qbar');
|
|||
|
|
// ... listeners detect rising edge of CLK → sample D into Q
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**SPICE:** NO se implementa mapper para FFs — edge detection en `.op` no es posible y `.tran` con sample-and-hold requeriría `ddt()` / sistemas más complejos. Los usuarios que necesiten FFs reales usan ICs como 74HC74 (más adelante, fase 11).
|
|||
|
|
|
|||
|
|
### 1.5 L293D motor driver dual H-bridge
|
|||
|
|
|
|||
|
|
**Pins (16, pero funcional: 8 por canal):** `EN1`, `IN1`, `IN2`, `OUT1`, `OUT2`, `EN2`, `IN3`, `IN4`, `OUT3`, `OUT4`, `VCC1` (lógica), `VCC2` (motor), `GND.1`..`GND.4`.
|
|||
|
|
|
|||
|
|
**Modelo SPICE (por canal):**
|
|||
|
|
```
|
|||
|
|
* Canal 1: si EN1 HIGH, OUT1 sigue a IN1 (HIGH/LOW) con V = Vcc2
|
|||
|
|
B_${id}_ch1a OUT1 0 V = u(V(EN1)-Vcc/2) * (u(V(IN1)-Vcc/2) * Vcc2 + (1-u(V(IN1)-Vcc/2))*0)
|
|||
|
|
B_${id}_ch1b OUT2 0 V = u(V(EN1)-Vcc/2) * (u(V(IN2)-Vcc/2) * Vcc2 + (1-u(V(IN2)-Vcc/2))*0)
|
|||
|
|
R_ch1a_load OUT1 0 1Meg
|
|||
|
|
R_ch1b_load OUT2 0 1Meg
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Cuando EN = LOW, los outputs flotan (alta impedancia) — representado con una resistencia débil a tierra.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. Plan de ejecución
|
|||
|
|
|
|||
|
|
### Fase 10.1 — Relé (1 día)
|
|||
|
|
|
|||
|
|
1. Mapper SPICE emite 5 cartas (R_coil, L_coil, D_fly opcional, 2× S switch).
|
|||
|
|
2. Web Component: dibujo schematic con bobina + contactos NC/NO.
|
|||
|
|
3. Metadata: pinCount=5, categoría `electromech` (categoría nueva).
|
|||
|
|
4. Añadir `'electromech'` a `ComponentCategory` y `displayNames`.
|
|||
|
|
5. Tests sandbox: (a) relé en reposo (contactos NC cerrados), (b) relé energizado (contactos NO cerrados), (c) histéresis (V_COIL justo debajo del threshold no activa).
|
|||
|
|
|
|||
|
|
### Fase 10.2 — Optoacopladores (1 día)
|
|||
|
|
|
|||
|
|
1. Mapper SPICE: diodo LED + V-sense + F-source con CTR.
|
|||
|
|
2. Web Component: DIP-4 con divisor visual entre LED y phototransistor.
|
|||
|
|
3. Metadata: 4N25 y PC817, categoría `analog`.
|
|||
|
|
4. Tests: (a) LED off → I_C ≈ 0, (b) LED forward biased → I_C ≈ CTR · I_LED.
|
|||
|
|
|
|||
|
|
### Fase 10.3 — 74HC ICs (2 días)
|
|||
|
|
|
|||
|
|
1. Mapper emite 4 (o 6 para 74HC04/14) B-sources.
|
|||
|
|
2. Web Component: rectángulo DIP-14 con label del part number.
|
|||
|
|
3. Metadata: 5 ICs nuevos, categoría `logic`.
|
|||
|
|
4. Tests: truth table completa para cada gate del package.
|
|||
|
|
|
|||
|
|
### Fase 10.4 — Flip-flops (1 día)
|
|||
|
|
|
|||
|
|
1. Helper genérico `edgeTriggeredFF(inputsLogic)` en `LogicGateParts.ts`.
|
|||
|
|
2. Registrar `flip-flop-d`, `flip-flop-jk`, `flip-flop-t`.
|
|||
|
|
3. Web Component: rectángulo con inputs en la izquierda, Q/Qbar a la derecha, triángulo de clock inverter en CLK.
|
|||
|
|
4. Metadata: pinCount según tipo.
|
|||
|
|
5. Tests digital-sim: secuencia de CLK pulses + verificar transiciones de Q.
|
|||
|
|
|
|||
|
|
### Fase 10.5 — L293D (1–2 días)
|
|||
|
|
|
|||
|
|
1. Mapper emite 4 B-sources + 4 pull-downs (1 por output).
|
|||
|
|
2. Web Component: DIP-16 con labels.
|
|||
|
|
3. Metadata: pinCount=16.
|
|||
|
|
4. Tests: (a) EN=LOW → outputs en alta-Z, (b) EN=HIGH, IN=HIGH → OUT a V_motor, (c) combinaciones forward/reverse/brake.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. Criterios de aceptación
|
|||
|
|
|
|||
|
|
- [ ] Cada mapper nuevo pasa un test `.op` en < 1 s (el test de componentToSpice "minimal fixtures" incluye todos).
|
|||
|
|
- [ ] Cada componente tiene entrada en `_customComponents` con `category` válida.
|
|||
|
|
- [ ] 74HC00 (4-NAND) produce la truth table correcta para LOS CUATRO gates en el mismo test.
|
|||
|
|
- [ ] Relay S-switch histéresis verificada: V_COIL en banda muerta no cambia estado.
|
|||
|
|
- [ ] Flip-flop D dispara solo en rising edge — test inyecta un level-HIGH sostenido de D y verifica que Q cambia sólo al próximo CLK edge.
|
|||
|
|
- [ ] 0 errores `tsc --noEmit` en los nuevos archivos.
|
|||
|
|
- [ ] `npm test` sandbox y frontend pasan con los nuevos tests.
|
|||
|
|
|
|||
|
|
## 4. Out-of-scope
|
|||
|
|
|
|||
|
|
- **74HC74** (D-FF real en IC): se hará como subcircuit de 2× FF en fase 11.
|
|||
|
|
- **Audio-capable opamps** (NE5532, OPA1612): fase 11 o fase 12.
|
|||
|
|
- **Motor con back-EMF / modelado mecánico**: se queda como `RL` estático — modelo mecánico completo (`J · dω/dt = k·I − τ_load`) excede el alcance del simulador eléctrico.
|
|||
|
|
- **Contactores / SSR** (solid-state relays): variantes del relé básico; se añadirán si hay demanda.
|
|||
|
|
|
|||
|
|
## 5. Referencias
|
|||
|
|
|
|||
|
|
- [`phase_9_component_catalog_expansion.md`](phase_9_component_catalog_expansion.md) — fase previa
|
|||
|
|
- [`autosearch/05_velxio_component_inventory.md`](../autosearch/05_velxio_component_inventory.md) — gap analysis
|
|||
|
|
- [`autosearch/06_ngspice_convergence.md`](../autosearch/06_ngspice_convergence.md) — gotchas conocidos
|
|||
|
|
- ngspice manual §B.4 "S-switch" (histéresis Vt/Vh)
|
|||
|
|
- ngspice manual §B.2 "F-source" (CCCS para optoacopladores)
|