Dependencies:   Encoder

Dependents:   NHK2020-m2-2-ros_2_25

Revision:
5:fddbe92ca86f
Parent:
4:ee0ac8415639
Child:
6:d110c276aa5a
--- a/SpeedController.h	Fri Aug 09 07:15:35 2019 +0000
+++ b/SpeedController.h	Sat Aug 10 04:13:52 2019 +0000
@@ -3,7 +3,7 @@
 
 /**
 * @brief モーターの速度制御用プログラム
-* @details モーターのdutyと角速度がほぼ比例することを利用してPID制御を補正する
+* @details モーターのdutyと角速度がほぼ比例することを利用して出力を決定し、PID制御で補正する
 **/
 class SpeedControl
 {
@@ -13,11 +13,6 @@
     double ptsc_;
     double Cf_;
     double Cb_;
-    /** 角速度(rad/s)をduty比に変換させるための定数
-     *
-     *
-     *
-     **/
     double Df_;
     double Db_;
     double initial_Df_;
@@ -39,6 +34,63 @@
     SpeedControl(PinName pwm_F,PinName pwm_B,int us,Ec &ec);
 
 
+
+    /**モーターのpwm周期の設定用関数
+    *   @param s モーターのpwm周期[s]
+    */
+    void period(double s);
+    /**モーターのpwm周期の設定用関数
+    *   @param ms モーターのpwm周期[ms]
+    */
+    void period_ms(int ms);
+    /**モーターのpwm周期の設定用関数
+    *   @param us モーターのpwm周期[us]
+     *  @senction SAMPLE
+     *  @code
+     *  SpeedControl motor(p21,p22,50,EC);
+     *  int main(){
+     *      motor.period_us(50);
+     *      while(1){
+     *  @endcode
+    */
+    void period_us(int us);
+    /** PIDパラメータ設定関数
+     *
+     *  引数はそれぞれp,dパラメータ
+     *
+     *  パラメーター値は実験的に頑張って求めるしかない
+     *  @param kp p制御パラメータ
+     *  @param kd d制御パラメータ
+     *  @senction SAMPLE
+     *  @code
+     *  SpeedControl motor(p21,p22,50,EC);
+     *  int main(){
+     *      motor.setPDparam(0.1,0.001);
+     *      while(1){
+     *  @endcode
+     */
+    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比の関係式の切片(逆転時)
+     *  @senction SAMPLE
+     *  @code
+     *  SpeedControl motor(p21,p22,50,EC);
+     *  int main(){
+     *      motor.setEquation(0.02,0.0001,-0.02,0.0001);
+     *      while(1){
+     *  @endcode
+     */
+    void setEquation(double cf,double df,double cb,double db);
+    /** 出力duty比の上限を決める関数
+    *   0 ~ 0.95の範囲内で設定する
+    *   @param duty_limit 出力duty比の上限
+    */
+    void setDutyLimit(double duty_limit);
     /** 速度制御関数、引数は目標速度
      *
      *  この目標角加速度になるようにモーターを回転させることができる
@@ -71,48 +123,14 @@
      *  }
      *  @endcode
      *
-     *  @section CAUTION(printfについて)
+     *  @section CAUTION(printfの負荷について)
      *  printfはプログラム的に大きな負担がかかり、かなり時間がかかってしまうものである。
+     *
      *  なのでループごとにいちいちprintfをさせると、速度の収束にかなり時間がかかってしまう。
+     *
      *  (どんなプログラムにも言えるが、)そのためこのようなprintfの頻度を少なくさせるような工夫が必要になる。
      */
     void Sc(double target_omega);
-    /**モーターのpwm周期の設定用関数
-    *   @param s モーターのpwm周期[s]
-    */
-    void period(double s);
-    /**モーターのpwm周期の設定用関数
-    *   @param s モーターのpwm周期[ms]
-    */
-    void period_ms(int ms);
-    /**モーターのpwm周期の設定用関数
-    *   @param s モーターの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);
-    /** 出力duty比の上限を決める関数
-    *   0 ~ 0.95の範囲内で設定する
-    *   @param duty_limit 出力duty比の上限
-    */
-    void setDutyLimit(double duty_limit);
-
     /** モーター停止用関数
     *   dutyを0にする
     */
@@ -130,13 +148,13 @@
     *   SpeedControl motor(p21,p22,50,EC);
     *   int main(){
     *       while(1){
-    *           motor.turn(0.5);
+    *           motor.turn(0.5);    //duty0.5で正転
     *           wait(1);
-    *           motor.turn(0);
+    *           motor.turn(0);      //停止
     *           wait(1);
-    *           motor.turn(-0.5);
+    *           motor.turn(-0.5);   //duty0.5で逆転
     *           wait(1);
-    *           motor.turn(0);
+    *           motor.turn(0);      //停止
     *           wait(1);
     *       }
     *   }