· 

ahkab(python)で回路シミュレーション(6)

前回の相互誘導の回路の送信側の電流波形を見てみたところ、送信側の電流を突然遮断していたので、いまいちな波形になっていた。

遮断した抵抗の両端にとんでもない高電圧が発生していたはず。で、ちょっと修正。

こんな感じに。

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

import ahkab
from ahkab import circuit, time_functions
mycircuit = circuit.Circuit(title="mutual coupling circuit")

gnd = mycircuit.get_ground_node()

V_src=5

R1_val=100e0
L1_val=600e-6
C1_val=200e-12

R2_val=100e3
L2_val=3e-3
C2_val=40e-12

Rg_val=10e6

mycircuit.add_capacitor("C1", n1="n2", n2="n3", value=C1_val)
mycircuit.add_resistor("R1", n1="n3", n2="n4", value=R1_val)
mycircuit.add_inductor("L1", n1="n4", n2=gnd, value=L1_val)

mycircuit.add_resistor("R2", n1="n5", n2="n6", value=R2_val)
mycircuit.add_inductor("L2", n1="n5", n2="n6", value=L2_val)
mycircuit.add_capacitor("C2", n1="n5", n2="n6", value=C2_val)

mycircuit.add_resistor("Rg", n1="n6", n2=gnd, value=Rg_val)

mycircuit.add_inductor_coupling("M1","L1","L2",0.00074)

mycircuit.add_model("sw", "mysw", {'name':"mysw", 'VT':0.5, 'VH':0.2, 'RON':1e-6, 'ROFF':10e6})
mycircuit.add_switch("S1",n1="n1",n2="n2",sn1="n10",sn2=gnd,ic=False,model_label="mysw")
mycircuit.add_switch("S2",n1="n2",n2=gnd,sn1="n20",sn2=gnd,ic=True,model_label="mysw")
mycircuit.add_switch("S3",n1="n1",n2=gnd,sn1="n20",sn2=gnd,ic=True,model_label="mysw")

voltage_carrier = time_functions.sin(vo=0,va=V_src,freq=459441)
mycircuit.add_vsource("V1", n1="n1", n2=gnd, dc_value=0, ac_value=0, function=voltage_carrier)

voltage_step2 = time_functions.pulse(v1=1, v2=0, td=0, tr=1e-6, pw=0.1e-3, tf=1e-6, per=0.2e-3)
mycircuit.add_vsource("V2", n1="n10", n2=gnd, dc_value=0, ac_value=0, function=voltage_step2)
voltage_step3 = time_functions.pulse(v1=0, v2=1, td=0, tr=1e-6, pw=0.1e-3, tf=1e-6, per=0.2e-3)
mycircuit.add_vsource("V3", n1="n20", n2=gnd, dc_value=0, ac_value=0, function=voltage_step3)

print(mycircuit)

print ('Resonance frequency=',end='')
print(1/(2*np.pi*np.sqrt(C1_val*L1_val)))
print ('Calculated Q=',end='')
print((1/R1_val)*np.sqrt(L1_val/C1_val))

print ('Resonance frequency=',end='')
print(1/(2*np.pi*np.sqrt(C2_val*L2_val)))
print ('Calculated Q=',end='')
print(R2_val*np.sqrt(C2_val/L2_val))


op_analysis = ahkab.new_op()
tran_analysis = ahkab.new_tran(tstart=0, tstop=0.7e-3, tstep=0.5e-6, x0=None)

r2 = ahkab.run(mycircuit, an_list=[op_analysis, tran_analysis])

t=r2['tran']['T']
tV_R2=r2['tran']['Vn6']-r2['tran']['Vn5']
tI_R1=(r2['tran']['Vn4']-r2['tran']['Vn3'])/R1_val

matplotlib.use('TkAgg') 

fig = plt.figure()

ax1=plt.subplot(2,1,2)
ax1.grid(True)
ax1.plot(t, np.real(tV_R2), '-')
ax1.set_ylabel('(Vn5-Vn4) [V]')
#ax1.set_xlabel('time [s]')
ax2=plt.subplot(2,1,1)
ax2.grid(True)
ax2.plot(t, np.real(tI_R1), '-')
ax2.set_ylabel('(Vn4-Vn3)/R1 [A]')
ax2.set_xlabel('time [s]')

fig.tight_layout()
plt.show()

スイッチの構成を変えたときに、H/Lのフェーズも変えてしまった。すまソ。

で、よくなった。が、実は細かく見るとまだいけてない。

スイッチのタイミングもうまい事やらんといかんのだろうけど。まぁ受信側はくずれてないので、今回はそこまで攻めない。

 

今更だけど、普通にngspiceとかでやればいいじゃん、、、って思ったりもする。まぁpythonでやるのがいいんです。spiceの回路記述を今更やりたいって人はあまりいないと思う。pythonでできるからやってみたいって思えるんだと思う。定数変えながらの繰り返し計算とかpythonだと簡単だし、結果表示の柔軟性もあるし。