Catch the GIANT Caplico! / Mbed 2 deprecated PID_AutoTuning

Dependencies:   EC mbed

Fork of PID by Catch the GIANT Caplico!

Committer:
kageyuta
Date:
Tue Jul 24 01:04:10 2018 +0000
Revision:
3:5d7dca0ca819
Parent:
2:18a1325ac2f2
Child:
4:77e3082c7cf7
?????PID?????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kageyuta 0:93650135c3a1 1 #include "mbed.h"
kageyuta 0:93650135c3a1 2 #include "EC.h"
kageyuta 2:18a1325ac2f2 3 #define K 0.01
kageyuta 2:18a1325ac2f2 4 #define stride 0.01
kageyuta 3:5d7dca0ca819 5 #define count 40
kageyuta 0:93650135c3a1 6 Serial pc(USBTX,USBRX);
kageyuta 0:93650135c3a1 7
kageyuta 0:93650135c3a1 8 PwmOut motorF(PA_3); //モータードライバの接続ピン
kageyuta 0:93650135c3a1 9 PwmOut motorR(PA_4); //モータードライバの接続ピン
kageyuta 2:18a1325ac2f2 10 Ec Ec1(PA_6,PA_7,NC,2048,0.01); //エンコーダの設定(A相、B相、分解能、計算間隔[s])
kageyuta 1:b38405009bb4 11 Ticker ticker;
kageyuta 2:18a1325ac2f2 12 Timer timer;
kageyuta 0:93650135c3a1 13
kageyuta 0:93650135c3a1 14 void out (double duty)
kageyuta 0:93650135c3a1 15 {
kageyuta 3:5d7dca0ca819 16 double duty_max = 0.6;
kageyuta 0:93650135c3a1 17 if(duty > 0) { //入力duty比が正の場合
kageyuta 1:b38405009bb4 18 if( abs(duty) < duty_max ) { //制限値を超えていない場合
kageyuta 0:93650135c3a1 19 motorF = abs(duty);
kageyuta 0:93650135c3a1 20 motorR = 0;
kageyuta 0:93650135c3a1 21 } else { //制限値を超えている場合
kageyuta 1:b38405009bb4 22 motorF = duty_max;
kageyuta 0:93650135c3a1 23 motorR = 0;
kageyuta 0:93650135c3a1 24 }
kageyuta 0:93650135c3a1 25 } else {//入力duty比が負の場合
kageyuta 1:b38405009bb4 26 if( abs(duty) < duty_max) { //制限値を超えていない場合
kageyuta 0:93650135c3a1 27 motorF = 0;
kageyuta 0:93650135c3a1 28 motorR = abs(duty);
kageyuta 0:93650135c3a1 29 } else { //制限値を超えている場合
kageyuta 0:93650135c3a1 30 motorF = 0;
kageyuta 1:b38405009bb4 31 motorR = duty_max;
kageyuta 0:93650135c3a1 32 }
kageyuta 0:93650135c3a1 33 }
kageyuta 0:93650135c3a1 34 }
kageyuta 0:93650135c3a1 35
kageyuta 0:93650135c3a1 36 void calOmega()
kageyuta 0:93650135c3a1 37 {
kageyuta 0:93650135c3a1 38 Ec1.CalOmega();
kageyuta 0:93650135c3a1 39 }
kageyuta 0:93650135c3a1 40
kageyuta 0:93650135c3a1 41 int main()
kageyuta 0:93650135c3a1 42 {
kageyuta 2:18a1325ac2f2 43 ticker.attach(&calOmega,0.01);
kageyuta 2:18a1325ac2f2 44 timer.start();
kageyuta 2:18a1325ac2f2 45 double omega_old;
kageyuta 2:18a1325ac2f2 46 int i,j;
kageyuta 0:93650135c3a1 47 while(1) {
kageyuta 2:18a1325ac2f2 48 pc.printf("Kp = %f : ",K+j*stride);
kageyuta 2:18a1325ac2f2 49 timer.reset();
kageyuta 2:18a1325ac2f2 50 i=0;
kageyuta 3:5d7dca0ca819 51 while(i<count && timer.read()<3) {
kageyuta 3:5d7dca0ca819 52 if(omega_old == 0 && Ec1.getOmega() == 0) {}
kageyuta 2:18a1325ac2f2 53 else if(omega_old * Ec1.getOmega() <= 0) i++;
kageyuta 2:18a1325ac2f2 54 omega_old = Ec1.getOmega();
kageyuta 2:18a1325ac2f2 55 out((10*(j%2) - Ec1.getCount()*(-1)*30*5/6*3.14159265359/2048) * (K + j*stride));
kageyuta 2:18a1325ac2f2 56 }
kageyuta 2:18a1325ac2f2 57 if(i==count) break;
kageyuta 2:18a1325ac2f2 58 pc.printf("TimeOut\r\n");
kageyuta 2:18a1325ac2f2 59 j++;
kageyuta 0:93650135c3a1 60 }
kageyuta 3:5d7dca0ca819 61 out(0);
kageyuta 2:18a1325ac2f2 62 double period = timer.read() / count;
kageyuta 2:18a1325ac2f2 63 pc.printf("K = %f, T = %fs\r\n",K+j*stride,period);
kageyuta 2:18a1325ac2f2 64 pc.printf("Kp = %f, Ki = %f, Kd = %f",0.6*(K+j*stride),0.5*period,0.125*period);
kageyuta 0:93650135c3a1 65 }