8#include "cubic_arduino.h"
18 return deg * DEG_TO_RAD;
29 return rad * RAD_TO_DEG;
32namespace Cubic_controller
68 constexpr double limitAngle(
double angle,
const double min = -PI)
74 while (angle >= min + TWO_PI)
90 constexpr double encoderToAngle(
const int32_t encoder,
const uint16_t CPR,
const double offset = -PI,
const bool limit =
true)
94 return limitAngle(offset + encoder * (TWO_PI / (
double)CPR));
98 return offset + encoder * (TWO_PI / (double)CPR);
111 double capableDutyCycle;
156 Controller(uint8_t
motorNo, uint8_t
encoderNo,
enum class encoderType encoderType, uint16_t
CPR,
double Kp,
double Ki,
double Kd,
double target,
bool direction,
double capableDutyCycle,
double current,
bool logging =
false);
177 void setGains(
double Kp,
double Ki,
double Kd);
183 void setKp(
double Kp);
189 void setKi(
double Ki);
195 void setKd(
double Kd);
219 double getDt()
const;
232 virtual void reset();
239 virtual void reset(
double target);
248 virtual void reset(
double Kp,
double Ki,
double Kd);
258 virtual void reset(
double Kp,
double Ki,
double Kd,
double target);
297 Velocity_PID(uint8_t
motorNo, uint8_t
encoderNo,
enum class encoderType encoderType, uint16_t
CPR,
double Kp,
double Ki,
double Kd,
double target,
bool direction,
double capableDutyCycle = 1.0,
double p = 1.0,
bool logging =
false);
311 void reset()
override;
312 void reset(
double target)
override;
313 void reset(
double Kp,
double Ki,
double Kd)
override;
314 void reset(
double Kp,
double Ki,
double Kd,
double target)
override;
324 int8_t loopCount = 0;
342 Position_PID(uint8_t
motorNo, uint8_t
encoderNo,
enum class encoderType encoderType, uint16_t
CPR,
double Kp,
double Ki,
double Kd,
double target,
bool direction,
double capableDutyCycle = 1.0,
bool logging =
false);
361 this->pid.
setGains(abs(Kp), abs(Ki), abs(Kd));
365 this->pid.
setKp(abs(Kp));
369 this->pid.
setKi(abs(Ki));
373 this->pid.
setKd(abs(Kd));
385 return this->dutyCycle;
389 return this->pid.
getDt();
398 static double prevAngle = angle;
399 double actualAngle = angle;
409 prevAngle = actualAngle;
411 return angle + TWO_PI * this->loopCount;
418 Serial.print(
"encoder:");
434 this->pid.
reset(target);
438 this->pid.
reset(Kp, Ki, Kd);
440 inline void Controller::reset(
const double Kp,
const double Ki,
const double Kd,
const double target)
442 this->pid.
reset(Kp, Ki, Kd, target);
encoderType
エンコーダの種類を示します
Definition Cubic.controller.h:56
constexpr double ALLOWED_ROTATION_RANGE
アブソリュートエンコーダーの回転をどこまで許容するか。
Definition Cubic.controller.h:47
constexpr double radToDeg(double rad)
弧度法から度数法に変換します
Definition Cubic.controller.h:27
constexpr double LOOP_THRESHOLD
アブソリュートエンコーダのループ閾値
Definition Cubic.controller.h:41
constexpr uint16_t AMT22_CPR
AMT22のCPRです
Definition Cubic.controller.h:38
constexpr double limitAngle(double angle, const double min=-PI)
与えられた角度を一定範囲(min<=angle<min+2pi)に収めます
Definition Cubic.controller.h:68
constexpr double degToRad(double deg)
度数法から弧度法に変換します
Definition Cubic.controller.h:16
constexpr double encoderToAngle(const int32_t encoder, const uint16_t CPR, const double offset=-PI, const bool limit=true)
与えられたCPRのもと、エンコーダの値から角度を計算します
Definition Cubic.controller.h:90
Cubic制御器の抽象クラス
Definition Cubic.controller.h:107
virtual void reset()
制御器のリセット
Definition Cubic.controller.h:428
double compute_PID(double current)
pid.compute_PID()を呼ぶだけの関数です。
Definition Cubic.controller.h:351
const bool logging
ログを出力するかどうか
Definition Cubic.controller.h:129
virtual double compute()=0
duty比を計算します。各ループで一回呼び出してください。このduty比は、DUTY_SPI_MAXに対する比です。計算された値は、この関数内部で、DC_motor::put()されます。
const bool direction
モータをプラスの方向に回したとき、エンコーダが増加するかどうか
Definition Cubic.controller.h:127
const uint8_t motorNo
モータ番号
Definition Cubic.controller.h:116
double getCurrent() const
直前に読んだ制御量を返します。
Definition Cubic.controller.h:379
enum encoderType encoderType
エンコーダの種類
Definition Cubic.controller.h:118
void setKd(double Kd)
Dゲインを設定します。負の値は-1倍されます。
Definition Cubic.controller.h:371
virtual double encoderToAngle(int32_t encoder)=0
エンコーダの値から角度を計算します。設定したCPR(Count Per Revolution)に依存します。
const uint16_t CPR
CPR(Counts Per Revolution)
Definition Cubic.controller.h:125
int32_t readEncoder() const
エンコーダを読みだします。
Definition Cubic.controller.h:413
virtual void setTarget(double target)
制御量の目標値を設定します。
Definition Cubic.controller.h:355
Controller(uint8_t motorNo, uint8_t encoderNo, enum class encoderType encoderType, uint16_t CPR, double Kp, double Ki, double Kd, double target, bool direction, double capableDutyCycle, double current, bool logging=false)
Construct a new Controller object.
Definition Cubic.controller.cpp:9
const uint8_t encoderNo
エンコーダ番号
Definition Cubic.controller.h:120
void setKi(double Ki)
Iゲインを設定します。負の値は-1倍されます。
Definition Cubic.controller.h:367
double getTarget() const
目標値を返します。
Definition Cubic.controller.h:375
void setGains(double Kp, double Ki, double Kd)
PIDゲインを設定します。負の値は-1倍されます。
Definition Cubic.controller.h:359
double getDutyCycle() const
直前に計算したデューティ比を返します。
Definition Cubic.controller.h:383
void setKp(double Kp)
Pゲインを設定します。負の値は-1倍されます。
Definition Cubic.controller.h:363
double getDt() const
直前のループにおける経過時間dtを返します
Definition Cubic.controller.h:387
アブソリュートエンコーダを用いた、DCモータの位置制御を行うためのクラス
Definition Cubic.controller.h:322
Position_PID(uint8_t motorNo, uint8_t encoderNo, enum class encoderType encoderType, uint16_t CPR, double Kp, double Ki, double Kd, double target, bool direction, double capableDutyCycle=1.0, bool logging=false)
Construct a new Position_PID object.
Definition Cubic.controller.cpp:46
void setTarget(double target) override
制御量の目標値を設定します。
Definition Cubic.controller.cpp:111
double compute() override
duty比を計算します。各ループで一回呼び出してください。このduty比は、DUTY_SPI_MAXに対する比です。計算された値は、この関数内部で、DC_motor::put()されます。
Definition Cubic.controller.cpp:62
double encoderToAngle(int32_t encoder) override
エンコーダの値から角度を計算します。設定したCPR(Count Per Revolution)に依存します。
Definition Cubic.controller.h:395
インクリメンタルエンコーダを用いた、DCモータの速度制御を行うためのクラス
Definition Cubic.controller.h:274
Velocity_PID(uint8_t motorNo, uint8_t encoderNo, enum class encoderType encoderType, uint16_t CPR, double Kp, double Ki, double Kd, double target, bool direction, double capableDutyCycle=1.0, double p=1.0, bool logging=false)
Construct a new Velocity_PID object.
Definition Cubic.controller.cpp:14
void reset() override
制御器のリセット
Definition Cubic.controller.h:444
double compute() override
duty比を計算します。各ループで一回呼び出してください。このduty比は、DUTY_SPI_MAXに対する比です。計算された値は、この関数内部で、DC_motor::put()されます。
Definition Cubic.controller.cpp:23
double encoderToAngle(int32_t encoder) override
エンコーダの値から角度を計算します。設定したCPR(Count Per Revolution)に依存します。
Definition Cubic.controller.h:391
void setLPF(double p)
ローパスフィルタの係数pを設定します。
Definition Cubic.controller.h:424
double getDt() const
Get the Dt object.
Definition PID.h:153
void setKi(double Ki)
Set the Ki object.
Definition PID.h:169
void setKp(double Kp)
Set the Kp object.
Definition PID.h:165
void setTarget(double target)
目標を変更する。
Definition PID.h:177
void setKd(double Kd)
Set the Kd object.
Definition PID.h:173
double getTarget() const
目標を取得する。
Definition PID.h:181
void reset()
制御器のリセット
Definition PID.h:193
double getCurrent() const
現在値を取得する。
Definition PID.h:185
void setGains(double Kp, double Ki, double Kd)
ゲインを変更する。
Definition PID.h:159
double compute_PID(double current, bool logging=false)
PID制御を行う関数
Definition PID.cpp:13