2月25日

Dependencies:   Encoder

Dependents:   NHK2020-m2-2-ros_2_25

Committer:
MazeTaka
Date:
Fri Aug 09 06:19:05 2019 +0000
Revision:
2:77256385cf03
Parent:
0:de44976b7670
Child:
3:58a298386879

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MazeTaka 0:de44976b7670 1 #ifndef _INCLUDE_SPEEDCONTROLLER_H_
MazeTaka 0:de44976b7670 2 #define _INCLUDE_SPEEDCONTROLLER_H_
MazeTaka 0:de44976b7670 3
MazeTaka 0:de44976b7670 4 /**
MazeTaka 0:de44976b7670 5 * @brief モーターの速度制御用プログラム
MazeTaka 0:de44976b7670 6 * @details モーターのdutyと角速度がほぼ比例することを利用してPID制御を補正する
MazeTaka 0:de44976b7670 7 **/
MazeTaka 0:de44976b7670 8 class SpeedControl
MazeTaka 0:de44976b7670 9 {
MazeTaka 0:de44976b7670 10 private:
MazeTaka 0:de44976b7670 11 double Kp_,Kd_;
MazeTaka 0:de44976b7670 12 double pre_diff;
MazeTaka 0:de44976b7670 13 double ptsc_;
MazeTaka 0:de44976b7670 14 double Cf_;
MazeTaka 0:de44976b7670 15 double Cb_;
MazeTaka 0:de44976b7670 16 /** 角速度(rad/s)をduty比に変換させるための定数
MazeTaka 0:de44976b7670 17 *
MazeTaka 0:de44976b7670 18 *
MazeTaka 0:de44976b7670 19 *
MazeTaka 0:de44976b7670 20 **/
MazeTaka 0:de44976b7670 21 double Df_;
MazeTaka 0:de44976b7670 22 double Db_;
MazeTaka 0:de44976b7670 23 double initial_Df_;
MazeTaka 0:de44976b7670 24 double initial_Db_;
MazeTaka 0:de44976b7670 25 double duty_limit_;
MazeTaka 0:de44976b7670 26 Ec *ec_;
MazeTaka 0:de44976b7670 27
MazeTaka 0:de44976b7670 28 public:
MazeTaka 0:de44976b7670 29 PwmOut pwm_F_;
MazeTaka 0:de44976b7670 30 PwmOut pwm_B_;
MazeTaka 0:de44976b7670 31
MazeTaka 0:de44976b7670 32 /** constractorの定義
MazeTaka 0:de44976b7670 33 * @param pwm_F モーターを正転させるpwmピン名
MazeTaka 0:de44976b7670 34 * @param pwm_B モーターを後転させるpwmピン名
MazeTaka 0:de44976b7670 35 * @param us モーターのpwm周期[us]
MazeTaka 0:de44976b7670 36 * @param ec Encoder classのポインタ
MazeTaka 0:de44976b7670 37 * モーターを正転させるとエンコーダのcountが正のほうに加算されるようにエンコーダとモーターを設置する
MazeTaka 0:de44976b7670 38 */
MazeTaka 0:de44976b7670 39 SpeedControl(PinName pwm_F,PinName pwm_B,int us,Ec &ec);
MazeTaka 0:de44976b7670 40
MazeTaka 0:de44976b7670 41
MazeTaka 0:de44976b7670 42 /** 速度制御関数、引数は目標速度
MazeTaka 0:de44976b7670 43 *
MazeTaka 0:de44976b7670 44 * この目標角加速度になるようにモーターを回転させることができる
MazeTaka 0:de44976b7670 45 * 負の数を代入すれば逆回転することができる
MazeTaka 0:de44976b7670 46 *
MazeTaka 0:de44976b7670 47 * @param target_omega 目標角速度
MazeTaka 0:de44976b7670 48 *
MazeTaka 0:de44976b7670 49 * @section CAUTION(printfについて)
MazeTaka 0:de44976b7670 50 *
MazeTaka 0:de44976b7670 51 * 上記のプログラムのように、速度制御ではループ500回ごとにprintfをしている。
MazeTaka 0:de44976b7670 52 *
MazeTaka 0:de44976b7670 53 * printfはプログラム的に大きな負担がかかり、かなり時間がかかってしまうものである。
MazeTaka 0:de44976b7670 54 *
MazeTaka 0:de44976b7670 55 * なのでループごとにいちいちprintfをさせると、速度の収束にかなり時間がかかってしまう。
MazeTaka 0:de44976b7670 56 *
MazeTaka 0:de44976b7670 57 * (どんなプログラムにも言えるが、)そのためこのようなprintfの頻度を少なくさせるような工夫が必要になる。
MazeTaka 0:de44976b7670 58 *
MazeTaka 0:de44976b7670 59 */
MazeTaka 0:de44976b7670 60 void Sc(double target_omega);
MazeTaka 0:de44976b7670 61 ///モーターのpwm周期の設定用関数[s]
MazeTaka 0:de44976b7670 62 void period(double s);
MazeTaka 0:de44976b7670 63 ///モーターのpwm周期の設定用関数[ms]
MazeTaka 0:de44976b7670 64 void period_ms(int ms);
MazeTaka 0:de44976b7670 65 ///モーターのpwm周期の設定用関数[us]
MazeTaka 0:de44976b7670 66 void period_us(int us);
MazeTaka 0:de44976b7670 67 /** PIDパラメータ設定関数
MazeTaka 0:de44976b7670 68 *
MazeTaka 0:de44976b7670 69 * 引数はそれぞれp,dパラメータ
MazeTaka 0:de44976b7670 70 *
MazeTaka 2:77256385cf03 71 * パラメーター値は実験的に頑張って求めるしかない
MazeTaka 0:de44976b7670 72 * @param kp p制御パラメータ
MazeTaka 0:de44976b7670 73 * @param kd d制御パラメータ
MazeTaka 0:de44976b7670 74 */
MazeTaka 0:de44976b7670 75 void setPDparam(double kp,double kd);
MazeTaka 0:de44976b7670 76
MazeTaka 0:de44976b7670 77 /** 角速度・duty比の関係式の設定関数
MazeTaka 0:de44976b7670 78 * 横軸を角速度[rad/s], 縦軸をduty比としたときの傾きCと切片Dを正転と逆転について設定する
MazeTaka 0:de44976b7670 79 * @param cf 角速度[rad/s]とduty比の関係式の傾き(正転時)
MazeTaka 0:de44976b7670 80 * @param df 角速度[rad/s]とduty比の関係式の切片(正転時)
MazeTaka 0:de44976b7670 81 * @param cb 角速度[rad/s]とduty比の関係式の傾き(逆転時)
MazeTaka 0:de44976b7670 82 * @param db 角速度[rad/s]とduty比の関係式の切片(逆転時)
MazeTaka 0:de44976b7670 83 */
MazeTaka 0:de44976b7670 84 void setEquation(double cf,double df,double cb,double db);
MazeTaka 2:77256385cf03 85 /** 出力duty比の上限を決める関数
MazeTaka 2:77256385cf03 86 * 0 ~ 0.95の範囲内で設定する
MazeTaka 2:77256385cf03 87 * @param duty_limit 出力duty比の上限
MazeTaka 2:77256385cf03 88 */
MazeTaka 0:de44976b7670 89 void setDutyLimit(double duty_limit);
MazeTaka 0:de44976b7670 90
MazeTaka 0:de44976b7670 91 /** モーター停止用関数
MazeTaka 0:de44976b7670 92 * dutyを0にする
MazeTaka 0:de44976b7670 93 */
MazeTaka 0:de44976b7670 94 void stop();
MazeTaka 0:de44976b7670 95 /** duty(-1 ~ 1)比でモーターを回転させる関数
MazeTaka 0:de44976b7670 96 * 負の値を入れたら逆回転する
MazeTaka 2:77256385cf03 97 * @param duty 出力duty比
MazeTaka 0:de44976b7670 98 */
MazeTaka 0:de44976b7670 99 void turn(double duty);
MazeTaka 0:de44976b7670 100 ///Encoderや速度制御の値をresetする関数
MazeTaka 0:de44976b7670 101 void reset();
MazeTaka 0:de44976b7670 102 };
MazeTaka 0:de44976b7670 103
MazeTaka 0:de44976b7670 104 #endif
MazeTaka 0:de44976b7670 105