shata

Committer:
yuki0108
Date:
Mon Oct 25 10:20:35 2021 +0000
Revision:
1:76da1a46652f
Parent:
0:7f95508de23e
Child:
2:113b6a35d37c
2021 1025

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yuki0108 0:7f95508de23e 1 #ifndef MOTORCONTROLLER_H
yuki0108 0:7f95508de23e 2 #define MOTORCONTROLLER_H
yuki0108 0:7f95508de23e 3
yuki0108 0:7f95508de23e 4
yuki0108 0:7f95508de23e 5 class MotorController
yuki0108 0:7f95508de23e 6 {
yuki0108 0:7f95508de23e 7 private:
yuki0108 0:7f95508de23e 8 double delta_t;
yuki0108 0:7f95508de23e 9 double angle;
yuki0108 0:7f95508de23e 10 double angle_offset;
yuki0108 1:76da1a46652f 11 double duty_offset;
yuki0108 0:7f95508de23e 12
yuki0108 0:7f95508de23e 13 double Cf_;
yuki0108 0:7f95508de23e 14 double Cb_;
yuki0108 0:7f95508de23e 15 double Df_;
yuki0108 0:7f95508de23e 16 double Db_;
yuki0108 0:7f95508de23e 17 double initial_Df_;
yuki0108 0:7f95508de23e 18 double initial_Db_;
yuki0108 0:7f95508de23e 19
yuki0108 0:7f95508de23e 20 double duty_max;
yuki0108 0:7f95508de23e 21 double omega_max;
yuki0108 1:76da1a46652f 22 double acceleration_max;
yuki0108 1:76da1a46652f 23 double pre_target_omega;
yuki0108 0:7f95508de23e 24
yuki0108 0:7f95508de23e 25 Ec *ec_;
yuki0108 0:7f95508de23e 26 CalPID *sc_pid;
yuki0108 0:7f95508de23e 27 CalPID *ac_duty_pid;
yuki0108 0:7f95508de23e 28 CalPID *ac_omega_pid;
yuki0108 0:7f95508de23e 29
yuki0108 0:7f95508de23e 30 protected:
yuki0108 0:7f95508de23e 31 PwmOut motor_p;
yuki0108 0:7f95508de23e 32 PwmOut motor_n;
yuki0108 0:7f95508de23e 33
yuki0108 0:7f95508de23e 34 public:
yuki0108 0:7f95508de23e 35 MotorController(PinName motor_p_, PinName motor_n_,double dt, Ec &ec, CalPID &sc_, CalPID &ac_duty, CalPID &ac_omega);//引数は下行
yuki0108 0:7f95508de23e 36 //モーター正転、逆転、周期[s]、エンコーダ、速度制御用のPID、角度制御のPID、速度制御利用の角度制御のPID
yuki0108 0:7f95508de23e 37
yuki0108 0:7f95508de23e 38 //////////////////////////////////////////各クラスのコンストラクタ引数で設定はされているので呼び出しは不要。変更したい場合などに
yuki0108 0:7f95508de23e 39 void period(double s);//pwm周期設定用関数
yuki0108 0:7f95508de23e 40 void period_ms(int ms);//pwm周期設定用関数
yuki0108 0:7f95508de23e 41 void period_us(int us);//pwm周期設定用関数
yuki0108 0:7f95508de23e 42 void setDutyLimit(double max);//CalPIDによるduty比の最大値設定
yuki0108 0:7f95508de23e 43 void setOmegaLimit(double max);//CalPIDによる角速度[rad/s]の最大値設定
yuki0108 0:7f95508de23e 44 void setPDParamSc(double kp, double kd);//速度制御のPDゲイン設定用関数
yuki0108 0:7f95508de23e 45 void setPDParamAcDuty(double kp, double kd);//(duty比による)角度制御のPDゲイン設定用関数
yuki0108 0:7f95508de23e 46 void setPDParamAcOmega(double kp, double kd);//(速度制御による)角度制御のPDゲイン設定用関数
yuki0108 0:7f95508de23e 47 void setDeltaTime(double dt);//制御周期の設定用関数
yuki0108 1:76da1a46652f 48 void setAccelMax(double a_max);
yuki0108 1:76da1a46652f 49 void setDutyOffset(double duty_off);
yuki0108 0:7f95508de23e 50
yuki0108 0:7f95508de23e 51 //////////////////////////////////////////実際に使うときに呼び出す関数
yuki0108 0:7f95508de23e 52 double getAngle();
yuki0108 0:7f95508de23e 53 void calibration(double angle_calibration);
yuki0108 0:7f95508de23e 54 void setEquation(double cf, double df, double cb, double db);//速度制御のC値、D値の設定用。設定が必要
yuki0108 0:7f95508de23e 55 void turn(double duty);//モーターにduty比入力する
yuki0108 0:7f95508de23e 56 void AcDuty(double target_angle);//PD算出されたdutyによる角度制御
yuki0108 0:7f95508de23e 57 void AcOmega(double target_angle);//PD算出された角速度による角度制御。速度制御を利用している
yuki0108 1:76da1a46652f 58 void Sc(double target_omega_input);//速度制御
yuki0108 1:76da1a46652f 59 double calSc(double target_omega_input);//速度制御
yuki0108 0:7f95508de23e 60 void stop();//duty=0を入力
yuki0108 0:7f95508de23e 61 void reset();
yuki0108 0:7f95508de23e 62
yuki0108 0:7f95508de23e 63 };
yuki0108 0:7f95508de23e 64
yuki0108 0:7f95508de23e 65 #endif