07-12-2021 12:08 AM
以前、質問させていただいたステッピングモーターではなく、手元にあったモータドライバにPWM信号を入力して、DCモーターの速度制御をすることになりました。
自分なりにプログラムを作成したところ、フロントパネルの制御器に任意の周波数とデューティーサイクルを入力し動作を開始すると、パネル上の停止ボタンを押すまでDCモーターを一定速度で回転させる、というプログラムは作成することができました。
ただ、周波数固定で、最初はデューティーサイクル0.5で3秒間、次にデューティーサイクル0.6で2秒間・・・などと、デューティーサイクルとその継続時間を変えることで、速度制御をしながら連続的にモーターを回転させるというプログラムを作成することができません。
この制御をする上で、何かよいプログラム方法はありませんでしょうか。
なにかアドバイスを頂けると幸いです。
現在、研究室の都合上Labview2010を使っています。
また、デバイスはUSB-6212です。
解決済! 解決策の投稿を見る。
07-12-2021 07:02 AM
こんにちは
手元にデバイスが無いので動くかわかりませんがサンプル作ってみました。
動かなかったらごめんなさい。
なお、小生LabVIEW2010が手元に無いので画像を添付します。
発振中のカウンタを停止させずにDutyを変えることがどうも出来なさそうなので、一旦カウンタをクリアしてから改めて新しい発振条件を設定して開始しています。配列にDutyと継続時間を入れると多様なパターンに対応できると思います。
速度変遷時の生成パルスに不連続な部分が出ますので、果たしてモーターはどういう挙動で速度変化するか?ちょっと興味あります。
07-13-2021 03:08 AM
SuuuSan 様
いつも本当にありがとうございます。
早速いただいたプログラムを参考に、プログラムを作成しモータドライバに出力させたところ、見事回転させることができました。
また、速度変化の際も少しの振動はありましたが、気にならない程度であるので、求めていた制御ができそうです。本当にありがとうございます。
もう一つお聞きしてもよろしいでしょうか。
今回のモータドライバは過負荷検出時にデジタル信号を出力する(通常時:L 過負荷時:H)のですが、そのデジタル信号をデバイスで受け取って、Hが入力されたときにプログラムを停止させるようにしたいのですが、この場合、Forループの条件端子に何をどのように配線すればよろしいのでしょうか。
07-13-2021 07:37 AM
回りましたか。結構うまくいくもんですね。
>Hが入力されたときにプログラムを停止
一番外のFOR-NEXTループをWHILEループにして、ループの中のシーケンスストラクチャ部分をWHILEループにして、その中でDIOのステートを見て、パルス生成継続時間かHIステートで全部のループを抜けて終了させる。
かなり詳細を端折りましたがこんな感じになるかと思います。基本FORループは途中で抜けられないので途中で抜けられるWHILEループにする必要があります。私事あしたから出張なのでさしあたり返信だけさせていただきました。ちょっと頑張ってみてください。わからなければまたお力添えします。
07-13-2021 08:59 AM
SuuuSan 様
ご多忙の中アドバイスを頂き、誠にありがとうございます。
早速頂いたアドバイスを参考に、ストラクチャ部の学習をしながら試行錯誤してみようと思います。
本当にありがとうございました。
09-13-2021 12:43 AM
SuuuSan 様
大学院入試等でまとまった時間が取れず、ご相談から期間が空いてしまい申し訳ありません。
頂いたプログラムからさらに以下の三つの機能を追加するため、自分なりに様々なプログラムを参考にしてプログラムを作成してみたのですが、なかなかうまくいかずどんどんわからないことが増えていくばかりだったため三度ご相談させていただいた次第です。
1.ループを無限ループにして、停止ボタン押下時にすべてのプログラムの動作を停止する。
2.ドライバのアラーム出力を受け取ってすべてのプログラムの動作を停止する。
3.csvファイルからd.cと継続時間を受け取ってプログラムに渡す。
添付させていただいたファイルの内、試作版は今回中心となるプログラムで、以前いただいたviを参考に三つの機能を実現するように作成していたのですが、停止ボタンを押しても停止しないなど、欲しい動作は得られませんでした。また、2.の機能についてはこのプログラムにどう配線したらよいのかわからず悩んでいたところです。
各種信号出力のサブviはフロントパネルのトグルにあるようなモータドライバの制御をするために、デジタル信号を出力するviとなっています。
御多忙のところすべて丸投げのような形になってしまい誠に申し訳ございません。
LabViewを扱っているのが自分だけで周りに相談できる人もいないため、なにかアドバイスだけでも頂けると幸いです。
大変ご面倒をおかけしますがよろしくお願い致します。
09-17-2021 12:19 PM
解決済みになっているスレは閲覧数が増えないので、続けて質問しても放置されちゃうかも。
前回のSuuuSanの書き込みを翻訳すると下図のようになると思います。
1番の問題はデジタル入力を読み取っているループ中に停止ボタンを入れて、アラーム値とORを取ればよさそうです。
「すべてのプログラムを止める」のを難しくしているのは、デジタル出力を別のサブVIに押し込んでいるからですね。ばらして1つのVI内にダイアグラムを置けばいいのではないですか?
09-17-2021 09:49 PM
上のVIはデューティーを0にしようとしてDAQエラーで止まりますね。
データの個数回ったらWhileループを抜けるように作らないといけませんでした。
09-22-2021 02:49 AM
J.H.Watson 様
お忙しい中詳しく丁寧に回答していただき、本当にありがとうございます。
早速頂いた画像とアドバイスをもとに添付画像のようにプログラムを作成してみると、上げていた三つの機能を満たすプログラムを作成することができました。
本当にありがとうございました。
頂いたプログラムについて、一つ質問させていただいてもよろしいでしょうか。
PWM信号を出力する部分のエラー配線をシーケンスストラクチャ内部に一度入れ込むのはどうしてなのでしょうか。
理解も知識も足りていない状態で大変申し訳ないのですが、教えていただけると幸いです。
また、添付のプログラムについて不備等ありましたらそれも指摘していただけるとありがたく存じます。
御多忙の中お手数おかけして大変申し訳ございませんが、よろしくお願い致します。
09-22-2021 03:46 AM
> PWM信号を出力する部分のエラー配線をシーケンスストラクチャ内部に一度入れ込むのはどうしてなのでしょうか。
これはノードの実行順を明確に決めるためです。
まず、COパルスの「タスクを開始」した後にシーケンスストラクチャで囲ったコードが実行されることを保証します。そしてデューティサイクルの待ち時間が経過した後に「タスクをクリア」することを保証します。
実行順を決めるだけなのでエラークラスタではなくDAQタスクのワイヤをくぐらせてもかまいません。
よく間違うのは、シーケンスストラクチャを忘れて時間待ちのWhileループだけにワイヤをくぐらせることです。すると最初のティックカウントの実行がCOパルスの「チャンネル作成」より先に実行されてしまい時間が不安定になる可能性が出てきます。
添付されたコードはおおむねOKですが、
COパルスのエラーはシフトレジスタにしなくてもいいです(Whileループが初回のエラーで抜けるので)。もしシフトレジスタにするなら最外周のWhileループの外から初期化してやらないと2回目以降実行されなくなりますよ。
またデジタル出力タスクの最後は「タスクを停止」ではなく「タスクをクリア」ですね。