shata

Committer:
shatari
Date:
Fri Dec 10 14:04:16 2021 +0000
Revision:
2:113b6a35d37c
Parent:
1:76da1a46652f
a

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
shatari 2:113b6a35d37c 37
shatari 2:113b6a35d37c 38 double present_devia_omega;
shatari 2:113b6a35d37c 39 double present_target_omega;
yuki0108 0:7f95508de23e 40
yuki0108 0:7f95508de23e 41 //////////////////////////////////////////各クラスのコンストラクタ引数で設定はされているので呼び出しは不要。変更したい場合などに
yuki0108 0:7f95508de23e 42 void period(double s);//pwm周期設定用関数
yuki0108 0:7f95508de23e 43 void period_ms(int ms);//pwm周期設定用関数
yuki0108 0:7f95508de23e 44 void period_us(int us);//pwm周期設定用関数
yuki0108 0:7f95508de23e 45 void setDutyLimit(double max);//CalPIDによるduty比の最大値設定
yuki0108 0:7f95508de23e 46 void setOmegaLimit(double max);//CalPIDによる角速度[rad/s]の最大値設定
yuki0108 0:7f95508de23e 47 void setPDParamSc(double kp, double kd);//速度制御のPDゲイン設定用関数
yuki0108 0:7f95508de23e 48 void setPDParamAcDuty(double kp, double kd);//(duty比による)角度制御のPDゲイン設定用関数
yuki0108 0:7f95508de23e 49 void setPDParamAcOmega(double kp, double kd);//(速度制御による)角度制御のPDゲイン設定用関数
yuki0108 0:7f95508de23e 50 void setDeltaTime(double dt);//制御周期の設定用関数
yuki0108 1:76da1a46652f 51 void setAccelMax(double a_max);
yuki0108 1:76da1a46652f 52 void setDutyOffset(double duty_off);
yuki0108 0:7f95508de23e 53
yuki0108 0:7f95508de23e 54 //////////////////////////////////////////実際に使うときに呼び出す関数
yuki0108 0:7f95508de23e 55 double getAngle();
yuki0108 0:7f95508de23e 56 void calibration(double angle_calibration);
yuki0108 0:7f95508de23e 57 void setEquation(double cf, double df, double cb, double db);//速度制御のC値、D値の設定用。設定が必要
yuki0108 0:7f95508de23e 58 void turn(double duty);//モーターにduty比入力する
yuki0108 0:7f95508de23e 59 void AcDuty(double target_angle);//PD算出されたdutyによる角度制御
yuki0108 0:7f95508de23e 60 void AcOmega(double target_angle);//PD算出された角速度による角度制御。速度制御を利用している
yuki0108 1:76da1a46652f 61 void Sc(double target_omega_input);//速度制御
yuki0108 1:76da1a46652f 62 double calSc(double target_omega_input);//速度制御
yuki0108 0:7f95508de23e 63 void stop();//duty=0を入力
yuki0108 0:7f95508de23e 64 void reset();
yuki0108 0:7f95508de23e 65
yuki0108 0:7f95508de23e 66 };
yuki0108 0:7f95508de23e 67
yuki0108 0:7f95508de23e 68 #endif