LCR and Q

Q

とある方からLCの共振回路とQについてのお題が出された。某ページを見ていたら共振回路とQに言及した説明が有り、疑問が有ったそうな。色々調べてそんなのEXCELで簡単に計算できるよとうそぶいている人も見つけたとの事。

何でもEXCELで解決するのはどんなものだろう。その人には、

akae@pen:/tmp$ apt show ngspice
Description: Spice circuit simulator
 NGSpice is a mixed-level/mixed-signal circuit simulator.  Its code is based on
 three open source software packages:
 Spice3f5, Cider1b1 and Xspice.

こういうシュミレータを紹介した。

オイラーもやってみるかな。使う道具は何にする? pythonは論外としてoctaveとかjuliaとかかな。最近lispに触っていないので、 思い出したように Maxima の使い方 とか、Maximaのまとめ を取り出してきて、ごにょごにょやってみる。

intro

分かり易いようにLCRの直列接続を考える。Lに直列に入っているRは、コイルの抵抗分を模している。Cの等価回路に出て来るリーク抵抗は、面倒なので無視(無限大を仮定)。

(%i22) z(f) := r + (2 * %pi * f*l) * %i - %i / (2 * %pi *f*c);
                                                   - %i
(%o22)              z(f) := r + (2 %pi f l) %i + ---------
                                                 2 %pi f c
(%i24) r: 10;
(%o24)                                10
(%i25) l: 2e-6;
(%o25)                              2.0E-6
(%i26) c: 100e-12;
(%o26)                              1.0E-10
(%i28) float( z(3e6) );
(%o28)                    10.0 - 492.817365129907 %i
(%i29) float( z(13e6) );
(%o29)                    40.93593868521128 %i + 10.0
(%i31) float( 1 / (2 * %pi * sqrt( c * l)));
(%o31)                       1.125395395196382E+7
(%i42) plot2d( abs(z(f)), [f, 5e6, 20e6]);
(%o42)                  [/tmp/maxout2842.gnuplot_pipes]

インピーダンスは、周波数の関数だ。抵抗は10オーム、コイルは2uH、コンデンサーは100pFとしよう。

この条件で、3MHzと13MHzの時のインピーダンスを求めてみる。この範囲内で虚部が反転してるので、どこかに共振周波数が有るはず。アマチュア無線の国家試験に出て来る式で、共振周波数を求めると、11.23MHzとなった。グラフに書いてみよう。

計算結果は複素数になるんで、それをそのままプロットしようとすると、

plot2d: expression evaluates to non-numeric value everywhere in plotting range.
plot2d: nothing to plot.

そんな無理な事は出来ませんと言われる。仕方なしに絶対値を取って表示させたよ。

%i12) plot2d([realpart(z(f)), imagpart(z(f))], [f, 5e6, 20e6]);
(%o12)                 [/tmp/maxout96159.gnuplot_pipes]

調べた限りでは、一発で複素数のグラフを書く事は出来ないけど、上記のように、実部、虚部に分解して同時に表示する事は可能だ。

参考までに、インピーダンスの絶対値も載せたグラフを置いておく。 impedance.svg

ここまでは、導入部だな。

draw graph

maximaでは方程式を解いてくれるsolveが有る。でも、無から有は生まれない。正しい式を立てられてこそ、maximaが生きてくる。

さて問題は、ある周波数に共振するLCの組み合わせは無数にある事だ。共振回路の特性を表すものにQと呼ばれるものがある。LCの組み合わせによってQが変化するのかと言う問いだ。

Qは、共振回路の尖鋭度とも言えるもの。定義は、共振周波数fcから3dB(1/sqrt(2))下がった所の周波数flとfhによって決まる。(但し、fl<fc, fh>fc とする)

q = fc /(fh - fl)

平たく言うと、共振周波数をバンド幅で除した値だ(qは、クォリティーの頭文字)。 このままでは、このqな式は使い道が無い。

仮に1Vの高周波電源に、インピーダンスz(f)を接続したら、そこを流れる電流はオームの法則で、1/z(f) になるな。この電流の周波数変化を図にすれば、目測でqの大小が分かるはず(ですよね)。

で、このインピーダンスの逆数は アドミッタンス(単位はシーメンス)って言うんだななんて事を思い出しながら、雑な関数を定義する。なお、インピーダンスは電流の流れにくさを表す指標。アドミッタンスは、電流の流れ易さを表しているって事だ。(アドミッタンスの実部はコンダクタンス、虚部はサセプタンスって名前がついてるけど、面倒なこったい。まて、名前が付いてて便利に使う、高い周波数領域に住んでる人がいるよ)

(%i31) g(l,c,f) := 1 / (r + (6.28*f*l - 1/(6.28*f*c))* %i );
                                             1
(%o31)            g(l, c, f) := ----------------------------
                                                   1
                                r + (6.28 f l - --------) %i
                                                6.28 f c

勿論、6.28は、2 * %pi の積り。この%piが残った式で、値を計算すると、後でfloatしなくちゃいけなくなるんで、生活の知恵を出したよ。

(%i33) plot2d([abs(g(2e-6,100e-12,f)), abs(g(1e-6,200e-12,f))], [f, 5e6, 20e6]);
(%o33)                  [/tmp/maxout732.gnuplot_pipes]

qcheck.svg に、グラフを載せた。青色の方は、2uH,100pFの組み合わせ。赤色は1uH,200pFの同調回路。抵抗は10Rとして共通。同調周波数では、1/10 = 100mA の電流が流れている事が確認出来る。

結論は、LCの組み合わせで、Lが大の方がQは高くなるって事だな。

solve

図的な解法は上で済んだけど、Qを計算で求められないかな? 計算の都合上、今回はRを1オームと固定しておく。そうすれば、同調点で1Aの電流が流れる事になり、式が建てやすい。

Qの定義からfl,fhを表す値は、1/sqrt(2) = 0.7071… 丸めてしまって0.7としておこう。 maximaには方程式を解くsolveって関数が用意されてる。結果を数値で欲しいので、floatで数値化すればよい。ただfloatを使うとやたら細かい数字が出て来るので、桁数制御の出来る、bfloatを使う事にする。fpprecで3桁出力になるようにした。

(%i36)  bfloat(solve(abs(g(2e-6,100e-12,f)) = 0.7, f)), fpprec: 3;

rat: replaced -0.7 by -7/10 = -0.7

rat: replaced -1.592356687898089E+9 by -250000000000/157 = -1.592356687898089E+9

rat: replaced 1.256E-5 by 157/12500000 = 1.256E-5
                    !           2                        !
            5.1b-10 !2.46b4 %i f  + 1.96b9 f - 3.13b18 %i!
(%o36)     [---------------------------------------------- = 1.43b0]
                                abs(f)

あれれ、これ答えになってないじゃん。苦肉の策としてabsを外してみるか。

(%i37) bfloat(solve( g(2e-6,100e-12,f) = 0.7, f)), fpprec: 3;

rat: replaced -0.7 by -7/10 = -0.7

rat: replaced -1.592356687898089E+9 by -250000000000/157 = -1.592356687898089E+9

rat: replaced 1.256E-5 by 157/12500000 = 1.256E-5
(%o37) [f = 9.1b-4 %i (1.24b10 %i - 1.88b7),
                                         f = - 9.1b-4 %i (1.24b10 %i + 1.88b7)]

答えが2つ出て来て期待したんだけど、

(%i40) float(abs (9.1b-4 * %i * (1.24b10 * %i - 1.88b7)));
(%o40)                       1.128401296896028E+7
(%i41) float(abs (-9.1b-4 * %i * (1.24b10 * %i + 1.88b7)));
(%o41)                       1.128401296896028E+7

何故か、共振周波数が結果として得られた。何か勘違いしてるかな?

公式有ったぞ

ここまで我流でやってきたけど、行き詰まってしまったので、文献を当たってみる。

Q値と周波数特性を学ぶ

共振回路の周波数特性とQの計算、その意味

有名なので、わんさかと出てくるな。

(%i1) cq(l,c,r) := sqrt( l / c) / r;
                                                l
                                           sqrt(-)
                                                c
(%o1)                       cq(l, c, r) := -------
                                              r
(%i2) cq(2e-6,100e-12,1.0);
(%o2)                          141.4213562373095
(%i3) cq(1e-6,200e-12,1.0);
(%o3)                          70.71067811865476

直列共振回路のQを計算してみた。Calc Q だから略して関数名は CQね。別に狙った訳ではない。

で、CQにかかせないのがアンテナ。オイラーにとっちゃ悩みの種。伸縮自在の釣竿アンテナを作ろうと思って、釣具店でグラスロッドを探し回ったけで、手に入らず。

今はみんなカーボンに移行してしまったそうだ。カーボンなら導電性が有るから何とかならないか? そんなのやめて輪だよ。

by hand

上でもう結論が出てしまったけど、そこに至るまで同調カーブから、値を読み取って、そこからQを計算するスクリプトを書いていたんだ。折角だから載せておく。

# Calc Q

def cq(l,c,r)
  step = 0.01e6                          # scan step
  fc   = 1 / (6.28 * Math.sqrt(l * c))
  th   = 0.7 / r                         # detect level
  xl   = 6.28 * l
  xc   = 6.28 * c

  fh   = fc + step
  while (1 / Complex(r, xl * fh - 1 / (xc * fh))).abs > th do
    fh += step
  end

  fl   = fc - step
  while (1 / Complex(r, xl * fl - 1 / (xc * fl))).abs > th do
    fl -= step
  end

  fc / (fh - fl)
end

puts cq(2e-6, 100e-12, 1.0)
puts cq(1e-6, 200e-12, 1.0)

久しぶりにruby語です。やってる事は単純で、同調点から高い方にスキャンしながら、3dB下がった周波数(fh)を見つける。次は低い方に向かって見つける。後は定義通りに計算。

sakae@pen:/tmp$ ruby cq.rb
112.59662120804897
62.553678448916095

理論値と大分違うな。

sakae@pen:/tmp$ irb
irb(main):001:0> require './cq'
 :
=> true
irb(main):002:0> cq(4e-6, 50e-12, 10.0)
=> 26.808719335249755

rubyのreplであるirbから、新しい計算も出来る。

MLA

上でやった直列回路、Rに物凄く敏感だった(反比例ですから)。Rが小さければ、非常に大きな電流が流れるはず。 最近、アマチュア無線業界ではマグネチック・ループ・アンテナ(略してMLA)がもてはやされている。魅力なのは、かさばらない事。狭い敷地しかない日本で流行って当然。

電磁波は、電界、磁界、電界、磁界って連なりで遠くまで届く。強い磁界を発生出来れば強い電波になる。

磁界の強さはATに比例する。小学校の理科の時間に倣う。電磁石の強さは、流れる電流(A)と巻数(T)の積になるよってやつだ。

直列共振でガンガン電流を流しましょ。巻数が多いと作るの大変だからフラフープみたいに1巻でいいよって妥協。そのうちに、誰かが常温超伝導物質を発明してくれるでしょ。そしたら、電流は天井知らずで流せるよ。しめしめ。

まて、コンデンサーの事を忘れていないか。有名な式、Q=CVってのを思い出せ! ここに出て来たQは、上に出てきたQとは全く別物。電荷量を表している。雑に言うと電流だな。

電流が無限大になったら、コンデンサーにかかる電圧も無限大っぽくなる。そんなコンデンサー(しかも同調を取らなきゃいけないのでバリコン)なんて有るのか?

夢は潰えますなあ。

wxmaxima

ってのを入れるとGUIでぐりぐり出来る。pythonかぶれでジュピターノートブックを使ってる人にお勧め。入力して、Ctl+Enterで、実行出来る。


This year's Index

Home