From e6fc5ad4e9efd64787e06b206c1375013f6b0791 Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Fri, 13 Feb 2026 02:18:20 -0700 Subject: [PATCH] K-line compatibility analysis: optocoupler vs 510 ohm pull-up R2 sweep (47-470 ohm) and CTR grade sweep at ISO 9141 minimum bus impedance. R2<=100 ohm works; BMW's R2=220 does not. Confirms transistor design is better fit for OBD-II K-line. --- reference/opto_vs_kline_510.cir | 70 +++++++++++++++++++++++++++++++++ reference/opto_vs_kline_ctr.cir | 64 ++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 reference/opto_vs_kline_510.cir create mode 100644 reference/opto_vs_kline_ctr.cir diff --git a/reference/opto_vs_kline_510.cir b/reference/opto_vs_kline_510.cir new file mode 100644 index 0000000..d48b964 --- /dev/null +++ b/reference/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/reference/opto_vs_kline_ctr.cir b/reference/opto_vs_kline_ctr.cir new file mode 100644 index 0000000..74e5c66 --- /dev/null +++ b/reference/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