From 48b61f462a872a657f883da8254097cd1f120d99 Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Fri, 20 Feb 2026 13:28:03 -0700 Subject: [PATCH] Add SPICE waveform plots and downloadable netlists to circuit design page Simulated RX and TX paths via mcltspice, generated 4 SVG waveform plots (2000 data points each), and staged all 8 netlists plus the muki01 schematic as downloadable site assets. Presentation: Starlight Tabs for RX/TX waveform pairs, inline schematic image, dark mode CSS filter for white-background SVGs, and netlist inventory with download links. --- site/public/spice/ibus_rx_path.cir | 65 ++++++++++++++ site/public/spice/ibus_tx_path.cir | 80 +++++++++++++++++ .../spice/muki01-optocoupler-schematic.png | Bin 0 -> 80176 bytes site/public/spice/opto_vs_kline_510.cir | 70 +++++++++++++++ site/public/spice/opto_vs_kline_ctr.cir | 64 ++++++++++++++ site/public/spice/rx_path_vibus.svg | 24 +++++ site/public/spice/rx_path_vrx.svg | 26 ++++++ site/public/spice/tx_path_vibus.svg | 33 +++++++ site/public/spice/tx_path_vrx_loopback.svg | 31 +++++++ site/public/spice/tx_sweep_ctr.cir | 38 ++++++++ site/public/spice/tx_sweep_r2.cir | 40 +++++++++ site/public/spice/tx_sweep_rpull.cir | 39 +++++++++ site/public/spice/tx_validated_r2_220.cir | 82 ++++++++++++++++++ .../content/docs/reference/circuit-design.mdx | 59 +++++++++---- site/src/styles/custom.css | 20 +++++ 15 files changed, 652 insertions(+), 19 deletions(-) create mode 100644 site/public/spice/ibus_rx_path.cir create mode 100644 site/public/spice/ibus_tx_path.cir create mode 100644 site/public/spice/muki01-optocoupler-schematic.png create mode 100644 site/public/spice/opto_vs_kline_510.cir create mode 100644 site/public/spice/opto_vs_kline_ctr.cir create mode 100644 site/public/spice/rx_path_vibus.svg create mode 100644 site/public/spice/rx_path_vrx.svg create mode 100644 site/public/spice/tx_path_vibus.svg create mode 100644 site/public/spice/tx_path_vrx_loopback.svg create mode 100644 site/public/spice/tx_sweep_ctr.cir create mode 100644 site/public/spice/tx_sweep_r2.cir create mode 100644 site/public/spice/tx_sweep_rpull.cir create mode 100644 site/public/spice/tx_validated_r2_220.cir diff --git a/site/public/spice/ibus_rx_path.cir b/site/public/spice/ibus_rx_path.cir new file mode 100644 index 0000000..4447417 --- /dev/null +++ b/site/public/spice/ibus_rx_path.cir @@ -0,0 +1,65 @@ +* BMW I/K-Bus Interface - RX Path (Bus to ESP32) - PC817 Optocoupler +* Bus drives byte 0x50 (MFL addr) at 9600 baud 8E1 +* 0x50 = 01010000, LSB first = 00001010, even parity = 0 +* Frame: START(0) d0(0) d1(0) d2(0) d3(0) d4(1) d5(0) d6(1) d7(0) P(0) STOP(1) +* Bus: 12V=idle/HIGH, 0V=active/LOW, bit time=104.17us +* ESP32 GPIO thresholds: LOW < 0.825V, HIGH > 2.475V +* +* PC817 pin order: 1=Anode, 2=Cathode, 3=Collector, 4=Emitter +* U1 config: emitter-follower (collector to VCC, emitter to RX output) + +* === Power Supplies === +V_BAT V12 0 12 +V_MCU VCC 0 3.3 + +* === Bus Model === +* External module driving byte 0x50 through 100R source impedance +V_BUS V_BUS_SRC 0 PWL( ++ 0u 12 ++ 199.5u 12 ++ 200u 0 ++ 720.33u 0 ++ 720.83u 12 ++ 824.5u 12 ++ 825u 0 ++ 928.67u 0 ++ 929.17u 12 ++ 1032.83u 12 ++ 1033.33u 0 ++ 1241.17u 0 ++ 1241.67u 12 ++ 2000u 12) +R_BUS V_BUS_SRC IBUS 100 +C_BUS IBUS 0 100p + +* === RX Optocoupler (U1) === +* Bus HIGH (12V): LED on -> phototransistor ON -> RX HIGH +* Bus LOW (0V): LED off -> phototransistor OFF -> RX LOW (via R4) +R1 IBUS U1_A 2k +XU1 U1_A 0 VCC RX PC817 Igain=1m +R4 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 + +* === Simulation === +.tran 0 2000u 0 0.1u + +* === Measurements === +.meas tran RX_HIGH MAX V(RX) +.meas tran RX_LOW MIN V(RX) +.meas tran IBUS_HIGH MAX V(IBUS) +.meas tran IBUS_LOW MIN V(IBUS) +.meas tran LED_CURRENT_MAX MAX I(R1) +.meas tran RX_RISE TRIG V(RX) VAL=0.825 RISE=1 TARG V(RX) VAL=2.475 RISE=1 +.meas tran RX_FALL TRIG V(RX) VAL=2.475 FALL=1 TARG V(RX) VAL=0.825 FALL=1 +.backanno +.end diff --git a/site/public/spice/ibus_tx_path.cir b/site/public/spice/ibus_tx_path.cir new file mode 100644 index 0000000..75fbfca --- /dev/null +++ b/site/public/spice/ibus_tx_path.cir @@ -0,0 +1,80 @@ +* 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 diff --git a/site/public/spice/muki01-optocoupler-schematic.png b/site/public/spice/muki01-optocoupler-schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..4793f659cfa8790107365f361182d89a013dc73c GIT binary patch literal 80176 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�Jo*!N}fh6d-x#As7SMnbSOP;aXNSC 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%0AH ztu-sE1{j8{c042~aPZ$Ct{oI|{IcIpP%v{oHgRqtS2M*_e3>{v84|QDO<|56feWa# zdIxVEN4QXAvX3WpSv@6ET=&M(LBDqT0nP99ek4(K?TSLp+bcbVQJ5w4X>y%lc(7zl z1-I8D0OML%cbqIb$gy*}=x~;drIeNqQsQuc4l9nFg+aBP`(+Q*MI~Z4fb-hwqSJHs z_9&Xry(D!!h zlpeSKBYsnoBRB1}viLM19?oCJ{V=Af)xnLipV$X5(}N4ug6&R6afPx3!^3JGw?oJ4 zyyf1Wk;f1+iI(6ui|q&-g5wX?gX0FF_mSnCuG*^1b!7drOp$v}4zJqlm=uL|!E#S9 zdL(5)EVuH`Z`rP|x}E*D!+P-{*M3NtvPnK~v`**k7l9})zPHooC;}zS)|&JB9q}h~ zd9-j^zN|(7X8efs$qxi_XgQ9-QSsjD&a!K-y#ov&?bq-Xod8EfrbIKY{~&qi);W1S zp0L;Xvn#7;FJreDb2z{?XIHlVe640n=Y znn>>CZ@hHI896ujP$mD&z-Y}%kNSi=c;^UdL+wu? zxr1l&UyUbd`Kz!}9B3Nq)EDUIU1OJK-RC(yMQEZxt*UGB�U(VFGMS(K?gP!hE*F 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 PZ*U+AYVzfBCc*y;ZI%u5 literal 0 HcmV?d00001 diff --git a/site/public/spice/opto_vs_kline_510.cir b/site/public/spice/opto_vs_kline_510.cir new file mode 100644 index 0000000..d48b964 --- /dev/null +++ b/site/public/spice/opto_vs_kline_510.cir @@ -0,0 +1,70 @@ +* Optocoupler (PC817) vs K-Line: Can it handle 510 ohm pull-up? +* Tests BMW opto design against OBD-II K-line worst-case impedance +* R2 sweep to find if any value works at 510 ohm + 10400 baud +* PC817 pin order: 1=Anode, 2=Cathode, 3=Collector, 4=Emitter + +.param R2val 220 + +V_BAT V12 0 12 +V_MCU VCC 0 3.3 + +* === TX Test Signal at 10400 baud (96.15us bit period) === +* Two pulses to show both edges +V_TX TX 0 PWL( ++ 0u 0 ++ 99u 0 ++ 100u 3.3 ++ 292u 3.3 ++ 292.5u 0 ++ 580u 0 ++ 580.5u 3.3 ++ 772u 3.3 ++ 772.5u 0 ++ 1500u 0) + +* === K-Line Bus Model: 510 ohm pull-up (ISO 9141 minimum spec) === +R_PULL V12 KLINE 510 +C_BUS KLINE 0 100p + +* === TX Driver: Q1 (BC547B) === +R5 TX R5_R3 470 +R3 R5_R3 Q1B 10k +Q1 Q1C Q1B 0 BC547B + +* === TX Optocoupler (U2) === +R2 VCC U2_A {R2val} +XU2 U2_A Q1C KLINE 0 PC817 Igain=1m + +* === RX Optocoupler (U1) on same K-Line wire === +R1_RX KLINE U1_A 2k +XU1 U1_A 0 VCC RX PC817 Igain=1m +R4_RX RX 0 1k + +* === PC817 Subcircuit === +.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 + +* === BC547B 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) + +* === Sweep R2 to find what works at 510 ohm bus === +.step param R2val list 47 68 100 150 220 330 470 + +.tran 0 1500u 0 0.1u + +* === Measurements === +.meas tran KLINE_HIGH MAX V(KLINE) +.meas tran KLINE_LOW MIN V(KLINE) +.meas tran KLINE_SWING PP V(KLINE) +.meas tran LED_CURRENT MAX I(R2) +.meas tran RX_HIGH MAX V(RX) +.meas tran RX_LOW MIN V(RX) +.backanno +.end diff --git a/site/public/spice/opto_vs_kline_ctr.cir b/site/public/spice/opto_vs_kline_ctr.cir new file mode 100644 index 0000000..74e5c66 --- /dev/null +++ b/site/public/spice/opto_vs_kline_ctr.cir @@ -0,0 +1,64 @@ +* Optocoupler vs K-Line: CTR grade sweep at 510 ohm + R2=100 +* Tests all PC817 grades with aggressive R2 at K-line impedance +* PC817 pin order: 1=Anode, 2=Cathode, 3=Collector, 4=Emitter + +.param CTRgain 1m + +V_BAT V12 0 12 +V_MCU VCC 0 3.3 + +* === TX Test Signal at 10400 baud === +V_TX TX 0 PWL( ++ 0u 0 ++ 99u 0 ++ 100u 3.3 ++ 292u 3.3 ++ 292.5u 0 ++ 580u 0 ++ 580.5u 3.3 ++ 772u 3.3 ++ 772.5u 0 ++ 1500u 0) + +* === K-Line: 510 ohm pull-up === +R_PULL V12 KLINE 510 +C_BUS KLINE 0 100p + +* === TX Driver === +R5 TX R5_R3 470 +R3 R5_R3 Q1B 10k +Q1 Q1C Q1B 0 BC547B + +* === TX Optocoupler (R2=100 for maximum LED current) === +R2 VCC U2_A 100 +XU2 U2_A Q1C KLINE 0 PC817 Igain={CTRgain} + +* === RX Optocoupler on same K-Line === +R1_RX KLINE U1_A 2k +XU1 U1_A 0 VCC RX PC817 Igain={CTRgain} +R4_RX RX 0 1k + +* === PC817 Subcircuit === +.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 + +* === BC547B 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) + +.step param CTRgain list 0.5m 1.0m 1.5m 2.3m 3.4m +.tran 0 1500u 0 0.1u + +.meas tran KLINE_HIGH MAX V(KLINE) +.meas tran KLINE_LOW MIN V(KLINE) +.meas tran LED_CURRENT MAX I(R2) +.meas tran RX_HIGH MAX V(RX) +.meas tran RX_LOW MIN V(RX) +.backanno +.end diff --git a/site/public/spice/rx_path_vibus.svg b/site/public/spice/rx_path_vibus.svg new file mode 100644 index 0000000..b1201fa --- /dev/null +++ b/site/public/spice/rx_path_vibus.svg @@ -0,0 +1,24 @@ + + + + +0 + +5 + +10 + +0 + +500µ + +1m + +1.5m + +2m + +RX Path — Bus Voltage (Byte 0x50 at 9600 Baud) +V(ibus) +Time (ms) + \ No newline at end of file diff --git a/site/public/spice/rx_path_vrx.svg b/site/public/spice/rx_path_vrx.svg new file mode 100644 index 0000000..4402dca --- /dev/null +++ b/site/public/spice/rx_path_vrx.svg @@ -0,0 +1,26 @@ + + + + +0 + +1 + +2 + +3 + +0 + +500µ + +1m + +1.5m + +2m + +RX Path — ESP32 Input (Byte 0x50 at 9600 Baud) +V(rx) +Time (ms) + \ No newline at end of file diff --git a/site/public/spice/tx_path_vibus.svg b/site/public/spice/tx_path_vibus.svg new file mode 100644 index 0000000..97c78f2 --- /dev/null +++ b/site/public/spice/tx_path_vibus.svg @@ -0,0 +1,33 @@ + + + + +0 + +2 + +4 + +6 + +8 + +0 + +500µ + +1m + +1.5m + +2m + +TX Path — Bus Voltage (R2=220Ω, 1kΩ Pull-up) +Time (ms) + + + +V(ibus) + +V(tx) + \ No newline at end of file diff --git a/site/public/spice/tx_path_vrx_loopback.svg b/site/public/spice/tx_path_vrx_loopback.svg new file mode 100644 index 0000000..a7a0583 --- /dev/null +++ b/site/public/spice/tx_path_vrx_loopback.svg @@ -0,0 +1,31 @@ + + + + +0 + +1 + +2 + +3 + +0 + +500µ + +1m + +1.5m + +2m + +TX Path — RX Loopback (Full Signal Chain) +Time (ms) + + + +V(tx) + +V(rx) + \ No newline at end of file diff --git a/site/public/spice/tx_sweep_ctr.cir b/site/public/spice/tx_sweep_ctr.cir new file mode 100644 index 0000000..3dbb633 --- /dev/null +++ b/site/public/spice/tx_sweep_ctr.cir @@ -0,0 +1,38 @@ +* TX Path - CTR Grade Sweep (Igain) with Current R2=470 and Tough Bus +* Shows how different PC817 grades perform with 1k bus pull-up +* PC817 pin order: 1=Anode, 2=Cathode, 3=Collector, 4=Emitter + +.param CTRgain 1m + +V_BAT V12 0 12 +V_MCU VCC 0 3.3 +V_TX TX 0 PWL(0u 0 199.5u 0 200u 3.3 512u 3.3 512.5u 0 2000u 0) +R_PULL V12 IBUS 1k +C_BUS IBUS 0 100p +R5 TX R5_R3 470 +R3 R5_R3 Q1B 10k +Q1 Q1C Q1B 0 BC547B +R2 VCC U2_A 470 +XU2 U2_A Q1C IBUS 0 PC817 Igain={CTRgain} +R1_RX IBUS U1_A 2k +XU1 U1_A 0 VCC RX PC817 Igain={CTRgain} +R4_RX RX 0 1k + +.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 + +.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) + +.step param CTRgain list 0.3m 0.5m 0.8m 1.0m 1.5m 2.3m 3.4m +.tran 0 1500u 0 0.5u +.meas tran IBUS_LOW MIN V(IBUS) +.meas tran IBUS_HIGH MAX V(IBUS) +.backanno +.end diff --git a/site/public/spice/tx_sweep_r2.cir b/site/public/spice/tx_sweep_r2.cir new file mode 100644 index 0000000..54c0d68 --- /dev/null +++ b/site/public/spice/tx_sweep_r2.cir @@ -0,0 +1,40 @@ +* TX Path - R2 Sweep at Worst-Case CTR (Igain=0.5m ~ PC817A min) +* Finding optimal R2 for 3.3V ESP32 design +* PC817 pin order: 1=Anode, 2=Cathode, 3=Collector, 4=Emitter + +.param R2val 470 + +V_BAT V12 0 12 +V_MCU VCC 0 3.3 +V_TX TX 0 PWL(0u 0 199.5u 0 200u 3.3 512u 3.3 512.5u 0 2000u 0) +R_PULL V12 IBUS 4.7k +C_BUS IBUS 0 100p +R5 TX R5_R3 470 +R3 R5_R3 Q1B 10k +Q1 Q1C Q1B 0 BC547B +R2 VCC U2_A {R2val} +XU2 U2_A Q1C IBUS 0 PC817 Igain=0.5m +R1_RX IBUS U1_A 2k +XU1 U1_A 0 VCC RX PC817 Igain=0.5m +R4_RX RX 0 1k + +.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 + +.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) + +.step param R2val list 100 150 220 270 330 390 470 +.tran 0 1500u 0 0.5u +.meas tran IBUS_LOW MIN V(IBUS) +.meas tran IBUS_HIGH MAX V(IBUS) +.meas tran LED_CURRENT MAX I(R2) +.meas tran BUS_RISE TRIG V(IBUS) VAL=0.5 RISE=1 TARG V(IBUS) VAL=3.5 RISE=1 +.backanno +.end diff --git a/site/public/spice/tx_sweep_rpull.cir b/site/public/spice/tx_sweep_rpull.cir new file mode 100644 index 0000000..65bb4e1 --- /dev/null +++ b/site/public/spice/tx_sweep_rpull.cir @@ -0,0 +1,39 @@ +* TX Path - Bus Impedance Sweep at Current R2=470 and Typical CTR +* Finding where the design breaks with different bus loading +* PC817 pin order: 1=Anode, 2=Cathode, 3=Collector, 4=Emitter + +.param Rpull 4700 + +V_BAT V12 0 12 +V_MCU VCC 0 3.3 +V_TX TX 0 PWL(0u 0 199.5u 0 200u 3.3 512u 3.3 512.5u 0 2000u 0) +R_PULL V12 IBUS {Rpull} +C_BUS IBUS 0 100p +R5 TX R5_R3 470 +R3 R5_R3 Q1B 10k +Q1 Q1C Q1B 0 BC547B +R2 VCC U2_A 470 +XU2 U2_A Q1C IBUS 0 PC817 Igain=1m +R1_RX IBUS U1_A 2k +XU1 U1_A 0 VCC RX PC817 Igain=1m +R4_RX RX 0 1k + +.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 + +.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) + +.step param Rpull list 510 1000 2200 3300 4700 6800 10000 +.tran 0 1500u 0 0.5u +.meas tran IBUS_LOW MIN V(IBUS) +.meas tran IBUS_HIGH MAX V(IBUS) +.meas tran BUS_RISE TRIG V(IBUS) VAL=0.5 RISE=1 TARG V(IBUS) VAL=3.5 RISE=1 +.backanno +.end diff --git a/site/public/spice/tx_validated_r2_220.cir b/site/public/spice/tx_validated_r2_220.cir new file mode 100644 index 0000000..cc5b6a4 --- /dev/null +++ b/site/public/spice/tx_validated_r2_220.cir @@ -0,0 +1,82 @@ +* BMW I/K-Bus Interface - TX Path VALIDATED (R2=220 fix for 3.3V ESP32) +* Tests worst realistic scenario: PC817A typical CTR + 1k bus pull-up +* Also includes RX loopback to verify full signal path +* +* Fix: R2 reduced from 470 to 220 ohms +* Effect: LED current increases from 4.66mA to ~9.3mA +* Phototransistor base drive doubles: 9.3uA -> 18.6uA +* Max collector current: 11.2mA -> 22.4mA +* Supports bus pull-ups down to ~530 ohms +* +* 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 (byte 0x68 = RAD address) === +* Inverted UART: 0V=idle, 3.3V=pulling bus LOW +* 0x68 = 01101000, LSB first = 00010110 +* 3 ones -> even parity = 1 +* Frame: START(1), 0,0,0,1,0,1,1,0, P(1), STOP(0) +* (inverted: start=HIGH, data inverted, stop=LOW) +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: 1k pull-up (loaded bus, worst realistic case) === +R_PULL V12 IBUS 1k +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) === +* FIX: R2 changed from 470 to 220 for 3.3V ESP32 compatibility +R2 VCC U2_A 220 +XU2 U2_A Q1C IBUS 0 PC817 Igain=1m + +* === RX Optocoupler (U1) for Loopback === +R1_RX IBUS U1_A 2k +XU1 U1_A 0 VCC RX PC817 Igain=1m +R4_RX RX 0 1k + +* === PC817 Subcircuit === +.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 + +* === BC547B 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 U2_LED_CURRENT MAX I(R2) +.meas tran Q1_VCE_SAT MIN V(Q1C) +.meas tran RX_LOOPBACK_HIGH MAX V(RX) +.meas tran RX_LOOPBACK_LOW MIN V(RX) +.meas tran BUS_RISE TRIG V(IBUS) VAL=1.0 RISE=1 TARG V(IBUS) VAL=7.0 RISE=1 +.meas tran BUS_FALL TRIG V(IBUS) VAL=7.0 FALL=1 TARG V(IBUS) VAL=1.0 FALL=1 +.backanno +.end diff --git a/site/src/content/docs/reference/circuit-design.mdx b/site/src/content/docs/reference/circuit-design.mdx index 5baec99..ec9aa65 100644 --- a/site/src/content/docs/reference/circuit-design.mdx +++ b/site/src/content/docs/reference/circuit-design.mdx @@ -3,6 +3,8 @@ title: Circuit Design description: "PC817 optocoupler interface — SPICE-validated circuit for BMW I/K-Bus" --- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + BMW I/K-Bus interface for ESP32, galvanically isolated via PC817 optocouplers. Based on the [muki01/I-K_Bus](https://github.com/muki01/I-K_Bus) optocoupler schematic, modified for 3.3V ESP32 operation (R2: 470 to 220 ohm). --- @@ -43,9 +45,9 @@ Galvanic isolation is maintained across both optocouplers. The only electrical c GND Q1 emitter ──> GND ``` -Reference images in `reference/`: -- `muki01-optocoupler-schematic.png` -- original schematic from muki01 -- `muki01-transistor-schematic.png` -- non-isolated alternative (not used here) +Original schematic from [muki01/I-K_Bus](https://github.com/muki01/I-K_Bus) (R2 modified from 470 to 220 ohm for 3.3V): + +muki01 optocoupler schematic showing PC817 RX/TX paths with BC547 driver --- @@ -75,6 +77,19 @@ Test stimulus: byte `0x50` (MFL address) at 9600 baud, 8E1 framing. Bus modeled The 5.8us rise time consumes 5.6% of the 104.17us bit period at 9600 baud. Sampling at bit center (52us into the bit) sees a fully settled signal. + + + RX path waveform: V(RX) shows clean 0 to 3.13V digital levels for byte 0x50 at 9600 baud, with 5.8us rise time through PC817 emitter-follower + + ESP32 RX pin voltage. Bus HIGH (12V idle) maps to 3.13V, bus LOW maps to ~0V. Signal polarity preserved — no software inversion needed. The exponential rise/fall edges are the PC817 phototransistor charging/discharging through R4. + + + RX path waveform: V(IBUS) shows 12V bus signal for byte 0x50, square wave modulated by 100 ohm source impedance + + Bus-side voltage. The stimulus is byte `0x50` (MFL steering wheel address) driven through 100 ohm source impedance. Bus swings between ~0V (active drive) and ~11.5V (bus idle, slight sag from R1 loading). + + + --- ## TX Path (MCU to Bus via U2 + Q1) @@ -109,6 +124,19 @@ Test conditions: 3.3V VCC, R2=220 ohm, 1k ohm bus pull-up to 12V (worst realisti The 9.1us bus rise time is passive -- set by the RC time constant of the bus pull-up and parasitic capacitance. On a real BMW bus, the TH3122 transceivers in other modules provide low-impedance active drive. Actual rise times will be similar or faster. + + + TX path waveform: V(IBUS) shows bus pulled to 0.27V by optocoupler against 1k pull-up, V(TX) shows ESP32 drive signal + + V(ibus) is the bus voltage; V(tx) is the ESP32 drive signal. When TX goes HIGH, Q1 drives U2's LED, and the phototransistor pulls the bus to 0.27V. When TX goes LOW, the bus returns to 8.35V via the 1k pull-up. Note the signal inversion — TX HIGH produces bus LOW. + + + TX path waveform: RX loopback shows V(TX) drive signal and V(RX) received through U1, confirming full signal chain integrity + + Full signal chain verification. V(tx) is the ESP32 drive; V(rx) is the loopback received through U1. The RX loopback confirms end-to-end signal integrity. Note the RX signal is inverted relative to TX — the two optocouplers' inversions cancel out, but the bus-side common-emitter in U2 adds one inversion that the emitter-follower in U1 does not cancel. + + + --- ## The R2 Fix: 470 ohm to 220 ohm for 3.3V ESP32 @@ -270,25 +298,18 @@ These are approximate. The SPICE model includes a phototransistor (NPN with Bf=1 All files in `reference/`. Simulations target 9600 baud (BMW I/K-Bus) unless noted. -| File | Description | -|---|---| -| `ibus_rx_path.cir` | RX path: bus byte 0x50 at 9600 baud through U1 (PC817) to ESP32 RX. Measures V(RX) levels, LED current, rise/fall times. 3.3V VCC, 100 ohm bus source impedance. | -| `ibus_tx_path.cir` | TX path: ESP32 TX through Q1 (BC547B) and U2 (PC817) to bus. Alternating pulses, 4.7k bus pull-up. Includes U1 RX loopback. R2=220 ohm, Igain=1m. | -| `tx_validated_r2_220.cir` | TX validation: R2=220 ohm fix against worst realistic loading (1k bus pull-up). Byte 0x68 at 9600 baud. Measures bus swing, rise/fall times, Q1 Vce_sat, RX loopback. The primary validation netlist for the R2 fix. | -| `tx_sweep_r2.cir` | Parameter sweep: R2 from 100 to 470 ohm. Worst-case CTR (Igain=0.5m), 4.7k bus pull-up. Single TX pulse. Identifies R2=330 ohm as the pass/fail threshold. | -| `tx_sweep_rpull.cir` | Parameter sweep: bus pull-up from 510 to 10k ohm. R2=470 ohm (original), typical CTR (Igain=1m). Shows failure at 510 ohm, pass at 1k and above. Demonstrates why R2=470 is insufficient for loaded buses. | -| `tx_sweep_ctr.cir` | Parameter sweep: CTR grade (Igain 0.3m to 3.4m). R2=470 ohm, 1k bus pull-up. Shows PC817A (typical) is marginal, PC817B+ passes. Motivated the R2 reduction as an alternative to grade selection. | -| `opto_vs_kline_510.cir` | K-line compatibility: R2 sweep (47 to 470 ohm) against 510 ohm pull-up at 10400 baud. Typical CTR. Shows R2=220 ohm is marginal, R2=100 ohm is the minimum for K-line. | -| `opto_vs_kline_ctr.cir` | K-line compatibility: CTR grade sweep at 510 ohm pull-up, R2=100 ohm, 10400 baud. Shows worst-case PC817A fails even with aggressive R2. Confirms transistor circuit is preferred for K-line. | - -Waveform plots (SVG, from initial simulations): +All netlists are SPICE-compatible `.cir` files that can be opened directly in LTspice. They include inlined PC817 subcircuit models — no external library dependencies. | File | Description | |---|---| -| `rx_path_vibus.svg` | Bus voltage waveform during RX simulation | -| `rx_path_vrx.svg` | ESP32 RX pin voltage during RX simulation | -| `tx_path_vibus.svg` | Bus voltage waveform during TX simulation | -| `tx_path_vrx_loopback.svg` | RX loopback voltage during TX simulation | +| [`ibus_rx_path.cir`](/spice/ibus_rx_path.cir) | RX path: bus byte 0x50 at 9600 baud through U1 to ESP32 RX. 3.3V VCC, 100 ohm bus source impedance. | +| [`ibus_tx_path.cir`](/spice/ibus_tx_path.cir) | TX path: ESP32 TX through Q1 and U2 to bus. Alternating pulses, 4.7k bus pull-up. Includes RX loopback. | +| [`tx_validated_r2_220.cir`](/spice/tx_validated_r2_220.cir) | **Primary validation netlist.** R2=220 ohm against 1k bus pull-up. Byte 0x68 at 9600 baud. | +| [`tx_sweep_r2.cir`](/spice/tx_sweep_r2.cir) | Sweep: R2 from 100 to 470 ohm. Worst-case CTR (Igain=0.5m), 4.7k bus. | +| [`tx_sweep_rpull.cir`](/spice/tx_sweep_rpull.cir) | Sweep: bus pull-up from 510 to 10k ohm. R2=470 ohm (original), typical CTR. | +| [`tx_sweep_ctr.cir`](/spice/tx_sweep_ctr.cir) | Sweep: CTR grade (Igain 0.3m to 3.4m). R2=470 ohm, 1k bus. | +| [`opto_vs_kline_510.cir`](/spice/opto_vs_kline_510.cir) | K-line: R2 sweep at 510 ohm pull-up, 10400 baud. | +| [`opto_vs_kline_ctr.cir`](/spice/opto_vs_kline_ctr.cir) | K-line: CTR sweep at 510 ohm, R2=100 ohm, 10400 baud. | --- diff --git a/site/src/styles/custom.css b/site/src/styles/custom.css index 169de79..9e56003 100644 --- a/site/src/styles/custom.css +++ b/site/src/styles/custom.css @@ -28,3 +28,23 @@ table { th { white-space: nowrap; } + +/* Waveform SVG plots */ +.waveform-plot { + width: 100%; + border: 1px solid var(--sl-color-gray-5); + border-radius: 6px; + background: white; +} + +:root[data-theme='dark'] .waveform-plot { + filter: invert(0.88) hue-rotate(180deg); + border-color: var(--sl-color-gray-4); +} + +/* Reference schematic image */ +.schematic-img { + border: 1px solid var(--sl-color-gray-5); + border-radius: 6px; + margin-block: 1rem; +}