プログラミング/LabView/波形発振器
波形発振器 VI を作る†
プログラミング/LabView/スニペットライブラリ#y4f95948 のデザインをサブ VI に分割して、再利用性の高い波形発振器の実装を考えます。
サブ VI を切り出した正弦波発生器†
「出力値の配列を作る」ループはサンプリング点1点ずつのループになっているので、 ここで適当な計算をすることでどんな波形も出力できます。
上では単純に sin を呼び出して正弦波を作っています。
その他の部分がきれいにサブVI化できたため、 メインの処理のみが見えるきれいな形になっています。
切り出されたサブ VI†
使用例†
もちろん、正弦波だけでよければ標準の波形生成コンポーネントがあるので、 それを使えばいいのですが、もっと凝ったものを作りたいとき、 上記の wavegen-sin.vi を改造すればいろいろできる、という話です。
安全な発振器†
上記の発振器では amplitude や offset を変更すると出力が不連続に変化してしまいます。 出力電圧をつなぐ機器によってはそのような不連続な変化は装置に過負荷を与えてしまいます。
そこで、amplitude や offset、wave type、enable oscillation を変えても出力が不連続に変化することがない、 デリケートな装置に接続しても安全な発振器を作りました。
- wave type で正弦波と三角波を選べます
- offset に2次の iir フィルタを掛けています
- amplitude は一定の速度で変化します
- enable oscillation が on になったときは必ず位相ゼロから始まります
- enable oscillation が off になると振幅が徐々に小さくなります
- 振幅がゼロになる前に再び on にすると、振幅は元の値に徐々に戻ります
- enable oscillation が on になる瞬間に wave type が読み取られます
サンプリング点ごとに amplitude や offset へのフィルタ計算をして、 その結果を使って波形を出力しています。
動作確認用 VI
このように、amplitude や offset などを変化させても出力は滑らかに変化します。
必要となるサブVI†
iir-module.vi
シンプルな1次の iir ローパスフィルタです。
slope-module.vi
速度一定で入力値に追随するフィルタです。
入力値を追いかけている間 sloping が true になります。
detect-change.vi
入力値が変化したら changed が true になります。