2024年5月12日日曜日

ngspyceを試す

 

ngspyceを使ってみる。実は、PySpiceでの相互誘導の記述方法がわからなかったので、ngspiceのdllを単に利用しているngspyceを使ってみる。

ngspyceは公式にPyPiに登録されていないようなので自力で入れる。
こちら(https://github.com/ignamv/ngspyce/tree/master)からCodeのボタンを押して、Download ZIPを押して、適当なところに解凍する(Linuxの場合はパーミッションを設定できる場所じゃないといかん、すなわちsmbfs上とかはだめ)。
とりあえず、/home/hoge/tempにngspyce-masterフォルダをぶっこんだとすると、
cd /home/hoge/temp
pip install ./ngspyce-master/
ってすると、インストールしてくれる。

では、値を変えながらシミュレーションして結果を重ね書きするって課題について、
  1. import ngspyce as ns
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. def ngspice_simulation(cvalue):
  5.     ns.circ(['.title Low-Pass RC Filter',
  6.              'R1 vin vout 1e3',
  7.              'C1 vout 0 1e-6',
  8.              'V1 vin 0 dc 0 ac 1',
  9.              '.end'])
  10.     ns.alter('C1',C=cvalue)
  11.     ac_results=ns.ac(mode='dec',npoints=10,fstart=1,fstop=1e6)
  12.     freqs=np.abs(ns.vector('frequency'))
  13.     vout=ns.vector('vout')
  14.     return freqs,vout
  15. freqs,vout1=ngspice_simulation(1e-6)
  16. freqs,vout2=ngspice_simulation(0.1e-6)
  17. freqs,vout3=ngspice_simulation(0.01e-6)
  18. fig = plt.figure()
  19. ax1=plt.subplot(2,1,1)
  20. ax1.grid(True)
  21. ax1.plot(freqs,20*np.log10(np.absolute(vout1)), 'b-')
  22. ax1.plot(freqs,20*np.log10(np.absolute(vout2)), 'g-')
  23. ax1.plot(freqs,20*np.log10(np.absolute(vout3)), 'r-')
  24. ax1.set_ylabel('Amplitude [dB]')
  25. plt.xscale('log')
  26. ax2=plt.subplot(2,1,2)
  27. ax2.grid(True)
  28. ax2.plot(freqs,np.angle(vout1), 'b-')
  29. ax2.plot(freqs,np.angle(vout2), 'g-')
  30. ax2.plot(freqs,np.angle(vout3), 'r-')
  31. ax2.set_xlabel('frequency [Hz]')
  32. ax2.set_ylabel('Phase [rad.]')
  33. plt.xscale('log')
  34. fig.tight_layout()
  35. plt.show()

相変わらずのいきなりな感じでこうなる。
回路は一度に入れ切らないといけなくて、後から追加って記述はできないらしい(なぜかできると信じ込んでちょっと悩んだ)。
で、

まぁ、うまくいっている。

ngspiceそのものの回路記述がすでにあるのなら、こっちのほうがラク。ていうか本当にngspiceのdllをwrapしているだけっぽい。それでも、自力でdllをcallする関数やら構造体やら記述するよりは全然助かる。

こういう小さいソフトが助かるんよ。何もかもやってくれる大規模なソフトは不要な機能まで理解する時間が必要になる(少なくともマニュアルを読み飛ばす時間が必要になる)のでムダが多い。

https://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6


2024年5月11日土曜日

PySpice使ってみる(2)

 

ngspiceってのがある。結果の表示をPySpiceってやつでもちっとうまいことでるんやないか。って試み。

前回、シミュレーションすることができた。ついに(ってほどじゃないやろ)、値を変更しながらのシミュレーションで結果を重ね書きってのをやる。で、

  1. import math
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import PySpice.Logging.Logging as Logging
  5. logger = Logging.setup_logging()
  6. from PySpice.Plot.BodeDiagram import bode_diagram
  7. from PySpice.Spice.Netlist import Circuit
  8. def ngspice_simulation(cvalue):
  9.     circuit = Circuit('Low-Pass RC Filter')
  10.     circuit.SinusoidalVoltageSource('input', 'vin', circuit.gnd, amplitude=1)
  11.     R1 = circuit.R(1, 'vin', 'vout', 1e3)
  12.     C1 = circuit.C(1, 'vout', circuit.gnd, cvalue)
  13.     break_frequency = 1 / (2 * math.pi * float(R1.resistance * C1.capacitance))
  14.     print("Break frequency = {:.1f} Hz".format(break_frequency))
  15.     simulator = circuit.simulator(temperature=25, nominal_temperature=25)
  16.     analysis = simulator.ac(start_frequency=1, stop_frequency=1e6, number_of_points=10, variation='dec')
  17.     freqs=np.array(analysis.frequency)
  18.     vout=np.array(analysis.vout)
  19.     return freqs,vout
  20. freqs,vout1=ngspice_simulation(1e-6)
  21. freqs,vout2=ngspice_simulation(0.1e-6)
  22. freqs,vout3=ngspice_simulation(0.01e-6)
  23. fig = plt.figure()
  24. ax1=plt.subplot(2,1,1)
  25. ax1.grid(True)
  26. ax1.plot(freqs,20*np.log10(np.absolute(vout1)), 'b-')
  27. ax1.plot(freqs,20*np.log10(np.absolute(vout2)), 'g-')
  28. ax1.plot(freqs,20*np.log10(np.absolute(vout3)), 'r-')
  29. ax1.set_ylabel('Amplitude [dB]')
  30. plt.xscale('log')
  31. ax2=plt.subplot(2,1,2)
  32. ax2.grid(True)
  33. ax2.plot(freqs,np.angle(vout1), 'b-')
  34. ax2.plot(freqs,np.angle(vout2), 'g-')
  35. ax2.plot(freqs,np.angle(vout3), 'r-')
  36. ax2.set_xlabel('frequency [Hz]')
  37. ax2.set_ylabel('Phase [rad.]')
  38. plt.xscale('log')
  39. fig.tight_layout()
  40. plt.show()
まぁいつものいきなりなやつでこうなる。
シミュレーション部分を関数化しているけど、どういう感じで関数化するのかはセンスが問われるところ。引数とか、戻り値とか。今回は必要な分だけ対象にしている(最も手抜きシンプル)。
で、結果、
はい。うまくいった。

ngspiceの機能を補うとともにpythonでの特殊な計算の実装の可能性もあるpyspice。まぁまぁいいね。(pythonではahkabって回路シミュレーターも選択肢なんだけど、ahkabは非線形素子の計算がゲロクソ遅いとか問題がある。状況に応じて使い分けるのが良いと思われる。)

PySpice使ってみる(1)

 

ngspiceってのがある。世の中はPSpiceとかLTSpiceとかが好き。でも個人的にはテキストだけで記述する方が好き。がngspiceの回路記述だけじゃどうにもならん(?)こともある(特に結果の表示とか保存)のでPySpiceってやつで何とかならんか考える。

ngspiceはこちら(https://ngspice.sourceforge.io/index.html)。Linuxでは最新版はソースコードからビルドするしかないが、マニュアル通りやればいい。この辺の情報はググれば見つかるんだけど、いざ細かいことをしようとすると、PSpiceやらLTSpiceやらに駆逐されていて情報が見つからない。

PySpiceはこちら(https://pyspice.fabrice-salvaire.fr/releases/v1.4/index.html#)。まぁpipでいける。

今回何をしたいのかというと、パラメータを変えながらシミュレーションして結果の重ね書きのグラフを作成するってこと。そんなのngspiceの回路記述のalterparamでできるじゃん(?)って思うんだけど、これがうまくいかない。alterparamした後はresetせんといかんのだけど、前のシミュレーション結果も忘れてしまうっぽくて、後で重ね書きしようとすると、そんなベクタは知らんって怒られる。

では、使ってみる。
こちら(https://pyspice.fabrice-salvaire.fr/releases/v1.4/examples/filter/low-pass-rc-filter.html)の例を試してみる。が、単位の書き方がうざい。"@u_"を付けることで、技術者が見慣れた単位を付けることができるんだけど、いや、むしろうざいから。そして、このまま実行しても色々怒られる。"in"はPythonの予約語だから使うんじゃねーっとか、その他意味わからんものがいろいろ。
で、色々いじくった結果、これでいけた。

  1. import math
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import PySpice.Logging.Logging as Logging
  5. logger = Logging.setup_logging()
  6. from PySpice.Plot.BodeDiagram import bode_diagram
  7. from PySpice.Spice.Netlist import Circuit
  8. circuit = Circuit('Low-Pass RC Filter')
  9. circuit.SinusoidalVoltageSource('input', 'vin', circuit.gnd, amplitude=1)
  10. R1 = circuit.R(1, 'vin', 'vout', 1e3)
  11. C1 = circuit.C(1, 'vout', circuit.gnd, 1e-6)
  12. break_frequency = 1 / (2 * math.pi * float(R1.resistance * C1.capacitance))
  13. print("Break frequency = {:.1f} Hz".format(break_frequency))
  14. simulator = circuit.simulator(temperature=25, nominal_temperature=25)
  15. analysis = simulator.ac(start_frequency=1, stop_frequency=1e6, number_of_points=10, variation='dec')
  16. freqs=np.array(analysis.frequency)
  17. vout=np.array(analysis.vout)
  18. fig = plt.figure()
  19. ax1=plt.subplot(2,1,1)
  20. ax1.grid(True)
  21. ax1.plot(freqs,20*np.log10(np.absolute(vout)), '-')
  22. ax1.set_ylabel('Amplitude [dB]')
  23. plt.xscale('log')
  24. ax2=plt.subplot(2,1,2)
  25. ax2.grid(True)
  26. ax2.plot(freqs,np.angle(vout), 'r-')
  27. ax2.set_xlabel('frequency [Hz]')
  28. ax2.set_ylabel('Phase [rad.]')
  29. plt.xscale('log')
  30. fig.tight_layout()
  31. plt.show()
まぁ、できた。
しかし、WARNINGがでるんよねー
 - WARNING - Unsupported Ngspice version 42
もちっと具体的に教えてくれんもんかね、、、まぁ結果オーライで^^

低賃金長時間労働への抗議のためパジャマで通勤するってのが隣の超大国で起こっているらしい。労働法によって労働時間や賃金についてそんなに無茶なことはできんはずだけど、抗議したくなるほどってことなんやろうなー、、、ちなみに日本も25年前は○○ムカー○”打刻してから○フ。○に戻って深夜まで○事するってのは普通だった。そのころの日本(または今の隣の超大国)と今の日本を表向きの生産性で比較したらいかんよね、、、

2024年5月3日金曜日

チップコンサンプルブック

今までチップコンはちまちま購入していたけど、やっぱりサンプルブックが欲しくなったので調べてみた。

村田製作所のサンプルブックとかをchip1stopで購入すると\9,000もするまぁまぁ手が出せない金額。しかも在庫なし。で、アマゾンで調べたらこんなの(https://www.amazon.co.jp/gp/product/B07WJTNHKF/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&th=1)あった。

安いし、中身も充実しているっぽいので、最近いろいろちまちま購入したばっかりだったけど、やっぱ買っちゃう。
で、来た。
いたるところの漢字が中国製と思われるけど、中身は村田製だと主張している。ほんとかどうかはわからない。が、こういうのが安くすぐに手に入るってのは中国の優位性だよなーと思う。