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.
Fork of PID by
main.cpp@3:5d7dca0ca819, 2018-07-24 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
