At 3.3V VCC the original R2=470 only drives 4.66mA through the PC817 LED, giving marginal bus pull-down on loaded buses (V_LOW=2.5V at 1k pull-up). Three parameter sweeps (R2, bus impedance, CTR grade) identified R2=220 as the fix: LED current doubles to 9.71mA, bus LOW drops to 0.27V even at 1k pull-up. Validated against PC817A typical CTR with worst-case bus loading.
81 lines
2.5 KiB
Plaintext
81 lines
2.5 KiB
Plaintext
* BMW I/K-Bus Interface - TX Path (ESP32 to Bus) - PC817 + BC547
|
|
* MCU TX drives Q1 (BC547B) which drives U2 (PC817) LED
|
|
* U2 phototransistor pulls bus LOW against 4.7k pull-up to 12V
|
|
* Test pattern: alternating 3-bit-time (312us) pulses
|
|
* TX 0V = bus idle (HIGH), TX 3.3V = bus active (LOW via U2)
|
|
* Includes U1 RX path for loopback observation
|
|
* Signal inversion: TX HIGH -> bus LOW (documented in design)
|
|
*
|
|
* PC817 pin order: 1=Anode, 2=Cathode, 3=Collector, 4=Emitter
|
|
|
|
* === Power Supplies ===
|
|
V_BAT V12 0 12
|
|
V_MCU VCC 0 3.3
|
|
|
|
* === TX Test Signal ===
|
|
* 0V=idle (U2 OFF, bus HIGH), 3.3V=active (U2 ON, bus LOW)
|
|
* Alternating ~3 bit times (312us) to show inversion
|
|
V_TX TX 0 PWL(
|
|
+ 0u 0
|
|
+ 199.5u 0
|
|
+ 200u 3.3
|
|
+ 512u 3.3
|
|
+ 512.5u 0
|
|
+ 825u 0
|
|
+ 825.5u 3.3
|
|
+ 1137u 3.3
|
|
+ 1137.5u 0
|
|
+ 2000u 0)
|
|
|
|
* === Bus Model ===
|
|
* Idle pull-up: represents combined impedance of other modules' inputs
|
|
* No active driver — only U2 phototransistor drives the bus here
|
|
R_PULL V12 IBUS 4.7k
|
|
C_BUS IBUS 0 100p
|
|
|
|
* === TX Driver: Q1 (BC547B) ===
|
|
R5 TX R5_R3 470
|
|
R3 R5_R3 Q1B 10k
|
|
Q1 Q1C Q1B 0 BC547B
|
|
|
|
* === TX Optocoupler (U2) ===
|
|
* LED path: VCC -> R2 -> U2 anode(1) -> U2 cathode(2) -> Q1 collector
|
|
* Phototransistor: collector(3) = IBUS, emitter(4) = GND
|
|
R2 VCC U2_A 220
|
|
XU2 U2_A Q1C IBUS 0 PC817 Igain=1m
|
|
|
|
* === RX Optocoupler (U1) for Loopback ===
|
|
* Shows what the MCU sees on RX when it transmits
|
|
R1_RX IBUS U1_A 2k
|
|
XU1 U1_A 0 VCC RX PC817 Igain=1m
|
|
R4_RX RX 0 1k
|
|
|
|
* === PC817 Subcircuit (inlined from LTspice library) ===
|
|
.subckt PC817 1 2 3 4
|
|
R1 N003 2 2
|
|
D1 1 N003 LD
|
|
G1 3 N004 N003 2 {Igain}
|
|
C1 1 2 18p
|
|
Q1 3 N004 4 [4] NP
|
|
.model LD D(Is=1e-20 Cjo=18p)
|
|
.model NP NPN(Bf=1200 Vaf=140 Ikf=100m Rc=1 Cjc=19p Cje=7p Cjs=7p C2=3e-15)
|
|
.ends PC817
|
|
|
|
* === Transistor Model ===
|
|
.model BC547B NPN(IS=2.39E-14 NF=1.008 ISE=3.545E-15 NE=1.541 BF=294.3 IKF=0.1357 VAF=63.2 NR=1.004 ISC=6.272E-14 NC=1.243 BR=7.946 IKR=0.1144 VAR=25.9 RB=1 IRB=1.00E-06 RBM=1 RE=0.4683 RC=0.85 XTB=0 EG=1.11 XTI=3 CJE=1.358E-11 VJE=0.65 MJE=0.3279 TF=4.391E-10 XTF=120 VTF=2.643 ITF=0.7495 PTF=0 CJC=3.728E-12 VJC=0.3997 MJC=0.2955 XCJC=0.6193 TR=1.00E-32 CJS=0 VJS=0.75 MJS=0.333 FC=0.9579 Vceo=45 Icrating=100m mfg=NXP)
|
|
|
|
* === Simulation ===
|
|
.tran 0 2000u 0 0.1u
|
|
|
|
* === Measurements ===
|
|
.meas tran IBUS_HIGH MAX V(IBUS)
|
|
.meas tran IBUS_LOW MIN V(IBUS)
|
|
.meas tran IBUS_SWING PP V(IBUS)
|
|
.meas tran TX_TO_BUS_DELAY TRIG V(TX) VAL=1.65 RISE=1 TARG V(IBUS) VAL=6 FALL=1
|
|
.meas tran U2_LED_CURRENT MAX I(R2)
|
|
.meas tran RX_LOOPBACK_HIGH MAX V(RX)
|
|
.meas tran RX_LOOPBACK_LOW MIN V(RX)
|
|
.meas tran Q1_BASE_CURRENT MAX I(R3)
|
|
.backanno
|
|
.end
|