前回は、実デバイスをシミュレーションするためのマクロモデルでしたが、今回は再びBehavioralなモデルに戻ります。何と言っても一端「踏み込んでしまった」Arbitrary Behavioral Voltage Sourceの中には、めくるめく?新たな世界が広がっており。ただし現物回路とは別物の世界だけれども。
※「SPICEの小瓶」投稿順インデックスはこちら
※ Analog Devices, Inc. LTspice XVII(x64) (17.0.36.0)を使用させていただいて動作確認しております。
BVシンボル
前々回以前は、Behavioralなモデルを記述するのに以下のような手順で行ってました。
-
- Behavioralなモデルをテキストでサブサーキットとして記述
- 上記のサブサーキットを参照するシンボルを定義
実際に回路図を描くときに参照するのは2の方なので、1のビヘイビア記述は隠蔽されておったというわけです。しかし、チョイチョイとBehavioralなモデルの動作を確認するにはいかにもメンドイです。
そんなときのために、LTspiceには、Arbitrary Behavioral Voltage Sourceそのものをアカラサマに呼び出すためのシンボル bv が用意されとります。こんな感じ。
なんだか普通の電圧源みたいですが。
rand、sin、maxを実験してみる
今回はBV用の各種関数の中で気になっていた3種類の関数をまとめて実験してみます。
-
- rand(x)、0と1の間の乱数を生成するもの
- sin(x)、正弦波を生成するもの
- max(x, y)、xとyを比べて大きい方を出力するもの
randは複数ある乱数系?の関数の中で一番プリミティブに思える関数です。乱数を求めるのは良いのですが、引数にとるxに対してはどう考えたらよいのでしょうか?
sin(x)はそのものズバリですが、やはり引数にとるxに対してはどう考えたらよいのでしょうか?
max(x, y)は、分かりやすいっちゃ、分かりやすいですが、実際に使ってみないとね。
ということで(どういうことだ?)作成したLTspice回路図が以下に。
ここで、引数にとれるものを列挙しておきたいと思います。
-
- どこかのノードの電圧、 V(ノード名)
- ノード間の電位差、V(ノード名1, ノード名2)
- 回路要素のどこかの電流値、例 Ib(Q1)、トランジスタQ1のベース電流
- time
- pi (円周率)
- 関数と演算子
timeはシミュレーション時刻そのものなので、上記のように .tran 0.1 と書いてあれば、0から0.1までシミュレーションステップに応じて更新されるので0から0.1までの値をとる筈。
rand()は、引数が整数値になるタイミングで1個乱数を振り出してくれるみたいです。timeを100倍しているので、0から10.0までの値をとるので、ちょうど整数値を通るところで1個乱数を求めてくれてるみたいです。知らんけど。
一方 sin(x)は、0から2πまでのx値とその倍数に対して出力値が決まるので、2*pi*100*timeとすれば、1秒間に100回転(100Hz)することになります。.tran 0.1なのでシミュレーション期間に限れば10周期。
それぞれBVモデルの出力がX、Yというノード名になっているので、max(V(X), V(Y))のところは、rand()とsin()のうち大きい方を出力するハズ。
まず、rand()赤、とsin()青をみてみるとこんな感じ。
なんか妙に人為的な波形だけれども、これがBVってやつかい?妙に納得。