大熊 正さんへのお返事です。
理想的なオペアンプの計算
仮想の素子を考える(図2)
・ナレータ
①V+とV-との電位は同じ(イマージナリーショート)
②V+とV-とには電流が流れない(入力抵抗が無限大)
・ノレータ
③Voからは必要な電流が供給される(両方向)
これを適用すると、図3は、図1の等価回路になると思います。
この図3の回路図で節点方程式を考えます。
通常、Voは固定値とするが、アンプにより確定できません。(Vo=K*e2、e2は節点②の電位)
そこで、アンプの入力を出力に反映させて(反復計算で)収束させます。
プログラムは図1のようなアンプを含んだ回路図で計算できるように
以前紹介した節点電位法のものを改良してあります。
1000 !節点電位法によるフィルタ回路の周波数解析(利得、位相)
1010
1020 OPTION ARITHMETIC COMPLEX
1030
1040 LET j=SQR(-1) !虚数単位 ※電気系はjを使う
1050
1060 LET f=60 !周波数[Hz]
1070 DEF w=2*PI*f !角周波数ω
1080
1090 DEF H2Ohm(L)=j*w*L ![H]を[Ω]へ
1100 DEF F2Ohm(C)=1/(j*w*C) ![F]を[Ω]へ
1110 DEF xL(L)=w*L !誘導リアクタンス
1120 DEF xC(C)=1/(w*C) !容量リアクタンス
1130
1140 SUB DispS(z) !複素数をS表示する ※スタインメッツ(Steinmetz)
1150 PRINT ABS(z);
1160 IF ABS(z)<>0 THEN
1170 IF arg(z)<>0 THEN PRINT "∠";DEG(arg(z));"°";
1180 END IF
1190 !PRINT
1200 END SUB
1210
1220 FUNCTION S2COMPLEX(l,th) !S表示(極座標形式)を複素数へ
1230 LET S2COMPLEX=COMPLEX(l*COS(RAD(th)),l*SIN(RAD(th)))
1240 END FUNCTION
1250 FUNCTION i2COMPLEX(im,th) !瞬時値式を複素数へ ※最大値、初期位相
1260 LET i2COMPLEX=S2COMPLEX(im/SQR(2),th) !実効値、初期位相
1270 END FUNCTION
1280 !-------------------- ここまでがサブルーチン
1290
1300
1310 SUB set_curcit !素子や結線を定義する
1320 !---------- ↓↓↓↓↓ ----------
1330
1340 !●回路図 Sallen-Key 3次ローパス・フィルタ
1350
1360 !参考サイト http://sim.okawa-denshi.jp/OPseikiLowkeisan.htm
1370
1380 ! ┌─C2─┬──────┐
1390 ! │ │ ┌──┐ │
1400 ! │ └─┤- │ │
1410 ! │ │ K├─6─
1420 ! ─2─R1─3─R2─4─R3─5─┤+ │ ↑
1430 ! ↑ │ │ └──┘ │
1440 ! Vi C1 C3 Vo
1450 ! ↓ │ │ ↓
1460 ! ─1───┴───────┴──────┴─
1470 ! │
1480 ! ≡アース
1490
1500 LET GND=1 !アース
1510 LET Vi=2 !入力端子
1520 LET Vo=6 !出力端子
1530
1540 !素子: Rn,Vn,In、n:番号(連番) ※2文字目以降は番号
1550 !値:
1560 !端子番号(起点): 1以上の値 ※節点
1570 !端子番号: 1以上の値 ※節点
1580
1590 CALL AddElements("R1",51e3,2,3) !51k[Ω]、枝路電流は2→3と仮定する
1600 CALL AddElements("C1",F2Ohm(0.0068e-6),3,1) !0.0068[μF]
1610 CALL AddElements("R2",82e3,3,4) !82k[Ω]
1620 CALL AddElements("C2",F2Ohm(0.022e-6),4,6) !0.022[μF]
1630 CALL AddElements("R3",39e3,4,5) !39k[Ω]
1640 CALL AddElements("C3",F2Ohm(330e-12),5,1) !330[pF]
1650
1660 !※電圧源の番号は1からの連番 例. CALL AddElements("V1",?,?,?) !?[V]
1670 !なし
1680
1690 CALL AddElements("A1",1.0,5,6) !アンプ 増幅率1.0,+端子5,出力端子6
1700
1710 !---------- ↑↑↑↑↑ ----------
1720
1730 CALL AddElements("Vi",10,GND,Vi) !10[V] ※測定用の電圧
1740 END SUB
1750
1760 !---------- ↓↓↓↓↓ ----------
1770 LET Ns=0 !電圧源の数
1780 LET Nd=6 !節点の数
1790 LET Na=1 !アンプの数
1800 !---------- ↑↑↑↑↑ ----------
1810
1820 LET N=Nd+Ns+Na+1
1830
1840 !●キルヒホッフの電流則より、節点方程式を組み立てる
1850 DIM A(N,N),x(N),b(N) !連立方程式 Ax=b
1860
1870 DIM AmpK(Na),AmpPlus(Na),AmpOut(Na)
1880
1890 SUB AddElements(el$,ev,nd1,nd2) !結線情報から回路方程式を組み立てる
1900 IF (nd1<1 OR nd1>Nd) OR (nd2<1 OR nd2>Nd) THEN
1910 PRINT "素子";el$;"の節点番号が違います。";nd1;nd2
1920 STOP
1930 END IF
1940
1950 !連立方程式を組み立てる Ax=b
1960 ! ┌ │ ┐┌ ┐ ┌ ┐
1970 ! │G │±1││V │=│I │ R,C,L,電流源(Nd個)
1980 !───┼─────────
1990 ! │±1│-Zp││Ip│ │Ep│ 電圧源(Ns個)、アンプ(Na個)、入力電圧源(1個)
2000 ! └ │ ┘└ ┘ └ ┘
2010
2020 SELECT CASE UCASE$(el$(1:1)) !素子に応じて
2030 CASE "V" !電圧源なら
2040 LET t$=UCASE$(el$(2:LEN(el$)))
2050 IF t$="I" THEN !計測用の入力電圧源なら
2060 LET p=Nd+Ns+Na+1
2070 ELSE
2080 LET p=VAL(t$) !番号を得る
2090 IF p<1 OR p>Ns THEN
2100 PRINT "電圧源の番号が違います。";el$
2110 STOP
2120 END IF
2130 LET p=p+Nd
2140 END IF
2150 LET A(nd1,p)=A(nd1,p)-1 !電流Ipが節点iから節点jへ流れたとして、(Vi-Vj)-Ip*Zp=Ep
2160 LET A(p,nd1)=A(p,nd1)-1
2170 LET A(nd2,p)=A(nd2,p)+1
2180 LET A(p,nd2)=A(p,nd2)+1
2190 LET A(p,p)=A(p,p)+0 !内部抵抗Zpは0とする
2200 LET b(p)=b(p)+ev !起電力
2210
2220 CASE "A" !アンプなら
2230 LET t=VAL(el$(2:LEN(el$))) !番号を得る
2240 IF t<1 OR t>Na THEN
2250 PRINT "アンプの番号が違います。";el$
2260 STOP
2270 END IF
2280 LET p=t+Nd+Ns !出力側をノレータ(初期値0Vの電圧源)として扱う
2290 LET A(GND,p)=A(GND,p)-1
2300 LET A(p,GND)=A(p,GND)-1
2310 LET A(nd2,p)=A(nd2,p)+1
2320 LET A(p,nd2)=A(p,nd2)+1
2330
2340 LET AmpK(t)=ev !増幅率
2350 LET AmpPlus(t)=nd1 !+端子
2360 LET AmpOut(t)=p !方程式内での出力端子
2370
2380 CASE "I" !電流源なら
2390 LET b(nd1)=b(nd1)-ev
2400 LET b(nd2)=b(nd2)+ev
2410
2420 CASE ELSE !素子なら
2430 LET Gij=1/ev
2440 !対角成分 ※節点に接続された素子(アドミタンス)の和
2450 LET A(nd1,nd1)=A(nd1,nd1)+Gij
2460 LET A(nd2,nd2)=A(nd2,nd2)+Gij
2470 !その他の成分 ※節点に接続された素子(アドミタンス)に-1をかけたものの和
2480 LET A(nd1,nd2)=A(nd1,nd2)-Gij
2490 LET A(nd2,nd1)=A(nd2,nd1)-Gij
2500
2510 END SELECT
2520 END SUB
2530
2540 DIM Ai(N,N) !連立方程式を解く
2550 SUB routine
2560 MAT A=ZER
2570 MAT b=ZER
2580 CALL set_curcit !結線から方程式を組み立てる
2590
2600 FOR i=1 TO Nd !結線されていない節点 1*Vi=0
2610 IF A(i,i)=0 THEN LET A(i,i)=1
2620 NEXT i
2630 LET A(GND,GND)=0 !電位を0とする
2640
2650 !!!MAT PRINT A; !dump it
2660 !!!MAT PRINT b;
2670
2680
2690 MAT Ai=INV(A)
2700 MAT x=Ai*b
2710 IF Na>0 THEN !アンプがあれば
2720 FOR iter=1 TO 100 !安定させる ※要調整
2730 FOR i=1 TO Na
2740 LET b(AmpOut(i))=AmpK(i)*x(AmpPlus(i)) !Vo=K*V+ ※入力を出力に反映させる
2750 NEXT i
2760 MAT x=Ai*b
2770 NEXT iter
2780 END IF
2790 END SUB
2800
2810
2820
2830 !SET bitmap SIZE 600,600 !画面を大きくする
2840 LET ymin=-150
2850 SET WINDOW -0.5,6.5, ymin,5 !表示領域
2860 DRAW grid(1,5) !左端の目盛り
2870
2880 FOR f=1 TO 6 !x軸が対数
2890 PLOT TEXT ,AT f-0.3,-0.15: mid$("10 100 1k 10k 100k1M ",4*(f-1)+1,4)
2900 NEXT f
2910
2920 FOR f=10 TO 100000 STEP 100 !周波数[Hz]
2930 CALL routine
2940 PLOT LINES: LOG10(f),20*LOG10(ABS(x(Vo)/x(Vi))); !利得[dB]
2950 NEXT f
2960 PLOT LINES
2970
2980
2990 SET TEXT COLOR 2
3000 FOR i=5 TO ymin STEP -5 !右端の縦軸目盛り
3010 PLOT TEXT ,AT 6,i: STR$(i*2)&"°" !※利得のグラフに合わせるために2倍する
3020 NEXT i
3030
3040 SET LINE COLOR 2
3050 FOR f=10 TO 100000 STEP 100 !周波数[Hz]
3060 CALL routine
3070 LET t=arg(x(Vo)/x(Vi))
3080 IF t>0 THEN LET t=t-2*PI !0~-2πへ補正する
3090 PLOT LINES: LOG10(f),DEG(t)/2; !位相θ ※利得のグラフに合わせるために1/2倍する
3100 NEXT f
3110 PLOT LINES
3120
3130
3140 END