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: PID QEI USBHost mbed
Revision 1:36385b59d183, committed 2015-04-20
- Comitter:
- neoqased
- Date:
- Mon Apr 20 03:34:10 2015 +0000
- Parent:
- 0:d7629adcea6d
- Commit message:
- kikaikougakujikken
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| setting.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Mon Oct 20 11:15:26 2014 +0000
+++ b/main.cpp Mon Apr 20 03:34:10 2015 +0000
@@ -8,8 +8,13 @@
//1回転あたりのパルス
#define PULSE_PER_REVOLUTION 200
-//PIDのウェイト ミリ秒
+//PIDのウェイト ミリ秒(制御周期)
#define PID_RATE 10
+//ギア比
+#define GEAR_RATIO 2
+
+#define KP_SCALE 10
+#define TI_SCALE 20
/**************************入出力ポート設定**************************/
DigitalOut led1(LED1); //mbed上LED出力4つ
@@ -30,8 +35,8 @@
Timer timer; //タイマー
typedef struct{ //時間tとその時のrpmを記録するための構造体
- float t;
- float rpm;
+ unsigned short t;
+ short rpm;
} result;
/**************************プロトタイプ宣言**************************/
@@ -86,7 +91,7 @@
pwm = vol;
if(i1 >= 20){
t = timer.read();
- rpm = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / t * 2; //減速比2
+ rpm = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / t * GEAR_RATIO; //減速比2
pc.printf("Duty Ratio = %.3f , %6d RPM\n", vol, (int)rpm);
encoder.reset();
i1 = 0;
@@ -99,6 +104,7 @@
}
case 2:{ //モード2はモータの応答を調べる.デューティ比1でモータを回転させ,100msごとの経過時間とRPMをUSBメモリのcsvファイルに出力する.約15秒で終了する.
//result exp2[(int)(15*1000/PID_RATE+1)] = {};
+ float dt = 0, tnow = 0, tpre = 0;
//初期化
exp[0].t = 0;
exp[0].rpm = 0;
@@ -109,8 +115,11 @@
//ループ(約15秒で終了)
for(int i = 0; i < 15*1000/PID_RATE; i++){ //10msごとに時間とrpmの取得
wait_ms(PID_RATE);
- exp[i+1].t = timer.read();
- exp[i+1].rpm = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / (exp[i+1].t - exp[i].t) * 2; //減速比2
+ tpre = tnow;
+ tnow = timer.read();
+ exp[i+1].t = (unsigned short)(tnow * 1000);
+ dt = tnow - tpre;
+ exp[i+1].rpm = (short)((float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / dt * GEAR_RATIO); //減速比2
encoder.reset();
}
for(int i = 100; i >= 0; i--){ //ゆるやかに減速
@@ -126,7 +135,7 @@
}
fprintf(fp,"Time , RPM\n");
for(int i = 0; i <= 15*1000/PID_RATE; i++){
- fprintf(fp,"%f , %f\n", exp[i].t, exp[i].rpm); //ファイルに実験データの書き込み
+ fprintf(fp,"%f , %d\n", (float)exp[i].t / 1000.0, exp[i].rpm); //ファイルに実験データの書き込み
}
fclose(fp);
Buzzer(4); //終了を知らせる
@@ -134,7 +143,7 @@
}
case 3:{ //モード3はモータの応答を調べる.PID制御をかけ,経過時間とRPMをUSBメモリのcsvファイルに出力する.約15秒で終了する.
//result exp3[(int)(15*1000/PID_RATE+1)] = {};
- float kp = 0, ki = 0, kd = 0, max_rpm = 0, target_rpm = 0, reduction = 0;
+ float kp = 0, ti = 0, td = 0, max_rpm = 0, target_rpm = 0, reduction = 0, dt = 0, tnow = 0, tpre = 0, rpmnow = 0;
//int pulse[15*1000/PID_RATE+2] = {};
//int j = 0;
//float times = 0;
@@ -179,13 +188,13 @@
//fscanf(fppid,"%f",&target_rpm);
//fclose(fppid);
- kp = KP;
- ki = KI;
- kd = KD;
+ kp = KP / KP_SCALE;
+ ti = TI * TI_SCALE;
+ td = TD;
max_rpm = MAX_RPM;
target_rpm = TARGET_RPM;
- PID pid(kp, ki, kd, PID_RATE); //PIDの設定
+ PID pid(kp, ti, td, PID_RATE); //PIDの設定
pid.setInputLimits(0.0, max_rpm);
pid.setOutputLimits(0.0, 1.0);
pid.setMode(AUTO_MODE);
@@ -195,9 +204,13 @@
exp[0].rpm = 0;
timer.start();
for(int i = 0; i < 15*1000/PID_RATE; i++){ //15秒間実行する
- exp[i+1].t = timer.read();
- exp[i+1].rpm = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / (exp[i+1].t - exp[i].t) * 2;
- pid.setProcessValue(exp[i+1].rpm);
+ tpre = tnow;
+ tnow = timer.read();
+ exp[i+1].t = (unsigned short)(tnow * 1000);
+ dt = tnow - tpre;
+ rpmnow = (float)encoder.getPulses() / 2 / PULSE_PER_REVOLUTION * 60 / dt * GEAR_RATIO;
+ exp[i+1].rpm = (short)rpmnow;
+ pid.setProcessValue(rpmnow);
pwm = pid.compute();
encoder.reset();
//pulse[i+1] = encoder.getPulses() / 2.0;
@@ -222,10 +235,10 @@
Buzzer(-1); //エラーコード-1のブザーを鳴らす
break; //終了
}
- fprintf(fp,"kp = %f ki = %f kd = %f\n",kp, ki, kd);
+ fprintf(fp,"kp = %.6f ki = %.6f kd = %.6f\n", (float)KP, (float)TI, (float)TD);
fprintf(fp,"Time , RPM\n");
for(int i = 0; i <= 15*1000/PID_RATE; i++){
- fprintf(fp,"%f , %f\n", exp[i].t, exp[i].rpm); //ファイルに実験データの書き込み
+ fprintf(fp,"%f , %d\n", (float)exp[i].t / 1000.0, exp[i].rpm); //ファイルに実験データの書き込み
}
fclose(fp);
Buzzer(5); //終了を知らせる
--- a/setting.h Mon Oct 20 11:15:26 2014 +0000 +++ b/setting.h Mon Apr 20 03:34:10 2015 +0000 @@ -1,10 +1,10 @@ #ifndef _SETTING_H #define _SETTING_H -#define KP 0.00135 -#define KI 0.00962 -#define KD 0.0 +#define KP 50 +#define TI 1 +#define TD 0.0 #define TARGET_RPM 4000 -#define MAX_RPM 10000 +#define MAX_RPM 7550 #endif \ No newline at end of file