Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Encoder
SpeedControl Class Reference
モーターの速度制御用プログラム More...
#include <SpeedController.h>
Public Member Functions | |
| SpeedControl (PinName pwm_F, PinName pwm_B, int us, Ec &ec) | |
| constractorの定義 | |
| void | period (double s) |
| モーターのpwm周期の設定用関数 | |
| void | period_ms (int ms) |
| モーターのpwm周期の設定用関数 | |
| void | period_us (int us) |
| モーターのpwm周期の設定用関数 | |
| void | setPDparam (double kp, double kd) |
| PIDパラメータ設定関数 | |
| void | setEquation (double cf, double df, double cb, double db) |
| 角速度・duty比の関係式の設定関数 横軸を角速度[rad/s], 縦軸をduty比としたときの傾きCと切片Dを正転と逆転について設定する | |
| void | setDutyLimit (double duty_limit) |
| 出力duty比の上限を決める関数 0 ~ 0.95の範囲内で設定する | |
| void | Sc (double target_omega) |
| 速度制御関数、引数は目標速度 | |
| void | stop () |
| モーター停止用関数 dutyを0にする | |
| void | turn (double duty) |
| duty(-1 ~ 1)比でモーターを回転させる関数 負の値を入れたら逆回転する | |
| void | reset () |
| Encoderや速度制御の値をresetする関数 | |
Detailed Description
モーターの速度制御用プログラム
モーターのdutyと角速度がほぼ比例することを利用して出力を決定し、PID制御で補正する
Definition at line 8 of file SpeedController.h.
Constructor & Destructor Documentation
| SpeedControl | ( | PinName | pwm_F, |
| PinName | pwm_B, | ||
| int | us, | ||
| Ec & | ec | ||
| ) |
constractorの定義
- Parameters:
-
pwm_F モーターを正転させるpwmピン名 pwm_B モーターを後転させるpwmピン名 us モーターのpwm周期[us] ec Encoder classのポインタ モーターを正転させるとエンコーダのcountが正のほうに加算されるようにエンコーダとモーターを設置する
Definition at line 5 of file SpeedController.cpp.
Member Function Documentation
| void period | ( | double | s ) |
| void period_ms | ( | int | ms ) |
| void period_us | ( | int | us ) |
モーターのpwm周期の設定用関数
- Parameters:
-
us モーターのpwm周期[us]
SAMPLE
Ec4multi EC(p11,p12,500); SpeedControl motor(p21,p22,50,EC); int main(){ motor.period_us(50); while(1){
Definition at line 22 of file SpeedController.cpp.
| void reset | ( | ) |
Encoderや速度制御の値をresetする関数
Definition at line 92 of file SpeedController.cpp.
| void Sc | ( | double | target_omega ) |
速度制御関数、引数は目標速度
この目標角加速度になるようにモーターを回転させることができる 負の数を代入すれば逆回転することができる
- Parameters:
-
target_omega 目標角速度
SAMPLE
//プログラム例 #include "mbed.h" #include "EC.h" //Encoderライブラリをインクルード #include "SpeedController.h" //SpeedControlライブラリをインクルード #define RESOLUTION 500 Ec4multi EC(p11,p12,RESOLUTION); SpeedControl motor(p21,p22,50,EC); int main(){ motor.setEquation(0.0062,0.0045,-0.0061,0.0091); //求めたC,Dの値を設定 motor.setPDparam(0.1,0.0); //PIDの係数を設定 int kai=0; for(int i=0;i<100000000;i++){ motor.Sc(10); //10[rad/s]でモーターを回転 kai++; if(kai>1000){ printf("omega=%f\r\n",EC.getOmega()); kai=0; } } motor.stop() while(1); }
CAUTION(printfの負荷について)
printfはプログラム的に大きな負担がかかり、かなり時間がかかってしまうものである。
なのでループごとにいちいちprintfをさせると、速度の収束にかなり時間がかかってしまう。
(どんなプログラムにも言えるが、)そのためこのようなprintfの頻度を少なくさせるような工夫が必要になる。
Definition at line 29 of file SpeedController.cpp.
| void setDutyLimit | ( | double | duty_limit ) |
出力duty比の上限を決める関数 0 ~ 0.95の範囲内で設定する
- Parameters:
-
duty_limit 出力duty比の上限
SAMPLE
Ec4multi EC(p11,p12,500); SpeedControl motor(p21,p22,50,EC); int main(){ motor.setDutyLimit(0.5); //duty比の上限を0.5に設定 while(1){
Definition at line 86 of file SpeedController.cpp.
| void setEquation | ( | double | cf, |
| double | df, | ||
| double | cb, | ||
| double | db | ||
| ) |
角速度・duty比の関係式の設定関数 横軸を角速度[rad/s], 縦軸をduty比としたときの傾きCと切片Dを正転と逆転について設定する
- Parameters:
-
cf 角速度[rad/s]とduty比の関係式の傾き(正転時) df 角速度[rad/s]とduty比の関係式の切片(正転時) cb 角速度[rad/s]とduty比の関係式の傾き(逆転時) db 角速度[rad/s]とduty比の関係式の切片(逆転時)
SAMPLE
Ec4multi EC(p11,p12,500); SpeedControl motor(p21,p22,50,EC); int main(){ motor.setEquation(0.02,0.0001,-0.02,0.0001); while(1){
Definition at line 76 of file SpeedController.cpp.
| void setPDparam | ( | double | kp, |
| double | kd | ||
| ) |
PIDパラメータ設定関数
引数はそれぞれp,dパラメータ
パラメーター値は実験的に頑張って求めるしかない
- Parameters:
-
kp p制御パラメータ kd d制御パラメータ
SAMPLE
Ec4multi EC(p11,p12,500); SpeedControl motor(p21,p22,50,EC); int main(){ motor.setPDparam(0.1,0.001); while(1){
Definition at line 69 of file SpeedController.cpp.
| void stop | ( | ) |
モーター停止用関数 dutyを0にする
Definition at line 101 of file SpeedController.cpp.
| void turn | ( | double | duty ) |
duty(-1 ~ 1)比でモーターを回転させる関数 負の値を入れたら逆回転する
- Parameters:
-
duty 出力duty比
SAMPLE
#include "mbed.h" #include "EC.h" //Encoderライブラリをインクルード #include "SpeedController.h" //SpeedControlライブラリをインクルード #define RESOLUTION 500 Ec4multi EC(p11,p12,RESOLUTION); SpeedControl motor(p21,p22,50,EC); int main(){ while(1){ motor.turn(0.5); //duty0.5で正転 wait(1); motor.turn(0); //停止 wait(1); motor.turn(-0.5); //duty0.5で逆転 wait(1); motor.turn(0); //停止 wait(1); } }
Definition at line 55 of file SpeedController.cpp.
Generated on Thu Jul 14 2022 10:28:44 by
1.7.2