mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
netlist: LM3900
- Align LM3900 pin names with other opamps - Add a better voltage clamping model - Add high precision model (disabled due to performance)
This commit is contained in:
parent
8459b00d4e
commit
065f52438f
@ -3,6 +3,13 @@
|
||||
#include "nlm_opamp.h"
|
||||
#include "netlist/devices/net_lib.h"
|
||||
|
||||
/*
|
||||
* 0 = Basic hack (Norton with just amplification, no voltage cutting)
|
||||
* 1 = Model from LTSPICE list - slow!
|
||||
* 2 = Simplified model using diode inputs and netlist TYPE=3
|
||||
*/
|
||||
#define USE_LM3900_MODEL (2)
|
||||
|
||||
/*
|
||||
* Generic layout with 4 opamps, VCC on pin 4 and GND on pin 11
|
||||
*/
|
||||
@ -195,6 +202,7 @@ static NETLIST_START(LM747A_DIP)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
#if USE_LM3900_MODEL == 0
|
||||
static NETLIST_START(LM3900)
|
||||
|
||||
/*
|
||||
@ -206,8 +214,8 @@ static NETLIST_START(LM3900)
|
||||
ALIAS(PLUS, R1.1) // Positive input
|
||||
ALIAS(MINUS, R2.1) // Negative input
|
||||
ALIAS(OUT, G1.OP) // Opamp output ...
|
||||
ALIAS(VM, G1.ON) // V- terminal
|
||||
ALIAS(VP, DUMMY.I) // V+ terminal
|
||||
ALIAS(VCC, G1.ON) // V- terminal
|
||||
ALIAS(GND, DUMMY.I) // V+ terminal
|
||||
|
||||
DUMMY_INPUT(DUMMY)
|
||||
|
||||
@ -224,7 +232,79 @@ static NETLIST_START(LM3900)
|
||||
PARAM(G1.RO, RES_K(8))
|
||||
|
||||
NETLIST_END()
|
||||
#endif
|
||||
|
||||
#if USE_LM3900_MODEL == 1
|
||||
// LTSPICE MODEL OF LM3900 FROM NATIONAL SEMICONDUCTOR
|
||||
// MADE BY HELMUT SENNEWALD, 8/6/2004
|
||||
// THE LM3900 IS A SO CALLED NORTON AMPLIFIER.
|
||||
//
|
||||
// PIN ORDER: IN+ IN- VCC VSS OUT
|
||||
static NETLIST_START(LM3900)
|
||||
PARAM(E1.G, 0.5)
|
||||
//ALIAS(IN+, Q2.B)
|
||||
//ALIAS(IN-, Q2.C)
|
||||
//ALIAS(VCC, Q10.C)
|
||||
//ALIAS(VSS, Q2.E)
|
||||
|
||||
ALIAS(PLUS, Q2.B)
|
||||
ALIAS(MINUS, Q2.C)
|
||||
ALIAS(VCC, Q10.C)
|
||||
ALIAS(GND, Q2.E)
|
||||
ALIAS(OUT, Q6.C)
|
||||
|
||||
//CS(B1/*I=LIMIT(0, V(VCC,VSS)/10K, 0.2m)*/)
|
||||
CS(B1, 2e-4)
|
||||
CAP(C1, CAP_P(6.000000))
|
||||
VCVS(E1)
|
||||
QBJT_EB(Q1, "LM3900_NPN1")
|
||||
QBJT_EB(Q10, "LM3900_NPN1")
|
||||
QBJT_EB(Q11, "LM3900_NPN1")
|
||||
QBJT_EB(Q12, "LM3900_NPN1")
|
||||
QBJT_EB(Q2, "LM3900_NPN1")
|
||||
QBJT_EB(Q3, "LM3900_NPN1")
|
||||
QBJT_EB(Q4, "LM3900_PNP1")
|
||||
QBJT_EB(Q5, "LM3900_PNP1")
|
||||
QBJT_EB(Q6, "LM3900_PNP1")
|
||||
QBJT_EB(Q7, "LM3900_PNP1")
|
||||
QBJT_EB(Q8, "LM3900_NPN1")
|
||||
QBJT_EB(Q9, "LM3900_NPN1")
|
||||
RES(R1, RES_K(2.000000))
|
||||
RES(R6, RES_K(1.600000))
|
||||
NET_C(Q11.B, Q12.B, R6.2)
|
||||
NET_C(Q5.C, Q5.B, B1.P, Q4.B)
|
||||
NET_C(Q8.C, Q8.B, B1.N, R1.1, E1.IP)
|
||||
NET_C(Q9.B, R1.2)
|
||||
NET_C(R6.1, E1.OP)
|
||||
NET_C(Q10.C, Q5.E, Q4.E, Q11.C, Q12.C)
|
||||
NET_C(Q2.C, Q3.B, Q12.E)
|
||||
NET_C(Q2.E, Q3.E, Q9.E, C1.2, Q1.E, Q8.E, E1.ON, E1.IN, Q7.C)
|
||||
NET_C(Q3.C, Q6.B, C1.1, Q7.B)
|
||||
NET_C(Q6.E, Q10.B, Q4.C)
|
||||
NET_C(Q6.C, Q10.E, Q9.C, Q7.E)
|
||||
NET_C(Q2.B, Q1.C, Q1.B, Q11.E)
|
||||
NETLIST_END()
|
||||
#endif
|
||||
|
||||
#if USE_LM3900_MODEL == 2
|
||||
static NETLIST_START(LM3900)
|
||||
OPAMP(A, "LM3900")
|
||||
|
||||
DIODE(D1, "D")
|
||||
DIODE(D2, "D")
|
||||
|
||||
ALIAS(VCC, A.VCC)
|
||||
ALIAS(GND, A.GND)
|
||||
ALIAS(MINUS, A.MINUS)
|
||||
ALIAS(PLUS, A.PLUS)
|
||||
ALIAS(OUT, A.OUT)
|
||||
|
||||
NET_C(D1.A, A.PLUS)
|
||||
NET_C(D2.A, A.MINUS)
|
||||
NET_C(D1.K, D2.K, A.MINUS)
|
||||
|
||||
NETLIST_END()
|
||||
#endif
|
||||
|
||||
NETLIST_START(OPAMP_lib)
|
||||
LOCAL_LIB_ENTRY(opamp_layout_4_4_11)
|
||||
@ -240,7 +320,12 @@ NETLIST_START(OPAMP_lib)
|
||||
NET_MODEL("UA741 OPAMP(TYPE=3 VLH=1.0 VLL=1.0 FPF=5 UGF=1000k SLEW=0.5M RI=2000k RO=75 DAB=0.0017)")
|
||||
NET_MODEL("LM747 OPAMP(TYPE=3 VLH=1.0 VLL=1.0 FPF=5 UGF=1000k SLEW=0.5M RI=2000k RO=50 DAB=0.0017)")
|
||||
NET_MODEL("LM747A OPAMP(TYPE=3 VLH=2.0 VLL=2.0 FPF=5 UGF=1000k SLEW=0.7M RI=6000k RO=50 DAB=0.0015)")
|
||||
NET_MODEL("LM3900 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=2k UGF=4M SLEW=0.5M RI=1M RO=2k DAB=0.0015)")
|
||||
|
||||
#if USE_LM3900_MODEL == 1
|
||||
NET_MODEL("LM3900_NPN1 NPN(IS=1E-14 BF=150 TF=1E-9 CJC=1E-12 CJE=1E-12 VAF=150 RB=100 RE=5 IKF=0.002)")
|
||||
NET_MODEL("LM3900_PNP1 PNP(IS=1E-14 BF=40 TF=1E-7 CJC=1E-12 CJE=1E-12 VAF=150 RB=100 RE=5)")
|
||||
#endif
|
||||
LOCAL_LIB_ENTRY(MB3614_DIP)
|
||||
LOCAL_LIB_ENTRY(LM324_DIP)
|
||||
LOCAL_LIB_ENTRY(LM358_DIP)
|
||||
|
@ -69,8 +69,8 @@ NETLIST_START(zac1b11142_schematics)
|
||||
NET_C(R104.2, U5C3.OUT, R105.1)
|
||||
NET_C(R102.1, U5C3.PLUS)
|
||||
NET_C(R103.2, R102.2, R84.1)
|
||||
NET_C(VCC, R126.1, R103.1, U5C1.VP, U5C2.VP, U5C3.VP)
|
||||
NET_C(GND, R133.2, C63.2, R132.2, R120.2, R129.2, R127.2, R121.2, C61.2, R84.2, U5C1.VM, U5C2.VM, U5C3.VM)
|
||||
NET_C(VCC, R126.1, R103.1, U5C1.VCC, U5C2.VCC, U5C3.VCC)
|
||||
NET_C(GND, R133.2, C63.2, R132.2, R120.2, R129.2, R127.2, R121.2, C61.2, R84.2, U5C1.GND, U5C2.GND, U5C3.GND)
|
||||
ALIAS(RULLANTE, R124.2)
|
||||
ALIAS(CASSA, R105.2)
|
||||
|
||||
@ -110,8 +110,8 @@ NETLIST_START(zac1b11142_schematics)
|
||||
NET_C(C45.2, R85.2, U5C4.OUT, R106.1)
|
||||
NET_C(R86.1, U5C4.PLUS)
|
||||
NET_C(R87.2, R86.2, R88.1)
|
||||
NET_C(VCC, R101.1, R87.1, U5B4.VP, U5C4.VP)
|
||||
NET_C(GND, R46.2, R100.2, C54.2, R88.2, U5B4.VM, U5C4.VM)
|
||||
NET_C(VCC, R101.1, R87.1, U5B4.VCC, U5C4.VCC)
|
||||
NET_C(GND, R46.2, R100.2, C54.2, R88.2, U5B4.GND, U5C4.GND)
|
||||
ALIAS(BASSO, R106.2)
|
||||
|
||||
|
||||
@ -170,8 +170,8 @@ NETLIST_START(zac1b11142_schematics)
|
||||
NET_C(C49.2, R107.2, U5B2.OUT, R90.1)
|
||||
NET_C(R93.1, U5B2.PLUS)
|
||||
NET_C(R92.2, R93.2, R91.1)
|
||||
NET_C(VCC, R92.1, U5B2.VP)
|
||||
NET_C(GND, R78.2, R91.2, U5B2.VM)
|
||||
NET_C(VCC, R92.1, U5B2.VCC)
|
||||
NET_C(GND, R78.2, R91.2, U5B2.GND)
|
||||
ALIAS(PIANO, R90.2)
|
||||
|
||||
|
||||
@ -212,8 +212,8 @@ NETLIST_START(zac1b11142_schematics)
|
||||
NET_C(R112.2, U5D.1, C50.1, R113.1, U5B1.MINUS)
|
||||
NET_C(R95.2, U5B1.PLUS)
|
||||
NET_C(U5D.2, C50.2, R113.2, U5B1.OUT, R96.1)
|
||||
NET_C(VCC, R64.1, R65.1, R94.1, R110.1, U5B1.VP)
|
||||
NET_C(GND, R66.2, C28.2, R40.2, T6.E, C37.2, R108.2, R111.2, U5B1.VM, U4A1.GND)
|
||||
NET_C(VCC, R64.1, R65.1, R94.1, R110.1, U5B1.VCC)
|
||||
NET_C(GND, R66.2, C28.2, R40.2, T6.E, C37.2, R108.2, R111.2, U5B1.GND, U4A1.GND)
|
||||
ALIAS(TROMBA, R96.2)
|
||||
|
||||
|
||||
@ -242,7 +242,7 @@ NETLIST_START(zac1b11142_schematics)
|
||||
TTL_74156_DIP(U4B) // FIXME: should be a 74LS156 (lower sink capability)
|
||||
LM3900(U5B3)
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
NET_C(RULLANTE, CASSA, BASSO, R82.2, /*R80.2,*/ PIANO, C40.1, R77.1)
|
||||
#else
|
||||
// cassa swamps the other instruments if it's connected - just ground it for now
|
||||
@ -270,17 +270,19 @@ NETLIST_START(zac1b11142_schematics)
|
||||
NET_C(R45.2, T7.C)
|
||||
NET_C(T7.B, R68.1)
|
||||
NET_C(R68.2, LEVEL)
|
||||
NET_C(VCC, R119.1, U4B.16, U5B3.VP)
|
||||
NET_C(VCC, R119.1, U4B.16, U5B3.VCC)
|
||||
NET_C(GND, P1.3, T7.E, R117.1, U4B.2, U4B.8, U4B.14)
|
||||
NET_C(GND, U5B3.VM)
|
||||
NET_C(GND, U5B3.GND)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
|
||||
NETLIST_START(zac1b11142)
|
||||
|
||||
//SOLVER(Solver, 48000)
|
||||
SOLVER(Solver, 48000)
|
||||
PARAM(Solver.ACCURACY, 1e-10)
|
||||
//PARAM(Solver.ACCURACY, 1e-10)
|
||||
PARAM(Solver.ACCURACY, 1e-7)
|
||||
PARAM(Solver.NR_LOOPS, 300)
|
||||
PARAM(Solver.METHOD, "MAT_CR")
|
||||
PARAM(Solver.PARALLEL, 0)
|
||||
|
Loading…
Reference in New Issue
Block a user