Maximaを使って、オペアンプのノイズの大きさを見積もってみる。ノイズに関してはここを参照してくださいな。
代入は、substをつかいます。wxMaximaではウィンドウの下の方に、Substituteというボタンがあって、普通はそこを押し使うのですが、今回はちょっと難しくなるので、これまでどおり、noise.macに書き込んでいくことにします。
wxMaximaのInputと書かれているところにeqn2と打ち込んでENTERキーを押してみてください。すると
さて、ここまでの結果をみて、げげっと思うほど複雑な式になっているのではないでしょうか。
wxMaximaのウィンドウの下のほうにFactorというボタンがあるのでそれをクリックしてみてください。これは、中学校でやるところの因数分解というやつです。反対に、expandというのは展開をしてくれます。
理論
次のようなOPアンプを用いた回路を考えます。
出力の電圧をvoutとし、オペアンプの入力側の電圧雑音をen、電流雑音をin、+入力をvp、-入力をvnと表し、ゲインをAとおく。このとき、次の式が成り立つ。・・・はず。
-
vout=A (vp+en-vn)
-
i1+i2+in-vn/R1+(vout-vn)/R2=0
-
in+i3+vp/R3=0
ここで、i1、i2、i3はそれぞれ、抵抗の熱雑音による電流雑音を表しています。
これをvoutについてとけば、電流雑音や電圧雑音、そして熱雑音が出力に寄与する大きさを見積もることが出来ますが。まぁちょっと単位がめちゃくちゃですね。
細かいことは、計算しながら考えることにしましょう。
準備
適当なテキストエディタを開き、noise.macというファイルを作る。ファイルに次のような命令を書き込んで保存しておく。
eqn1:solve(v_out=A*(v_p+e_n-v_n),v_out);
wxMaximaを起動し、[File]-[Batchfile]かCtrl+Bを押下すると、ファイルの選択ダイアログが出るので、そこで、先ほどのnoise.macを選択する。
ちゃんと実行できました♪
さて、これを良く見てみると、v_outというのが[]の中に入っているため、直接使うことが出来ない。この[]というのはリストを表しているものなので、次のようにすると、[]の無い結果が得られる。eqn1:solve(v_out=A*(v_p+e_n-v_n),v_out)[1];noise.macを書き換えて、もう一度・・・
ここまでの説明
- 変数の定義は「=」ではなく「:」を使います。
変数には式を入れることが出来ます。ということで、上の場合、eqn1にはsolve(~)[1]の結果得られたもの(式)が入ります。 -
[1,2,3]で表されているのはリストなので、[番号]と指定してやると、その要素だけを見ることができます。(日本語てきとー)
- solve(~)に関してはponpoko氏のヘルプの日本語訳を見てください。ここでは「,」の前の式をv_outについて解くという意味の無いことをしています。まぁ、後々意味があるようにはなっているのですが&
- 行末には「;」
eqn1:solve(v_out=A*(v_p+e_n-v_n),v_out)[1];
eqn2:solve(i1+i2+i_n-v_n/R1+(v_out-v_n)/R2=0,v_n)[1];
eqn3:solve(i_n+i3+v_p/R3=0,v_p)[1];
式を整理する
さて、今日の目標は、上の3つの式をv_outについて解くことにします。先ほど使ったsolve()というのは連立方程式も解けるので、solve([eqn1,eqn2,eqn3],[v_out,v_n,v_p]);のようなことをしてもいいのですが、v_n,v_pについて求めてもしょうがないので、ただ単に、eq1にeq2、eq3を代入して最後に整理することにしましょう。
代入は、substをつかいます。wxMaximaではウィンドウの下の方に、Substituteというボタンがあって、普通はそこを押し使うのですが、今回はちょっと難しくなるので、これまでどおり、noise.macに書き込んでいくことにします。
ここまでの説明
- substは置き換えをするときに使います。使い方は2種類
- subst(A,B,C)・・・Aに置き換えますBを。Cにおいて。
(%i1) C:A+B;
(%o1) B+A
(%i2) subst(A,B,C);
(%o2) 2*A - subst(A=B,C)・・・A=Bですよ。Cのなかでは。
(%i3) subst(A=B,C);
(%o3) 2*B
- ボタンを押すとsubst(A,B,C)の形式のものが入力しやすくなります。
- 日本人にはsubst(A=B,C)のほうがはるかにわかりやすいです。
wxMaximaのInputと書かれているところにeqn2と打ち込んでENTERキーを押してみてください。すると
(%i5) eqn2;と出たはずです(おそらくきれいな分数の形で)。eqn2にはすでにA=Bの形で入っているので、
(%o5) v_n=(R1*v_out+(i_n+i2+I1)*R1*R2)/(R2+R1)
subst(eqn2,eqn1)とすれば、eqn1にv_nの細かい内容が代入されています。Inputと書かれているところに書いて試してみてください。
(%i6) subst(eqn2,eqn1);ということで、気を取り直して、先ほどのnoise.macに以下を追加しましょう。
(%o6)v_out=A*v_p-(A*(R1*v_out+(i_n+i2+I1)*R1*R2))/(R2+R1)+A*e_n
eqn1:subst(eqn2,eqn1);ここではeqn1にv_nなどを代入した結果を再び入れて使いまわしています。まぁ、その辺は適当!適当!
eqn1:subst(eqn3,eqn1);
eqn1:solve(eqn1,v_out)[1];
さて、ここまでの結果をみて、げげっと思うほど複雑な式になっているのではないでしょうか。
v_out=-(((A*i_n+A*i3)*R2+(A*i_n+A*i3)*R1)*R3+((A*i_n+A*i2+A*I1)*R1-A*e_n)*R2-A*e_n*R1)/(R2+(A+1)*R1)でも良く見ると、これは、
(A*R2+A*R1)/(R2+(A+1)*R1)で割ってやるときれいな形になりそうです。(ここで見るとわかりにくいですが、wxMaximaの画面の上でみるとわかりやすいですよん)(というか正確にいうと、右辺からAを消したいだけなんですけどね^_^;)。ということで、新しくfac=(R2+(A+1)*R1)/(A*R2+A*R1)というのを定義してやって、それと掛け算します。以下をnoise.macに追加してCtrl+Bで実行してみてください。
fac:(R2+(A+1)*R1)/(A*R2+A*R1);さてさて・・・すごい結果になりましたね。
eqn1*fac;
wxMaximaのウィンドウの下のほうにFactorというボタンがあるのでそれをクリックしてみてください。これは、中学校でやるところの因数分解というやつです。反対に、expandというのは展開をしてくれます。
ここまでの説明
- factor(~)は~を因数分解するという意味。(正確にはカッコをまとめる)
- expand(~)は~を展開するという意味。
- factorと書いてあるボタンを押すと、factor(%)というのが出てくる。
- ここで%は直前にした計算結果を表す