# LM18200 Dual-Mode Operation ## System Architecture ``` ┌─────────────────────────────────────────────────────────────┐ │ ESP32-2432S028R Module │ │ │ │ ┌──────────────┐ ┌────────────┐ ┌──────────────────┐ │ │ │ Touchscreen │ │ DCC │ │ Motor │ │ │ │ UI Control │→→│ Generator │ │ Controller │ │ │ └──────────────┘ └────────────┘ └──────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ GPIO 18 (PWM/DCC_A) │ │ GPIO 19 (DIR/DCC_B) │ │ GPIO 23 (BRAKE) │ │ GPIO 35 (ADC - ACK Detect) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────┐ │ LM18200 │ │ H-Bridge │ │ │ │ Universal │ │ DC/DCC Driver │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ Current Sense │ │ 0.1Ω 1W │ └─────────────────┘ │ ┌────────────┴────────────┐ │ │ ▼ ▼ Track Rail 1 Track Rail 2 │ │ └────── LOCOMOTIVE ───────┘ ``` ## Mode Comparison ### DC Analog Mode ``` GPIO 18 ──→ PWM Signal (20kHz, 0-100% duty) ──→ LM18200 ──→ Variable Voltage GPIO 19 ──→ Direction (HIGH/LOW) ──→ LM18200 ──→ Polarity GPIO 23 ──→ Brake (active when needed) ──→ LM18200 ──→ Both outputs LOW Result: Traditional DC motor control with variable speed ``` ### DCC Digital Mode ``` GPIO 18 ──→ DCC Signal A (58μs/100μs pulses) ──→ LM18200 ──→ Track + GPIO 19 ──→ DCC Signal B (inverted A) ──→ LM18200 ──→ Track - GPIO 23 ──→ Brake (emergency stop) ──→ LM18200 ──→ Both outputs LOW Result: NMRA DCC digital control with 128 speed steps + functions ``` ### Programming Track Mode (DCC Service Mode) ``` GPIO 18 ──→ Service Mode Packets (22-bit preamble) ──→ LM18200 ──→ Track + GPIO 19 ──→ Inverted service packets ──→ LM18200 ──→ Track - │ ▼ Current Sense (0.1Ω) │ ▼ Voltage Divider │ ▼ GPIO 35 ◄──────────────── ADC reads ACK pulse (60mA = 6mV across 0.1Ω) Result: Decoder programming with ACK verification ``` ## Signal Characteristics ### DC Mode Signals ``` GPIO 18 (PWM): ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▔▔▔▔▔▔▔▔▔▔ (20kHz square wave, variable duty cycle) GPIO 19 (Direction): ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ (Forward: HIGH) ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ (Reverse: LOW) ``` ### DCC Mode Signals ``` GPIO 18 (DCC Signal A): ▔▁▔▁▔▁▔▁▔▁▔▁▔▁▔▁ ← '1' bits (58μs per half) ▔▔▁▁▔▔▁▁▔▔▁▁▔▔▁▁ ← '0' bits (100μs per half) GPIO 19 (DCC Signal B): ▁▔▁▔▁▔▁▔▁▔▁▔▁▔▁▔ ← Inverted from Signal A ▁▁▔▔▁▁▔▔▁▁▔▔▁▁▔▔ ``` ### Programming Track ACK ``` Current Draw During Programming: Normal: ───────────────────────────── (baseline ~10-20mA) ACK: ────────┏━━━━━━┓───────────── (60mA spike for 6ms) ↑ ↑ Valid End Command ACK ADC Reading (GPIO 35): ─────────┏━━━━━┓────────────── (voltage spike detected) ``` ## LM18200 Pin Configuration ``` ┌────────────────────────────────┐ │ LM18200 H-Bridge │ ├────────────────────────────────┤ │ │ │ PWM (Pin 3) ← GPIO 18 │ } Dual purpose: │ DIR (Pin 5) ← GPIO 19 │ } DC: PWM+Direction │ BRAKE(Pin 4) ← GPIO 23 │ } DCC: Signal A+B │ │ │ VCC (Pin 1) ← 5V Logic │ │ GND (Pin 2) ← GND │ │ │ │ VS (Pin 10) ← 12-18V Track │ │ │ │ OUT1 (Pin 8) → Rail 1 ────┐ │ │ OUT2 (Pin 9) → Rail 2 ────┤ │ └────────────────────────────┼───┘ │ ┌──────┴──────┐ │ 0.1Ω Sense │ └──────┬──────┘ │ To Track ``` ## Current Flow and ACK Detection ### Programming Track Current Sensing ``` LM18200 OUT1 │ ▼ ┌─────────┐ │ 0.1Ω 1W │ ← Sense Resistor └─────────┘ │ ┌────┴────┐ │ │ 1kΩ To Track Rail 1 │ GPIO 35 (ADC) │ 10kΩ │ GND ──── Track Rail 2 ──── LM18200 OUT2 Voltage Calculation: - Decoder ACK = 60mA - Voltage across 0.1Ω = I × R = 0.06A × 0.1Ω = 6mV - Voltage divider (1kΩ/10kΩ): V_adc = 6mV × (10/(1+10)) ≈ 5.45mV - ESP32 ADC: 12-bit (0-4095) for 0-3.3V - Expected ADC value: (5.45mV / 3300mV) × 4095 ≈ 6-7 counts Note: In practice, use higher resistance for better ADC reading, or amplify signal with op-amp for more reliable detection. ``` ## Why This Works for Programming ### Traditional DCC System - **Main Track**: 3-5A continuous, many locomotives - **Programming Track**: 250mA max, one decoder at a time - **Separation Required**: Different boosters to prevent overcurrent ### DCC-Bench Approach - **Single Track**: Only one locomotive under test - **Low Current**: Programming current well within LM18200 limits - **No Isolation Needed**: Same track for operation and programming - **Mode Selection**: Software-controlled (touchscreen UI) ### LM18200 Specifications - **Continuous Current**: 3A (plenty for single loco) - **Peak Current**: 6A (handles inrush) - **Current Limit**: Built-in thermal protection - **Perfect for**: Small test bench with one locomotive ## Safety Features ### Hardware Protection 1. **LM18200 thermal shutdown**: 165°C junction temperature 2. **Current limiting**: Automatic under-voltage lockout 3. **Brake function**: Forces outputs LOW (GPIO 23) 4. **Optional fuse**: 250mA on track output for extra safety ### Software Safety 1. **Power-off on mode change**: Prevents accidental high current 2. **CV range validation**: Only CV 1-1024 allowed 3. **Address validation**: 1-10239 range check 4. **Write verification**: Confirms successful programming 5. **Timeout handling**: Aborts if no ACK after retries ## Limitations and Considerations ### Current Implementation ✅ - Sends NMRA-compliant programming packets - Proper timing and packet structure - Retry logic for reliability - Basic ACK detection framework ### With Hardware Addition 📋 - Full ACK detection with current sensing - Verified programming success - Reliable decoder communication - Professional-grade test bench ### Not Supported ⚠️ - **Operations Mode Programming**: Requires main track operation - **RailCom**: Needs additional hardware and timing - **Multiple Locomotives**: Bench designed for single loco testing - **High Current Ops**: Not a layout controller (test bench only) ## Advantages Summary ✅ **Simplicity**: One driver for everything ✅ **Cost**: No separate programming booster ✅ **Reliability**: LM18200 proven design ✅ **Flexibility**: Easy mode switching ✅ **Safety**: Built-in protection ✅ **Completeness**: Full NMRA compliance ✅ **Practicality**: Perfect for test bench use This design leverages the fact that a test bench only ever has ONE locomotive, eliminating the need for separate main track and programming track boosters!