diff options
author | 2017-01-10 23:08:57 +0100 | |
---|---|---|
committer | 2017-01-12 23:20:22 +0100 | |
commit | c8c7e9a770a525a63a0f40bccdf0489966cfdc25 (patch) | |
tree | 046e3fcacc78d68483f56d3e4850fea79f55235d /nl_examples/opamp.c | |
parent | 5b4026d13fd1f619617ba8ce94628406416019fd (diff) |
Fix timing issue in CD4538. Add "pow" (power) to the function model.
Minor documentation updates. Slight improvement of gorilla sound. (nw)
Diffstat (limited to 'nl_examples/opamp.c')
-rw-r--r-- | nl_examples/opamp.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/nl_examples/opamp.c b/nl_examples/opamp.c index 7e62d405b01..d3dc80f76a9 100644 --- a/nl_examples/opamp.c +++ b/nl_examples/opamp.c @@ -97,3 +97,91 @@ NETLIST_START(opamp) NET_C(EBUF.IP, RP1.1) NETLIST_END() + +NETLIST_START(opamp_mod) + + /* Opamp model from + * + * http://www.ecircuitcenter.com/Circuits/opmodel1/opmodel1.htm + * + * MB3614 Unit Gain frequency is about 500 kHz and the first pole frequency + * about 5 Hz. We have to keep the Unity Gain Frequency below our sampling + * frequency of 24 Khz. + * + * Simple Opamp Model Calculation + * + * First Pole Frequency 5 Hz + * Unity Gain Frequency 11,000 Hz + * RP 100,000 Ohm + * DC Gain / Aol 2200 + * CP 0.318 uF + * KG 0.022 + * + */ + + /* Terminal definitions for calling netlists */ + + ALIAS(PLUS, G1.IP) // Positive input + ALIAS(MINUS, G1.IN) // Negative input + ALIAS(OUT, EBUF.OP) // Opamp output ... + + AFUNC(fUH, 1, "A0 1.2 -") + AFUNC(fUL, 1, "A0 1.2 +") + + ALIAS(VCC, fUH.A0) // VCC terminal + ALIAS(GND, fUL.A0) // VGND terminal + + AFUNC(fVREF, 2, "A0 A1 + 0.5 *") + NET_C(fUH.A0, fVREF.A0) + NET_C(fUL.A0, fVREF.A1) + + NET_C(EBUF.ON, fVREF) + /* The opamp model */ + + LVCCS(G1) + PARAM(G1.RI, RES_K(1000)) +#if 0 + PARAM(G1.G, 0.0022) + RES(RP1, 1e6) + CAP(CP1, 0.0318e-6) +#else + PARAM(G1.G, 0.002) + PARAM(G1.CURLIM, 0.002) + RES(RP1, 9.5e6) + CAP(CP1, 0.0033e-6) +#endif + VCVS(EBUF) + PARAM(EBUF.RO, 50) + PARAM(EBUF.G, 1) + + NET_C(G1.ON, fVREF) + NET_C(RP1.2, fVREF) + NET_C(CP1.2, fVREF) + NET_C(EBUF.IN, fVREF) + + NET_C(RP1.1, G1.OP) + NET_C(CP1.1, RP1.1) + + DIODE(DP,"D(IS=1e-15 N=1)") + DIODE(DN,"D(IS=1e-15 N=1)") +#if 1 + NET_C(DP.K, fUH.Q) + NET_C(fUL.Q, DN.A) + NET_C(DP.A, DN.K, RP1.1) +#else + /* + * This doesn't add any performance by decreasing iteration loops. + * To the contrary, it significantly decreases iterations + */ + RES(RH1, 0.1) + RES(RL1, 0.1) + NET_C(DP.K, RH1.1) + NET_C(RH1.2, fUH.Q) + NET_C(fUL.Q, RL1.1) + NET_C(RL1.2, DN.A) + NET_C(DP.A, DN.K, RP1.1) + +#endif + NET_C(EBUF.IP, RP1.1) + +NETLIST_END() |