This is VectorControl Program for drive BLDCMotor.
BLDC_VectorControl/main.cpp@0:f129a8da4e18, 2018-11-18 (annotated)
- Committer:
- porizou3
- Date:
- Sun Nov 18 13:19:01 2018 +0000
- Revision:
- 0:f129a8da4e18
BLDC
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
porizou3 | 0:f129a8da4e18 | 1 | #include "mbed.h" |
porizou3 | 0:f129a8da4e18 | 2 | #include "rtos.h" |
porizou3 | 0:f129a8da4e18 | 3 | |
porizou3 | 0:f129a8da4e18 | 4 | |
porizou3 | 0:f129a8da4e18 | 5 | #include "Encoder.h" |
porizou3 | 0:f129a8da4e18 | 6 | #include "VectorControl.h" |
porizou3 | 0:f129a8da4e18 | 7 | #include "VelocityControl.h" |
porizou3 | 0:f129a8da4e18 | 8 | #include "CurrentControl.h" |
porizou3 | 0:f129a8da4e18 | 9 | |
porizou3 | 0:f129a8da4e18 | 10 | /* エンコーダの設定 */ |
porizou3 | 0:f129a8da4e18 | 11 | #define ENC_A p11 |
porizou3 | 0:f129a8da4e18 | 12 | #define ENC_B p12 |
porizou3 | 0:f129a8da4e18 | 13 | |
porizou3 | 0:f129a8da4e18 | 14 | #define ENC_NUM 20 //エンコーダの一回転あたりのパルス数 |
porizou3 | 0:f129a8da4e18 | 15 | |
porizou3 | 0:f129a8da4e18 | 16 | #define VELOCITYSAMPLE 0.001 //回転速度のサンプル周期[s] |
porizou3 | 0:f129a8da4e18 | 17 | #define THETASAMPLE 0.001 //回転角度のサンプル周期[s] |
porizou3 | 0:f129a8da4e18 | 18 | |
porizou3 | 0:f129a8da4e18 | 19 | /* ベクトル制御の設定 */ |
porizou3 | 0:f129a8da4e18 | 20 | #define U_U LED2 |
porizou3 | 0:f129a8da4e18 | 21 | #define U_V p7 |
porizou3 | 0:f129a8da4e18 | 22 | #define U_W p5 |
porizou3 | 0:f129a8da4e18 | 23 | #define L_U LED4 |
porizou3 | 0:f129a8da4e18 | 24 | #define L_V p9 |
porizou3 | 0:f129a8da4e18 | 25 | #define L_W p10 |
porizou3 | 0:f129a8da4e18 | 26 | |
porizou3 | 0:f129a8da4e18 | 27 | #define U_PLUS p16 // U相電流検出用抵抗の+側アナログ入力 |
porizou3 | 0:f129a8da4e18 | 28 | #define U_MINUS p17 // U相電流検出用抵抗の-側アナログ入力 |
porizou3 | 0:f129a8da4e18 | 29 | #define V_PLUS p19 // V相電流検出用抵抗の+側アナログ入力 |
porizou3 | 0:f129a8da4e18 | 30 | #define V_MINUS p20 // V相電流検出用抵抗の-側アナログ入力 |
porizou3 | 0:f129a8da4e18 | 31 | |
porizou3 | 0:f129a8da4e18 | 32 | /* 電流制御の設定 */ |
porizou3 | 0:f129a8da4e18 | 33 | #define iKp 1.0 //電流制御Pゲイン |
porizou3 | 0:f129a8da4e18 | 34 | #define iKi 1.0 //電流制御Iゲイン |
porizou3 | 0:f129a8da4e18 | 35 | #define iKd 0.0 //電流制御Dゲイン |
porizou3 | 0:f129a8da4e18 | 36 | |
porizou3 | 0:f129a8da4e18 | 37 | #define I_CONTROL_CYCLE 0.001 //電流制御周期 |
porizou3 | 0:f129a8da4e18 | 38 | |
porizou3 | 0:f129a8da4e18 | 39 | |
porizou3 | 0:f129a8da4e18 | 40 | /* 速度制御の設定 */ |
porizou3 | 0:f129a8da4e18 | 41 | #define vKp 1.0 //速度制御Pゲイン |
porizou3 | 0:f129a8da4e18 | 42 | #define vKi 1.0 //速度制御Iゲイン |
porizou3 | 0:f129a8da4e18 | 43 | #define vKd 0.0 //速度制御Dゲイン |
porizou3 | 0:f129a8da4e18 | 44 | |
porizou3 | 0:f129a8da4e18 | 45 | #define V_CONTROL_CYCLE 0.002 //速度制御周期 |
porizou3 | 0:f129a8da4e18 | 46 | |
porizou3 | 0:f129a8da4e18 | 47 | Serial pc(USBTX, USBRX); // tx, rx |
porizou3 | 0:f129a8da4e18 | 48 | |
porizou3 | 0:f129a8da4e18 | 49 | Encoder Enc(ENC_A, ENC_B, ENC_NUM, THETASAMPLE, VELOCITYSAMPLE); |
porizou3 | 0:f129a8da4e18 | 50 | |
porizou3 | 0:f129a8da4e18 | 51 | VectorControl Vector(U_U, U_V, U_W, L_U, L_V, L_W, U_PLUS, U_MINUS, V_PLUS, V_MINUS); |
porizou3 | 0:f129a8da4e18 | 52 | |
porizou3 | 0:f129a8da4e18 | 53 | CurrentControl IdC(iKp, iKi, iKd, I_CONTROL_CYCLE); //d軸電流制御クラス |
porizou3 | 0:f129a8da4e18 | 54 | CurrentControl IqC(iKp, iKi, iKd, I_CONTROL_CYCLE); //q軸電流制御クラス |
porizou3 | 0:f129a8da4e18 | 55 | |
porizou3 | 0:f129a8da4e18 | 56 | VelocityControl VC(vKp, vKi, vKd, V_CONTROL_CYCLE); //速度制御クラス |
porizou3 | 0:f129a8da4e18 | 57 | |
porizou3 | 0:f129a8da4e18 | 58 | DigitalOut led(LED1); |
porizou3 | 0:f129a8da4e18 | 59 | |
porizou3 | 0:f129a8da4e18 | 60 | |
porizou3 | 0:f129a8da4e18 | 61 | |
porizou3 | 0:f129a8da4e18 | 62 | float Iqref = 0.0; //q軸電流目標値[A] |
porizou3 | 0:f129a8da4e18 | 63 | float Idref = 0.0; //d軸電流目標値[A] |
porizou3 | 0:f129a8da4e18 | 64 | |
porizou3 | 0:f129a8da4e18 | 65 | float Vref = 0.0; //速度制御目標値[rad/s] |
porizou3 | 0:f129a8da4e18 | 66 | |
porizou3 | 0:f129a8da4e18 | 67 | |
porizou3 | 0:f129a8da4e18 | 68 | /* 電流制御スレッド */ |
porizou3 | 0:f129a8da4e18 | 69 | void CurrentThread(void const *argument) { |
porizou3 | 0:f129a8da4e18 | 70 | |
porizou3 | 0:f129a8da4e18 | 71 | float Vd, Vq; |
porizou3 | 0:f129a8da4e18 | 72 | float Theta; |
porizou3 | 0:f129a8da4e18 | 73 | |
porizou3 | 0:f129a8da4e18 | 74 | Theta = Enc.getAngle(); //回転角度の取得 |
porizou3 | 0:f129a8da4e18 | 75 | |
porizou3 | 0:f129a8da4e18 | 76 | Vector.calcIdq(Theta); //dq軸電流値の取得 |
porizou3 | 0:f129a8da4e18 | 77 | |
porizou3 | 0:f129a8da4e18 | 78 | Vd = IdC.calcPID(Idref, Vector.getId()); //d軸電流制御 |
porizou3 | 0:f129a8da4e18 | 79 | Vq = IqC.calcPID(Iqref, Vector.getIq()); //q軸電流制御 |
porizou3 | 0:f129a8da4e18 | 80 | |
porizou3 | 0:f129a8da4e18 | 81 | Vector.calcVuvw(Vd, Vq, Theta); //3相電圧値の計算 |
porizou3 | 0:f129a8da4e18 | 82 | |
porizou3 | 0:f129a8da4e18 | 83 | Vector.outPWM(); //PWMの出力 |
porizou3 | 0:f129a8da4e18 | 84 | } |
porizou3 | 0:f129a8da4e18 | 85 | |
porizou3 | 0:f129a8da4e18 | 86 | /* 速度制御スレッド */ |
porizou3 | 0:f129a8da4e18 | 87 | void VelocityThread(void const *argument) { |
porizou3 | 0:f129a8da4e18 | 88 | |
porizou3 | 0:f129a8da4e18 | 89 | float V = Enc.getVelocity(); |
porizou3 | 0:f129a8da4e18 | 90 | |
porizou3 | 0:f129a8da4e18 | 91 | Iqref = VC.calcPID(Vref, V); |
porizou3 | 0:f129a8da4e18 | 92 | } |
porizou3 | 0:f129a8da4e18 | 93 | |
porizou3 | 0:f129a8da4e18 | 94 | int main() { |
porizou3 | 0:f129a8da4e18 | 95 | //RTOSタイマーの宣言 |
porizou3 | 0:f129a8da4e18 | 96 | RtosTimer Current(CurrentThread); //電流制御 |
porizou3 | 0:f129a8da4e18 | 97 | RtosTimer Velocity(VelocityThread); //速度制御 |
porizou3 | 0:f129a8da4e18 | 98 | |
porizou3 | 0:f129a8da4e18 | 99 | Current.start(I_CONTROL_CYCLE * 1000); |
porizou3 | 0:f129a8da4e18 | 100 | Velocity.start(V_CONTROL_CYCLE * 1000); |
porizou3 | 0:f129a8da4e18 | 101 | |
porizou3 | 0:f129a8da4e18 | 102 | while(1) { |
porizou3 | 0:f129a8da4e18 | 103 | |
porizou3 | 0:f129a8da4e18 | 104 | led = !led; |
porizou3 | 0:f129a8da4e18 | 105 | } |
porizou3 | 0:f129a8da4e18 | 106 | } |
porizou3 | 0:f129a8da4e18 | 107 | |
porizou3 | 0:f129a8da4e18 | 108 | |
porizou3 | 0:f129a8da4e18 | 109 | |
porizou3 | 0:f129a8da4e18 | 110 | |
porizou3 | 0:f129a8da4e18 | 111 | |
porizou3 | 0:f129a8da4e18 | 112 | |
porizou3 | 0:f129a8da4e18 | 113 | |
porizou3 | 0:f129a8da4e18 | 114 | |
porizou3 | 0:f129a8da4e18 | 115 | |
porizou3 | 0:f129a8da4e18 | 116 | |
porizou3 | 0:f129a8da4e18 | 117 | |
porizou3 | 0:f129a8da4e18 | 118 | |
porizou3 | 0:f129a8da4e18 | 119 | |
porizou3 | 0:f129a8da4e18 | 120 | |
porizou3 | 0:f129a8da4e18 | 121 | |
porizou3 | 0:f129a8da4e18 | 122 | |
porizou3 | 0:f129a8da4e18 | 123 | |
porizou3 | 0:f129a8da4e18 | 124 | |
porizou3 | 0:f129a8da4e18 | 125 | |
porizou3 | 0:f129a8da4e18 | 126 | |
porizou3 | 0:f129a8da4e18 | 127 | |
porizou3 | 0:f129a8da4e18 | 128 | |
porizou3 | 0:f129a8da4e18 | 129 | |
porizou3 | 0:f129a8da4e18 | 130 | |
porizou3 | 0:f129a8da4e18 | 131 | |
porizou3 | 0:f129a8da4e18 | 132 | |
porizou3 | 0:f129a8da4e18 | 133 | |
porizou3 | 0:f129a8da4e18 | 134 |