· 

コイル(1)

コイルを考えてみる。まずはインダクタンスを測定する方法。

こうする。検出抵抗は本当は大きいほうが高インピーダンスを正確に測定できると思う。DUTが50Ωに対してかなり大きい場合、CH2の電圧が小さくなりすぎて正確に測定できないから。まぁ、とりあえずこのままでいってみる。

で、対象物のインピーダンスを$Z$とする。対象物に印可されている電圧を$V_D$、対象物を流れる電流を$I_D$とすると、 \[ V_D=V_1-V_2 \] \[ I_D=\frac{V_2}{50} \] なので、 \[ Z=50\left(\frac{V_1}{V_2}-1\right) \]
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal

sig1=sig1-np.mean(sig1)
sig2=sig2-np.mean(sig2)
sig1_hil=signal.hilbert(sig1)
sig2_hil=signal.hilbert(sig2)
Z=50*(sig1_hil/sig2_hil-1)

nop=np.size(t)
analysis_start=int(nop*0.2)
analysis_stop=int(nop*0.8)

t=t[analysis_start:analysis_stop]
sig1=sig1[analysis_start:analysis_stop]
sig2=sig2[analysis_start:analysis_stop]
sig1_hil=sig1_hil[analysis_start:analysis_stop]
sig2_hil=sig2_hil[analysis_start:analysis_stop]
Z=Z[analysis_start:analysis_stop]
Z_re=np.mean(np.real(Z))
Z_im=np.mean(np.imag(Z))
print('Z=',end='\t')
print(Z_re,end='\t')
print(Z_im)

fig=plt.figure()
fig.add_subplot(3,1,1)
plt.plot(t,sig1,t,abs(sig1_hil))
fig.add_subplot(3,1,2)
plt.plot(t,sig2,t,abs(sig2_hil))
ax1=fig.add_subplot(3,1,3)
ax2=ax1.twinx()
ax1.plot(t,np.abs(Z),'C0')
ax2.plot(t,np.angle(Z),'C1')
plt.show()
こんなんで、インピーダンス計算を行う。sig1, sig2, tはオシロからデータを読み出したとする。
計算にあたって$V_1$と$V_2$は複素数じゃないといけないので、測定データをヒルベルト変換しています。またそのためにオシロのオフセットずれを補正しています。

ブレッドボードに刺さっている緑色のものが4.7mHのコイル(まぁただのリード付き固定インダクタ)です。

これで、FGの周波数を変えながらじゃんじゃん測定していきます。

          L
          0.0047
meas         Ideal
Freq Z_re Z_im |Z| angle(Z) X
Hz Ω Ω Ω degree Ω
1000 27.094 31.005 41.175 48.852 29.531
10000 28.703 299.011 300.385 84.517 295.310
20000 29.686 583.651 584.405 87.088 590.619
30000 30.229 868.108 868.634 88.006 885.929
50000 36.998 1426.486 1426.966 88.514 1476.549
70000 44.065 1995.790 1996.276 88.735 2067.168
100000 65.708 2845.696 2846.454 88.677 2953.097
200000 161.381 5993.912 5996.084 88.458 5906.194
300000 285.996 10023.551 10027.630 88.366 8859.291
400000 1091.753 15599.345 15637.502 85.997 11812.388
500000 2148.145 24127.666 24223.104 84.912 14765.485
600000 5080.702 24158.475 24686.949 78.123 17718.583
700000 9788.134 1574.062 9913.891 9.136 20671.680
750000 10024.830 -4249.908 10888.477 -22.974 22148.228
800000 12231.597 -17298.350 21185.960 -54.736 23624.777
900000 4425.030 -31061.942 31375.550 -81.892 26577.874
1000000 4188.150 -29492.355 29788.246 -81.918 29530.971
2000000 320.729 -8455.934 8462.014 -87.828 59061.942
3000000 144.641 -5455.654 5457.571 -88.481 88592.913
5000000 68.754 -3093.022 3093.786 -88.727 147654.855
7000000 57.006 -2225.953 2226.683 -88.533 206716.797
10000000 81.943 -1546.003 1548.173 -86.966 295309.709
20000000 86.325 -825.207 829.710 -84.028 590619.419
30000000 45.107 -599.558 601.252 -85.697 885929.128

こうなる。一番右の列は、部品の公称値からリアクタンスを計算した値。

まずは、実測結果のインピーダンスの大きさと位相をプロット。青がインピーダンスの大きさ。燈がインピーダンスの位相。自己共振周波数付近がきちんと測定できていないかもしれないが、まぁまぁそれらしい。

こちらはリアクタンスの実測と理論値のプロット。青が実測。燈が部品定数からの理論値。自己共振周波数より十分低い周波数ではほぼ一致している。

つまりインダクタンスを測定するには、自己共振周波数より十分低い周波数で

\[ L=\frac{X_{meas}}{\omega} \]

とすればいい。

、、、当たり前?

ところで、コイルに自己共振周波数があるのは線間容量で並列共振回路になっているからで、そのほかにもコイルには寄生成分があるので、これを模擬した等価回路ってのがあります。使用周波数によっていくつかの回路があるのですが、比較的広範囲で使えそうな4素子回路

で、考えてみる。

CpはLと並列共振を作るので、共振周波数から推定。Rpは共振周波数でのインピーダンスの上限を与えるもので、インピーダンスの上限から推定。Rsは線材による抵抗なので、低周波でのレジスタンスから推定。

という感じで、ざっくり求められる。

今回は自己共振周波数付近で波形が逝かれたのでシミュレーションとの一致を見ながら推定する。

シミュレーションはこうする。定数はざっくり推定したものがすでに入っている。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

import ahkab
from ahkab import circuit

Cp=10e-12
Ls=4.7e-3
Rs=27
Rp=50e3

mycircuit = circuit.Circuit(title="Inductor Equivalent circuit")

gnd = mycircuit.get_ground_node()

mycircuit.add_capacitor("Cp", n1="n1", n2="n3", value=Cp)
mycircuit.add_inductor("Ls", n1="n1", n2="n2", value=Ls)
mycircuit.add_resistor("Rs", n1="n2", n2="n3", value=Rs)
mycircuit.add_resistor("Rp", n1="n1", n2="n3", value=Rp)
mycircuit.add_resistor("R0", n1="n3", n2=gnd, value=50)

mycircuit.add_vsource("V1", n1="n1", n2=gnd, dc_value=0, ac_value=1,)

print(mycircuit)

op_analysis = ahkab.new_op()
ac_analysis = ahkab.new_ac(start=1e3, stop=30e6, points=1001,sweep_type='LOG')

r = ahkab.run(mycircuit, an_list=[op_analysis, ac_analysis])

matplotlib.use('TkAgg') 

f=r['ac']['f']
V1=r['ac']['Vn1']
V2=r['ac']['Vn3']
Z=50*(V1/V2-1)

fig = plt.figure()
ax1=plt.subplot(1,1,1)
ax2=ax1.twinx()
ax1.semilogx(f,np.abs(Z),'C0')
ax2.semilogx(f,np.angle(Z)*180/np.pi,'C1')
plt.show()

for i in range(np.size(f)):
    print(f[i],end=(','))
    print(np.real(Z[i]),end=(','))
    print(np.imag(Z[i]))

まぁこんな感じ。青が実測。燈がシミュレーション。上が大きさ。下が位相。あってそうであってない。まぁこんなもんなんだろう。

 

オシロのスイッチの一つが逝かれてきた。結構頻繁に使っているのに今日気づいた。接触が悪いだけのようだけど自力で修理するとなるとしんどそう。このスペック(1GS/s, 70MHz)で買い替えとなるとまぁまぁの金額。しばらくはだましだまし使う。