- ベストアンサー
モータの制御
永久磁石同期モータを速度制御をする場合 電流制御をマイナーループとした制御系を構成するとします。このとき、電流制御系のサンプリング間隔が速度制御系よりも短いサンプリング間隔で電流制御をすると思います。この場合、アルゴリズム(C言語でのプログラム)はどのようにしたらよいのでしょうか? マイナーループの電流指令の生成の部分がよくわかりません。 説明がわかりにく部分があるかもしれませんがよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
マイコンの場合などは2つのタイマーを使って実現すると思います。 例えば、速度制御は1秒間隔、電流制御は0.1秒間隔とか。 擬似的には時刻判定を使えばいいと思います。 ただ、時刻を要求すると現在時刻でなく、プログラム開始時刻を返すものもあるので 注意が必要です。 他のプログラムによって実行が一時とまることもあるのでこの辺の注意も必要です。
その他の回答 (3)
- foobar
- ベストアンサー率44% (1423/3185)
タイマー1個使って、回数で制御することも可能かと。 例えば、 void 制御(){ static int i=0; i++; if(i>=n){ 速度制御(); i=0; } 電流制御(); } みたいな感じで、コーディングして、制御()をタイマーで定期的に起動するとか如何でしょうか。 (速度制御()は制御()がn回起動される毎に、電流制御()は制御()が起動される毎に実行されるかと。) 電流指令値のホールドは、速度制御以外では電流指令値を変更しないようにすれば、よさそうな気がします。
お礼
どうもありがとうございました。
- ymmasayan
- ベストアンサー率30% (2593/8599)
No.1です。 > タイマー2つ使うんですか…。 タイマー一つで回数をカウントしてn回に1回速度制御という方法もあります。 このときは、回数を引き継ぐのが結構大変そうですが。 > 例えば、1秒から2秒の間の電流指令は一定値になるのでしょうか? どういう構成なのかわかりませんがどこかで目標電流値をホールドする必要があります。
お礼
どうもありがとうございました。
- foobar
- ベストアンサー率44% (1423/3185)
いろいろな実装方法があるでしょうし、OSに依存するところもあると思いますが、 ・電流制御のモジュールと速度制御のモジュールを独立して作り、リアルタイムOSが提供するタイマで異なる周期で呼び出す。(例えば、電流制御を10ms毎に、速度制御を50ms毎に呼び出す) ・例えば、電流制御モジュールを5回呼び出す毎に、速度制御ループを1回呼び出す、という具合に回数で制御する。 ・電流制御と速度制御系を同じサンプリング間隔で構築する。制御利得を適切に設定して、速度制御系の応答が電流制御系よりも充分遅くなる(制御利得を低めに)ように設定する。 といった手法がとられるかと思います。
お礼
回答ありがとうございます。 実装しているシステムにタイマー1つしかないので一番下の方法でやるしかないんですね。 どうもありがとうございました。
補足
回答ありがとうございます。 タイマー2つ使うんですか…。 速度制御の間隔が1秒、電流制御を0.1秒、速度制御器にはPI、電流制御器にはPを使うと仮定します。 例えば、1秒から2秒の間の電流指令は一定値になるのでしょうか?速度制御器の出力が電流指令になり、速度制御が1秒ごとに更新されるので。 わかりにく説明で申し訳ないのですがよろしくお願いします。