プログラミング/LabView/波形発振器 のバックアップの現在との差分(No.1)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
* 波形発振器 VI を作る [#z958be7d]

[[プログラミング/LabView/スニペットライブラリ#y4f95948]] 
のデザインをサブ VI に分割して、再利用性の高い波形発振器の実装を考えます。

* サブ VI を切り出した正弦波発生器 [#zaa7bbf9]

&attachref(プログラミング/LabView/スニペットライブラリ/wavegen-sin.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/wavegen-sin.png);

「出力値の配列を作る」ループはサンプリング点1点ずつのループになっているので、
ここで適当な計算をすることでどんな波形も出力できます。

上では単純に sin を呼び出して正弦波を作っています。

その他の部分がきれいにサブVI化できたため、
メインの処理のみが見えるきれいな形になっています。
** 切り出されたサブ VI [#qdd7031a]

&attachref(プログラミング/LabView/スニペットライブラリ/wavegen-sampling-info.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/wavegen-sampling-info.png);

&attachref(プログラミング/LabView/スニペットライブラリ/wavegen-phase-generator.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/wavegen-phase-generator.png);

&attachref(プログラミング/LabView/スニペットライブラリ/wavegen-t0-generator.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/wavegen-t0-generator.png);

** 使用例 [#w6dc1b34]

&attachref(プログラミング/LabView/スニペットライブラリ/wavegen-sin-example.png);

&ref(プログラミング/LabView/スニペットライブラリ/wavegen-sin-example-panel.png);

もちろん、正弦波だけでよければ標準の波形生成コンポーネントがあるので、
それを使えばいいのですが、もっと凝ったものを作りたいとき、
上記の wavegen-sin.vi を改造すればいろいろできる、という話です。

* 安全な発振器 [#q983da34]

上記の発振器では amplitude や offset を変更すると出力が不連続に変化してしまいます。
出力電圧をつなぐ機器によってはそのような不連続な変化は装置に過負荷を与えてしまいます。

&ref(abrupt-change.png);

そこで、amplitude や offset、wave type、enable oscillation 
を変えても出力が不連続に変化することがない、
装置などに接続しても安全な発振器を作りました。
デリケートな装置に接続しても安全な発振器を作りました。

- wave type で正弦波と三角波を選べます
- offset に2次の iir フィルタを掛けています
- amplitude は一定の速度で変化します
- enable oscillation が on になったときは必ず位相ゼロから始まります
- enable oscillation が off になると振幅が徐々に小さくなります
- 振幅がゼロになる前に再び on にすると、振幅は元の値に徐々に戻ります
- enable oscillation が on になる瞬間に wave type が読み取られます

&attachref(プログラミング/LabView/スニペットライブラリ/wavegen-safe.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/wavegen-safe.png);

サンプリング点ごとに amplitude や offset へのフィルタ計算をして、
その結果を使って波形を出力しています。

動作確認用 VI

&attachref(プログラミング/LabView/スニペットライブラリ/wavegen-safe-example.png);


&ref(smooth-change.png);

このように、amplitude や offset などを変化させても出力は滑らかに変化します。

*** 必要となるサブVI [#cc3ce497]

&attachref(プログラミング/LabView/スニペットライブラリ/iir-module.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/iir-module.png);~
シンプルな1次の iir ローパスフィルタです。

&attachref(プログラミング/LabView/スニペットライブラリ/slope-module.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/slope-module.png);~
速度一定で入力値に追随するフィルタです。~
入力値を追いかけている間 sloping が true になります。

&attachref(プログラミング/LabView/スニペットライブラリ/detect-change.vi);~
&ref(プログラミング/LabView/スニペットライブラリ/detect-change.png);~
入力値が変化したら changed が true になります。

* 質問・コメント [#b260a6a3]

#article_kcaptcha



Counter: 6273 (from 2010/06/03), today: 2, yesterday: 0