• 締切済み

離散化したP制御

サーボモータの速度制御をc言語で行いたいです. http://www.picfun.com/motor05.html ↑のページを参考にして以下のように考えましたが うまくいきませんでした.プログラム中の変数は, ・vel_ref:希望速度指令値 ・vel_fb :モータからのフィードバック速度 ・ref_now:モータへの速度指令値 としました.ゲインや必要な変換定数は書いてありませんが,アルゴリズムとして評価いただければ幸いです.制御に詳しい方のご指導がいただければうれしいです.よろしくお願いします. vel_err = vel_ref - vel_fb; delta = Kp*(vel_err - vel_err_old); ref_now = ref_old + delta; ref_old = ref_now; vel_err_old = vel_err;

みんなの回答

回答No.2

vel_refとvel_fbの単位をあわせて計算しなければいけないと思います。 P制御だけであれば ref_now= Kp*vel_err で大丈夫だと思います。ですがref_nowに上限値、下限値を設定しておく必要があると思います。それは定格以上の速度で回転させないようにするためです。 if(ref_now > 上限値){  ref_now= 上限値; } 下限(逆方向の回転)の場合も同様です。 あくまでも参考までに。

すると、全ての回答が全文表示されます。
  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.1

ref_nowってモータへの電圧、もしくは電流(やトルク)の操作信号ではないかとおもいますが。 一旦(vel_err - vel_err_old)と誤差の差分を生成する理由は? 単純に、 ref_now=Kp*vel_err; としてまずい理由がなにかあるのでしょうか?

maryu0709
質問者

お礼

早速の御回答ありがとうございます. ref_nowはモータへの速度指令電圧です. 私もfoobarさんの言われるように ref_now=Kp*(vel_ref - vel_fb); で一度組んでみたところ,vel_refとvel_fbが一致しません(2倍程度違います).何か問題があるのかと疑問に思いながら上記のページを参考に組みなおしてみました.おそらく上記のページでは,PIDを前提に書かれているかと思います.ですから単純にP制御でよければfooberさんの方法でいいはずですよね. おそらく他の部分に問題がありそうです. もう一度他の部分をあたってみます.ありがとうございました.

すると、全ての回答が全文表示されます。

関連するQ&A