shata

Committer:
yuki0108
Date:
Sat Jul 10 01:51:58 2021 +0000
Revision:
0:7f95508de23e
Child:
1:76da1a46652f
7.10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yuki0108 0:7f95508de23e 1 #include "mbed.h"
yuki0108 0:7f95508de23e 2 #include "EC.h"
yuki0108 0:7f95508de23e 3 #include "CalPID.h"
yuki0108 0:7f95508de23e 4 #include "MotorController.h"
yuki0108 0:7f95508de23e 5
yuki0108 0:7f95508de23e 6 MotorController::MotorController(PinName motor_p_, PinName motor_n_,double dt, Ec &ec, CalPID &sc_, CalPID &ac_duty, CalPID &ac_omega) : motor_p(motor_p_), motor_n(motor_n_)
yuki0108 0:7f95508de23e 7 {
yuki0108 0:7f95508de23e 8 ec_ = &ec;
yuki0108 0:7f95508de23e 9 sc_pid = &sc_;
yuki0108 0:7f95508de23e 10 ac_duty_pid = &ac_duty;
yuki0108 0:7f95508de23e 11 ac_omega_pid = &ac_omega;
yuki0108 0:7f95508de23e 12 motor_p.period_us(50);
yuki0108 0:7f95508de23e 13 motor_n.period_us(50);
yuki0108 0:7f95508de23e 14 setDeltaTime(dt);
yuki0108 0:7f95508de23e 15 angle_offset=0;
yuki0108 0:7f95508de23e 16 // state_sc=ACCELERATION_MODE;
yuki0108 0:7f95508de23e 17
yuki0108 0:7f95508de23e 18 calibration(0);
yuki0108 0:7f95508de23e 19 }
yuki0108 0:7f95508de23e 20 double MotorController::getAngle()
yuki0108 0:7f95508de23e 21 {
yuki0108 0:7f95508de23e 22 angle=ec_->getRad();
yuki0108 0:7f95508de23e 23 angle+=angle_offset;
yuki0108 0:7f95508de23e 24 return angle;
yuki0108 0:7f95508de23e 25 }
yuki0108 0:7f95508de23e 26 void MotorController::calibration(double angle_calibration)
yuki0108 0:7f95508de23e 27 {
yuki0108 0:7f95508de23e 28 angle_offset=angle_calibration;
yuki0108 0:7f95508de23e 29 ec_->reset();
yuki0108 0:7f95508de23e 30 }
yuki0108 0:7f95508de23e 31 void MotorController::period(double s)
yuki0108 0:7f95508de23e 32 {
yuki0108 0:7f95508de23e 33 motor_p.period(s);
yuki0108 0:7f95508de23e 34 motor_n.period(s);
yuki0108 0:7f95508de23e 35 }
yuki0108 0:7f95508de23e 36 void MotorController::period_ms(int ms)
yuki0108 0:7f95508de23e 37 {
yuki0108 0:7f95508de23e 38 motor_p.period_ms(ms);
yuki0108 0:7f95508de23e 39 motor_n.period_ms(ms);
yuki0108 0:7f95508de23e 40 }
yuki0108 0:7f95508de23e 41 void MotorController::period_us(int us)
yuki0108 0:7f95508de23e 42 {
yuki0108 0:7f95508de23e 43 motor_p.period_us(us);
yuki0108 0:7f95508de23e 44 motor_n.period_us(us);
yuki0108 0:7f95508de23e 45 }
yuki0108 0:7f95508de23e 46 void MotorController::setDutyLimit(double max)
yuki0108 0:7f95508de23e 47 {
yuki0108 0:7f95508de23e 48 sc_pid->setMaxValue(max);
yuki0108 0:7f95508de23e 49 ac_duty_pid->setMaxValue(max);
yuki0108 0:7f95508de23e 50 }
yuki0108 0:7f95508de23e 51 void MotorController::setOmegaLimit(double max)
yuki0108 0:7f95508de23e 52 {
yuki0108 0:7f95508de23e 53 ac_omega_pid->setMaxValue(max);
yuki0108 0:7f95508de23e 54 }
yuki0108 0:7f95508de23e 55 void MotorController::setPDParamSc(double kp, double kd)
yuki0108 0:7f95508de23e 56 {
yuki0108 0:7f95508de23e 57 sc_pid->setParameter(kp, 0, kd);
yuki0108 0:7f95508de23e 58 }
yuki0108 0:7f95508de23e 59 void MotorController::setPDParamAcDuty(double kp, double kd)
yuki0108 0:7f95508de23e 60 {
yuki0108 0:7f95508de23e 61 ac_duty_pid->setParameter(kp, 0, kd);
yuki0108 0:7f95508de23e 62 }
yuki0108 0:7f95508de23e 63 void MotorController::setPDParamAcOmega(double kp, double kd)
yuki0108 0:7f95508de23e 64 {
yuki0108 0:7f95508de23e 65 ac_omega_pid->setParameter(kp, 0, kd);
yuki0108 0:7f95508de23e 66 }
yuki0108 0:7f95508de23e 67 void MotorController::setDeltaTime(double dt)
yuki0108 0:7f95508de23e 68 {
yuki0108 0:7f95508de23e 69 delta_t=dt;
yuki0108 0:7f95508de23e 70 sc_pid->setDELTA_T(dt);
yuki0108 0:7f95508de23e 71 ac_duty_pid->setDELTA_T(dt);
yuki0108 0:7f95508de23e 72 ac_omega_pid->setDELTA_T(dt);
yuki0108 0:7f95508de23e 73
yuki0108 0:7f95508de23e 74 }
yuki0108 0:7f95508de23e 75 void MotorController::setEquation(double cf,double df,double cb,double db)
yuki0108 0:7f95508de23e 76 {
yuki0108 0:7f95508de23e 77 Cf_=cf;
yuki0108 0:7f95508de23e 78 if(cb>0)Cb_=cb;
yuki0108 0:7f95508de23e 79 else Cb_=-cb;
yuki0108 0:7f95508de23e 80 initial_Df_=df;
yuki0108 0:7f95508de23e 81 initial_Db_=-db;
yuki0108 0:7f95508de23e 82 Df_=initial_Df_;
yuki0108 0:7f95508de23e 83 Db_=initial_Db_;
yuki0108 0:7f95508de23e 84 }
yuki0108 0:7f95508de23e 85 void MotorController::turn(double duty)
yuki0108 0:7f95508de23e 86 {
yuki0108 0:7f95508de23e 87 if (duty<1.0&&duty >= 0) {
yuki0108 0:7f95508de23e 88 motor_p = duty;
yuki0108 0:7f95508de23e 89 motor_n = 0;
yuki0108 0:7f95508de23e 90 } else if (duty < 0&&duty>-1.0) {
yuki0108 0:7f95508de23e 91 motor_p = 0;
yuki0108 0:7f95508de23e 92 motor_n = -duty;
yuki0108 0:7f95508de23e 93 }
yuki0108 0:7f95508de23e 94 }
yuki0108 0:7f95508de23e 95 void MotorController::Sc(double target_omega)
yuki0108 0:7f95508de23e 96 {
yuki0108 0:7f95508de23e 97 ec_->calOmega();
yuki0108 0:7f95508de23e 98 double omega = ec_->getOmega();
yuki0108 0:7f95508de23e 99 double devia = target_omega - omega;
yuki0108 0:7f95508de23e 100 // double pid = sc_pid->calPD(devia);
yuki0108 0:7f95508de23e 101 double pid = sc_pid->calP_D(devia,ec_->getAcceleration());
yuki0108 0:7f95508de23e 102 // double duty;
yuki0108 0:7f95508de23e 103
yuki0108 0:7f95508de23e 104 if (target_omega > 0.0) {
yuki0108 0:7f95508de23e 105 Df_ += Cf_ * pid;
yuki0108 0:7f95508de23e 106 duty = Cf_ * target_omega + Df_;
yuki0108 0:7f95508de23e 107 } else if (target_omega < -0.0) {
yuki0108 0:7f95508de23e 108 Db_ += Cb_ * pid;
yuki0108 0:7f95508de23e 109 duty = Cb_ * target_omega + Db_;
yuki0108 0:7f95508de23e 110 } else
yuki0108 0:7f95508de23e 111 duty = 0;
yuki0108 0:7f95508de23e 112 turn(duty);
yuki0108 0:7f95508de23e 113 }
yuki0108 0:7f95508de23e 114 double MotorController::calSc(double target_omega)
yuki0108 0:7f95508de23e 115 {
yuki0108 0:7f95508de23e 116 ec_->calOmega();
yuki0108 0:7f95508de23e 117 double omega = ec_->getOmega();
yuki0108 0:7f95508de23e 118 double devia = target_omega - omega;
yuki0108 0:7f95508de23e 119 // double pid = sc_pid->calPD(devia);
yuki0108 0:7f95508de23e 120 double pid = sc_pid->calP_D(devia,ec_->getAcceleration());
yuki0108 0:7f95508de23e 121
yuki0108 0:7f95508de23e 122 double duty_=0;
yuki0108 0:7f95508de23e 123 if (target_omega > 0.0) {
yuki0108 0:7f95508de23e 124 Df_ += Cf_ * pid;
yuki0108 0:7f95508de23e 125 duty_ = Cf_ * target_omega + Df_;
yuki0108 0:7f95508de23e 126 } else if (target_omega < -0.0) {
yuki0108 0:7f95508de23e 127 Db_ += Cb_ * pid;
yuki0108 0:7f95508de23e 128 duty_ = Cb_ * target_omega + Db_;
yuki0108 0:7f95508de23e 129 } else
yuki0108 0:7f95508de23e 130 duty_ = 0;
yuki0108 0:7f95508de23e 131 return duty_;
yuki0108 0:7f95508de23e 132 }
yuki0108 0:7f95508de23e 133 void MotorController::AcDuty(double target_angle)
yuki0108 0:7f95508de23e 134 {
yuki0108 0:7f95508de23e 135 getAngle();
yuki0108 0:7f95508de23e 136 double devia = target_angle - angle;
yuki0108 0:7f95508de23e 137 double duty_omega = ac_duty_pid->calP_D(devia,ec_->getOmega());
yuki0108 0:7f95508de23e 138 turn(duty_omega);
yuki0108 0:7f95508de23e 139 }
yuki0108 0:7f95508de23e 140 void MotorController::AcOmega(double target_angle)
yuki0108 0:7f95508de23e 141 {
yuki0108 0:7f95508de23e 142 getAngle();
yuki0108 0:7f95508de23e 143 double devia = target_angle - angle;
yuki0108 0:7f95508de23e 144 double omega = ac_omega_pid->calP_D(devia,ec_->getOmega());
yuki0108 0:7f95508de23e 145 double duty_offset=DUTY_OFFSET*cos(angle);
yuki0108 0:7f95508de23e 146 duty=calSc(omega)+duty_offset;
yuki0108 0:7f95508de23e 147 turn(duty);
yuki0108 0:7f95508de23e 148 }
yuki0108 0:7f95508de23e 149 void MotorController::stop()
yuki0108 0:7f95508de23e 150 {
yuki0108 0:7f95508de23e 151 motor_p = 0;
yuki0108 0:7f95508de23e 152 motor_n = 0;
yuki0108 0:7f95508de23e 153 }
yuki0108 0:7f95508de23e 154 void MotorController::reset()
yuki0108 0:7f95508de23e 155 {
yuki0108 0:7f95508de23e 156 ec_->reset();
yuki0108 0:7f95508de23e 157 Df_=initial_Df_;
yuki0108 0:7f95508de23e 158 Db_=initial_Db_;
yuki0108 0:7f95508de23e 159 }
yuki0108 0:7f95508de23e 160 double MotorController::getDuty()
yuki0108 0:7f95508de23e 161 {
yuki0108 0:7f95508de23e 162 // return duty;
yuki0108 0:7f95508de23e 163 return Df_;
yuki0108 0:7f95508de23e 164 }