trunk/nl_examples/congo_bongo.c
| r248576 | r248577 | |
| 34 | 34 | // .END |
| 35 | 35 | |
| 36 | 36 | SOLVER(Solver, 24000) |
| 37 | | PARAM(Solver.ACCURACY, 1e-9) |
| 38 | | PARAM(Solver.NR_LOOPS, 90) |
| 37 | PARAM(Solver.ACCURACY, 1e-8) |
| 38 | PARAM(Solver.NR_LOOPS, 150) |
| 39 | 39 | PARAM(Solver.SOR_FACTOR, 0.001) |
| 40 | 40 | PARAM(Solver.GS_LOOPS, 1) |
| 41 | 41 | //PARAM(Solver.GS_THRESHOLD, 99) |
| r248576 | r248577 | |
| 80 | 80 | */ |
| 81 | 81 | PARAM(XU16.B.MODEL, "MB3614(UGF=11k)") |
| 82 | 82 | PARAM(XU17.C.MODEL, "MB3614(UGF=11k)") |
| 83 | | //PARAM(XU16.B.MODEL, "MB3614_SLOW") |
| 84 | | //PARAM(XU17.C.MODEL, "MB3614_SLOW") |
| 85 | 83 | |
| 84 | PARAM(XU17.A.MODEL, "MB3614(TYPE=1)") |
| 85 | PARAM(XU17.B.MODEL, "MB3614(TYPE=1)") |
| 86 | PARAM(XU17.D.MODEL, "MB3614(TYPE=1)") |
| 87 | |
| 88 | //PARAM(XU16.A.MODEL, "MB3614(TYPE=1)") |
| 89 | PARAM(XU16.C.MODEL, "MB3614(TYPE=1)") |
| 90 | PARAM(XU16.D.MODEL, "MB3614(TYPE=1)") |
| 91 | |
| 92 | #if 0 |
| 93 | PARAM(XU13.A.MODEL, "MB3614(TYPE=1)") |
| 94 | PARAM(XU13.B.MODEL, "MB3614(TYPE=1)") |
| 95 | PARAM(XU13.C.MODEL, "MB3614(TYPE=1)") |
| 96 | PARAM(XU13.D.MODEL, "MB3614(TYPE=1)") |
| 97 | #endif |
| 98 | |
| 86 | 99 | OPTIMIZE_FRONTIER(C51.1, RES_K(20), 50) |
| 87 | 100 | OPTIMIZE_FRONTIER(R77.2, RES_K(20), 50) |
| 88 | 101 | |
trunk/src/emu/netlist/analog/nld_opamps.c
| r248576 | r248577 | |
| 42 | 42 | |
| 43 | 43 | /* |
| 44 | 44 | * Type = 0: Impedance changer |
| 45 | | * 1; Ideal opamp |
| 45 | * 1; Idealized opamp |
| 46 | 46 | * 2; opamp with first pole |
| 47 | 47 | * 3: opamp with first pole + output limit |
| 48 | 48 | * 4: opamp with input stage, first pole + output limit |
| r248576 | r248577 | |
| 50 | 50 | |
| 51 | 51 | NETLIB_START(OPAMP) |
| 52 | 52 | { |
| 53 | | register_sub("RP1", m_RP); |
| 54 | | register_sub("CP1", m_CP); |
| 55 | | register_sub("G1", m_G1); |
| 56 | | register_sub("EBUF", m_EBUF); |
| 57 | | register_sub("DN", m_DN); |
| 58 | | register_sub("DP", m_DP); |
| 53 | register_param("MODEL", m_model, ""); |
| 59 | 54 | |
| 55 | m_type = m_model.model_value("TYPE"); |
| 56 | |
| 60 | 57 | register_input("VCC", m_VCC); |
| 61 | 58 | register_input("GND", m_GND); |
| 62 | 59 | |
| r248576 | r248577 | |
| 64 | 61 | register_output("VH", m_VH); |
| 65 | 62 | register_output("VREF", m_VREF); |
| 66 | 63 | |
| 67 | | register_param("MODEL", m_model, ""); |
| 64 | register_sub("G1", m_G1); |
| 65 | register_sub("RP1", m_RP); |
| 68 | 66 | |
| 69 | | m_type = m_model.model_value("TYPE"); |
| 67 | if (m_type == 1) |
| 68 | { |
| 69 | register_subalias("PLUS", "G1.IP"); |
| 70 | register_subalias("MINUS", "G1.IN"); |
| 71 | register_subalias("OUT", "G1.OP"); |
| 70 | 72 | |
| 71 | | if (m_type == 3) |
| 73 | connect_late("G1.ON", "VREF"); |
| 74 | connect_late("RP1.2", "VREF"); |
| 75 | connect_late("RP1.1", "G1.OP"); |
| 76 | |
| 77 | } |
| 78 | else if (m_type == 3) |
| 72 | 79 | { |
| 80 | register_sub("CP1", m_CP); |
| 81 | register_sub("EBUF", m_EBUF); |
| 82 | register_sub("DN", m_DN); |
| 83 | register_sub("DP", m_DP); |
| 84 | |
| 73 | 85 | register_subalias("PLUS", "G1.IP"); |
| 74 | 86 | register_subalias("MINUS", "G1.IN"); |
| 75 | 87 | register_subalias("OUT", "EBUF.OP"); |
| r248576 | r248577 | |
| 111 | 123 | |
| 112 | 124 | NETLIB_RESET(OPAMP) |
| 113 | 125 | { |
| 114 | | m_EBUF.do_reset(); |
| 115 | 126 | m_G1.do_reset(); |
| 116 | | m_DP.do_reset(); |
| 117 | | m_DN.do_reset(); |
| 118 | | m_CP.do_reset(); |
| 119 | | m_RP.do_reset(); |
| 120 | | |
| 121 | | m_EBUF.m_G.setTo(1.0); |
| 122 | 127 | m_G1.m_RI.setTo(m_model.model_value("RI")); |
| 123 | | m_EBUF.m_RO.setTo(m_model.model_value("RO")); |
| 124 | | m_DP.m_model.setTo("D(IS=1e-15 N=1)"); |
| 125 | | m_DN.m_model.setTo("D(IS=1e-15 N=1)"); |
| 126 | 128 | |
| 127 | | double CP = m_model.model_value("DAB") / m_model.model_value("SLEW"); |
| 128 | | double RP = 0.5 / 3.1459 / CP / m_model.model_value("FPF"); |
| 129 | | double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RP; |
| 129 | if (m_type == 1) |
| 130 | { |
| 131 | double RO = m_model.model_value("RO"); |
| 132 | double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RO; |
| 133 | m_RP.set_R(RO); |
| 134 | m_G1.m_G.setTo(G); |
| 135 | } |
| 136 | else if (m_type == 3) |
| 137 | { |
| 138 | m_EBUF.do_reset(); |
| 139 | m_DP.do_reset(); |
| 140 | m_DN.do_reset(); |
| 141 | m_CP.do_reset(); |
| 142 | m_RP.do_reset(); |
| 130 | 143 | |
| 131 | | //printf("CP=%e RP=%f G=%f\n", CP, RP, G); |
| 132 | | m_CP.m_C.setTo(CP); |
| 133 | | m_RP.set_R(RP); |
| 134 | | m_G1.m_G.setTo(G); |
| 144 | m_EBUF.m_G.setTo(1.0); |
| 145 | m_EBUF.m_RO.setTo(m_model.model_value("RO")); |
| 146 | m_DP.m_model.setTo("D(IS=1e-15 N=1)"); |
| 147 | m_DN.m_model.setTo("D(IS=1e-15 N=1)"); |
| 135 | 148 | |
| 149 | double CP = m_model.model_value("DAB") / m_model.model_value("SLEW"); |
| 150 | double RP = 0.5 / 3.1459 / CP / m_model.model_value("FPF"); |
| 151 | double G = m_model.model_value("UGF") / m_model.model_value("FPF") / RP; |
| 152 | |
| 153 | //printf("CP=%e RP=%f G=%f\n", CP, RP, G); |
| 154 | m_CP.m_C.setTo(CP); |
| 155 | m_RP.set_R(RP); |
| 156 | m_G1.m_G.setTo(G); |
| 157 | |
| 158 | } |
| 159 | |
| 160 | |
| 136 | 161 | } |
| 137 | 162 | |
| 138 | 163 | NETLIB_UPDATE_PARAM(OPAMP) |