robostep8th / Mbed 2 deprecated SCforMatlab

Dependencies:   mbed Encoder

Committer:
mrtkhmbed
Date:
Thu Dec 24 08:35:33 2020 +0000
Revision:
0:0b57d295ca56
SCforMatlab

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mrtkhmbed 0:0b57d295ca56 1 #ifndef _INCLUDE_MOTORMEASURE_H_
mrtkhmbed 0:0b57d295ca56 2 #define _INCLUDE_MOTORMEASURE_H_
mrtkhmbed 0:0b57d295ca56 3 #define MEASURE_CW 0
mrtkhmbed 0:0b57d295ca56 4 #define MEASURE_CCW 1
mrtkhmbed 0:0b57d295ca56 5 #define GEER 1.0 //回転を制御したい軸とエンコーダーの付いてる軸が異なる場合に
mrtkhmbed 0:0b57d295ca56 6 class SCforMatlab //制御周期が0.01s以上を想定。それ以上細かい制御周期では使えない
mrtkhmbed 0:0b57d295ca56 7 {
mrtkhmbed 0:0b57d295ca56 8 private:
mrtkhmbed 0:0b57d295ca56 9 ////////////////////////////////
mrtkhmbed 0:0b57d295ca56 10 int size;
mrtkhmbed 0:0b57d295ca56 11 float duty;
mrtkhmbed 0:0b57d295ca56 12 float delta_t;
mrtkhmbed 0:0b57d295ca56 13 int save_count;
mrtkhmbed 0:0b57d295ca56 14 int duty_count;
mrtkhmbed 0:0b57d295ca56 15 float turn_time;
mrtkhmbed 0:0b57d295ca56 16 // float *omega; //Matlab用に出力を記録。fが正転の測定分でbが逆転の測定分
mrtkhmbed 0:0b57d295ca56 17 // float *input_duty; //Matlab用に入力を記録
mrtkhmbed 0:0b57d295ca56 18 float omega[3500]; //Matlab用に出力を記録
mrtkhmbed 0:0b57d295ca56 19 float input_duty[3500]; //Matlab用に入力を記録
mrtkhmbed 0:0b57d295ca56 20 float least_squares[18][2]; //最小二乗法用に測定(データは0~0.8取得しているが計算では指定した範囲(デフォルト0.1~0.7)を使う)
mrtkhmbed 0:0b57d295ca56 21 int measure_mode; //正転計測時0で逆転計測時1
mrtkhmbed 0:0b57d295ca56 22 Ec *ec_;
mrtkhmbed 0:0b57d295ca56 23 ////////////////////////////////速度制御のC値,D値計算周り。
mrtkhmbed 0:0b57d295ca56 24 float start_cal;
mrtkhmbed 0:0b57d295ca56 25 float end_cal;
mrtkhmbed 0:0b57d295ca56 26 float cf_;
mrtkhmbed 0:0b57d295ca56 27 float df_;
mrtkhmbed 0:0b57d295ca56 28 float cb_;
mrtkhmbed 0:0b57d295ca56 29 float db_;
mrtkhmbed 0:0b57d295ca56 30 public:
mrtkhmbed 0:0b57d295ca56 31 PwmOut forward;
mrtkhmbed 0:0b57d295ca56 32 PwmOut back;
mrtkhmbed 0:0b57d295ca56 33 Ticker ticker_;
mrtkhmbed 0:0b57d295ca56 34 SCforMatlab(PinName pwm_F,PinName pwm_B,float period_us,Ec &ec,float dt);//dtには速度制御(Sc)を実際に使うときに繰り返す周期を入れる(0.05とか0.01とか)
mrtkhmbed 0:0b57d295ca56 35 void saveOmega();
mrtkhmbed 0:0b57d295ca56 36 void motorTurn(float out);
mrtkhmbed 0:0b57d295ca56 37 void measureTurn();
mrtkhmbed 0:0b57d295ca56 38 void showOmega();
mrtkhmbed 0:0b57d295ca56 39 ////////////////////////////////////////////////////////////////C,D値計算周りの関数
mrtkhmbed 0:0b57d295ca56 40 void setCDRange(float start,float end);//最小二乗法に使う範囲を0.05刻みで決める
mrtkhmbed 0:0b57d295ca56 41 void calC_Dvalue();//速度制御のC値,D値を計算して表示してくれる。
mrtkhmbed 0:0b57d295ca56 42 ////////////////////////////////////////////////////////////////////
mrtkhmbed 0:0b57d295ca56 43 void measureMotor();/////測定し、結果がprintfされる。
mrtkhmbed 0:0b57d295ca56 44 //////////////////////////使い方///////////////////////////////////////
mrtkhmbed 0:0b57d295ca56 45 //1:まずエンコーダーとモーターの向きを合わせる。pwm_Fピンから入力したときにエンコーダーが増えてく方向推奨。
mrtkhmbed 0:0b57d295ca56 46 //2:measureMotor()を一回処理するとモーターが回って、測定が始まる
mrtkhmbed 0:0b57d295ca56 47 //3:出てきたデータを全部エクセルなどにコピペ(Matlabに取り込むときにエクセルファイルである必要があるので)
mrtkhmbed 0:0b57d295ca56 48 //////出てきたデータについて
mrtkhmbed 0:0b57d295ca56 49 //////まずMatlab用の入出力データが表示される。最後にSpeedControllerライブラリで必要なC,D値が出力される。
mrtkhmbed 0:0b57d295ca56 50 //////記録の意味もあるのでエクセルに全部コピペ推奨ですが、最後のSC用の部分はMatlabでは使わないです。
mrtkhmbed 0:0b57d295ca56 51 //4:MatlabでPIDの係数を算出する。
mrtkhmbed 0:0b57d295ca56 52 //5:以上でSC用のC,D値とPIDの係数が算出される。
mrtkhmbed 0:0b57d295ca56 53 };
mrtkhmbed 0:0b57d295ca56 54 #endif
mrtkhmbed 0:0b57d295ca56 55
mrtkhmbed 0:0b57d295ca56 56
mrtkhmbed 0:0b57d295ca56 57
mrtkhmbed 0:0b57d295ca56 58
mrtkhmbed 0:0b57d295ca56 59
mrtkhmbed 0:0b57d295ca56 60
mrtkhmbed 0:0b57d295ca56 61
mrtkhmbed 0:0b57d295ca56 62
mrtkhmbed 0:0b57d295ca56 63
mrtkhmbed 0:0b57d295ca56 64
mrtkhmbed 0:0b57d295ca56 65
mrtkhmbed 0:0b57d295ca56 66
mrtkhmbed 0:0b57d295ca56 67
mrtkhmbed 0:0b57d295ca56 68
mrtkhmbed 0:0b57d295ca56 69