2024年5月11日土曜日

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)あった。

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

2024年4月28日日曜日

コイル(4)

300uHのバーアンテナを作ろうと思ってる。もうちょっとねばってできるだけ狙いに近づけてみる。

ほぼ端から端まで巻いたところ125tとなって。で、インダクタンスを測定したところ、
390uHくらいかな。
で、正確にどこを狙うか、、、普通のインダクタだと測定周波数ってのが仕様で決まっていて、その周波数での値が規定されている。今回は用途に合った周波数で合わせるか、一般的な1MHzで合わせるか、、、で、1MHzで合わせることにする。これまでの測定結果をまとめて、
まぁ狭い範囲なので線形だとすると、100tで300uHになるってことがわかる。ていうか、1tずつ剥いていって調整するのがよさそう。
で、
いやー、がんばった。結局、100tで約300uHでした。




コイル(3)

300uHのバーアンテナを作ろうと思ってる。コイルを巻いてみる。

とりあえず、aitendoからきたフェライトバーになんとなく38t巻いてみる。空芯で円形の巻線インダクタを作る場合はこういうところ(https://keisan.casio.jp/exec/user/1488083605)でざっくり計算できるけど、素材の比透磁率もわからんし、断面も長円だし、えいやっ※でやるしかない。(※昭和なワードらしい)
フェライトとエナメル線がこすれてエナメルにキズが付かないようポリイミドテープを巻いてからコイルを巻いてます。
まぁこんな感じ。で、エクセル、、、じゃないLibreOfficeCalcで計算すると、
まぁ、だいたい82uH、、、ぜんぜんたらんかったorz。むしろ大きめに出てくれて剥いていく方がラクだったのに( ̄д ̄ )チッ、、、自分の無能を呪いながらやり直す。
で、92t巻いてみた。
ちなみに、巻くときは今何tかなーとか考えない。コアのざっくりここからここまで巻こうって巻いて、巻き終わった後に写真にして印刷して鉛筆でしるしをつけながらカウントすることにしている。
で、測定した結果、270uH、、、
ぎゃーまだ足りんのかー
まぁもうこんくらいでいいや


2024年4月27日土曜日

コイル(2)

 

300uHのバーアンテナを作ろうと思ってる。まずはインダクタンスの測定方法を検討。

最近フェライトバーって入手しにくくって、通販で購入できるのはaitendoくらいしかない。でこちらを発注。以前品物間違った前科もあるしドキドキする。今回、発送の連絡もなく突然ブツが届いた。そして、、、おそらくこっちが届いた。前回間違ったときには連絡すると必要以上に丁寧な対応でびっくりしたってこともあり、もう今回の差は大したことではないので、放置することにする。(大須とかでフェライトバー売ってるとこないんかな、、、大須まで行く交通費を考えると通販のほうが安いんだけど、例えばリード線とか専門家のいる店じゃないと買えないし、フェライトもそういう位置づけかも)

で、まずはインダクタンスをどう測定するか。以前FGとオシロで測定した(https://sunday-engineer.jimdofree.com/2022/10/09/%E3%82%B3%E3%82%A4%E3%83%AB-1/)んだけど、結構手間がかかる。そういえばうちにはNanoVNA(https://sunday-engineer.jimdofree.com/2020/11/22/nanovna-h4/)とかいうネットアナあるじゃんね。これで測定してみる。測定原理はこちら(https://engineer-climb.com/impedance-measurement/)。今回はインダクタなので「シリーズスルー法」にする。
ところで、NanoVNAをPCで制御するWindowsソフトで、NanoVNASaverってやつがある。以前はバイナリでダウンロードできてたんだけど、バイナリがなくなった。モノはPythonっぽいので、環境を整えてPythonから実行すればいいんやろ、、、が面倒なので、今回は以前ダウンロードしてあったバイナリを使う(歳とるといろんなことが面倒に感じる。または、あの病の後遺症かもしれない。)。
で、自分で作成したバーアンテナを測定する前に、値のわかっている(330uH)インダクタを測定してみる。
まぁこんな感じで。そすっと、
こんな感じで測定できる。で、これをs2pで保存してLibreOffice Calcで開くと
こんな感じで、S11とS21が保存されているわけだ。NanoVNAはハード的にPort2にソースがないのでまぁ、こうなっちゃうわけで、これをこのままシミュレーションとかには使えないわけだが、波形を保存できるってこと、それ自体が良い事だと思う。
では、数字をいじくっていく。
\[ Z_{DUT}=100\times \frac{\left(1-S_{21}\right)}{S_{21}} \tag{1} \]
まぁ単にこれを計算するだけ。で、こうなる。
まぁ、ざっくり1MHzくらいで300uHくらい。まぁまぁ測定できているって感じがする。

世の中は連休だー。この連休に色々取り返さんといかん。と思いつつも、以前にも増してなかなかやる気が起こらない。後遺症かなー。まったくどこでもらっちまったのかわからんかかりかただったのは、免疫低めの生活をしていたからよなー。