This is VectorControl Program for drive BLDCMotor.

Dependencies:   mbed

Committer:
porizou3
Date:
Sun Nov 18 13:19:01 2018 +0000
Revision:
0:f129a8da4e18
BLDC

Who changed what in which revision?

UserRevisionLine numberNew 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