7th_DENSOU / SpeedController
Embed: (wiki syntax)

« Back to documentation index

SpeedControl Class Reference

SpeedControl Class Reference

モーターの速度制御用プログラム More...

#include <SpeedController.h>

Public Member Functions

 SpeedControl (PinName pwm_F, PinName pwm_B, int us, Ec &ec)
 constractorの定義
void period (double s)
 モーターのpwm周期の設定用関数
void period_ms (int ms)
 モーターのpwm周期の設定用関数
void period_us (int us)
 モーターのpwm周期の設定用関数
void setPIDparam (double kp, double ki, double kd)
 PIDパラメータ設定関数
void setEquation (double cf, double df, double cb, double db)
 角速度・duty比の関係式の設定関数 横軸を角速度[rad/s], 縦軸をduty比としたときの傾きCと切片Dを正転と逆転について設定する
void setDutyLimit (double duty_limit)
 出力duty比の上限を決める関数 0 ~ 0.95の範囲内で設定する
void Sc (double target_omega)
 速度制御関数、引数は目標速度
void stop ()
 モーター停止用関数 dutyを0にする
void turn (double duty)
 duty(-1 ~ 1)比でモーターを回転させる関数 負の値を入れたら逆回転する
void reset ()
 Encoderや速度制御の値をresetする関数

Detailed Description

モーターの速度制御用プログラム

モーターのdutyと角速度がほぼ比例することを利用して出力を決定し、PID制御で補正する

Definition at line 8 of file SpeedController.h.


Constructor & Destructor Documentation

SpeedControl ( PinName  pwm_F,
PinName  pwm_B,
int  us,
Ec &  ec 
)

constractorの定義

Parameters:
pwm_Fモーターを正転させるpwmピン名
pwm_Bモーターを後転させるpwmピン名
usモーターのpwm周期[us]
ecEncoder classのポインタ モーターを正転させるとエンコーダのcountが正のほうに加算されるようにエンコーダとモーターを設置する

Definition at line 5 of file SpeedController.cpp.


Member Function Documentation

void period ( double  s )

モーターのpwm周期の設定用関数

Parameters:
sモーターのpwm周期[s]

Definition at line 12 of file SpeedController.cpp.

void period_ms ( int  ms )

モーターのpwm周期の設定用関数

Parameters:
msモーターのpwm周期[ms]

Definition at line 17 of file SpeedController.cpp.

void period_us ( int  us )

モーターのpwm周期の設定用関数

Parameters:
usモーターのpwm周期[us]

SAMPLE

   Ec4multi EC(p11,p12,500);
   SpeedControl motor(p21,p22,50,EC);
   int main(){
       motor.period_us(50);
       while(1){

Definition at line 22 of file SpeedController.cpp.

void reset (  )

Encoderや速度制御の値をresetする関数

Definition at line 100 of file SpeedController.cpp.

void Sc ( double  target_omega )

速度制御関数、引数は目標速度

この目標角加速度になるようにモーターを回転させることができる 負の数を代入すれば逆回転することができる

Parameters:
target_omega目標角速度

SAMPLE

   //プログラム例
   #include "mbed.h"
   #include "EC.h" //Encoderライブラリをインクルード
   #include "SpeedController.h"    //SpeedControlライブラリをインクルード
   #define RESOLUTION 500
   Ec4multi EC(p11,p12,RESOLUTION);
   SpeedControl motor(p21,p22,50,EC);
   int main(){
       motor.setEquation(0.0062,0.0045,-0.0061,0.0091);    //求めたC,Dの値を設定
       motor.setPDparam(0.1,0.0);  //PIDの係数を設定
       int kai=0;
       for(int i=0;i<100000000;i++){
           motor.Sc(10);   //10[rad/s]でモーターを回転
           kai++;
           if(kai>1000){
               printf("omega=%f\r\n",EC.getOmega());
               kai=0;
           }
       }
       motor.stop()
       while(1);
   }

CAUTION(printfの負荷について)

printfはプログラム的に大きな負担がかかり、かなり時間がかかってしまうものである。

なのでループごとにいちいちprintfをさせると、速度の収束にかなり時間がかかってしまう。

(どんなプログラムにも言えるが、)そのためこのようなprintfの頻度を少なくさせるような工夫が必要になる。

Definition at line 29 of file SpeedController.cpp.

void setDutyLimit ( double  duty_limit )

出力duty比の上限を決める関数 0 ~ 0.95の範囲内で設定する

Parameters:
duty_limit出力duty比の上限

SAMPLE

  Ec4multi EC(p11,p12,500);
  SpeedControl motor(p21,p22,50,EC);
  int main(){
      motor.setDutyLimit(0.5);    //duty比の上限を0.5に設定
      while(1){

Definition at line 94 of file SpeedController.cpp.

void setEquation ( double  cf,
double  df,
double  cb,
double  db 
)

角速度・duty比の関係式の設定関数 横軸を角速度[rad/s], 縦軸をduty比としたときの傾きCと切片Dを正転と逆転について設定する

Parameters:
cf角速度[rad/s]とduty比の関係式の傾き(正転時)
df角速度[rad/s]とduty比の関係式の切片(正転時)
cb角速度[rad/s]とduty比の関係式の傾き(逆転時)
db角速度[rad/s]とduty比の関係式の切片(逆転時)

SAMPLE

  Ec4multi EC(p11,p12,500);
  SpeedControl motor(p21,p22,50,EC);
  int main(){
      motor.setEquation(0.02,0.0001,-0.02,0.0001);
      while(1){

Definition at line 84 of file SpeedController.cpp.

void setPIDparam ( double  kp,
double  ki,
double  kd 
)

PIDパラメータ設定関数

引数はそれぞれp,dパラメータ

パラメーター値は実験的に頑張って求めるしかない

Parameters:
kpp制御パラメータ
kdd制御パラメータ

SAMPLE

  Ec4multi EC(p11,p12,500);
  SpeedControl motor(p21,p22,50,EC);
  int main(){
      motor.setPDparam(0.1,0.001);
      while(1){

Definition at line 76 of file SpeedController.cpp.

void stop (  )

モーター停止用関数 dutyを0にする

Definition at line 109 of file SpeedController.cpp.

void turn ( double  duty )

duty(-1 ~ 1)比でモーターを回転させる関数 負の値を入れたら逆回転する

Parameters:
duty出力duty比

SAMPLE

   #include "mbed.h"
   #include "EC.h" //Encoderライブラリをインクルード
   #include "SpeedController.h"    //SpeedControlライブラリをインクルード
   #define RESOLUTION 500
   Ec4multi EC(p11,p12,RESOLUTION);
   SpeedControl motor(p21,p22,50,EC);
   int main(){
       while(1){
           motor.turn(0.5);    //duty0.5で正転
           wait(1);
           motor.turn(0);      //停止
           wait(1);
           motor.turn(-0.5);   //duty0.5で逆転
           wait(1);
           motor.turn(0);      //停止
           wait(1);
       }
   }

Definition at line 62 of file SpeedController.cpp.