2月25日
Dependencies: Encoder
Dependents: NHK2020-m2-2-ros_2_25
SpeedController.h
- Committer:
- MazeTaka
- Date:
- 2019-07-24
- Revision:
- 0:de44976b7670
- Child:
- 2:77256385cf03
File content as of revision 0:de44976b7670:
#ifndef _INCLUDE_SPEEDCONTROLLER_H_ #define _INCLUDE_SPEEDCONTROLLER_H_ /** * @brief モーターの速度制御用プログラム * @details モーターのdutyと角速度がほぼ比例することを利用してPID制御を補正する **/ class SpeedControl { private: double Kp_,Kd_; double pre_diff; double ptsc_; double Cf_; double Cb_; /** 角速度(rad/s)をduty比に変換させるための定数 * * * **/ double Df_; double Db_; double initial_Df_; double initial_Db_; double duty_limit_; Ec *ec_; public: PwmOut pwm_F_; PwmOut pwm_B_; /** constractorの定義 * @param pwm_F モーターを正転させるpwmピン名 * @param pwm_B モーターを後転させるpwmピン名 * @param us モーターのpwm周期[us] * @param ec Encoder classのポインタ * モーターを正転させるとエンコーダのcountが正のほうに加算されるようにエンコーダとモーターを設置する */ SpeedControl(PinName pwm_F,PinName pwm_B,int us,Ec &ec); /** 速度制御関数、引数は目標速度 * * この目標角加速度になるようにモーターを回転させることができる * 負の数を代入すれば逆回転することができる * * @param target_omega 目標角速度 * * @section CAUTION(printfについて) * * 上記のプログラムのように、速度制御ではループ500回ごとにprintfをしている。 * * printfはプログラム的に大きな負担がかかり、かなり時間がかかってしまうものである。 * * なのでループごとにいちいちprintfをさせると、速度の収束にかなり時間がかかってしまう。 * * (どんなプログラムにも言えるが、)そのためこのようなprintfの頻度を少なくさせるような工夫が必要になる。 * */ void Sc(double target_omega); ///モーターのpwm周期の設定用関数[s] void period(double s); ///モーターのpwm周期の設定用関数[ms] void period_ms(int ms); ///モーターのpwm周期の設定用関数[us] void period_us(int us); /** PIDパラメータ設定関数 * * 引数はそれぞれp,dパラメータ * * パラメーター値は実験的に頑張って求めるしかないです * @param kp p制御パラメータ * @param kd d制御パラメータ */ void setPDparam(double kp,double kd); /** 角速度・duty比の関係式の設定関数 * 横軸を角速度[rad/s], 縦軸をduty比としたときの傾きCと切片Dを正転と逆転について設定する * @param cf 角速度[rad/s]とduty比の関係式の傾き(正転時) * @param df 角速度[rad/s]とduty比の関係式の切片(正転時) * @param cb 角速度[rad/s]とduty比の関係式の傾き(逆転時) * @param db 角速度[rad/s]とduty比の関係式の切片(逆転時) */ void setEquation(double cf,double df,double cb,double db); void setDutyLimit(double duty_limit); /** モーター停止用関数 * dutyを0にする */ void stop(); /** duty(-1 ~ 1)比でモーターを回転させる関数 * 負の値を入れたら逆回転する */ void turn(double duty); ///Encoderや速度制御の値をresetする関数 void reset(); }; #endif